diff --git a/asmodee.py b/asmodee.py index 7cd7222..a05a2f6 100755 --- a/asmodee.py +++ b/asmodee.py @@ -29,14 +29,15 @@ cartes_base = ["As de carreau", "2 de carreau", "3 de carreau", "4 de carreau", "10 de trefle", "Valet de trefle", "Dame de trefle", "Roi de trefle", "Joker rouge", "Joker noir"] cartes=list(cartes_base) bot = None -clock = {} -stats = {} -quotes = {} -bieres = {} -welcome = {} -membres = {} +clock = {} # horloges pbta +stats = {} # Statistiques sur les messages +quotes = {} # Citations +bieres = {} # Boissons a offrir +welcome = {} # Messages d'accueil des salons admins = [] # Admins du bot +modos = {} # Moderateurs des salons +# Chargement des données persistantes def horloge_read(): global clock try: @@ -82,17 +83,16 @@ def welcome_read(): except: welcome = {} -def membres_read(): - global membres +def modos_read(): + global modos try: - with open("membres", "rb") as fichier: + with open("moderateurs", "rb") as fichier: loader = pickle.Unpickler(fichier) - membres = loader.load() + modos = loader.load() except: - membres = {} + modos = {} - -def signal_handler(signal, frame): +def signal_handler(signal, frame): # Sauvegarder les données persistantes avant sortie with open("horloge", "wb") as fichier: saver = pickle.Pickler(fichier) saver.dump(clock) @@ -108,9 +108,9 @@ def signal_handler(signal, frame): with open("welcome", "wb") as fichier: saver = pickle.Pickler(fichier) saver.dump(welcome) - with open("membres", "wb") as fichier: + with open("moderateurs", "wb") as fichier: saver = pickle.Pickler(fichier) - saver.dump(membres) + saver.dump(modos) sys.exit(0) class Userstats: #Pour garder des stats sur les users @@ -209,7 +209,7 @@ class Parser: #Pour parser la ligne de commande return True return False -def verifPMRoom(room, event): +def verifPMRoom(room, event): # Pour obtenir ou créer un salon pour les messages privés avec l'utilisateur global bot nick = "" try: @@ -261,7 +261,7 @@ def verifPMRoom(room, event): return salon -def getNick(room, event): +def getNick(room, event): # Obtenir le DisplayName à partir du mxid members = room.get_joined_members() nick = "" try: @@ -275,10 +275,10 @@ def getNick(room, event): nick = event['sender'] return(nick) -def card(room, event): +def card(room, event): # Tirer une carte du paquet sans la retirer room.send_text(cartes_base[random.randrange(0,len(cartes_base))]) -def carte(room, event): +def carte(room, event): # Tirer une carte du paquet en la retirant ensuite global cartes args = event['content']['body'].split() if (len(args) > 1): @@ -292,11 +292,11 @@ def carte(room, event): room.send_text(cartes[i]) cartes.pop(i) -def help(room, event): +def help(room, event): # Aide en message privé help_center(room,event,"help",True) -def aide(room, event): +def aide(room, event): # Aide dans le salon help_center(room,event,"aide",False) -def help_center(room,event,name,private): +def help_center(room,event,name,private): # Aide sur les commandes disponibles args = event['content']['body'].split() args.pop(0) salon = room @@ -340,7 +340,7 @@ def help_center(room,event,name,private): else: salon.send_text("Commandes disponibles:\n- !card\n- !carte\n- !liste [Nombre d'elements souhaites]\n- !horloge : gestion des horloges PBTA\n- !last : Date de dernier post\n- !actif : Nombre de message et taille moyenne de ceux ci\n- !quote : citations du salon\n- !biere : breuvages du salon\n- :roll \n- :sw \n- :dom \n- :wod \n- :owod \n- :ars \n- :des \n- :star \n\n- Pour plus de details, tapez !" + name + " \n\nRetrouvez Asmodee sur https://git.ombreport.info/nemesis/asmodee_matrix") -def roll(result,type,explosif,nb,f,noadd,ars,relance,mitige): +def roll(result,type,explosif,nb,f,noadd,ars,relance,mitige): # Lancement d'un dé # verif type et contenu params? roll = 0 new = 0 @@ -374,7 +374,7 @@ def roll(result,type,explosif,nb,f,noadd,ars,relance,mitige): #print("fin roll " + str(result) + " " + str(roll) + " " + str(new)) return (result,roll,new) -def rolls(result,jet,type,nb,explosif,noadd,wild,f,g,ars,relance,mitige,z): +def rolls(result,jet,type,nb,explosif,noadd,wild,f,g,ars,relance,mitige,z): # Lancement d'un groupe de dés y = 0 total = 0 allresult = [] @@ -429,7 +429,7 @@ def rolls(result,jet,type,nb,explosif,noadd,wild,f,g,ars,relance,mitige,z): print("fin rolls : " + str(result) + "|" + str(total) + "|" + str(jet)) return (result,total,jet) -def entryPoint(room, event): +def entryPoint(room, event): # Analyse des commandes ":", point d'entrée pour les jets de dés global parser text = event['content']['body'] nick = getNick(room,event) @@ -468,7 +468,7 @@ def entryPoint(room, event): room.send_text("Je n'ai pas compris " + text) -def rollOptionPoint(): +def rollOptionPoint(): # Parse des options global parser while (True): if (parser.eat("[Ee]",1)): @@ -558,7 +558,7 @@ def rollOptionPoint(): else: break -def dupli(orig): +def dupli(orig): # Duplication d'un parser salon = orig.room orig.room = None nouv = copy.deepcopy(orig) @@ -567,7 +567,7 @@ def dupli(orig): nouv.room = salon return nouv -def rollXPoint(): +def rollXPoint(): # Parser le nombre de lancers de dés identiques global parser rollPlusMoinsPoint() if (parser.eat("[xX]",1)): @@ -586,7 +586,7 @@ def rollXPoint(): parser.arg["error"] = True -def rollPlusMoinsPoint(): +def rollPlusMoinsPoint(): # Gérer les bloc du jet séparés par les + et -, afficher le résultat global parser parser.arg["roll_sig"] = True parser.arg["error"] = None @@ -652,7 +652,7 @@ def rollPlusMoinsPoint(): parser.room.send_text("Rien compris. Essayez '!help' pour obtenir de l'aide.") -def rollEntityPoint(): +def rollEntityPoint(): # Parser les séparateurs de bloc + et - global parser if (parser.eat("[-+]", 1)): if (parser.mtch == "-"): @@ -661,7 +661,7 @@ def rollEntityPoint(): rollNbPoint() -def rollNbPoint(): +def rollNbPoint(): # Parser le nombre de dés global parser parser.arg["roll_nb"] = None if (parser.eat(r"\d+",1)): @@ -670,7 +670,7 @@ def rollNbPoint(): rollDPoint() -def rollDPoint(): +def rollDPoint(): # Parser le mot clé identifiant un dé global parser if (parser.eat("[dD]",1)): if (not parser.arg.get("roll_nb",False)): @@ -683,7 +683,7 @@ def rollDPoint(): parser.arg["error"] = True -def rollTypePoint(): +def rollTypePoint(): # Parser le nombre de faces du dé global parser if (parser.space()): parser.arg["roll_typ"] = 6 @@ -698,7 +698,7 @@ def rollTypePoint(): parser.arg["error"] = True -def reponses(room, phrases): +def reponses(room, phrases): # Afficher une réponse aléatoire dans la liste i = random.randrange(0,len(phrases)) room.send_text(phrases[i]) @@ -744,14 +744,7 @@ def hi_callback(room, event): phrases.append("Oh non, et voilà de nouveau " + nick + "...") reponses(room, phrases) -def echo_callback(room, event): - args = event['content']['body'].split() - args.pop(0) - - # Echo what they said back - room.send_text(' '.join(args)) - -def liste(room, event): +def liste(room, event): # Afficher un élement aléatoire d'une liste fournie res = [] nick = getNick(room,event) @@ -842,7 +835,7 @@ def cristal(room, event): phrases.append("Tu portes quelque chose de sombre, je refuse de me laisser souiller.") reponses(room, phrases) -def horloge(room, event): +def horloge(room, event): # Gestion des horloges PBTA global clock nick = getNick(room,event) @@ -879,7 +872,7 @@ def horloge(room, event): else: room.send_text("Utilisation : \n- !horloge : Affiche les horloges. \n- !horloge : Place ou crée l'horloge au niveau spécifié.\n- !horloge del : Supprime l'horloge.") -def statistiques(room,event): +def statistiques(room,event): # Enregistrement des statistiques global stats nick = getNick(room,event) user = event['sender'] @@ -930,7 +923,7 @@ def statistiques(room,event): stats[room.room_id,user] = usrstats1 stats[room.room_id,nick] = usrstats2 -def last(room,event): +def last(room,event): # Regarde la dernière fois que quelqu'un a écrit un message global stats args = event['content']['body'].split() args.pop(0) @@ -948,7 +941,7 @@ def last(room,event): # if (cle[0] == room.room_id): # room.send_text(cle[1] + "\n") -def actif(room,event): +def actif(room,event): # Stats d'activité d'une personne global stats args = event['content']['body'].split() args.pop(0) @@ -986,7 +979,7 @@ def nb_kap(room,event): except: room.send_text(pers + " : Personne non reconnue\n") -def quote(room,event): +def quote(room,event): # Gestion des citations global quotes args = event['content']['body'].split() args.pop(0) @@ -1082,7 +1075,7 @@ def quote(room,event): else: room.send_text("Je n'ai pas de citations pour ce salon") -def biere(room,event): +def biere(room,event): # Gestion des boissons global bieres args = event['content']['body'].split() args.pop(0) @@ -1197,7 +1190,7 @@ def biere(room,event): else: room.send_text("Je n'ai pas de breuvages pour ce salon") -def boissons(room,event): +def boissons(room,event): # Gestion des alias de boissons boisson = "" elu = "" @@ -1222,7 +1215,7 @@ def boissons(room,event): biere(room,event) -def accueil(room,event): +def accueil(room,event): # Mettre un message d'accueil if (event['sender'] in admins): global welcome args = event['content']['body'].split() @@ -1235,7 +1228,7 @@ def accueil(room,event): else: salon.send_text("Vous n'êtes pas autorisés à modifier le message d'accueil.") -def bienvenue(event): +def bienvenue(event): # Affichage d'un message d'accueil aux nouveaux venus room_id = event['room_id'] room = bot.client.rooms[room_id] membership = event['content']['membership'] @@ -1249,7 +1242,37 @@ def bienvenue(event): if (membership == "join"): room.send_text("Bienvenue sur " + alias + ", " + nick + ". " + msg) -def invitations(room_id, state): +def modo(room,event): # Definition d'un moderateur + if (event['sender'] in admins): + global modos + lmod = modos[room.room_id] + args = event['content']['body'].split() + args.pop(0) + if (len(args) > 1 and args[0] == "add"): + args.pop(0) + candidat = " ".join(args) + if (not candidat in lmod): + lmod.append(candidat) + modos[room.room_id] = lmod + room.send_text(candidat + " devient moderateur.") + else: + room.send_text(candidat + " est déjà moderateur.") + elif (len(args) > 1 and args[0] == "del"): + args.pop(0) + candidat = " ".join(args) + if (candidat in lmod): + place = index(candidat,lmod) + del lmod[place] + modos[room.room_id] = lmod + room.send_text(candidat + " n'est plus moderateur.") + else: + room.send_text(candidat + " n'est pas moderateur.") + else: + room.send_text(lmod) + else: + salon.send_text("Vous n'êtes pas autorisés à définir les modérateurs.") + +def invitations(room_id, state): # Reponse aux invitations global bot try: global bot @@ -1352,14 +1375,15 @@ def main(): # Accueil welcome_read() - membres_read() welcome_handler = MCommandHandler("accueil", accueil) bot.add_handler(welcome_handler) bot.client.add_listener(bienvenue, event_type="m.room.member") - #test_handler = MCommandHandler("test", verifPMRoom) - #bot.add_handler(test_handler) - + # Definition des moderateurs + modos_read() + modos_handler = MCommandHandler("modo", modo) + bot.add_handler(modos_handler) + # Invitations bot.client.add_invite_listener(invitations)