import os, time, random, requests, threading, json BASE_URL = "https://tapi.bale.ai/bot" TOKEN = os.getenv("BALE_BOT_TOKEN") # ---------------- LOG ---------------- def log(x): print(x, flush=True) # ---------------- SAFE NET ---------------- 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 # ---------------- DATA SOURCES ---------------- HAFEZ_LOCAL = [ { "id": 1, "poem": "الا یا ایها الساقی ادر کاسا و ناولها\nکه عشق آسان نمود اول ولی افتاد مشکل‌ها", "tafseer": "شروع کارت خوب است اما ادامه‌اش صبر می‌خواهد." }, { "id": 2, "poem": "دل می‌رود ز دستم صاحبدلان خدا را\nدردا که راز پنهان خواهد شد آشکارا", "tafseer": "احساساتت قوی است، عجله نکن." }, { "id": 3, "poem": "صلاح کار کجا و من خراب کجا\nببین تفاوت ره از کجاست تا به کجا", "tafseer": "خودت را دست‌کم نگیر." }, ] hafez_cache = [] data_source = "LOCAL" # ---------------- LOADERS ---------------- def load_from_hf(): """ اگر HF Dataset وجود داشت اینجا فعال می‌شود عمدا اختیاری است """ try: # placeholder برای آینده 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" # ---------------- MEMORY ---------------- 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 # ---------------- BALE API ---------------- 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}) # ---------------- INTENT ---------------- 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) # ---------------- WATCHDOG ---------------- def watchdog(): while True: log(f"💓 alive | source={data_source} | fal_count={len(hafez_cache)}") time.sleep(30) # ---------------- MAIN ---------------- 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) # ---------------- BOOT ---------------- if __name__ == "__main__": while True: try: main() except Exception as e: log(f"🔥 recovered from crash: {e}") time.sleep(5)