diff --git a/asmodee.ini b/asmodee.ini index d438f89..1de3f8a 100644 --- a/asmodee.ini +++ b/asmodee.ini @@ -9,6 +9,7 @@ admin = "" liste = roll,quote,biere,stats,liste,horloge,carte,card,cristal,welcome,salut,jdr,gens,va,salon,kick [MAIL] +malt = 0 msender = "user@domain.tld" mpass = "password" msmtp = "smtp" diff --git a/asmodee.py b/asmodee.py index 07987c0..4aaebc7 100755 --- a/asmodee.py +++ b/asmodee.py @@ -12,6 +12,7 @@ import threading import json from datetime import datetime,timedelta import smtplib +import os from matrix_bot_api.matrix_bot_api import MatrixBotAPI from matrix_bot_api.mregex_handler import MRegexHandler @@ -47,6 +48,7 @@ mails = {} # Liste de gens abonnés par mail au salon liste_mod = [] # Modules disponibles USERNAME = "" +malt = 0 msender = "" mpass = "" msmtp = "" @@ -292,8 +294,11 @@ class Parser: #Pour parser la ligne de commande return True return False -def msg(room,msg,content=False): +def msg(room,msg,sender,content=False): try: + lmod = modos[room.room_id] + if (sender not in admins and sender not in lmod): + msg = msg.replace('@room', 'tout le monde') if content: bot.client.api.send_message_event(room.room_id, 'm.room.message', msg, None, None) else: @@ -327,7 +332,7 @@ def verifPMRoom(room, event): # Pour obtenir ou créer un salon pour les message # if alias in salon.aliases: # print("trouvé : " + cle) # print(salon.aliases) - # msg(salon,"gagné") + # msg(salon,"gagné",event['sender']) # return salon # else: # print(salon.aliases) @@ -349,7 +354,7 @@ def verifPMRoom(room, event): # Pour obtenir ou créer un salon pour les message except: print("Impossible de creer ou joindre " + alias) return None - #msg(salon,"nouvelle conversation") + #msg(salon,"nouvelle conversation",event['sender']) # TODO vérifier la présence du sender dans la liste des membres de ce salon et réinviter si besoin try: salon.invite_user(event['sender']) @@ -383,7 +388,7 @@ def card(room, event): # Tirer une carte du paquet sans la retirer modules[room.room_id, 'card'] = False if (modules[room.room_id, 'card']): reponse = cartes_base[random.randrange(0,len(cartes_base))] - msg(room,reponse) + msg(room,reponse,event['sender']) @not_myself def carte(room, event): # Tirer une carte du paquet en la retirant ensuite @@ -397,13 +402,13 @@ def carte(room, event): # Tirer une carte du paquet en la retirant ensuite args = event['content']['body'].split() if (len(args) > 1): cartes=list(cartes_base) - msg(room,"Le paquet est melange") + msg(room,"Le paquet est melange",event['sender']) else: if (len(cartes) < 1): cartes=list(cartes_base) - msg(room,"Le paquet est melange") + msg(room,"Le paquet est melange",event['sender']) i = random.randrange(0,len(cartes)) - msg(room,cartes[i]) + msg(room,cartes[i],event['sender']) cartes.pop(i) @not_myself @@ -420,51 +425,51 @@ def help_center(room,event,name,private): # Aide sur les commandes disponibles salon = verifPMRoom(room,event) if (len(args) > 0): if (re.search("roll", args[0])): - msg(salon,":roll (+-modifs ou des)\n\n- exemple :roll vr4g3 6d6 - \#g\#r3d6 +2 x3 : lance avec les details 6d6 en relancant les des avec un resultat de 4+ et en gardant les trois meilleurs, puis en retranchant 3d6 sans relancer les 4+ et en gardant tout, enfin ajouter 2. L'operation sera executee trois fois.\n\n- v : details (verbose) du jet\n- n : no add, chaque de est traite separement\n- e : explosif, si un de fait le maximum, on le relance et on additionne\n- z : Star Zars, le premier de est explosif. Mais s'il sort un 1, on retire ce 1 et la plus grande valeur des autres des\n- f : difficulte a atteindre par de avec option n\n- g : nombre de des conserves\n- r : relance si le de a obtenu au moins ce nombre\n- m : Enleve un succes si ce nombre ou moins est atteint\n- s : seuil a atteindre et niveaux de reussites\n- w : lance un wild die avec les autres.") + msg(salon,":roll (+-modifs ou des)\n\n- exemple :roll vr4g3 6d6 - \#g\#r3d6 +2 x3 : lance avec les details 6d6 en relancant les des avec un resultat de 4+ et en gardant les trois meilleurs, puis en retranchant 3d6 sans relancer les 4+ et en gardant tout, enfin ajouter 2. L'operation sera executee trois fois.\n\n- v : details (verbose) du jet\n- n : no add, chaque de est traite separement\n- e : explosif, si un de fait le maximum, on le relance et on additionne\n- z : Star Zars, le premier de est explosif. Mais s'il sort un 1, on retire ce 1 et la plus grande valeur des autres des\n- f : difficulte a atteindre par de avec option n\n- g : nombre de des conserves\n- r : relance si le de a obtenu au moins ce nombre\n- m : Enleve un succes si ce nombre ou moins est atteint\n- s : seuil a atteindre et niveaux de reussites\n- w : lance un wild die avec les autres.",event['sender']) elif (re.search("sw", args[0])): - msg(salon,"- :sw : Lance les des en mode Savage Worlds\nVerbose/Noadd/Explosif/Seuil 4/Niveau de reussite 4/Wild Die d6.") + msg(salon,"- :sw : Lance les des en mode Savage Worlds\nVerbose/Noadd/Explosif/Seuil 4/Niveau de reussite 4/Wild Die d6.",event['sender']) elif (re.search("dom", args[0])): - msg(salon,"- :dom : Lance les dommages en mode Savage Worlds\nVerbose/Explosif/seuil 4/Niveau de reussite 4.") + msg(salon,"- :dom : Lance les dommages en mode Savage Worlds\nVerbose/Explosif/seuil 4/Niveau de reussite 4.",event['sender']) elif (re.search("owod", args[0])): - msg(salon,"- :owod : Lance les des en mode Ancien Monde des Tenebres\nVerbose/Noadd/Difficulte 6/Relance les 10/Les 1 enleve un succes.") + msg(salon,"- :owod : Lance les des en mode Ancien Monde des Tenebres\nVerbose/Noadd/Difficulte 6/Relance les 10/Les 1 enleve un succes.",event['sender']) elif (re.search("wod", args[0])): - msg(salon,"- :wod : Lance les des en mode Nouveau Monde des Tenebres\nVerbose/Noadd/Difficulte 8/Relance les 10.") + msg(salon,"- :wod : Lance les des en mode Nouveau Monde des Tenebres\nVerbose/Noadd/Difficulte 8/Relance les 10.",event['sender']) elif (re.search("ars", args[0])): - msg(salon,"- :ars : Lance les des en mode Ars Magicka : de de tension\nVerbose/Noadd/Sur un 1, on relance et on double.") + msg(salon,"- :ars : Lance les des en mode Ars Magicka : de de tension\nVerbose/Noadd/Sur un 1, on relance et on double.",event['sender']) elif (re.search("des", args[0])): - msg(salon,"- :des : Lance des des de desastre\nVerbose/Noadd/Difficulte 10.") + msg(salon,"- :des : Lance des des de desastre\nVerbose/Noadd/Difficulte 10.",event['sender']) elif (re.search("star", args[0])): - msg(salon,"- :star : Lance des des en mode star wars. Le premier de est explosif. Mais s'il sort un 1, on retire ce 1 et la plus grande valeur des autres des.") + msg(salon,"- :star : Lance des des en mode star wars. Le premier de est explosif. Mais s'il sort un 1, on retire ce 1 et la plus grande valeur des autres des.",event['sender']) elif (re.search("carte", args[0])): - msg(salon,"- !carte : Tire une carte et la retire du paquet\n- !carte m : remelange le paquet.") + msg(salon,"- !carte : Tire une carte et la retire du paquet\n- !carte m : remelange le paquet.",event['sender']) elif (re.search("card", args[0])): - msg(salon,"- !card : tire une carte sans la retirer du paquet.") + msg(salon,"- !card : tire une carte sans la retirer du paquet.",event['sender']) elif (re.search("liste", args[0])): - msg(salon,"- !liste [Nombre d'elements souhaites] : retourne ce nombre d'elements de la liste.") + msg(salon,"- !liste [Nombre d'elements souhaites] : retourne ce nombre d'elements de la liste.",event['sender']) elif (re.search("horloge", args[0])): - msg(salon,"- !horloge : Affiche les horloges\n- !horloge : Crée ou modifie une horloge en lui mettant un niveau (normalement de 0 à 6)\n- !horloge del : Supprime cette horloge.") + msg(salon,"- !horloge : Affiche les horloges\n- !horloge : Crée ou modifie une horloge en lui mettant un niveau (normalement de 0 à 6)\n- !horloge del : Supprime cette horloge.",event['sender']) elif (re.search("last", args[0])): - msg(salon,"- !last : Date de son dernier post\n- !last : Date du dernier post de la personne\n") + msg(salon,"- !last : Date de son dernier post\n- !last : Date du dernier post de la personne\n",event['sender']) elif (re.search("actif", args[0])): - msg(salon,"- !actif : Nombre de ses messages et taille moyenne de ceux ci\n- !actif : Nombre des messages de cette personne et taille moyenne de ceux ci\n") + msg(salon,"- !actif : Nombre de ses messages et taille moyenne de ceux ci\n- !actif : Nombre des messages de cette personne et taille moyenne de ceux ci\n",event['sender']) elif (re.search("quote", args[0])): - msg(salon,"- !quote : Affiche une citation du salon au hasard\n- !quote : Affiche une citation d'une personne du salon au hasard\n- !quote add : : Enregistre une citation\n- !quote list [Personne] : Affiche les citation du salon ou d'une personne du salon en message privé\n- !quote list all : Affiche toutes les citations de tous les salons en message privé\n- !quote del : Supprime la citation avec l'id spécifié") + msg(salon,"- !quote : Affiche une citation du salon au hasard\n- !quote : Affiche une citation d'une personne du salon au hasard\n- !quote add : : Enregistre une citation\n- !quote list [Personne] : Affiche les citation du salon ou d'une personne du salon en message privé\n- !quote list all : Affiche toutes les citations de tous les salons en message privé\n- !quote del : Supprime la citation avec l'id spécifié",event['sender']) elif (re.search("biere", args[0])): - msg(salon,"- !biere : Fournit une boisson du salon au hasard\n- !biere : Fournit une boisson spécifique du salon\n- !biere give [:Nom du Breuvage] : Offre une boisson (spécifique en option) à la personne spécifiée\n- !biere add : : Enregistre une phrase pour ce breuvage\n- !biere list [Nom de Breuvage] : Affiche les phrases des breuvages du salon ou celles d'un breuvage spécifique du salon en message privé\n- !biere list all : Affiche toutes les citations de tous breuvages de tous les salons en message privé\n- !biere del : Supprime la phrase avec l'id spécifié") + msg(salon,"- !biere : Fournit une boisson du salon au hasard\n- !biere : Fournit une boisson spécifique du salon\n- !biere give [:Nom du Breuvage] : Offre une boisson (spécifique en option) à la personne spécifiée\n- !biere add : : Enregistre une phrase pour ce breuvage\n- !biere list [Nom de Breuvage] : Affiche les phrases des breuvages du salon ou celles d'un breuvage spécifique du salon en message privé\n- !biere list all : Affiche toutes les citations de tous breuvages de tous les salons en message privé\n- !biere del : Supprime la phrase avec l'id spécifié",event['sender']) elif (re.search("accueil", args[0])): - msg(salon,"- !accueil : Modifie le message d'accueil avec message. Il sera affiché à tout nouvel arrivant précédé de la mention 'Bienvenue sur le salon XXX, YYY.'") + msg(salon,"- !accueil : Modifie le message d'accueil avec message. Il sera affiché à tout nouvel arrivant précédé de la mention 'Bienvenue sur le salon XXX, YYY.'",event['sender']) elif (re.search("kick", args[0])): - msg(salon,"- !kick <@mxid> [@mxid] ... : kick les users listés") + msg(salon,"- !kick <@mxid> [@mxid] ... : kick les users listés",event['sender']) elif (re.search("mails", args[0]) or re.search("mail", args[0])): - msg(salon,"- !mail add : s'abonner aux messages du salon par mail.\n -!mail del : se désabonner aux messages du salon par mail.") + msg(salon,"- !mail add : s'abonner aux messages du salon par mail.\n -!mail del : se désabonner aux messages du salon par mail.",event['sender']) elif (re.search("modo", args[0])): - msg(salon,"- !modo : Affiche la liste des modérateurs (ils peuvent gérer le message d'accueil, supprimer des citations ou des boissons, ajouter/retirer des modules, ajouter/retirer des modérateurs)\n- !modo add : Ajoute une personne comme modérateur du salon\n- !modo del : Retire une personne des modérateurs.") + msg(salon,"- !modo : Affiche la liste des modérateurs (ils peuvent gérer le message d'accueil, supprimer des citations ou des boissons, ajouter/retirer des modules, ajouter/retirer des modérateurs)\n- !modo add : Ajoute une personne comme modérateur du salon\n- !modo del : Retire une personne des modérateurs.",event['sender']) elif (re.search("module", args[0])): - 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- !modo del : Désactive un module sur le salon.") + 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- !modo del : Désactive un module sur le salon.",event['sender']) elif (re.search("cristal", args[0])): - 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.") + 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.",event['sender']) else: - msg(salon,"A venir") + msg(salon,"A venir",event['sender']) else: rid = room.room_id message = "Commandes disponibles:" @@ -494,7 +499,7 @@ def help_center(room,event,name,private): # Aide sur les commandes disponibles 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" - msg(salon,message) + msg(salon,message,event['sender']) def roll(result,type,explosif,nb,f,noadd,ars,relance,mitige): # Lancement d'un dé # verif type et contenu params? @@ -631,7 +636,7 @@ def entryPoint(room, event): # Analyse des commandes ":", point d'entrée pour l if (not parser.arg.get("error",None) and not parser.eat("$",0)): parser.arg["noerror"] = True - msg(room,"Je n'ai pas compris " + text) + msg(room,"Je n'ai pas compris " + text,event['sender']) def rollOptionPoint(): # Parse des options @@ -812,10 +817,10 @@ def rollPlusMoinsPoint(): # Gérer les bloc du jet séparés par les + et -, aff tmp = (res1 - s) // d + 1 result += ("/" + ("0" if (tmp < 0) else str(tmp))) if (s != 0) else "" parser.arg["jet"] = jet - msg(parser.room,parser.nick + " rolls " + ("e" if exp else "") + ("n" if noa else "") + ("v" if ver else "") + ("a" if ars else "") + ("s"+str(s)+"/"+str(d) if (s != 0) else "") + (" " if (exp or noa or ver or s != 0) else "") + result) + msg(parser.room,parser.nick + " rolls " + ("e" if exp else "") + ("n" if noa else "") + ("v" if ver else "") + ("a" if ars else "") + ("s"+str(s)+"/"+str(d) if (s != 0) else "") + (" " if (exp or noa or ver or s != 0) else "") + result, "dice") elif (not parser.arg.get("noerror",False)): - msg(parser.room,"match = " + parser.mtch + "\nstr = " + parser.str) - msg(parser.room,"Rien compris. Essayez '!help' pour obtenir de l'aide.") + msg(parser.room,"match = " + parser.mtch + "\nstr = " + parser.str, "dice") + msg(parser.room,"Rien compris. Essayez '!help' pour obtenir de l'aide.", "dice") def rollEntityPoint(): # Parser les séparateurs de bloc + et - @@ -866,7 +871,7 @@ def rollTypePoint(): # Parser le nombre de faces du dé def reponses(room, phrases, content=False): # Afficher une réponse aléatoire dans la liste i = random.randrange(0,len(phrases)) - msg(room,phrases[i],content) + msg(room,phrases[i],content, "reponses") @not_myself def jdr(room, event): @@ -954,9 +959,9 @@ def liste(room, event): # Afficher un élement aléatoire d'une liste fournie for i in range(nb): id = random.randrange(0,len(list)) res.append(list.pop(id)) - msg(room,nick + " obtient :\n" + '\n'.join(res)) + msg(room,nick + " obtient :\n" + '\n'.join(res),event['sender']) else: - msg(room,"Utilisation : !liste [nombre d elements]") + msg(room,"Utilisation : !liste [nombre d elements]",event['sender']) @not_myself def cristal(room, event): # Affiche une réponse à une question posée @@ -971,7 +976,7 @@ def cristal(room, event): # Affiche une réponse à une question posée args = event['content']['body'].split() args.pop(0) if (len(args) < 2 or args[len(args)-1][-1] != '?'): - msg(room,"Utilisation : !cristal ") + msg(room,"Utilisation : !cristal ",event['sender']) else: args[len(args)-1] = args[len(args)-1][0:-1] conj = args[0] @@ -1038,21 +1043,21 @@ def cristal(room, event): # Affiche une réponse à une question posée def aff_hor(room, hor, valeur): # affichage des horloges if (int(valeur) == 0): - msg(room,hor + " : " + chr(128320) + "\n") + msg(room,hor + " : " + chr(128320) + "\n", "horloge") elif (int(valeur) == 1): - msg(room,hor + " : " + chr(128338) + "\n") + msg(room,hor + " : " + chr(128338) + "\n", "horloge") elif (int(valeur) == 2): - msg(room,hor + " : " + chr(128341) + "\n") + msg(room,hor + " : " + chr(128341) + "\n", "horloge") elif (int(valeur) == 3): - msg(room,hor + " : " + chr(128344) + "\n") + msg(room,hor + " : " + chr(128344) + "\n", "horloge") elif (int(valeur) == 4): - msg(room,hor + " : " + chr(128345) + "\n") + msg(room,hor + " : " + chr(128345) + "\n", "horloge") elif (int(valeur) == 5): - msg(room,hor + " : " + chr(128346) + "\n") + msg(room,hor + " : " + chr(128346) + "\n", "horloge") elif (int(valeur) == 6): - msg(room,hor + " : " + chr(128347) + "\n") + msg(room,hor + " : " + chr(128347) + "\n", "horloge") else: - msg(room,hor + " : " + str(valeur) + " \n") + msg(room,hor + " : " + str(valeur) + " \n", "horloge") @not_myself def horloge(room, event): # Gestion des horloges PBTA @@ -1099,7 +1104,7 @@ def horloge(room, event): # Gestion des horloges PBTA args.pop(0) del clock[room.room_id, ' '.join(args)] else: - 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.") + 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.",event['sender']) @not_myself def statistiques(room,event): # Enregistrement des statistiques @@ -1190,7 +1195,7 @@ def last(room,event): # Regarde la dernière fois que quelqu'un a écrit un mess for user,usrstats in all_usr.items(): if ((max_sign == "+" and usrstats.date < ref_duree) or ((max_sign == "-" and usrstats.date > ref_duree))): reponse += "- " + usrstats.nick + "(" + user + ")" + " le " + usrstats.date.strftime("%Y-%m-%d %H:%M:%S") + "\n" - msg(salon, reponse) + msg(salon, reponse,event['sender']) elif (len(args) >= 1 and args[0] == "inactifs"): max_sign = "+" max_duree = 0 @@ -1211,7 +1216,7 @@ def last(room,event): # Regarde la dernière fois que quelqu'un a écrit un mess for user,usrstats in all_usr.items(): if (((max_sign == "+" and usrstats.date < ref_duree) or ((max_sign == "-" and usrstats.date > ref_duree))) and usrstats.mess <= max_mess): reponse += "- " + usrstats.nick + "(" + user + ")" + " le " + usrstats.date.strftime("%Y-%m-%d %H:%M:%S") + "\n" - msg(salon, reponse) + msg(salon, reponse,event['sender']) else: if (len(args) == 0): pers = getNick(room,event) @@ -1219,12 +1224,12 @@ def last(room,event): # Regarde la dernière fois que quelqu'un a écrit un mess pers=" ".join(args) try: usrstats = stats[room.room_id,pers] - msg(room,"J'ai vu " + usrstats.nick + " poster pour la derniere fois le " + usrstats.date.strftime("%Y-%m-%d %H:%M:%S")) + msg(room,"J'ai vu " + usrstats.nick + " poster pour la derniere fois le " + usrstats.date.strftime("%Y-%m-%d %H:%M:%S"),event['sender']) except: - msg(room,pers + " : Personne non reconnue") + msg(room,pers + " : Personne non reconnue",event['sender']) #for cle,valeur in stats.items(): # if (cle[0] == room.room_id): - # msg(room,cle[1] + "\n") + # msg(room,cle[1] + "\n",event['sender']) @not_myself @@ -1251,7 +1256,7 @@ def actif(room,event): # Stats d'activité d'une personne if us.user not in dupli_check: dupli_check.append(us.user) reponse = reponse + us.nick + " : " + str(us.mess) + "\n" - msg(salon,reponse) + msg(salon,reponse,event['sender']) else: pers = "" if (len(args) == 0): @@ -1261,9 +1266,9 @@ def actif(room,event): # Stats d'activité d'une personne try: usrstats = stats[room.room_id,pers] moy = "{:10.2f}".format(usrstats.char / usrstats.mess) - msg(room,usrstats.nick + " a poste " + str(usrstats.mess) + " messages avec une moyenne de " + moy + " caracteres par message") + msg(room,usrstats.nick + " a poste " + str(usrstats.mess) + " messages avec une moyenne de " + moy + " caracteres par message",event['sender']) except: - msg(room,pers + " : Personne non reconnue\n") + msg(room,pers + " : Personne non reconnue\n",event['sender']) @not_myself def nb_kap(room,event): @@ -1284,15 +1289,15 @@ def nb_kap(room,event): try: usrstats = stats[room.room_id,pers] if (usrstats.kapoue < 10): - msg(room,usrstats.nick + " a crié " + str(usrstats.kapoue) + " KAPOUE!") + msg(room,usrstats.nick + " a crié " + str(usrstats.kapoue) + " KAPOUE!",event['sender']) elif (usrstats.kapoue < 50): - msg(room,usrstats.nick + " a crié " + str(usrstats.kapoue) + " KAPOUE! Pendez le!") + msg(room,usrstats.nick + " a crié " + str(usrstats.kapoue) + " KAPOUE! Pendez le!",event['sender']) elif (usrstats.kapoue < 150): - msg(room,usrstats.nick + " a crié " + str(usrstats.kapoue) + " KAPOUE! Brûlez le vif!") + msg(room,usrstats.nick + " a crié " + str(usrstats.kapoue) + " KAPOUE! Brûlez le vif!",event['sender']) else: - msg(room,usrstats.nick + " a crié " + str(usrstats.kapoue) + " KAPOUE! Faites le manger par des fourmis! Pauvres bêtes...") + msg(room,usrstats.nick + " a crié " + str(usrstats.kapoue) + " KAPOUE! Faites le manger par des fourmis! Pauvres bêtes...",event['sender']) except: - msg(room,pers + " : Personne non reconnue\n") + msg(room,pers + " : Personne non reconnue\n",event['sender']) @not_myself def quote(room,event): # Gestion des citations @@ -1323,10 +1328,10 @@ def quote(room,event): # Gestion des citations tps = datetime.now().microsecond famous[nick,tps] = citation quotes[room.room_id] = famous - msg(room,"Ajout de la citation de " + nick + ":" + citation) + msg(room,"Ajout de la citation de " + nick + ":" + citation,event['sender']) else: # message d'aide - msg(room,"!quote add :") + msg(room,"!quote add :",event['sender']) elif (len(args) > 0 and args[0] == "list"): # liste les quotes args.pop(0) @@ -1339,21 +1344,21 @@ def quote(room,event): # Gestion des citations for cle,valeur in famous.items(): reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" if (len(reponse) > 500): - msg(salon,reponse) + msg(salon,reponse,event['sender']) reponse = "" - msg(salon,reponse) + msg(salon,reponse,event['sender']) elif (args[0] == "all"): # toutes les quotes de tous les salons reponse = "Les citations de tous les salons : " + "\n" - msg(salon,reponse) + msg(salon,reponse,event['sender']) for rid,fame in quotes.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) + msg(salon,reponse,event['sender']) reponse = "" - msg(salon,reponse) + msg(salon,reponse,event['sender']) else: # les quotes du pseudo spécifié nick = " ".join(args) @@ -1361,7 +1366,7 @@ def quote(room,event): # Gestion des citations for cle,valeur in famous.items(): if (cle[0] == nick): reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" - msg(salon,reponse) + msg(salon,reponse,event['sender']) elif (len(args) > 1 and args[0] == "del"): salon = verifPMRoom(room,event) lmod = modos[room.room_id] @@ -1374,7 +1379,7 @@ def quote(room,event): # Gestion des citations del fame[cle[0],cle[1]] reponse = reponse + rid + " / " + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" break - msg(salon,reponse) + msg(salon,reponse,event['sender']) elif (event['sender'] in lmod): id = args[1] reponse = "Voici la citation supprimée : \n" @@ -1385,9 +1390,9 @@ def quote(room,event): # Gestion des citations del fame[cle[0],cle[1]] reponse = reponse + rid + " / " + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" break - msg(salon,reponse) + msg(salon,reponse,event['sender']) else: - msg(salon,"Vous n'êtes pas autorisés à supprimer des citations.") + msg(salon,"Vous n'êtes pas autorisés à supprimer des citations.",event['sender']) elif (len(args) > 0): # cite une quote d'une personne precise nick = " ".join(args) @@ -1398,7 +1403,7 @@ def quote(room,event): # Gestion des citations if (len(phrases) > 0 ): reponses(room,phrases) else: - msg(room,"Je n'ai pas de citations pour " + nick) + msg(room,"Je n'ai pas de citations pour " + nick,event['sender']) else: # cite une quote aleatoire phrases = [] @@ -1407,7 +1412,7 @@ def quote(room,event): # Gestion des citations if (len(phrases) > 0 ): reponses(room,phrases) else: - msg(room,"Je n'ai pas de citations pour ce salon") + msg(room,"Je n'ai pas de citations pour ce salon",event['sender']) @not_myself def salon(room,event): # Gestion des listes de salons recommandes @@ -1441,7 +1446,7 @@ def salon(room,event): # Gestion des listes de salons recommandes desc = " ".join(args) famous[ref] = desc salons[room.room_id] = famous - msg(room,"Ajout du salon " + ref + " : " + desc) + msg(room,"Ajout du salon " + ref + " : " + desc,event['sender']) elif (len(args) > 1 and args[0] == "del"): salon = verifPMRoom(room,event) lmod = modos[room.room_id] @@ -1455,7 +1460,7 @@ def salon(room,event): # Gestion des listes de salons recommandes del fame[cle] reponse = reponse + rid + " / " + cle + " : " + valeur + "\n" break - msg(room,reponse) + msg(room,reponse,event['sender']) elif (event['sender'] in lmod): id = args[1] reponse = "Voici le salon supprimé : \n" @@ -1466,20 +1471,20 @@ def salon(room,event): # Gestion des listes de salons recommandes del fame[cle] reponse = reponse + rid + " / " + cle + " : " + valeur + "\n" break - msg(room,reponse) + msg(room,reponse,event['sender']) else: - msg(salon,"Vous n'êtes pas autorisés à supprimer des salons.") + msg(salon,"Vous n'êtes pas autorisés à supprimer des salons.",event['sender']) elif (len(args) > 0): # cite un salon precis ref = args[0] trouve = 0 for cle,valeur in famous.items(): if (cle == ref): - msg(salon,cle + " : " + valeur) + msg(salon,cle + " : " + valeur,event['sender']) trouve = 1 break if (trouve == 0): - msg(room,"Je n'ai pas de salons nomme " + ref) + msg(room,"Je n'ai pas de salons nomme " + ref,event['sender']) else: # cite tous les salons reponse = "" @@ -1491,9 +1496,9 @@ def salon(room,event): # Gestion des listes de salons recommandes reponse = reponse + cle + " : " + valeur + "\n" trouve = 1 if (trouve == 0): - msg(room,"Je n'ai pas de salons recommandes pour ce salon") + msg(room,"Je n'ai pas de salons recommandes pour ce salon",event['sender']) else: - msg(room,reponse) + msg(room,reponse,event['sender']) @not_myself def addquote(room,event): # enregistrer les citations mode reponses matrix @@ -1539,7 +1544,7 @@ def addquote(room,event): # enregistrer les citations mode reponses matrix # enregistrement de la citation famous[auteur,tps] = content citations[room.room_id] = famous - msg(room,"Ajout de la citation de " + auteur + ":") + msg(room,"Ajout de la citation de " + auteur + ":",event['sender']) bot.client.api.send_message_event(room.room_id, 'm.room.message', content, None, None) @not_myself @@ -1568,7 +1573,7 @@ def showquote(room, event): # afficher les citations mode reponse matrix if (len(phrases) > 0 ): reponses(room,phrases,True) else: - msg(room,"Je n'ai pas de citations pour " + nick) + msg(room,"Je n'ai pas de citations pour " + nick,event['sender']) else: # cite une quote aleatoire phrases = [] @@ -1577,7 +1582,7 @@ def showquote(room, event): # afficher les citations mode reponse matrix if (len(phrases) > 0 ): reponses(room,phrases,True) else: - msg(room,"Je n'ai pas de citations pour ce salon") + msg(room,"Je n'ai pas de citations pour ce salon",event['sender']) @not_myself def biere(room,event): # Gestion des boissons @@ -1629,10 +1634,10 @@ def biere(room,event): # Gestion des boissons tps = datetime.now().microsecond breuvages[nick,tps] = citation bieres[room.room_id] = breuvages - msg(room,"Ajout du breuvage " + nick + ":" + citation) + msg(room,"Ajout du breuvage " + nick + ":" + citation,event['sender']) else: # message d'aide - msg(room,"!biere add :") + msg(room,"!biere add :",event['sender']) elif (len(args) > 0 and args[0] == "list"): # liste les quotes args.pop(0) @@ -1645,21 +1650,21 @@ def biere(room,event): # Gestion des boissons for cle,valeur in breuvages.items(): reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" if (len(reponse) > 500): - msg(salon,reponse) + msg(salon,reponse,event['sender']) reponse = "" - msg(salon,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) + 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) + msg(salon,reponse,event['sender']) reponse = "" - msg(salon,reponse) + msg(salon,reponse,event['sender']) else: # les breuvages du pseudo spécifié nick = " ".join(args) @@ -1667,7 +1672,7 @@ def biere(room,event): # Gestion des boissons for cle,valeur in breuvages.items(): if (cle[0] == nick): reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" - msg(salon,reponse) + msg(salon,reponse,event['sender']) elif (len(args) > 1 and args[0] == "del"): salon = verifPMRoom(room,event) lmod = modos[room.room_id] @@ -1680,7 +1685,7 @@ def biere(room,event): # Gestion des boissons del fame[cle[0],cle[1]] reponse = reponse + rid + " / " + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" break - msg(salon,reponse) + msg(salon,reponse,event['sender']) elif (event['sender'] in lmod): id = args[1] reponse = "Voici le breuvage supprimé : \n" @@ -1691,9 +1696,9 @@ def biere(room,event): # Gestion des boissons del fame[cle[0],cle[1]] reponse = reponse + rid + " / " + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n" break - msg(salon,reponse) + msg(salon,reponse,event['sender']) else: - msg(salon,"Vous n'êtes pas autorisés à supprimer des breuvages.") + msg(salon,"Vous n'êtes pas autorisés à supprimer des breuvages.",event['sender']) elif (len(args) > 0): # cite une reponse d'un breuvage precis nick = " ".join(args) @@ -1707,7 +1712,7 @@ def biere(room,event): # Gestion des boissons if (len(phrases) > 0 ): reponses(room,phrases) else: - msg(room,"Je n'ai pas de " + nick + " en stock!") + msg(room,"Je n'ai pas de " + nick + " en stock!",event['sender']) else: # cite une réponse d'un breuvage aleatoire phrases = [] @@ -1719,7 +1724,7 @@ def biere(room,event): # Gestion des boissons if (len(phrases) > 0 ): reponses(room,phrases) else: - msg(room,"Je n'ai pas de breuvages pour ce salon") + msg(room,"Je n'ai pas de breuvages pour ce salon",event['sender']) @not_myself def boissons(room,event): # Gestion des alias de boissons @@ -1769,10 +1774,10 @@ def accueil(room,event): # Mettre un message d'accueil reponse = " ".join(args) if (len(args) > 0): welcome[room.room_id] = reponse - msg(room,"Le message d'accueil est désormais : " + reponse) + msg(room,"Le message d'accueil est désormais : " + reponse,event['sender']) else: - msg(salon,"Vous n'êtes pas autorisés à modifier le message d'accueil.") + msg(salon,"Vous n'êtes pas autorisés à modifier le message d'accueil.",event['sender']) def bienvenue(event): # Affichage d'un message d'accueil aux nouveaux venus room_id = event['room_id'] @@ -1801,7 +1806,7 @@ def bienvenue(event): # Affichage d'un message d'accueil aux nouveaux venus except: reponse = "" if (membership == "join" and prev_member != "join"): - msg(room,"Bienvenue sur " + alias + ", " + nick + ". " + reponse) + msg(room,"Bienvenue sur " + alias + ", " + nick + ". " + reponse,event['sender']) @not_myself def addmails(room,event): # Abonnements mail aux messages @@ -1826,9 +1831,9 @@ def addmails(room,event): # Abonnements mail aux messages if (not mail in lmails): lmails.append(mail) mails[room.room_id] = lmails - msg(room,mail + " recevra des mails.") + msg(room,mail + " recevra des mails.",event['sender']) else: - msg(room,mail + " reçoit déjà des mails.") + msg(room,mail + " reçoit déjà des mails.",event['sender']) elif (len(args) > 1 and args[0] == "del"): args.pop(0) mail = args[0] @@ -1836,13 +1841,13 @@ def addmails(room,event): # Abonnements mail aux messages place = lmails.index(mail) del lmails[place] mails[room.room_id] = lmails - msg(room,mail + " ne recevra plus de mails.") + msg(room,mail + " ne recevra plus de mails.",event['sender']) else: - msg(room,mail + " ne reçoit pas de mails.") + msg(room,mail + " ne reçoit pas de mails.",event['sender']) else: - msg(room,"\n".join(lmails)) + msg(room,"\n".join(lmails),event['sender']) else: - msg(salon,"Vous n'êtes pas autorisés à définir les réceptions de mails pour ce salon.") + msg(salon,"Vous n'êtes pas autorisés à définir les réceptions de mails pour ce salon.",event['sender']) @not_myself def envoi_mail(room,event): # envoi des messages aux abonnés par mail @@ -1858,12 +1863,15 @@ def envoi_mail(room,event): # envoi des messages aux abonnés par mail except: lmails = [] for mail in lmails: - serveur = smtplib.SMTP(msmtp, mport) - serveur.starttls() - serveur.login(msender, mpass) - message = event['sender'] + " : " + event['content']['body'] - serveur.sendmail(msender, mail, message) - serveur.quit() + if (malt == 1): + os.system('echo "' + event['content']['body'] + '" | mailx -s "' + event['sender'] + '" -r ' + msender + ' ' + mail) + else: + serveur = smtplib.SMTP(msmtp, mport) + serveur.starttls() + serveur.login(msender, mpass) + message = event['sender'] + " : " + event['content']['body'] + serveur.sendmail(msender, mail, message) + serveur.quit() @not_myself def modo(room,event): # Definition d'un moderateur @@ -1882,9 +1890,9 @@ def modo(room,event): # Definition d'un moderateur if (not candidat in lmod): lmod.append(candidat) modos[room.room_id] = lmod - msg(room,candidat + " devient moderateur.") + msg(room,candidat + " devient moderateur.",event['sender']) else: - msg(room,candidat + " est déjà moderateur.") + msg(room,candidat + " est déjà moderateur.",event['sender']) elif (len(args) > 1 and args[0] == "del"): args.pop(0) candidat = " ".join(args) @@ -1892,13 +1900,13 @@ def modo(room,event): # Definition d'un moderateur place = lmod.index(candidat) del lmod[place] modos[room.room_id] = lmod - msg(room,candidat + " n'est plus moderateur.") + msg(room,candidat + " n'est plus moderateur.",event['sender']) else: - msg(room,candidat + " n'est pas moderateur.") + msg(room,candidat + " n'est pas moderateur.",event['sender']) else: - msg(room,"\n".join(lmod)) + msg(room,"\n".join(lmod),event['sender']) else: - msg(salon,"Vous n'êtes pas autorisés à définir les modérateurs.") + msg(salon,"Vous n'êtes pas autorisés à définir les modérateurs.",event['sender']) @not_myself def module(room,event): # Definition des modules d'un salon @@ -1916,18 +1924,18 @@ def module(room,event): # Definition des modules d'un salon rmod = args[0] if (rmod in liste_mod): modules[room.room_id, rmod] = True - msg(room,"Module : " + rmod + " activé.") + msg(room,"Module : " + rmod + " activé.",event['sender']) else: - msg(room,"Module : " + rmod + " inconnu.") + msg(room,"Module : " + rmod + " inconnu.",event['sender']) #print(liste_mod) elif (len(args) == 2 and args[0] == "del"): args.pop(0) rmod = args[0] if (rmod in liste_mod): modules[room.room_id, rmod] = False - msg(room,"Module : " + rmod + " désactivé.") + msg(room,"Module : " + rmod + " désactivé.",event['sender']) else: - msg(room,"Module : " + rmod + " inconnu.") + msg(room,"Module : " + rmod + " inconnu.",event['sender']) else: # Lister les modules actifs du salon rmod = "" @@ -1936,16 +1944,16 @@ def module(room,event): # Definition des modules d'un salon rmod = rmod + cle[1] + ", " if (len(rmod) > 1): rmod = rmod[:-2] - msg(room,"Modules actuels : " + rmod) + msg(room,"Modules actuels : " + rmod,event['sender']) # Lister les modules disponibles dmod = "" for val in liste_mod: dmod = dmod + val + ", " if (len(dmod) > 1): dmod = dmod[:-2] - msg(room,"Modules disponibles : " + dmod) + msg(room,"Modules disponibles : " + dmod,event['sender']) else: - msg(room,"Vous n'êtes pas autorisés à définir les modules du salon.") + msg(room,"Vous n'êtes pas autorisés à définir les modules du salon.",event['sender']) def invitations(room_id, state): # Reponse aux invitations @@ -1991,10 +1999,10 @@ def kick(room, event): # kick une liste de membres try: bot.client.api.kick_user(room.room_id, args[0], reason="") except: - msg(room, "Vous ne pouvez pas expulser args[0]") + msg(room, "Vous ne pouvez pas expulser args[0]",event['sender']) args.pop(0) else: - msg(room,"Vous n'êtes pas autorisés à kicker des membres de ce salon.") + msg(room,"Vous n'êtes pas autorisés à kicker des membres de ce salon.",event['sender']) def main(): @@ -2025,11 +2033,13 @@ def main(): if ('MAIL' in config): try: + malt = config['MAIL']['malt'] msender = config['MAIL']['msender'] mpass = config['MAIL']['mpass'] msmtp = config['MAIL']['msmtp'] mport = config['MAIL']['mport'] except: + malt = 0 msender = "" mpass = "" msmtp = ""