Hafezble / app.py
Hosdroid's picture
Update app.py
334bf1f verified
Raw
History Blame Contribute Delete
5.04 kB
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)