import threading, time import requests from utils.logger import get_logger log = get_logger() class BotState: def __init__(self): self.paused = False self.close_all = False class Telegram: def __init__(self, cfg: dict, state: BotState, status_fn): self.on = cfg.get("enabled", False) self.token, self.chat = cfg.get("token"), str(cfg.get("chat_id")) self.state, self.status_fn, self.offset = state, status_fn, 0 if self.on: threading.Thread(target=self._poll, daemon=True).start() def send(self, text: str): if not self.on: return try: requests.post(f"https://api.telegram.org/bot{self.token}/sendMessage", json={"chat_id": self.chat, "text": text}, timeout=10) except Exception as e: log.warning(f"Telegram: {e}") def _poll(self): while True: try: r = requests.get(f"https://api.telegram.org/bot{self.token}/getUpdates", params={"offset": self.offset, "timeout": 25}, timeout=35).json() for u in r.get("result", []): self.offset = u["update_id"] + 1 m = u.get("message", {}) if str(m.get("chat", {}).get("id")) != self.chat: continue # seul ton chat peut commander le bot self._cmd(m.get("text", "")) except Exception: time.sleep(5) def _cmd(self, t): if t == "/status": self.send(self.status_fn()) elif t == "/pause": self.state.paused = True; self.send("⏸ Bot en pause (nouveaux trades bloqués)") elif t == "/resume": self.state.paused = False; self.send("▶️ Bot relancé") elif t == "/closeall": self.state.close_all = True; self.send("🧹 Fermeture de toutes les positions...") else: self.send("Commandes: /status /pause /resume /closeall")