diff --git a/asmodee.py b/asmodee.py index 46a98ef..1acff1f 100755 --- a/asmodee.py +++ b/asmodee.py @@ -13,6 +13,8 @@ import threading import asyncio import nio +from datetime import datetime,timedelta + # Var bot = None PREFIX = '!' @@ -22,6 +24,7 @@ USERNAME = "" admins = [] # Admins du bot modos = {} # Moderateurs des salons modules = {} # Modules activés par salon +prive = {} # Les espaces de message privés du bot avec les utilisateurs liste_mod = [] # Modules disponibles citations = {} #addquote bieres = {} # Boissons a offrir @@ -113,6 +116,15 @@ def modules_read(): modules = loader.load() except: modules = {} + +def prive_read(): + global prive + try: + with open("prive", "rb") as fichier: + loader = pickle.Unpickler(fichier) + prive = loader.load() + except: + prive = {} def save_obj(room=None, event=None): with open("moderateurs", "wb") as fichier: @@ -121,6 +133,9 @@ def save_obj(room=None, event=None): with open("modules", "wb") as fichier: saver = pickle.Pickler(fichier) saver.dump(modules) + with open("prive", "wb") as fichier: + saver = pickle.Pickler(fichier) + saver.dump(prive) if ('horloge' in liste_mod): with open("horloge", "wb") as fichier: saver = pickle.Pickler(fichier) @@ -618,13 +633,18 @@ def getUser(message): def getNick(room, message): # Obtenir le DisplayName à partir du mxid. sender = getUser(message) - return(room.user_name(sender)) + nick = None + try: + nick = room.user_name(sender).split(' ')[0] + except: + nick = room.user_name(sender) + return(nick) async def msg(room,mess,sender,content=False): try: try: - lmod = modos[room.room_id] - if (sender not in admins and sender not in lmod): + lmod = modos.get(room.room_id) + if (sender not in admins and lmod != None and sender not in lmod): mess = mess.replace('@room', 'tout le monde') except: try: @@ -671,7 +691,7 @@ async def modo(room,message): # Definition d'un moderateur else: await msg(room,"\n".join(lmod),sender) else: - await msg(salon,"Vous n'êtes pas autorisés à définir les modérateurs.",sender) + await msg(room,"Vous n'êtes pas autorisés à définir les modérateurs.",sender) async def module(room,message): # Definition des modules d'un salon lmod = [] @@ -814,6 +834,33 @@ async def horloge(room, message): # Gestion des horloges PBTA 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 verifPMRoom(room, message): # Pour obtenir ou créer un salon pour les messages privés avec l'utilisateur + global prive + nick = "" + sender = "" + sender = getUser(message) + nick = getNick(room, message) + client_id = bot.creds.username.split(':')[0].split('@')[1] + client_host = bot.creds.username.split(':')[1] + room_nick = client_id + "_" + nick + "_b" + salon = None + room_id = prive.get(sender) + if (room_id): + await bot.async_client.room_invite(room_id=room_id, user_id=sender) + new_salon = nio.rooms.MatrixRoom(room_id, client_id) + new_salon.name="Asmodee" + new_salon.topic="Informations d'Asmodee" + new_salon.is_direct=True + return(new_salon) + else: + salon = await bot.async_client.room_create(alias=room_nick, name="Asmodee", topic="Informations d'Asmodee",is_direct=True,invite=[sender]) + if isinstance(salon, nio.responses.RoomCreateError): + print("Impossible de creer : " + room_nick + " pour " + sender) + return(room) + else: + prive[sender]=salon.room_id + return(salon) async def biere(room,message): # Gestion des boissons global modules @@ -825,7 +872,7 @@ async def biere(room,message): # Gestion des boissons if (modules[room.room_id, 'biere']): sender = getUser(message) mess = getMessage(message) - lmod = modos[room.room_id] + lmod = modos.get(room.room_id) if (sender in admins or sender in lmod): power = 1 global bieres @@ -834,7 +881,7 @@ async def biere(room,message): # Gestion des boissons breuvages = {} give = False elu = "" - envoyeur = getNick(message) + envoyeur = getNick(room, message) try: breuvages = bieres[room.room_id] @@ -866,48 +913,56 @@ async def biere(room,message): # Gestion des boissons tps = datetime.now().microsecond breuvages[nick,tps] = citation bieres[room.room_id] = breuvages - await msg(room,"Ajout du breuvage " + nick + ":" + citation,event['sender']) + await msg(room,"Ajout du breuvage " + nick + ":" + citation,sender) else: # message d'aide await msg(room,"!biere add :",sender) - #elif (len(args) > 0 and args[0] == "list"): + elif (len(args) > 0 and args[0] == "list"): # liste les quotes - # args.pop(0) - # salon = verifPMRoom(room,event) - # if (len(args) == 0): + args.pop(0) + salon = await verifPMRoom(room,message) + print(salon) + 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']) + reponse = "Voici les reponses du salon " + room.room_id + "\n" + alias = None + if room.name: + alias = room.name + elif room.canonical_alias: + alias = room.canonical_alias + elif room.names: + alias = room.names[0] + else: + alias = "" + reponse = reponse + "(alias : " + alias + ")\n" + for cle,valeur in breuvages.items(): + reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" + if (len(reponse) > 500): + await msg(salon,reponse,sender) + reponse = "" + await msg(salon,reponse,sender) + elif (args[0] == "all"): + # tous les breuvages de tous les salons + reponse = "Les breuvages de tous les salons : " + "\n" + await msg(salon,reponse,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): + await msg(salon,reponse,sender) + reponse = "" + await msg(salon,reponse,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" + await msg(salon,reponse,sender) elif (len(args) > 1 and args[0] == "del"): - # salon = verifPMRoom(room,event) - salon = room.room_id + salon = await verifPMRoom(room,message) lmod = modos[room.room_id] if (sender in admins): id = args[1] @@ -957,7 +1012,7 @@ async def biere(room,message): # Gestion des boissons if (len(phrases) > 0 ): await reponses(room,phrases) else: - await msg(room,"Je n'ai pas de breuvages pour ce salon",event['sender']) + await msg(room,"Je n'ai pas de breuvages pour ce salon",sender) async def boissons(room,message): # Gestion des alias de boissons global modules @@ -1027,8 +1082,7 @@ async def salon(room,message): # Gestion des listes de salons recommandes 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 + salon = await verifPMRoom(room,message) lmod = modos[room.room_id] if (sender in admins): id = args[1] @@ -1233,6 +1287,7 @@ def main(): modules_read() modos_read() + prive_read() if ('horloge' in liste_mod): horloge_read() if ('quote' in liste_mod):