Mt5pro-bot2/python/notifier/telegram.py

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