diff --git a/asmodee.ini.sample b/asmodee.ini.sample index 5920248..9305472 100644 --- a/asmodee.ini.sample +++ b/asmodee.ini.sample @@ -14,3 +14,8 @@ msender = user@domain.tld mpass = password msmtp = smtp mport = port + +[RTE] +client_id = id +client_secret = secret +call_url = https://digital.iservices.rte-france.com/open_api/ecowatt/v4/signals diff --git a/asmodee.py b/asmodee.py index dbdb39c..632f747 100755 --- a/asmodee.py +++ b/asmodee.py @@ -15,12 +15,20 @@ import nio from datetime import datetime,timedelta import requests +from oauthlib.oauth2 import BackendApplicationClient +from requests_oauthlib import OAuth2Session +from requests.auth import HTTPBasicAuth import html2text +import json # Var bot = None PREFIX = '!' USERNAME = "" +oauth = None #Appels RTE +#ecowatt_url = 'https://digital.iservices.rte-france.com/open_api/ecowatt/v4/sandbox/signals' +ecowatt_url = 'https://digital.iservices.rte-france.com/open_api/ecowatt/v4/signals' +wattobj = None # Listes et dictionnaires admins = [] # Admins du bot @@ -204,6 +212,12 @@ def signal_handler(signal, frame): # Sauvegarder les données persistantes avant save_obj(None,None) sys.exit(0) +class Wattobject: # Cache du service ecowatt + def __init__(self): + self.jour = 19000101 + self.heure = 0 + self.signals = None + class Userstats: #Pour garder des stats sur les users def __init__(self,room,user,nick): self.room = room @@ -1588,8 +1602,69 @@ async def actif(room,message): # Stats d'activité d'une personne print("erreur usrstats") else: await msg(room,pers + " : Personne non reconnue\n",sender) + +def getNiveau(niveau): + if (niveau == 1): + return("vert") + elif (niveau == 2): + return("orange") + elif (niveau == 3): + return("rouge") + else: + return("Inconnu") - +async def ecowatt(room, message): + global modules + try: + rmod = modules[room.room_id, 'ecowatt'] + except: + modules[room.room_id, 'ecowatt'] = False + if (modules[room.room_id, 'ecowatt']): + args = getMessage(message).split() + sender = getUser(message) + jn = int(datetime.today().strftime("%Y%m%d")) + hn = int(datetime.today().strftime("%H")) + signals = None + global wattobj + if (wattobj.jour < jn or (wattobj.jour == jn and wattobj.heure + 1 < hn)): + result = oauth.get(ecowatt_url) + watt = json.loads(result.text) + sign = watt["signals"] + signals = sorted(sign, key=lambda signal: signal["jour"][0:10]) + wattobj.jour = jn + wattobj.heure = hn + wattobj.signals = signals + else: + signals = wattobj.signals + args.pop(0) + mess = "" + if (len(args) > 0 and args[0] == "details"): + i=False + for jour in signals: + if (jour["dvalue"] > 1): + if (i): + mess = mess + "\n" + i=True + mess = mess + jour["jour"][0:10] + " : " + jour["message"] + heures = sorted(jour["values"], key=lambda h: h["pas"]) + for heure in heures: + if (heure["hvalue"] > 1): + alerte = getNiveau(heure["hvalue"]) + mess = mess + "\n" + str(heure["pas"]) + "h : niveau " + alerte + if (len(mess) < 10): + mess = "Aucune alerte sur le réseau RTE dans les trois prochains jours." + elif (len(args) > 0 and args[0].isnumeric()): + j = int(args[0]) + if (len(signals) > j): + jour = signals[j] + alerte = getNiveau(jour["dvalue"]) + mess = mess + "La météo RTE du " + jour["jour"][0:10] + " est de niveau " + alerte + " (" + jour["message"] + ")\n" + else: + for jour in signals: + alerte = getNiveau(jour["dvalue"]) + mess = mess + "La météo RTE du " + jour["jour"][0:10] + " est de niveau " + alerte + " (" + jour["message"] + ")\n" + await msg(room, mess, sender) + async def help(room, message): # Aide en message privé await help_center(room,message,"help",True) @@ -1649,6 +1724,8 @@ async def help_center(room,message,name,private): # Aide sur les commandes dispo await msg(salon,"- !module : Affiche la liste des modules actifs sur le salon ainsi que celle des modules disponibles\n- !module add : Active un module sur le salon\n- !module del : Désactive un module sur le salon.",sender, False) elif (re.search("cristal", args[0])): await msg(salon,"- !cristal : Réponds à une question posée commençant par Est-ce, Combien, Pourquoi, Quand, Comment, Où et se terminant par un point d'interrogation.",sender, False) + elif (re.search("ecowatt", args[0])): + await msg(salon,"- !ecowatt : Météo RTE des prochains jours.\n- !ecowatt 0-3 : Météo RTE d'une journée entre J et J+3.\n- !ecowatt details : Météo RTE des prochains jours, chaque heure orange ou rouge spécifiquement.",sender, False) else: await msg(salon,"A venir",sender, False) else: @@ -1679,11 +1756,19 @@ async def help_center(room,message,name,private): # Aide sur les commandes dispo message += "\n- !titre : retourne le titre de la page en paramètre si celle ci possède une balise titre" if (cle[0] == rid and cle[1] == "mails" and valeur): message += "\n- !mail : s'abonner aux messages du salon par mail." + if (cle[0] == rid and cle[1] == "ecowatt" and valeur): + message += "\n- !ecowatt : Météo des prochains jours du réseau électrique RTE." if (cle[0] == rid and cle[1] == "roll" and valeur): message += "\n- :roll \n- :sw \n- :dom \n- :wod \n- :owod \n- :ars \n- :des \n- :star " message += "\n- !modo : Gère les modérateurs du salon\n- !module : Gère les modules actifs sur le salon\n\n- Pour plus de details, tapez !" + name + " \n\nRetrouvez Asmodee sur https://git.ombreport.info/nemesis/asmodee_matrix" await msg(salon,message,sender, False) +@bot.listener.on_message_event +async def callEcowatt(room, message): + match = botlib.MessageMatch(room, message, bot, PREFIX) + if match.is_not_from_this_bot() and match.prefix() and match.command("ecowatt"): + await ecowatt(room, message) + @bot.listener.on_message_event async def callActif(room, message): match = botlib.MessageMatch(room, message, bot, PREFIX) @@ -1824,7 +1909,7 @@ def main(): USERNAME = "" # Bot's username PASSWORD = "" # Bot's password SERVER = "" # Matrix server URL - mods = ["roll", "quote", "biere", "stats", "liste", "horloge", "carte", "card", "cristal", "welcome", "salut", "jdr", "gens", "va", "salon", "kick", "mails", "titre", "invididious"] + mods = ["roll", "quote", "biere", "stats", "liste", "horloge", "carte", "card", "cristal", "welcome", "salut", "jdr", "gens", "va", "salon", "kick", "mails", "titre", "invididious", "ecowatt"] global admins if ('AUTH' in config): USERNAME = config['AUTH']['username'] # Bot's username @@ -1832,7 +1917,23 @@ def main(): SERVER = config['AUTH']['server'] # Matrix server URL admins = config['AUTH']['admin'].split(",") # Admins du bot @admin1:host.tld,@admin2:host.tld,... else: - print("Probleme de lecture de configuration asmodee.ini") + print("Probleme de lecture de configuration asmodee.ini (AUTH)") + + RTE_ID = None # Bot's RTE ID + RTE_SECRET = None # Bot's RTE SECRET + if ('RTE' in config): + global oauth + global wattobj + RTE_ID = config['RTE']['client_id'] # Bot's username + RTE_SECRET = config['RTE']['client_secret'] # Bot's password + auth = HTTPBasicAuth(RTE_ID, RTE_SECRET) + client = BackendApplicationClient(client_id=RTE_ID) + oauth = OAuth2Session(client=client) + token = oauth.fetch_token(token_url='https://digital.iservices.rte-france.com/token/oauth/', auth=auth) + wattobj = Wattobject() + + else: + print("Probleme de lecture de configuration asmodee.ini (RTE)") global liste_mod if ('MOD' in config):