| import os, time, random, requests, threading, json |
|
|
| BASE_URL = "https://tapi.bale.ai/bot" |
| TOKEN = os.getenv("BALE_BOT_TOKEN") |
|
|
| |
| def log(x): |
| print(x, flush=True) |
|
|
| |
| def safe_get(url, params=None): |
| try: |
| r = requests.get(url, params=params, timeout=40) |
| return r.json() |
| except: |
| return None |
|
|
| def safe_post(url, data): |
| try: |
| requests.post(url, json=data, timeout=20) |
| except: |
| pass |
|
|
| |
| HAFEZ_LOCAL = [ |
| { |
| "id": 1, |
| "poem": "الا یا ایها الساقی ادر کاسا و ناولها\nکه عشق آسان نمود اول ولی افتاد مشکلها", |
| "tafseer": "شروع کارت خوب است اما ادامهاش صبر میخواهد." |
| }, |
| { |
| "id": 2, |
| "poem": "دل میرود ز دستم صاحبدلان خدا را\nدردا که راز پنهان خواهد شد آشکارا", |
| "tafseer": "احساساتت قوی است، عجله نکن." |
| }, |
| { |
| "id": 3, |
| "poem": "صلاح کار کجا و من خراب کجا\nببین تفاوت ره از کجاست تا به کجا", |
| "tafseer": "خودت را دستکم نگیر." |
| }, |
| ] |
|
|
| hafez_cache = [] |
| data_source = "LOCAL" |
|
|
| |
| def load_from_hf(): |
| """ |
| اگر HF Dataset وجود داشت اینجا فعال میشود |
| عمدا اختیاری است |
| """ |
| try: |
| |
| return [] |
| except: |
| return [] |
|
|
| def load_from_api(): |
| try: |
| r = safe_get("https://api.allorigins.win/raw?url=https://hafez.eitaa.com") |
| if not r: |
| return [] |
| return [] |
| except: |
| return [] |
|
|
| def init_hafez(): |
| global hafez_cache, data_source |
|
|
| hf = load_from_hf() |
| if hf: |
| hafez_cache = hf |
| data_source = "HF_DATASET" |
| return |
|
|
| api = load_from_api() |
| if api: |
| hafez_cache = api |
| data_source = "ONLINE_API" |
| return |
|
|
| hafez_cache = HAFEZ_LOCAL |
| data_source = "LOCAL" |
|
|
| |
| user_last = {} |
| pointer = 0 |
|
|
| def get_fal(user_id): |
| global pointer |
| fal = hafez_cache[pointer] |
| pointer = (pointer + 1) % len(hafez_cache) |
| user_last[user_id] = fal["id"] |
| return fal |
|
|
| |
| def get_updates(offset): |
| url = f"{BASE_URL}{TOKEN}/getUpdates" |
| return safe_get(url, {"timeout": 30, "offset": offset}) |
|
|
| def send(chat_id, text): |
| url = f"{BASE_URL}{TOKEN}/sendMessage" |
| safe_post(url, {"chat_id": chat_id, "text": text}) |
|
|
| |
| def normalize(t): |
| return "".join(t.lower().replace("/", "").split()) |
|
|
| def want_fal(text): |
| keys = ["فال", "حافظ", "fale", "fal", "یهفال", "فالگیر"] |
| t = normalize(text) |
| return any(normalize(k) in t for k in keys) |
|
|
| |
| def watchdog(): |
| while True: |
| log(f"💓 alive | source={data_source} | fal_count={len(hafez_cache)}") |
| time.sleep(30) |
|
|
| |
| def main(): |
| log("👑 HAFEZBLE GOD MODE STARTING") |
|
|
| if not TOKEN: |
| log("❌ TOKEN NOT FOUND") |
| return |
|
|
| init_hafez() |
| log(f"📚 Hafez loaded from: {data_source}") |
|
|
| offset = None |
| threading.Thread(target=watchdog, daemon=True).start() |
|
|
| while True: |
| data = get_updates(offset) |
| if not data or "result" not in data: |
| time.sleep(2) |
| continue |
|
|
| for upd in data["result"]: |
| offset = upd["update_id"] + 1 |
| msg = upd.get("message") |
| if not msg: |
| continue |
|
|
| chat_id = msg["chat"]["id"] |
| user_id = msg["from"]["id"] |
| text = msg.get("text", "") |
|
|
| t = normalize(text) |
|
|
| if t == "start": |
| send(chat_id, |
| "سلام 😇\n" |
| "من فال حافظ میدم، غر نمیزنم.\n" |
| "بنویس: /فال") |
|
|
| elif want_fal(text): |
| fal = get_fal(user_id) |
| send(chat_id, |
| f"📜 فال حافظ #{fal['id']}\n\n" |
| f"{fal['poem']}\n\n" |
| f"🔮 تعبیر:\n{fal['tafseer']}") |
|
|
| elif t == "help": |
| send(chat_id, |
| "/فال ← فال حافظ\n" |
| "هرجور بنویسی میفهمم 😙") |
|
|
| else: |
| send(chat_id, |
| "اگه فال میخوای، فقط بنویس فال 😇") |
|
|
| time.sleep(1) |
|
|
| |
| if __name__ == "__main__": |
| while True: |
| try: |
| main() |
| except Exception as e: |
| log(f"🔥 recovered from crash: {e}") |
| time.sleep(5) |
|
|