From fce865ee3dbf8970bb9091175a7e66a0deb33b91 Mon Sep 17 00:00:00 2001 From: nemesis Date: Sat, 21 Mar 2020 17:51:23 +0100 Subject: [PATCH] mails --- asmodee.ini | 6 +++ asmodee.py | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 114 insertions(+), 4 deletions(-) diff --git a/asmodee.ini b/asmodee.ini index a78162b..d438f89 100644 --- a/asmodee.ini +++ b/asmodee.ini @@ -7,3 +7,9 @@ admin = "" [MOD] # liste = roll,quote,biere,stats,liste,horloge,carte,card,cristal,welcome,salut,jdr,gens,va,salon,kick liste = roll,quote,biere,stats,liste,horloge,carte,card,cristal,welcome,salut,jdr,gens,va,salon,kick + +[MAIL] +msender = "user@domain.tld" +mpass = "password" +msmtp = "smtp" +mport = "port" diff --git a/asmodee.py b/asmodee.py index 72d461a..2243645 100755 --- a/asmodee.py +++ b/asmodee.py @@ -11,6 +11,7 @@ import time import threading import json from datetime import datetime,timedelta +import smtplib from matrix_bot_api.matrix_bot_api import MatrixBotAPI from matrix_bot_api.mregex_handler import MRegexHandler @@ -42,9 +43,15 @@ welcome = {} # Messages d'accueil des salons admins = [] # Admins du bot modos = {} # Moderateurs des salons modules = {} # Modules activés par salon +mails = {} # Liste de gens abonnés par mail au salon liste_mod = [] # Modules disponibles USERNAME = "" +msender = "" +mpass = "" +msmtp = "" +mport = "" + # Chargement des données persistantes def horloge_read(): global clock @@ -128,6 +135,16 @@ def modules_read(): except: modules = {} +def mails_read(): + global mails + try: + with open("mails", "rb") as fichier: + loader = pickle.Unpickler(fichier) + mails = loader.load() + except: + mails = {} + + def save_obj(): if ('horloge' in liste_mod): with open("horloge", "wb") as fichier: @@ -156,6 +173,10 @@ def save_obj(): with open("welcome", "wb") as fichier: saver = pickle.Pickler(fichier) saver.dump(welcome) + if ('mails' in liste_mod): + with open("mails", "wb") as fichier: + saver = pickle.Pickler(fichier) + saver.dump(mails) with open("moderateurs", "wb") as fichier: saver = pickle.Pickler(fichier) saver.dump(modos) @@ -169,10 +190,10 @@ def signal_handler(signal, frame): # Sauvegarder les données persistantes avant def not_myself(f): def handler(room, event): - if event['sender'] == USERNAME: - return + if event['sender'] == USERNAME: + return - f(room, event) + f(room, event) return handler @@ -435,6 +456,8 @@ def help_center(room,event,name,private): # Aide sur les commandes disponibles 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.'") elif (re.search("kick", args[0])): msg(salon,"- !kick <@mxid> [@mxid] ... : kick les users listés") + elif (re.search("mails", 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.") 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.") elif (re.search("module", args[0])): @@ -467,6 +490,8 @@ def help_center(room,event,name,private): # Aide sur les commandes disponibles message += "\n- !accueil : Modifie le message d'accueil" if (cle[0] == rid and cle[1] == "kick" and valeur): message += "\n- !kick <@mxid> [@mxid] ... : kick les users listés" + if (cle[0] == rid and cle[1] == "mails" and valeur): + message += "\n- !mail add : s'abonner aux messages du salon par mail.\n -!mail del : se désabonner aux messages du salon par mail." 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" @@ -1770,6 +1795,68 @@ def bienvenue(event): # Affichage d'un message d'accueil aux nouveaux venus if (membership == "join" and prev_member != "join"): msg(room,"Bienvenue sur " + alias + ", " + nick + ". " + reponse) +@not_myself +def mails(room,event): # Abonnements mail aux messages + global modules + global modos + try: + rmod = modules[room.room_id, 'mails'] + except: + modules[room.room_id, 'mails'] = False + if (modules[room.room_id, 'mails']): + lmails = [] + try: + lmails = mails[room.room_id] + except: + lmails = [] + if (event['sender'] in admins or event['sender'] in lmod or event['sender'] == bot.client.user_id): + args = event['content']['body'].split() + args.pop(0) + if (len(args) > 1 and args[0] == "add"): + args.pop(0) + mail = args[0] + if (not mail in lmails): + lmails.append(mail) + mails[room.room_id] = lmails + msg(room,mail + " recevra des mails.") + else: + msg(room,mail + " reçoit déjà des mails.") + elif (len(args) > 1 and args[0] == "del"): + args.pop(0) + mail = args[0] + if (mail in lmails): + place = lmails.index(mail) + del lmails[place] + mails[room.room_id] = lmails + msg(room,mail + " ne recevra plus de mails.") + else: + msg(room,mail + " ne reçoit pas de mails.") + else: + msg(room,"\n".join(lmails)) + else: + msg(salon,"Vous n'êtes pas autorisés à définir les réceptions de mails pour ce salon.") + +@not_myself +def envoi_mail(room,event): # envoi des messages aux abonnés par mail + global modules + try: + rmod = modules[room.room_id, 'mails'] + except: + modules[room.room_id, 'mails'] = False + if (modules[room.room_id, 'mails']): + lmails = [] + try: + lmails = mails[room.room_id] + 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() + @not_myself def modo(room,event): # Definition d'un moderateur global modos @@ -1909,7 +1996,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"] + mods = ["roll", "quote", "biere", "stats", "liste", "horloge", "carte", "card", "cristal", "welcome", "salut", "jdr", "gens", "va", "salon", "kick", "mails"] global admins if ('AUTH' in config): USERNAME = config['AUTH']['username'] # Bot's username @@ -1927,6 +2014,18 @@ def main(): liste_mod = mods else: liste_mod = mods + + if ('MAIL' in config): + try: + msender = config['MAIL']['msender'] + mpass = config['MAIL']['mpass'] + msmtp = config['MAIL']['msmtp'] + mport = config['MAIL']['mport'] + except: + msender = "" + mpass = "" + msmtp = "" + mport = "" # Create an instance of the MatrixBotAPI global bot @@ -2034,6 +2133,11 @@ def main(): kick_handler = MCommandHandler("kick", kick) bot.add_handler(kick_handler) + # Mails + if ('mails' in liste_mod): + mails_handler = MCommandHandler("mails", mails) + bot.add_handler(mails_handler) + # Definition des moderateurs modos_read() modos_handler = MCommandHandler("modo", modo)