Files
tclBot/tcl.py
2022-12-15 16:20:49 +01:00

147 lines
6.6 KiB
Python

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 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()
@command.new(name="tcl", help="")
@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(
"""
!tcl alerte ligne -> Retourne les alertes TCL sur la ligne donnée
"""
)
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
"""
)
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]):
alerte=True
debut = datetime.fromisoformat(value["debut"])
fin = datetime.fromisoformat(value["fin"])
respText = "<h3>" + value["type"] + "</h3><p><strong>" + value["titre"] + "</strong></p><p>" \
+ value["message"] + "</p><strong>" + debut.strftime("%d/%m/%Y à %H:%M") + " au " \
+ fin.strftime("%d/%m/%Y à %H:%M") + "</strong></p>"
await evt.respond(respText, allow_html=True)
if(alerte==False):
await evt.respond("<h3>Pas d'alerte sur cette ligne</h3>", allow_html=True)
except KeyError:
await evt.respond("Erreur d'analyse JSON ")
elif pattern.__contains__("horaires"):
chunks = pattern.split(None, 1)
if len(chunks) != 2:
await evt.respond(
"""
!tcl horaires arrêt -> Retourne les horaires à l'arrêt
"""
)
return
with open("/home/tfa/maubot/tcl/tcl_sytral.tclarret.json") as file:
objet = json.load(file)
values = objet["values"]
arrets = []
for value in values:
arrets.append(value["nom"].lower())
arret = difflib.get_close_matches(chunks[1].lower(),arrets,n=1,cutoff=0.8)
if len(arret) == 0:
await evt.respond("Arrêt non trouvé")
return
Ids =[]
nomArret = ""
for value in values:
if value["nom"].lower() == arret[0]:
nomArret = value["nom"]
Ids.append(value["id"])
url = 'https://download.data.grandlyon.com/ws/rdata/tcl_sytral.tclpassagearret/all.json?maxfeatures=2000&start=1'
respText = "<h3>Prochains départs " + nomArret + " :</h3><ul>"
self.log.info(respText)
while len(url) > 0:
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:
url = objet["next"]
except KeyError:
url = ""
values = objet["values"]
for value in values:
if value["id"] in Ids:
if value["type"] == "E": #Filtré sur les estimés et non théoriques
if value["coursetheorique"].split('-')[0] == "301A" :
transport = "A"
elif value["coursetheorique"].split('-')[0] == "303" :
transport = "C"
elif value["coursetheorique"].split('-')[0] == "325" :
transport = "F1"
elif value["coursetheorique"].split('-')[0] == "326" :
transport = "F2"
elif value["coursetheorique"].split('-')[0] == "304" :
transport = "D"
elif value["coursetheorique"].split('-')[0] == "302A" :
transport = "B"
else:
transport = value["coursetheorique"].split('-')[0][:-1]
respText += "<li>Ligne " + transport + " - direction " \
+ value["direction"] + " : " + value["delaipassage"] + "</li>"
self.log.info(respText)
respText += "</ul>"
await evt.respond(respText, allow_html=True)
@classmethod
def get_config_class(cls) -> Type[BaseProxyConfig]:
return Config