You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
743 lines
22 KiB
743 lines
22 KiB
# coding: utf8
|
|
import simplematrixbotlib as botlib
|
|
|
|
import random
|
|
import re
|
|
import copy
|
|
import configparser
|
|
|
|
import signal
|
|
import sys
|
|
import pickle
|
|
import threading
|
|
import asyncio
|
|
|
|
# Var
|
|
bot = None
|
|
PREFIX = '!'
|
|
USERNAME = ""
|
|
|
|
# Listes et dictionnaires
|
|
admins = [] # Admins du bot
|
|
modos = {} # Moderateurs des salons
|
|
modules = {} # Modules activés par salon
|
|
liste_mod = [] # Modules disponibles
|
|
|
|
# Connexion du bot
|
|
config = configparser.ConfigParser()
|
|
config.read('asmodee.ini')
|
|
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", "mails", "titre", "invidious"]
|
|
|
|
if ('AUTH' in config):
|
|
USERNAME = config['AUTH']['username'] # Bot's username
|
|
PASSWORD = config['AUTH']['password'] # Bot's password
|
|
SERVER = config['AUTH']['server'] # Matrix server URL
|
|
admins = config['AUTH']['admin'].split(",") # Admins du bot @admin1:host.tld,@admin2:host.tld,...
|
|
else:
|
|
print("Probleme de lecture de configuration asmodee.ini")
|
|
|
|
# Create an instance of the MatrixBotAPI
|
|
creds = botlib.Creds(SERVER, USERNAME, PASSWORD)
|
|
bot = botlib.Bot(creds)
|
|
|
|
# Chargement des données persistantes
|
|
def modos_read():
|
|
global modos
|
|
try:
|
|
with open("moderateurs", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
modos = loader.load()
|
|
except:
|
|
modos = {}
|
|
|
|
def modules_read():
|
|
global modules
|
|
try:
|
|
with open("modules", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
modules = loader.load()
|
|
except:
|
|
modules = {}
|
|
|
|
def save_obj(room=None, event=None):
|
|
with open("moderateurs", "wb") as fichier:
|
|
saver = pickle.Pickler(fichier)
|
|
saver.dump(modos)
|
|
with open("modules", "wb") as fichier:
|
|
saver = pickle.Pickler(fichier)
|
|
saver.dump(modules)
|
|
|
|
def signal_handler(signal, frame): # Sauvegarder les données persistantes avant sortie
|
|
save_obj(None,None)
|
|
sys.exit(0)
|
|
|
|
class Parser: #Pour parser la ligne de commande
|
|
def __init__(self, str, nick, room):
|
|
self._str = str.strip()
|
|
self._nick = nick
|
|
self._old = ""
|
|
self._mtch = ""
|
|
self._room = room
|
|
self._arg = {}
|
|
self._option = [False,False,False,0,0,0,0,0,False,0,0,False]
|
|
|
|
@property
|
|
def str(self):
|
|
return self._str
|
|
|
|
@str.setter
|
|
def str(self, str):
|
|
self._str = str
|
|
|
|
@property
|
|
def nick(self):
|
|
return self._nick
|
|
|
|
@nick.setter
|
|
def nick(self, nick):
|
|
self._nick = nick
|
|
|
|
@property
|
|
def old(self):
|
|
return self._old
|
|
|
|
@old.setter
|
|
def old(self, old):
|
|
self._old = old
|
|
|
|
@property
|
|
def mtch(self):
|
|
return self._mtch
|
|
|
|
@mtch.setter
|
|
def mtch(self, mtch):
|
|
self._mtch = mtch
|
|
|
|
@property
|
|
def room(self):
|
|
return self._room
|
|
|
|
@room.setter
|
|
def room(self, room):
|
|
self._room = room
|
|
|
|
@property
|
|
def arg(self):
|
|
return self._arg
|
|
|
|
@arg.setter
|
|
def arg(self, arg):
|
|
self._arg = arg
|
|
|
|
@property
|
|
def option(self):
|
|
return self._option
|
|
|
|
@option.setter
|
|
def option(self, option):
|
|
self._option = option
|
|
|
|
def space(self):
|
|
if (re.match("^\s", self._str) or re.match("^$", self._str)):
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def restaure(self):
|
|
self._str += self._mtch
|
|
self._old
|
|
|
|
def eat(self,mtch,opt):
|
|
pattern=r"^(\s*)(" + mtch + r")(.*)"
|
|
if (re.match(pattern,self._str)):
|
|
if (opt == 1):
|
|
self._mtch = re.sub(pattern,r"\2",self._str)
|
|
self._old += re.sub(pattern,r"\1\2",self._str)
|
|
self._str = re.sub(pattern,r"\3",self._str)
|
|
return True
|
|
return False
|
|
|
|
def roll(result,type,explosif,nb,f,noadd,ars,relance,mitige): # Lancement d'un dé
|
|
# verif type et contenu params?
|
|
roll = 0
|
|
new = 0
|
|
moins = 0
|
|
if (ars):
|
|
roll = 1
|
|
if (type > 1):
|
|
tmp = 1
|
|
while (ars and tmp == 1):
|
|
roll *= 2
|
|
tmp = random.randrange(1,type+1)
|
|
roll = ((roll//2)*tmp)
|
|
else:
|
|
tmp = random.randrange(1,type+1)
|
|
roll += int(tmp)
|
|
#print("roll " + str(roll))
|
|
while (explosif and tmp == type):
|
|
tmp = random.randrange(1,type+1)
|
|
roll += int(tmp)
|
|
if (relance != 0 and relance != 1 and relance <= roll):
|
|
new = 1
|
|
if (mitige != 0 and mitige >= roll):
|
|
moins = 1
|
|
result += (' ' if nb>0 else '') + str(roll)
|
|
if (f != 0 and roll < f):
|
|
roll = 0
|
|
elif (f != 0 and roll >= f and noadd):
|
|
tmp = int(roll//type)
|
|
roll = tmp + ((roll - tmp*type) >= 1 if f else 0)
|
|
roll -= moins
|
|
#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): # Lancement d'un groupe de dés
|
|
y = 0
|
|
total = 0
|
|
allresult = []
|
|
if (nb > 100):
|
|
nb = 100
|
|
tmp=(type and nb)
|
|
if (tmp):
|
|
jet += str(nb)+"d"+str(type)
|
|
#print(jet)
|
|
for i in range(nb):
|
|
new = 0
|
|
# Star Wars
|
|
if (z == True and i == 0):
|
|
result, res1, new = roll(result,type,True,nb,f,noadd,ars,relance,mitige)
|
|
allresult.append(res1)
|
|
if (res1 == 1):
|
|
y = 1
|
|
# Autre
|
|
else:
|
|
result, res1, new = roll(result,type,explosif,nb,f,noadd,ars,relance,mitige)
|
|
allresult.append(res1)
|
|
# Tant qu'il faut relancer
|
|
while (new == 1):
|
|
result, res1, new = roll(result,type,explosif,nb,f,noadd,ars,relance,mitige)
|
|
allresult.append(res1)
|
|
# Wild die de Savage Worlds
|
|
if (wild != 0):
|
|
jet += "w" + str(wild)
|
|
result, res1, new = roll(result,wild,wild!=1,nb if nb else 0,f,noadd,ars,relance,mitige)
|
|
allresult.append(res1)
|
|
result += 'w'
|
|
#print(allresult)
|
|
allresult.sort(reverse=True)
|
|
# 1 au de joker de Star Wars
|
|
if (y == 1):
|
|
del allresult[-1]
|
|
del allresult[0]
|
|
for i in range((len(allresult)) if (g == 0 and ((f != 0 and noadd) or not noadd)) else (0 if (noadd and f == 0) else g)):
|
|
if (g == 0 or len(allresult) >= g):
|
|
total += allresult[i] if allresult[i] else 0
|
|
if (noadd and f == 0):
|
|
total += max(allresult)
|
|
#print("total : " + str(total))
|
|
jet += (("g" + str(g)) if g != 0 else "#g") if g != parser.option[5] else (("g" + str(g)) if g != 0 else "")
|
|
jet += (("f" + str(f)) if f != 0 else "#f") if f != parser.option[4] else (("f" + str(f)) if f != 0 else "")
|
|
jet += (("r" + str(relance)) if relance != 0 else "#r") if relance != parser.option[9] else (("r" + str(relance)) if relance != 0 else "")
|
|
jet += (("m" + str(mitige)) if mitige != 0 else "#m") if mitige != parser.option[9] else (("m" + str(mitige)) if mitige != 0 else "")
|
|
if (tmp):
|
|
jet += ("e" if explosif == True else "#e") if explosif != parser.option[0] else ""
|
|
jet += ("n" if noadd == True else "#n") if noadd != parser.option[1] else ""
|
|
jet += ("a" if ars == True else "#a") if ars != parser.option[8] else ""
|
|
#print("fin rolls : " + str(result) + "|" + str(total) + "|" + str(jet))
|
|
return (result,total,jet)
|
|
|
|
async def entryPoint(room, message): # Analyse des commandes ":", point d'entrée pour les jets de dés
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'roll']
|
|
except:
|
|
modules[room.room_id, 'roll'] = False
|
|
if (modules[room.room_id, 'roll']):
|
|
global parser
|
|
text = getMessage(message)
|
|
user = getUser(message)
|
|
nick = getNick(room,message)
|
|
parser = Parser(text,nick,room)
|
|
|
|
if (parser.eat(":roll",1)):
|
|
parser.option = [False,False,False,0,0,0,0,0,False,0,0,False]
|
|
await rollXPoint()
|
|
elif (parser.eat(":dom",1)):
|
|
parser.option = [True,False,True,0,0,0,4,4,False,0,0,False]
|
|
await rollXPoint()
|
|
elif (parser.eat(":sw",1)):
|
|
parser.option = [True,True,True,0,0,0,4,4,False,0,0,False]
|
|
await rollXPoint()
|
|
elif (parser.eat(":ars",1)):
|
|
parser.option = [False,True,True,0,0,0,0,0,True,0,0,False]
|
|
await rollXPoint()
|
|
elif (parser.eat(":des",1)):
|
|
parser.option = [False,True,True,0,10,0,0,0,False,0,0,False]
|
|
await rollXPoint()
|
|
elif (parser.eat(":wod",1)):
|
|
parser.option = [False,True,True,0,8,0,0,0,False,10,0,False]
|
|
await rollXPoint()
|
|
elif (parser.eat(":adv",1)):
|
|
parser.option = [False,True,False,0,5,0,0,0,False,0,0,False]
|
|
await rollXPoint()
|
|
elif (parser.eat(":owod",1)):
|
|
parser.option = [False,True,True,0,6,0,0,0,False,10,1,False]
|
|
await rollXPoint()
|
|
elif (parser.eat(":star",1)):
|
|
parser.option = [False,False,True,0,0,0,0,0,False,0,0,True]
|
|
await rollXPoint()
|
|
elif (parser.eat(":fate",1)):
|
|
text = text[5:] + " 4d3-8"
|
|
parser = Parser(text,nick,room)
|
|
parser.option = [False,False,False,0,0,0,0,0,False,0,0,False]
|
|
await rollXPoint()
|
|
else:
|
|
parser.arg["error"] = True
|
|
|
|
if (not parser.arg.get("error",None) and not parser.eat("$",0)):
|
|
parser.arg["noerror"] = True
|
|
await msg(room,"Je n'ai pas compris " + text,user)
|
|
|
|
|
|
def rollOptionPoint(): # Parse des options
|
|
global parser
|
|
while (True):
|
|
if (parser.eat("[Ee]",1)):
|
|
parser.option[0] = True
|
|
elif (parser.eat("#[Ee]",1)):
|
|
parser.option[0] = False
|
|
elif (parser.eat("[Nn]",1)):
|
|
parser.option[1] = True
|
|
elif (parser.eat("#[Nn]",1)):
|
|
parser.option[1] = False
|
|
elif (parser.eat("[Vv]",1)):
|
|
parser.option[2] = True
|
|
elif (parser.eat("#[Vv]",1)):
|
|
parser.option[2] = False
|
|
elif (parser.eat("[Ww]",1)):
|
|
if (parser.space()):
|
|
parser.option[3] = 6
|
|
elif (parser.eat(r"\d+",1)):
|
|
parser.option[3] = int(parser.mtch)
|
|
else:
|
|
parser.option[3] = 6
|
|
elif (parser.eat("#[Ww]",1)):
|
|
parser.option[3] = 0
|
|
elif (parser.eat("[Ff]",1)):
|
|
if (parser.space()):
|
|
parser.option[4] = 6
|
|
elif (parser.eat(r"\d+",1)):
|
|
parser.option[4] = int(parser.mtch)
|
|
else:
|
|
parser.option[4] = 6
|
|
elif (parser.eat("#[Ff]",1)):
|
|
parser.option[4] = 0
|
|
elif (parser.eat("[Gg]",1)):
|
|
if (parser.space()):
|
|
parser.option[5] = 6
|
|
elif (parser.eat(r"\d+",1)):
|
|
parser.option[5] = int(parser.mtch)
|
|
else:
|
|
parser.option[5] = 6
|
|
elif (parser.eat("#[Gg]",1)):
|
|
parser.option[5] = 0
|
|
elif (parser.eat("[Ss]",1)):
|
|
if (parser.space()):
|
|
parser.option[6] = 4
|
|
elif (parser.eat(r"\d+",1)):
|
|
parser.option[6] = int(parser.mtch)
|
|
else:
|
|
parser.option[6] = 4
|
|
if (parser.eat("[/]",1)):
|
|
if (parser.space()):
|
|
parser.option[7] = 4
|
|
elif (parser.eat(r"\d+",1)):
|
|
parser.option[7] = int(parser.mtch)
|
|
else:
|
|
parser.option[7] = 4
|
|
else:
|
|
parser.option[7] = 4
|
|
elif (parser.eat("#[Ss]",1)):
|
|
parser.option[6] = 0
|
|
parser.option[7] = 0
|
|
elif (parser.eat("[Aa]",1)):
|
|
parser.option[8] = True
|
|
elif (parser.eat("#[Aa]",1)):
|
|
parser.option[8] = False
|
|
elif (parser.eat("[Rr]",1)):
|
|
if (parser.space()):
|
|
parser.option[9] = 10
|
|
elif (parser.eat(r"\d+",1)):
|
|
parser.option[9] = int(parser.mtch)
|
|
else:
|
|
parser.option[9] = 10
|
|
elif (parser.eat("#[Rr]",1)):
|
|
parser.option[9] = 0
|
|
elif (parser.eat("[Mm]",1)):
|
|
if (parser.space()):
|
|
parser.option[10] = 1
|
|
elif (parser.eat(r"\d+",1)):
|
|
parser.option[10] = int(parser.mtch)
|
|
else:
|
|
parser.option[10] = 1
|
|
elif (parser.eat("#[Mm]",1)):
|
|
parser.option[10] = 0
|
|
elif (parser.eat("[Zz]",1)):
|
|
parser.option[11] = True
|
|
elif (parser.eat("#[Zz]",1)):
|
|
parser.option[11] = False
|
|
else:
|
|
break
|
|
|
|
def dupli(orig): # Duplication d'un parser
|
|
salon = orig.room
|
|
orig.room = None
|
|
nouv = copy.deepcopy(orig)
|
|
nouv.option = [orig.option[0],orig.option[1],orig.option[2],orig.option[3],orig.option[4],orig.option[5],orig.option[6],orig.option[7],orig.option[8],orig.option[9],orig.option[10],orig.option[11]]
|
|
orig.room = salon
|
|
nouv.room = salon
|
|
return nouv
|
|
|
|
async def rollXPoint(): # Parser le nombre de lancers de dés identiques
|
|
global parser
|
|
await rollPlusMoinsPoint()
|
|
if (parser.eat("[xX]",1)):
|
|
if (parser.eat(r"\d+",1)):
|
|
tmp = dupli(parser)
|
|
str = parser.arg["jet"]
|
|
xtime = int(parser.mtch)-1
|
|
xtime = xtime if (xtime < 11) else 10
|
|
for _ in range(xtime):
|
|
parser = dupli(parser)
|
|
parser.str = str
|
|
#print (parser.str)
|
|
await rollPlusMoinsPoint()
|
|
parser = tmp
|
|
else:
|
|
parser.arg["error"] = True
|
|
|
|
|
|
async 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
|
|
result = ""
|
|
res1 = ""
|
|
res2 = ""
|
|
jet = ""
|
|
rollOptionPoint()
|
|
#print(parser.option)
|
|
exp,noa,ver,will,f,g,s,d,ars,r,m,z = parser.option
|
|
rollEntityPoint()
|
|
#print("de " + str(parser.arg.get("roll_nb",None)) + "|" + str(parser.arg.get("roll_typ",None)))
|
|
if (not parser.arg["error"]):
|
|
if (not parser.arg.get("roll_sig",True)):
|
|
jet += "-"
|
|
result += "-"
|
|
if (parser.arg.get("roll_typ",None) or parser.arg.get("roll_wil",None)):
|
|
result += "("
|
|
exp2,noa2,ver2,will2,f2,g2,s2,d2,ars2,r2,m2,z2 = parser.option
|
|
parser.option = [exp,noa,ver,will,f,g,s,d,ars,r,m,z]
|
|
result, res1, jet = rolls(result,jet,parser.arg.get("roll_typ",None),parser.arg.get("roll_nb",None),exp2,noa2,will2,f2,g2,ars2,r2,m2,z2)
|
|
result += " = " + str(res1) + ")"
|
|
else:
|
|
jet += str(parser.arg.get("roll_nb",None))
|
|
result += str(parser.arg.get("roll_nb",None))
|
|
res1 = parser.arg["roll_nb"]
|
|
#print("prem " + result + " " +str(res1))
|
|
if (not parser.arg.get("roll_sig",True)):
|
|
res1 = -res1
|
|
while (parser.eat("[+-]",1)):
|
|
parser.arg["roll_sig"] = True
|
|
if (parser.mtch == "-"):
|
|
parser.arg["roll_sig"] = not parser.arg.get("roll_sig",True)
|
|
rollEntityPoint()
|
|
if (not parser.arg.get("error",None)):
|
|
jet += " +" if parser.arg.get("roll_sig",True) else " -"
|
|
result += " + " if parser.arg.get("roll_sig",True) else " - "
|
|
if (parser.arg.get("roll_typ",None) or parser.arg.get("roll_wil",None)):
|
|
result += "("
|
|
exp2,noa2,ver2,will2,f2,g2,s2,d2,ars2,r2,m2,z2 = parser.option
|
|
parser.option = [exp,noa,ver,will,f,g,s,d,ars,r,m,z]
|
|
result, res2, jet = rolls(result,jet,parser.arg.get("roll_typ",None),parser.arg.get("roll_nb",None),exp2,noa2,will2,f2,g2,ars2,r2,m2,z2)
|
|
result += " = " + str(res2) + ")"
|
|
else:
|
|
jet += str(parser.arg.get("roll_nb",None))
|
|
result += str(parser.arg.get("roll_nb",None))
|
|
res2 = parser.arg.get("roll_nb",None)
|
|
res1 += res2 if parser.arg.get("roll_sig",None) else -res2
|
|
#print("deux " + result + " " +str(res1))
|
|
if (res1):
|
|
if (ver):
|
|
result = jet + " = (" + result + ") = " + str(res1)
|
|
else:
|
|
result = jet + " = " + str(res1)
|
|
if (d <= 0):
|
|
d=1
|
|
tmp = (res1 - s) // d + 1
|
|
result += ("/" + ("0" if (tmp < 0) else str(tmp))) if (s != 0) else ""
|
|
parser.arg["jet"] = jet
|
|
await 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)):
|
|
await msg(parser.room,"match = " + parser.mtch + "\nstr = " + parser.str, "dice")
|
|
await msg(parser.room,"Rien compris. Essayez '!help' pour obtenir de l'aide.", "dice")
|
|
|
|
|
|
def rollEntityPoint(): # Parser les séparateurs de bloc + et -
|
|
global parser
|
|
if (parser.eat("[-+]", 1)):
|
|
if (parser.mtch == "-"):
|
|
parser.arg["roll_sig"] = not parser.arg.get("roll_sig",True)
|
|
rollOptionPoint()
|
|
rollNbPoint()
|
|
|
|
|
|
def rollNbPoint(): # Parser le nombre de dés
|
|
global parser
|
|
parser.arg["roll_nb"] = None
|
|
if (parser.eat(r"\d+",1)):
|
|
parser.arg["roll_nb"] = int(parser.mtch)
|
|
#print("nb " + str(parser.arg.get("roll_nb",1)))
|
|
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)):
|
|
parser.arg["roll_nb"] = 1
|
|
parser.arg["roll_bon"] = 0
|
|
rollTypePoint()
|
|
elif (parser.arg.get("roll_nb",False)):
|
|
parser.arg["roll_typ"] = None
|
|
else:
|
|
parser.arg["error"] = True
|
|
|
|
|
|
def rollTypePoint(): # Parser le nombre de faces du dé
|
|
global parser
|
|
if (parser.space()):
|
|
parser.arg["roll_typ"] = 6
|
|
elif (parser.eat(r"\d+",1)):
|
|
parser.arg["roll_typ"] = int(parser.mtch)
|
|
if (parser.mtch == "1"):
|
|
parser.option[0] = False
|
|
else:
|
|
parser.arg["roll_typ"] = 6
|
|
rollOptionPoint()
|
|
if (not parser.arg.get("roll_nb",False)):
|
|
parser.arg["error"] = True
|
|
|
|
def getMessage(message):
|
|
try:
|
|
return(str(message).split(":",2)[2].strip())
|
|
except:
|
|
return(str(message))
|
|
|
|
def getUser(message):
|
|
match = re.search(r"^(@\w+:[^ :]+)", str(message))
|
|
return str(match.group())
|
|
|
|
def getNick(room, message): # Obtenir le DisplayName à partir du mxid.
|
|
sender = getUser(message)
|
|
return(room.user_name(sender))
|
|
|
|
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):
|
|
mess = mess.replace('@room', 'tout le monde')
|
|
except:
|
|
try:
|
|
mess = mess.replace('@room', 'tout le monde')
|
|
except:
|
|
print(mess)
|
|
print("id : " + str(room.room_id) + " message : " + str(mess))
|
|
await bot.api.send_text_message(room.room_id, mess)
|
|
except:
|
|
print("Impossible d'envoyer le message")
|
|
|
|
async def modo(room,message): # Definition d'un moderateur
|
|
global modos
|
|
sender = getUser(message)
|
|
texte = getMessage(message)
|
|
print("texte : " + texte + " sender : " + sender)
|
|
lmod = []
|
|
try:
|
|
lmod = modos[room.room_id]
|
|
except:
|
|
lmod = []
|
|
if (sender in admins or sender in lmod or sender == bot.client.user_id):
|
|
args = texte.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
|
|
await msg(room,candidat + " devient moderateur.",sender)
|
|
else:
|
|
await msg(room,candidat + " est déjà moderateur.",sender)
|
|
elif (len(args) > 1 and args[0] == "del"):
|
|
args.pop(0)
|
|
candidat = " ".join(args)
|
|
if (candidat in lmod):
|
|
place = lmod.index(candidat)
|
|
del lmod[place]
|
|
modos[room.room_id] = lmod
|
|
await msg(room,candidat + " n'est plus moderateur.",sender)
|
|
else:
|
|
await msg(room,candidat + " n'est pas moderateur.",sender)
|
|
else:
|
|
await msg(room,"\n".join(lmod),sender)
|
|
else:
|
|
await msg(salon,"Vous n'êtes pas autorisés à définir les modérateurs.",sender)
|
|
|
|
async def module(room,message): # Definition des modules d'un salon
|
|
lmod = []
|
|
sender = getUser(message)
|
|
texte = getMessage(message)
|
|
try:
|
|
lmod = modos[room.room_id]
|
|
except:
|
|
lmod = []
|
|
if (sender in admins or sender in lmod or sender == bot.client.user_id):
|
|
global modules
|
|
args = texte.split()
|
|
args.pop(0)
|
|
if (len(args) == 2 and args[0] == "add"):
|
|
args.pop(0)
|
|
rmod = args[0]
|
|
if (rmod in liste_mod):
|
|
modules[room.room_id, rmod] = True
|
|
await msg(room,"Module : " + rmod + " activé.",sender)
|
|
else:
|
|
await msg(room,"Module : " + rmod + " inconnu.",sender)
|
|
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
|
|
await msg(room,"Module : " + rmod + " désactivé.",sender)
|
|
else:
|
|
await msg(room,"Module : " + rmod + " inconnu.",sender)
|
|
else:
|
|
# Lister les modules actifs du salon
|
|
rmod = ""
|
|
for cle,valeur in modules.items():
|
|
if (cle[0] == room.room_id and valeur == True):
|
|
rmod = rmod + cle[1] + ", "
|
|
if (len(rmod) > 1):
|
|
rmod = rmod[:-2]
|
|
await msg(room,"Modules actuels : " + rmod,sender)
|
|
# Lister les modules disponibles
|
|
dmod = ""
|
|
for val in liste_mod:
|
|
dmod = dmod + val + ", "
|
|
if (len(dmod) > 1):
|
|
dmod = dmod[:-2]
|
|
await msg(room,"Modules disponibles : " + dmod,sender)
|
|
else:
|
|
await msg(room,"Vous n'êtes pas autorisés à définir les modules du salon.",sender)
|
|
|
|
async def liste(room, message): # Afficher un élement aléatoire d'une liste fournie
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'liste']
|
|
except:
|
|
modules[room.room_id, 'liste'] = False
|
|
if (modules[room.room_id, 'liste']):
|
|
res = []
|
|
nick = getNick(room,message)
|
|
|
|
args = getMessage(message).split()
|
|
args.pop(0)
|
|
try:
|
|
nb = int(args[len(args)-1])
|
|
args.pop(len(args)-1)
|
|
except:
|
|
nb = 1
|
|
args = ' '.join(args)
|
|
list = args.split('/')
|
|
if (nb <= len(list)):
|
|
for i in range(nb):
|
|
id = random.randrange(0,len(list))
|
|
res.append(list.pop(id))
|
|
await msg(room,nick + " obtient :\n" + '\n'.join(res),nick)
|
|
else:
|
|
await msg(room,"Utilisation : !liste <options/de/la/liste> [nombre d elements]",nick)
|
|
|
|
|
|
@bot.listener.on_message_event
|
|
async def callListe(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("liste"):
|
|
await liste(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callRoll(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, ":")
|
|
if match.is_not_from_this_bot() and match.prefix():
|
|
await entryPoint(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callModule(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("module"):
|
|
await module(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callModo(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("modo"):
|
|
await modo(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def echo(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("echo"):
|
|
print(message)
|
|
await bot.api.send_text_message(
|
|
room.room_id, " ".join(arg for arg in match.args())
|
|
)
|
|
def main():
|
|
config = configparser.ConfigParser()
|
|
config.read('asmodee.ini')
|
|
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", "mails", "titre", "invididious"]
|
|
global admins
|
|
if ('AUTH' in config):
|
|
USERNAME = config['AUTH']['username'] # Bot's username
|
|
PASSWORD = config['AUTH']['password'] # Bot's password
|
|
SERVER = config['AUTH']['server'] # Matrix server URL
|
|
admins = config['AUTH']['admin'].split(",") # Admins du bot @admin1:host.tld,@admin2:host.tld,...
|
|
else:
|
|
print("Probleme de lecture de configuration asmodee.ini")
|
|
|
|
global liste_mod
|
|
if ('MOD' in config):
|
|
try:
|
|
liste_mod = config['MOD']['liste'].split(',') # Liste des modules
|
|
except:
|
|
liste_mod = mods
|
|
else:
|
|
liste_mod = mods
|
|
|
|
if (threading.current_thread().__class__.__name__ == '_MainThread'):
|
|
print("main thread")
|
|
signal.signal(signal.SIGINT, signal_handler)
|
|
|
|
modules_read()
|
|
modos_read()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|
|
bot.run()
|
|
|