Spaces:
Running
Running
| """Telegram long-polling bot for crowd contributions.""" | |
| from __future__ import annotations | |
| import os | |
| import time | |
| import requests | |
| from bots.base import dispatch_command | |
| from services.config_loader import load_config | |
| def run_telegram_bot() -> None: | |
| token = os.environ.get( | |
| load_config().get("bots", {}).get("telegram", {}).get("token_env", "TELEGRAM_BOT_TOKEN"), | |
| "", | |
| ).strip() | |
| if not token: | |
| raise RuntimeError("Set TELEGRAM_BOT_TOKEN to run the Telegram bot") | |
| base = f"https://api.telegram.org/bot{token}" | |
| offset = 0 | |
| print("[telegram] polling...") | |
| while True: | |
| resp = requests.get( | |
| f"{base}/getUpdates", | |
| params={"timeout": 30, "offset": offset}, | |
| timeout=35, | |
| ) | |
| resp.raise_for_status() | |
| for upd in resp.json().get("result", []): | |
| offset = upd["update_id"] + 1 | |
| msg = upd.get("message") or {} | |
| text = (msg.get("text") or "").strip() | |
| if not text.startswith("/"): | |
| continue | |
| chat_id = msg["chat"]["id"] | |
| user = msg.get("from", {}) | |
| contributor_id = f"tg:{user.get('id', chat_id)}" | |
| parts = text.split(None, 1) | |
| command = parts[0] | |
| args = parts[1] if len(parts) > 1 else "" | |
| try: | |
| reply = dispatch_command(contributor_id, command, args) | |
| except Exception as e: | |
| reply = f"❌ {e}" | |
| requests.post( | |
| f"{base}/sendMessage", | |
| json={"chat_id": chat_id, "text": reply}, | |
| timeout=20, | |
| ) | |
| time.sleep(0.5) | |
| if __name__ == "__main__": | |
| run_telegram_bot() | |