from typing import Type from mautrix.util.config import BaseProxyConfig, ConfigUpdateHelper from maubot import Plugin, MessageEvent from maubot.handlers import command from datetime import datetime import aiohttp import asyncio import json import base64 import difflib class Terminus: def __init__(self, name): self.name = name self.horaires = [] self.estimated = False def add_horaire(self, horaire, est): if self.estimated == False: if est == "E": self.horaires = [] self.horaires.append(horaire) self.estimated = True else: self.horaires.append(horaire) else: if est == "E": self.horaires.append(horaire) def get_horaires(self): return self.sort_horaires() def get_name(self): return self.name def sort_horaires(self): inth = [] for h in self.horaires: if h == "Proche": inth.append(0) else : inth.append(int(h[:-4])) inth.sort() return inth def get_estimated(self): return self.estimated class Ligne: def __init__(self, name): self.name = name self.terminus = [] def add_terminus(self, newterminus): if newterminus in self.terminus: return self.terminus.append(newterminus) def get_terminus(self, term): for t in self.terminus: if t.get_name() == term: return t return None def get_all_terminus(self): return self.terminus def get_name(self): return self.name class Config(BaseProxyConfig): def do_update(self, helper: ConfigUpdateHelper) -> None: helper.copy("mail") helper.copy("password") class Tcl(Plugin): async def start(self) -> None: self.config.load_and_update() def help_msg(self): return( """ !tcl alerte ligne -> Retourne les alertes TCL sur la ligne donnée ligne peut être : - Metros : A, B, C, D - Trams : T1, T2 ... - Renforcés : C1, C2 ... - Bus : 1, 2 ... - Funis : F1, F2 ATTENTION : Le bot ne vérifie pas que la ligne existe !tcl horaires arrêt (-- ligne) -> Retourne les horaires à l'arrêt (et filtre par ligne) La réponse indique si les horaires sont théoriques (T) ou estimés (E) Les horaires estimés sont préférés, si pas dispo, les horaires théoriques sont affichés Optionnellement le paramètre "-- ligne" permet de filtrer l'affichage pour ne garder que la ligne souhaitée """ ) @command.new(name="tcl", help="Permet d'avoir des informations sur les TCL") @command.argument("pattern", pass_raw=True, required=True) async def tclInfos(self, evt: MessageEvent, pattern: str) -> None: await evt.mark_read() strToEncode = self.config["mail"] + ':' + self.config["password"] base64string = base64.b64encode(strToEncode.encode('utf-8')) if not pattern: await evt.respond(self.help_msg()) else: self.log.info("Commande : " + pattern) if pattern.__contains__("alerte"): chunks = pattern.split(None, 1) if len(chunks) != 2: await evt.respond( """ !tcl alerte ligne -> Retourne les alertes TCL sur la ligne donnée ligne peut être : - Metros : A, B, C, D - Trams : T1, T2 ... - Renforcés : C1, C2 ... - Bus : 1, 2 ... - Funis : F1, F2 ATTENTTION : Le bot ne vérifie pas que la ligne existe """ ) url = 'https://download.data.grandlyon.com/ws/rdata/tcl_sytral.tclalertetrafic_2/all.json?maxfeatures=200&start=1' resp = await self.http.get(url, headers={'Authorization' : 'Basic ' + base64string.decode('utf-8')}) ans = await resp.text() try: resp.raise_for_status() except aiohttp.ClientError as Error: await evt.respond(str(Error)) return objet = json.loads(ans) try: values = objet["values"] alerte=False for value in values: if(value["ligne_cli"] == chunks[1].upper()): alerte=True debut = datetime.fromisoformat(value["debut"]) fin = datetime.fromisoformat(value["fin"]) respText = "
" + value["titre"] + "
" \ + value["message"] + "
" + debut.strftime("%d/%m/%Y à %H:%M") + " au " \ + fin.strftime("%d/%m/%Y à %H:%M") + "" await evt.respond(respText, allow_html=True) if(alerte==False): await evt.respond("