From 1705d754a6b41aefe6750313992135083846cf03 Mon Sep 17 00:00:00 2001 From: nemesis Date: Sun, 21 Aug 2022 21:54:24 +0200 Subject: [PATCH] welcome : ok --- asmodee.py | 508 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 508 insertions(+) diff --git a/asmodee.py b/asmodee.py index 191eeed..46a98ef 100755 --- a/asmodee.py +++ b/asmodee.py @@ -11,6 +11,7 @@ import sys import pickle import threading import asyncio +import nio # Var bot = None @@ -22,6 +23,11 @@ admins = [] # Admins du bot modos = {} # Moderateurs des salons modules = {} # Modules activés par salon liste_mod = [] # Modules disponibles +citations = {} #addquote +bieres = {} # Boissons a offrir +salons = {} # liste de salons recommandés +welcome = {} # Messages d'accueil des salons +clock = {} # horloges pbta # Connexion du bot config = configparser.ConfigParser() @@ -44,6 +50,52 @@ creds = botlib.Creds(SERVER, USERNAME, PASSWORD) bot = botlib.Bot(creds) # Chargement des données persistantes +def horloge_read(): + global clock + try: + with open("horloge", "rb") as fichier: + loader = pickle.Unpickler(fichier) + clock = loader.load() + except: + clock = {} + +def citations_read(): + global citations + try: + with open("citations", "rb") as fichier: + loader = pickle.Unpickler(fichier) + citations = loader.load() + except: + citations = {} + + +def bieres_read(): + global bieres + try: + with open("bieres", "rb") as fichier: + loader = pickle.Unpickler(fichier) + bieres = loader.load() + except: + bieres = {} + +def salons_read(): + global salons + try: + with open("salons", "rb") as fichier: + loader = pickle.Unpickler(fichier) + salons = loader.load() + except: + salons = {} + +def welcome_read(): + global welcome + try: + with open("welcome", "rb") as fichier: + loader = pickle.Unpickler(fichier) + welcome = loader.load() + except: + welcome = {} + def modos_read(): global modos try: @@ -69,6 +121,29 @@ def save_obj(room=None, event=None): with open("modules", "wb") as fichier: saver = pickle.Pickler(fichier) saver.dump(modules) + if ('horloge' in liste_mod): + with open("horloge", "wb") as fichier: + saver = pickle.Pickler(fichier) + saver.dump(clock) + if ('quote' in liste_mod): + #with open("quotes", "wb") as fichier: + # saver = pickle.Pickler(fichier) + # saver.dump(quotes) + with open("citations", "wb") as fichier: + saver = pickle.Pickler(fichier) + saver.dump(citations) + if ('biere' in liste_mod): + with open("bieres", "wb") as fichier: + saver = pickle.Pickler(fichier) + saver.dump(bieres) + if ('salon' in liste_mod): + with open("salons", "wb") as fichier: + saver = pickle.Pickler(fichier) + saver.dump(salons) + if ('welcome' in liste_mod): + with open("welcome", "wb") as fichier: + saver = pickle.Pickler(fichier) + saver.dump(welcome) def signal_handler(signal, frame): # Sauvegarder les données persistantes avant sortie save_obj(None,None) @@ -671,7 +746,429 @@ async def liste(room, message): # Afficher un élement aléatoire d'une liste fo await msg(room,nick + " obtient :\n" + '\n'.join(res),nick) else: await msg(room,"Utilisation : !liste [nombre d elements]",nick) + +async def aff_hor(room, hor, valeur): # affichage des horloges + if (int(valeur) == 0): + await msg(room,hor + " : " + chr(128320) + "\n", "horloge") + elif (int(valeur) == 1): + await msg(room,hor + " : " + chr(128338) + "\n", "horloge") + elif (int(valeur) == 2): + await msg(room,hor + " : " + chr(128341) + "\n", "horloge") + elif (int(valeur) == 3): + await msg(room,hor + " : " + chr(128344) + "\n", "horloge") + elif (int(valeur) == 4): + await msg(room,hor + " : " + chr(128345) + "\n", "horloge") + elif (int(valeur) == 5): + await msg(room,hor + " : " + chr(128346) + "\n", "horloge") + elif (int(valeur) == 6): + await msg(room,hor + " : " + chr(128347) + "\n", "horloge") + else: + await msg(room,hor + " : " + str(valeur) + " \n", "horloge") +async def horloge(room, message): # Gestion des horloges PBTA + global modules + try: + rmod = modules[room.room_id, 'horloge'] + except: + modules[room.room_id, 'horloge'] = False + if (modules[room.room_id, 'horloge']): + global clock + nick = getNick(room,message) + + args = getMessage(message).split() + args.pop(0) + if (len(args) == 0): + # Liste des horloges du salon + for cle,valeur in clock.items(): + if (cle[0] == room.room_id): + await aff_hor(room, cle[1], valeur) + elif (len(args) >= 2 and args[len(args)-1].isnumeric()): + # Place le niveau de l'horloge entre 0 et 6 + nv = int(args[len(args)-1]) + clock[room.room_id, ' '.join(args[0:-1])] = nv + elif (len(args) >= 2 and (args[len(args)-1][:1] == "+" or args[len(args)-1][:1] == "-")): + nv = 0 + hor = ' '.join(args[0:-1]) + if ((room.room_id, hor) in clock): + nv = clock[room.room_id, hor] + val = 0 + if (args[len(args)-1][1:].isnumeric()): + val = int(args[len(args)-1][1:]) + if (args[len(args)-1][:1] == "+"): + nv = nv + val + if (nv > 6): + nv = 6 + else: + nv = nv - val + if (nv < 0): + nv = 0 + clock[room.room_id, hor] = nv + await aff_hor(room, hor, nv) + elif (len(args) >= 2 and args[0] == "del"): + # Supprime une horloge + args.pop(0) + del clock[room.room_id, ' '.join(args)] + else: + await msg(room,"Utilisation : \n- !horloge : Affiche les horloges. \n- !horloge : Place ou crée l'horloge au niveau spécifié.\n- !horloge del : Supprime l'horloge.",getUser(message)) + +async def reponses(room, phrases, content=False): # Afficher une réponse aléatoire dans la liste + i = random.randrange(0,len(phrases)) + await msg(room,phrases[i],"reponses",content) + +async def biere(room,message): # Gestion des boissons + global modules + try: + rmod = modules[room.room_id, 'biere'] + except: + modules[room.room_id, 'biere'] = False + power = 0 + if (modules[room.room_id, 'biere']): + sender = getUser(message) + mess = getMessage(message) + lmod = modos[room.room_id] + if (sender in admins or sender in lmod): + power = 1 + global bieres + args = mess.split() + args.pop(0) + breuvages = {} + give = False + elu = "" + envoyeur = getNick(message) + + try: + breuvages = bieres[room.room_id] + except: + breuvages = {} + + if (len(args) > 1 and args[0] == "give"): + give = True + args.pop(0) + submit = " ".join(args).split(":") + elu = submit[0] + if (power == 0): + elu = elu.replace('@room', 'tout le monde') + try: + args = submit[1].split() + except: + args = "" + if (len(args) > 2 and args[0] == "add"): + #ajoute une biere + args.pop(0) + submit = " ".join(args).split(":") + if (len(submit) > 1): + # Ajout de la citation + nick = submit[0].strip() + nick = nick.replace('@room', 'tous') + submit.pop(0) + citation = ":".join(submit) + citation = citation.replace('@room', 'tout le monde') + tps = datetime.now().microsecond + breuvages[nick,tps] = citation + bieres[room.room_id] = breuvages + await msg(room,"Ajout du breuvage " + nick + ":" + citation,event['sender']) + else: + # message d'aide + await msg(room,"!biere add :",sender) + #elif (len(args) > 0 and args[0] == "list"): + # liste les quotes + # args.pop(0) + # salon = verifPMRoom(room,event) + # if (len(args) == 0): + # Liste les breuvages du salon + # reponse = "Voici les reponses du salon " + room.room_id + "\n" + # if (len(room.aliases) > 0): + # reponse = reponse + "(alias : " + room.aliases[0] + "\n" + # for cle,valeur in breuvages.items(): + # reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" + # if (len(reponse) > 500): + # msg(salon,reponse,event['sender']) + # reponse = "" + # msg(salon,reponse,event['sender']) + # elif (args[0] == "all"): + # # tous les breuvages de tous les salons + # reponse = "Les breuvages de tous les salons : " + "\n" + # msg(salon,reponse,event['sender']) + # for rid,fame in bieres.items(): + # reponse = "Voici les reponses du salon " + rid + "\n" + # for cle,valeur in fame.items(): + # reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" + # if (len(reponse) > 500): + # msg(salon,reponse,event['sender']) + # reponse = "" + # msg(salon,reponse,event['sender']) + # else: + # # les breuvages du pseudo spécifié + # nick = " ".join(args) + # reponse = "Voici les reponses du breuvage " + nick + "\n" + # for cle,valeur in breuvages.items(): + # if (cle[0] == nick): + # reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" + # msg(salon,reponse,event['sender']) + elif (len(args) > 1 and args[0] == "del"): + # salon = verifPMRoom(room,event) + salon = room.room_id + lmod = modos[room.room_id] + if (sender in admins): + id = args[1] + reponse = "Voici le breuvage supprimé : \n" + for rid,fame in bieres.items(): + for cle,valeur in fame.items(): + if (str(cle[1]) == id): + del fame[cle[0],cle[1]] + reponse = reponse + rid + " / " + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" + break + await msg(salon,reponse,sender) + elif (sender in lmod): + id = args[1] + reponse = "Voici le breuvage supprimé : \n" + rid = room.room_id + fame = bieres[rid] + for cle,valeur in fame.items(): + if (str(cle[1]) == id): + del fame[cle[0],cle[1]] + reponse = reponse + rid + " / " + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" + break + await msg(salon,reponse,sender) + else: + await msg(salon,"Vous n'êtes pas autorisés à supprimer des breuvages.",sender) + elif (len(args) > 0): + # cite une reponse d'un breuvage precis + nick = " ".join(args) + phrases = [] + for cle,valeur in breuvages.items(): + if (cle[0] == nick): + if (give): + phrases.append(valeur + " pour " + elu + " de la part de " + envoyeur) + else: + phrases.append(valeur + " pour " + envoyeur) + if (len(phrases) > 0 ): + await reponses(room,phrases) + else: + await msg(room,"Je n'ai pas de " + nick + " en stock!",sender) + else: + # cite une réponse d'un breuvage aleatoire + phrases = [] + for cle,valeur in breuvages.items(): + if (give): + phrases.append(valeur + " pour " + elu + " de la part de " + envoyeur) + else: + phrases.append(valeur + " pour " + envoyeur) + if (len(phrases) > 0 ): + await reponses(room,phrases) + else: + await msg(room,"Je n'ai pas de breuvages pour ce salon",event['sender']) + +async def boissons(room,message): # Gestion des alias de boissons + global modules + try: + rmod = modules[room.room_id, 'biere'] + except: + modules[room.room_id, 'biere'] = False + if (modules[room.room_id, 'biere']): + sender = getUser(message) + mess = getMessage(message) + boisson = "" + elu = "" + + args = mess.split() + try: + boisson = args[0][1:] + except: + boisson = "" + args.pop(0) + + if (len(args) > 0): + elu = " ".join(args) + + if (len(elu) > 0 and len(boisson) > 0): + mess = "!biere give " + elu + ":" + boisson + elif (len(elu) > 0): + mess = "!biere give " + elu + elif (len(boisson) > 0): + mess = "!biere " + boisson + else: + mess = "!biere" + message = sender + " : " + mess + await biere(room,message) + +async def salon(room,message): # Gestion des listes de salons recommandes + global modules + try: + rmod = modules[room.room_id, 'salon'] + except: + modules[room.room_id, 'salon'] = False + if (modules[room.room_id, 'salon']): + sender = getUser(message) + mess = getMessage(message) + global salons + args = mess.split() + args.pop(0) + famous = {} + try: + famous = salons[room.room_id] + except: + famous = {} + + if (len(args) > 3 and args[0] == "add"): + #ajoute un salon recommande + ref = "" + desc = "" + args.pop(0) + if (args[0] == "desc"): + args.pop(0) + ref = "desc" + desc = " ".join(args) + else: + ref = args[0] + args.pop(0) + desc = " ".join(args) + famous[ref] = desc + salons[room.room_id] = famous + await msg(room,"Ajout du salon " + ref + " : " + desc,sender) + elif (len(args) > 1 and args[0] == "del"): + #salon = verifPMRoom(room,event) + salon = room.room_id + lmod = modos[room.room_id] + if (sender in admins): + id = args[1] + reponse = "Voici le salon supprimé : \n" + rid = room.room_id + fame = salons[rid] + for cle,valeur in fame.items(): + if (str(cle) == id): + del fame[cle] + reponse = reponse + rid + " / " + cle + " : " + valeur + "\n" + break + await msg(room,reponse,sender) + elif (sender in lmod): + id = args[1] + reponse = "Voici le salon supprimé : \n" + rid = room.room_id + fame = salons[rid] + for cle,valeur in fame.items(): + if (str(cle) == id): + del fame[cle] + reponse = reponse + rid + " / " + cle + " : " + valeur + "\n" + break + await msg(room,reponse,sender) + else: + await msg(salon,"Vous n'êtes pas autorisés à supprimer des salons.",sender) + elif (len(args) > 0): + # cite un salon precis + ref = args[0] + trouve = 0 + for cle,valeur in famous.items(): + if (cle == ref): + await msg(salon,cle + " : " + valeur,sender) + trouve = 1 + break + if (trouve == 0): + await msg(room,"Je n'ai pas de salons nomme " + ref,sender) + else: + # cite tous les salons + reponse = "" + trouve = 0 + if ("desc" in famous): + reponse = reponse + famous["desc"] + "\n" + for cle,valeur in famous.items(): + if (cle != "desc"): + reponse = reponse + cle + " : " + valeur + "\n" + trouve = 1 + if (trouve == 0): + await msg(room,"Je n'ai pas de salons recommandes pour ce salon",sender) + else: + await msg(room,reponse,sender) + +async def accueil(room,message): # Mettre un message d'accueil + global modules + try: + rmod = modules[room.room_id, 'welcome'] + except: + modules[room.room_id, 'welcome'] = False + if (modules[room.room_id, 'welcome']): + sender = getUser(message) + mess = getMessage(message) + lmod = modos[room.room_id] + if (sender in admins or sender in lmod): + global welcome + args = mess.split() + args.pop(0) + reponse = " ".join(args) + if (len(args) > 0): + welcome[room.room_id] = reponse + await msg(room,"Le message d'accueil est désormais : " + reponse,sender) + + else: + await msg(salon,"Vous n'êtes pas autorisés à modifier le message d'accueil.",sender) + +async def bienvenue(room,message): # Affichage d'un message d'accueil aux nouveaux venus + global modules + try: + rmod = modules[room.room_id, 'welcome'] + except: + modules[room.room_id, 'welcome'] = False + if (modules[room.room_id, 'welcome']): + sender = message.sender + nick = room.user_name(message.state_key) if room.user_name(message.state_key) else message.state_key + membership = message.membership + prev_member = message.prev_membership + + if room.name: + alias = room.name + elif room.canonical_alias: + alias = room.canonical_alias + elif room.names: + alias = room.names[0] + else: + alias = "" + reponse = "" + try: + reponse = welcome[room.room_id] + except: + reponse = "" + if (membership == "join" and prev_member != "join"): + await msg(room,"Bienvenue sur " + alias + ", " + nick + ". " + reponse,sender) + elif (membership == "leave" and prev_member != "leave"): + await msg(room,"Au revoir " + nick + "!",sender) + else: + print("current: " + membership + " prev: " + prev_member) + +@bot.listener.on_custom_event(nio.RoomMemberEvent) +async def callBienvenue(room, message): + match = botlib.MessageMatch(room, message, bot) + if match.is_not_from_this_bot(): + await bienvenue(room, message) + +@bot.listener.on_message_event +async def callAccueil(room, message): + match = botlib.MessageMatch(room, message, bot, PREFIX) + if match.is_not_from_this_bot() and match.prefix() and match.command("accueil"): + await accueil(room, message) + +@bot.listener.on_message_event +async def callSalon(room, message): + match = botlib.MessageMatch(room, message, bot, PREFIX) + if match.is_not_from_this_bot() and match.prefix() and match.command("salon"): + await salon(room, message) + +@bot.listener.on_message_event +async def callBoisson(room, message): + match = botlib.MessageMatch(room, message, bot, "%") + if match.is_not_from_this_bot() and match.prefix(): + await boissons(room, message) + +@bot.listener.on_message_event +async def callBiere(room, message): + match = botlib.MessageMatch(room, message, bot, PREFIX) + if match.is_not_from_this_bot() and match.prefix() and match.command("biere"): + await biere(room, message) + +@bot.listener.on_message_event +async def callHor(room, message): + match = botlib.MessageMatch(room, message, bot, PREFIX) + if match.is_not_from_this_bot() and match.prefix() and match.command("horloge"): + await horloge(room, message) @bot.listener.on_message_event async def callListe(room, message): @@ -736,6 +1233,17 @@ def main(): modules_read() modos_read() + if ('horloge' in liste_mod): + horloge_read() + if ('quote' in liste_mod): + #quotes_read() + citations_read() + if ('biere' in liste_mod): + bieres_read() + if ('salon' in liste_mod): + salons_read() + if ('welcome' in liste_mod): + welcome_read() if __name__ == "__main__": main()