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")
|