47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
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")
|