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 = [] def add_horaire(self, horaire): 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 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 -> Retourne les horaires à l'arrêt """ ) @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("