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.
2093 lines
70 KiB
2093 lines
70 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
|
|
import nio
|
|
|
|
from datetime import datetime,timedelta
|
|
import requests
|
|
from oauthlib.oauth2 import BackendApplicationClient
|
|
from requests_oauthlib import OAuth2Session
|
|
from requests.auth import HTTPBasicAuth
|
|
import html2text
|
|
import json
|
|
|
|
# Var
|
|
bot = None
|
|
PREFIX = '!'
|
|
USERNAME = ""
|
|
RTE_ID = None # Bot's RTE ID
|
|
RTE_SECRET = None # Bot's RTE SECRET
|
|
|
|
#ecowatt_url = 'https://digital.iservices.rte-france.com/open_api/ecowatt/v4/sandbox/signals'
|
|
ecowatt_url = 'https://digital.iservices.rte-france.com/open_api/ecowatt/v4/signals'
|
|
commune_url = 'https://geo.api.gouv.fr/communes?<TYPE>=<NOM>&fields=nom,code,codesPostaux,population&format=json'
|
|
eau_url = 'https://hubeau.eaufrance.fr/api/vbeta/qualite_eau_potable/resultats_dis?<TYPE>=<NOM>&size=5'
|
|
|
|
wattobj = None
|
|
|
|
# Listes et dictionnaires
|
|
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
|
|
salons = {} # liste de salons recommandés
|
|
welcome = {} # Messages d'accueil des salons
|
|
clock = {} # horloges pbta
|
|
paquets = {} # paquets de cartes des salons
|
|
stats = {} # Statistiques sur les messages
|
|
|
|
cartes_base = ["As de carreau", "2 de carreau", "3 de carreau", "4 de carreau", "5 de carreau", "6 de carreau", \
|
|
"7 de carreau", "8 de carreau", "9 de carreau", "10 de carreau", "Valet de carreau", "Dame de carreau", \
|
|
"Roi de carreau", "As de coeur", "2 de coeur", "3 de coeur", "4 de coeur", "5 de coeur", "6 de coeur", \
|
|
"7 de coeur", "8 de coeur", "9 de coeur", "10 de coeur", "Valet de coeur", "Dame de coeur", "Roi de coeur", \
|
|
"As de pique", "2 de pique", "3 de pique", "4 de pique", "5 de pique", "6 de pique", "7 de pique", "8 de pique", \
|
|
"9 de pique", "10 de pique", "Valet de pique", "Dame de pique", "Roi de pique", "As de trefle", "2 de trefle", \
|
|
"3 de trefle", "4 de trefle", "5 de trefle", "6 de trefle", "7 de trefle", "8 de trefle", "9 de trefle", \
|
|
"10 de trefle", "Valet de trefle", "Dame de trefle", "Roi de trefle", "Joker rouge", "Joker noir"]
|
|
|
|
|
|
# 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 horloge_read():
|
|
global clock
|
|
try:
|
|
with open("horloge", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
clock = loader.load()
|
|
except:
|
|
clock = {}
|
|
|
|
def citations_read():
|
|
global citations
|
|
try:
|
|
with open("citations", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
citations = loader.load()
|
|
except:
|
|
citations = {}
|
|
|
|
|
|
def bieres_read():
|
|
global bieres
|
|
try:
|
|
with open("bieres", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
bieres = loader.load()
|
|
except:
|
|
bieres = {}
|
|
|
|
def salons_read():
|
|
global salons
|
|
try:
|
|
with open("salons", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
salons = loader.load()
|
|
except:
|
|
salons = {}
|
|
|
|
def welcome_read():
|
|
global welcome
|
|
try:
|
|
with open("welcome", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
welcome = loader.load()
|
|
except:
|
|
welcome = {}
|
|
|
|
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 prive_read():
|
|
global prive
|
|
try:
|
|
with open("prive", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
prive = loader.load()
|
|
except:
|
|
prive = {}
|
|
|
|
def paquets_read():
|
|
global cartes
|
|
try:
|
|
with open("paquets", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
paquets = loader.load()
|
|
except:
|
|
paquets = {}
|
|
|
|
def stats_read():
|
|
global stats
|
|
try:
|
|
with open("stats", "rb") as fichier:
|
|
loader = pickle.Unpickler(fichier)
|
|
stats = loader.load()
|
|
except:
|
|
stats = {}
|
|
|
|
def save_obj(room=None, message=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)
|
|
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)
|
|
saver.dump(clock)
|
|
if ('quote' in liste_mod):
|
|
#with open("quotes", "wb") as fichier:
|
|
# saver = pickle.Pickler(fichier)
|
|
# saver.dump(quotes)
|
|
with open("citations", "wb") as fichier:
|
|
saver = pickle.Pickler(fichier)
|
|
saver.dump(citations)
|
|
if ('biere' in liste_mod):
|
|
with open("bieres", "wb") as fichier:
|
|
saver = pickle.Pickler(fichier)
|
|
saver.dump(bieres)
|
|
if ('salon' in liste_mod):
|
|
with open("salons", "wb") as fichier:
|
|
saver = pickle.Pickler(fichier)
|
|
saver.dump(salons)
|
|
if ('welcome' in liste_mod):
|
|
with open("welcome", "wb") as fichier:
|
|
saver = pickle.Pickler(fichier)
|
|
saver.dump(welcome)
|
|
if ('cartes' in liste_mod):
|
|
with open("paquets", "wb") as fichier:
|
|
saver = pickle.Pickler(fichier)
|
|
saver.dump(paquets)
|
|
if ('stats' in liste_mod):
|
|
with open("stats", "wb") as fichier:
|
|
saver = pickle.Pickler(fichier)
|
|
saver.dump(stats)
|
|
|
|
def signal_handler(signal, frame): # Sauvegarder les données persistantes avant sortie
|
|
save_obj(None,None)
|
|
sys.exit(0)
|
|
|
|
class Wattobject: # Cache du service ecowatt
|
|
def __init__(self):
|
|
self.jour = 19000101
|
|
self.heure = 0
|
|
self.signals = None
|
|
|
|
class Userstats: #Pour garder des stats sur les users
|
|
def __init__(self,room,user,nick):
|
|
self.room = room
|
|
self.user = user
|
|
self.nick = nick.strip() if nick and nick != None else ""
|
|
self.date = 0
|
|
self.mess = 0
|
|
self.char = 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))
|
|
if match:
|
|
return str(match.group())
|
|
else:
|
|
return "personne"
|
|
|
|
def getNick(room, message): # Obtenir le DisplayName à partir du mxid.
|
|
sender = getUser(message)
|
|
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.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:
|
|
mess = mess.replace('@room', 'tout le monde')
|
|
except:
|
|
print(mess)
|
|
print("id : " + str(room.room_id) + " message : " + str(mess))
|
|
if (content):
|
|
await bot.api.send_markdown_message(room.room_id, mess)
|
|
else:
|
|
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.get(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(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 = []
|
|
sender = getUser(message)
|
|
texte = getMessage(message)
|
|
try:
|
|
lmod = modos.get(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)
|
|
|
|
async def aff_hor(room, hor, valeur): # affichage des horloges
|
|
if (int(valeur) == 0):
|
|
await msg(room,hor + " : " + chr(128320) + "\n", "horloge")
|
|
elif (int(valeur) == 1):
|
|
await msg(room,hor + " : " + chr(128338) + "\n", "horloge")
|
|
elif (int(valeur) == 2):
|
|
await msg(room,hor + " : " + chr(128341) + "\n", "horloge")
|
|
elif (int(valeur) == 3):
|
|
await msg(room,hor + " : " + chr(128344) + "\n", "horloge")
|
|
elif (int(valeur) == 4):
|
|
await msg(room,hor + " : " + chr(128345) + "\n", "horloge")
|
|
elif (int(valeur) == 5):
|
|
await msg(room,hor + " : " + chr(128346) + "\n", "horloge")
|
|
elif (int(valeur) == 6):
|
|
await msg(room,hor + " : " + chr(128347) + "\n", "horloge")
|
|
else:
|
|
await msg(room,hor + " : " + str(valeur) + " \n", "horloge")
|
|
|
|
async def horloge(room, message): # Gestion des horloges PBTA
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'horloge']
|
|
except:
|
|
modules[room.room_id, 'horloge'] = False
|
|
if (modules[room.room_id, 'horloge']):
|
|
global clock
|
|
nick = getNick(room,message)
|
|
|
|
args = getMessage(message).split()
|
|
args.pop(0)
|
|
if (len(args) == 0):
|
|
# Liste des horloges du salon
|
|
for cle,valeur in clock.items():
|
|
if (cle[0] == room.room_id):
|
|
await aff_hor(room, cle[1], valeur)
|
|
elif (len(args) >= 2 and args[len(args)-1].isnumeric()):
|
|
# Place le niveau de l'horloge entre 0 et 6
|
|
nv = int(args[len(args)-1])
|
|
clock[room.room_id, ' '.join(args[0:-1])] = nv
|
|
elif (len(args) >= 2 and (args[len(args)-1][:1] == "+" or args[len(args)-1][:1] == "-")):
|
|
nv = 0
|
|
hor = ' '.join(args[0:-1])
|
|
if ((room.room_id, hor) in clock):
|
|
nv = clock[room.room_id, hor]
|
|
val = 0
|
|
if (args[len(args)-1][1:].isnumeric()):
|
|
val = int(args[len(args)-1][1:])
|
|
if (args[len(args)-1][:1] == "+"):
|
|
nv = nv + val
|
|
if (nv > 6):
|
|
nv = 6
|
|
else:
|
|
nv = nv - val
|
|
if (nv < 0):
|
|
nv = 0
|
|
clock[room.room_id, hor] = nv
|
|
await aff_hor(room, hor, nv)
|
|
elif (len(args) >= 2 and args[0] == "del"):
|
|
# Supprime une horloge
|
|
args.pop(0)
|
|
del clock[room.room_id, ' '.join(args)]
|
|
else:
|
|
await msg(room,"Utilisation : \n- !horloge : Affiche les horloges. \n- !horloge <nom> <niveau> : Place ou crée l'horloge au niveau spécifié.\n- !horloge del <nom> : Supprime l'horloge.",getUser(message))
|
|
|
|
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
|
|
bot_nick = getNick(room, message)
|
|
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=bot_nick
|
|
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=bot_nick, 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)
|
|
#TODO : room_delete_alias(access_token, room_alias)
|
|
|
|
async def biere(room,message): # Gestion des boissons
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'biere']
|
|
except:
|
|
modules[room.room_id, 'biere'] = False
|
|
power = 0
|
|
if (modules[room.room_id, 'biere']):
|
|
sender = getUser(message)
|
|
mess = getMessage(message)
|
|
lmod = modos.get(room.room_id)
|
|
if (sender in admins or sender in lmod):
|
|
power = 1
|
|
global bieres
|
|
args = mess.split()
|
|
args.pop(0)
|
|
breuvages = {}
|
|
give = False
|
|
elu = ""
|
|
envoyeur = getNick(room, message)
|
|
|
|
try:
|
|
breuvages = bieres[room.room_id]
|
|
except:
|
|
breuvages = {}
|
|
|
|
if (len(args) > 1 and args[0] == "give"):
|
|
give = True
|
|
args.pop(0)
|
|
submit = " ".join(args).split(":")
|
|
elu = submit[0]
|
|
if (power == 0):
|
|
elu = elu.replace('@room', 'tout le monde')
|
|
try:
|
|
args = submit[1].split()
|
|
except:
|
|
args = ""
|
|
if (len(args) > 2 and args[0] == "add"):
|
|
#ajoute une biere
|
|
args.pop(0)
|
|
submit = " ".join(args).split(":")
|
|
if (len(submit) > 1):
|
|
# Ajout de la citation
|
|
nick = submit[0].strip()
|
|
nick = nick.replace('@room', 'tous')
|
|
submit.pop(0)
|
|
citation = ":".join(submit)
|
|
citation = citation.replace('@room', 'tout le monde')
|
|
tps = datetime.now().microsecond
|
|
breuvages[nick,tps] = citation
|
|
bieres[room.room_id] = breuvages
|
|
await msg(room,"Ajout du breuvage " + nick + ":" + citation,sender)
|
|
else:
|
|
# message d'aide
|
|
await msg(room,"!biere add <nick>:<citation>",sender)
|
|
elif (len(args) > 0 and args[0] == "list"):
|
|
# liste les quotes
|
|
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"
|
|
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 = await verifPMRoom(room,message)
|
|
lmod = modos.get(room.room_id)
|
|
if (sender in admins):
|
|
id = args[1]
|
|
reponse = "Voici le breuvage supprimé : \n"
|
|
for rid,fame in bieres.items():
|
|
for cle,valeur in fame.items():
|
|
if (str(cle[1]) == id):
|
|
del fame[cle[0],cle[1]]
|
|
reponse = reponse + rid + " / " + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n"
|
|
break
|
|
await msg(salon,reponse,sender)
|
|
elif (sender in lmod):
|
|
id = args[1]
|
|
reponse = "Voici le breuvage supprimé : \n"
|
|
rid = room.room_id
|
|
fame = bieres[rid]
|
|
for cle,valeur in fame.items():
|
|
if (str(cle[1]) == id):
|
|
del fame[cle[0],cle[1]]
|
|
reponse = reponse + rid + " / " + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n"
|
|
break
|
|
await msg(salon,reponse,sender)
|
|
else:
|
|
await msg(salon,"Vous n'êtes pas autorisés à supprimer des breuvages.",sender)
|
|
elif (len(args) > 0):
|
|
# cite une reponse d'un breuvage precis
|
|
nick = " ".join(args)
|
|
phrases = []
|
|
for cle,valeur in breuvages.items():
|
|
if (cle[0] == nick):
|
|
if (give):
|
|
phrases.append(valeur + " pour " + elu + " de la part de " + envoyeur)
|
|
else:
|
|
phrases.append(valeur + " pour " + envoyeur)
|
|
if (len(phrases) > 0 ):
|
|
await reponses(room,phrases)
|
|
else:
|
|
await msg(room,"Je n'ai pas de " + nick + " en stock!",sender)
|
|
else:
|
|
# cite une réponse d'un breuvage aleatoire
|
|
phrases = []
|
|
for cle,valeur in breuvages.items():
|
|
if (give):
|
|
phrases.append(valeur + " pour " + elu + " de la part de " + envoyeur)
|
|
else:
|
|
phrases.append(valeur + " pour " + envoyeur)
|
|
if (len(phrases) > 0 ):
|
|
await reponses(room,phrases)
|
|
else:
|
|
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
|
|
try:
|
|
rmod = modules[room.room_id, 'biere']
|
|
except:
|
|
modules[room.room_id, 'biere'] = False
|
|
if (modules[room.room_id, 'biere']):
|
|
sender = getUser(message)
|
|
mess = getMessage(message)
|
|
boisson = ""
|
|
elu = ""
|
|
|
|
args = mess.split()
|
|
try:
|
|
boisson = args[0][1:]
|
|
except:
|
|
boisson = ""
|
|
args.pop(0)
|
|
|
|
if (len(args) > 0):
|
|
elu = " ".join(args)
|
|
|
|
if (len(elu) > 0 and len(boisson) > 0):
|
|
mess = "!biere give " + elu + ":" + boisson
|
|
elif (len(elu) > 0):
|
|
mess = "!biere give " + elu
|
|
elif (len(boisson) > 0):
|
|
mess = "!biere " + boisson
|
|
else:
|
|
mess = "!biere"
|
|
message = sender + " : " + mess
|
|
await biere(room,message)
|
|
|
|
async def salon(room,message): # Gestion des listes de salons recommandes
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'salon']
|
|
except:
|
|
modules[room.room_id, 'salon'] = False
|
|
if (modules[room.room_id, 'salon']):
|
|
sender = getUser(message)
|
|
mess = getMessage(message)
|
|
global salons
|
|
args = mess.split()
|
|
args.pop(0)
|
|
famous = {}
|
|
try:
|
|
famous = salons[room.room_id]
|
|
except:
|
|
famous = {}
|
|
|
|
if (len(args) > 3 and args[0] == "add"):
|
|
#ajoute un salon recommande
|
|
ref = ""
|
|
desc = ""
|
|
args.pop(0)
|
|
if (args[0] == "desc"):
|
|
args.pop(0)
|
|
ref = "desc"
|
|
desc = " ".join(args)
|
|
else:
|
|
ref = args[0]
|
|
args.pop(0)
|
|
desc = " ".join(args)
|
|
famous[ref] = desc
|
|
salons[room.room_id] = famous
|
|
await msg(room,"Ajout du salon " + ref + " : " + desc,sender)
|
|
elif (len(args) > 1 and args[0] == "del"):
|
|
salon = await verifPMRoom(room,message)
|
|
lmod = modos.get(room.room_id)
|
|
if (sender in admins):
|
|
id = args[1]
|
|
reponse = "Voici le salon supprimé : \n"
|
|
rid = room.room_id
|
|
fame = salons[rid]
|
|
for cle,valeur in fame.items():
|
|
if (str(cle) == id):
|
|
del fame[cle]
|
|
reponse = reponse + rid + " / " + cle + " : " + valeur + "\n"
|
|
break
|
|
await msg(room,reponse,sender)
|
|
elif (sender in lmod):
|
|
id = args[1]
|
|
reponse = "Voici le salon supprimé : \n"
|
|
rid = room.room_id
|
|
fame = salons[rid]
|
|
for cle,valeur in fame.items():
|
|
if (str(cle) == id):
|
|
del fame[cle]
|
|
reponse = reponse + rid + " / " + cle + " : " + valeur + "\n"
|
|
break
|
|
await msg(room,reponse,sender)
|
|
else:
|
|
await msg(salon,"Vous n'êtes pas autorisés à supprimer des salons.",sender)
|
|
elif (len(args) > 0):
|
|
# cite un salon precis
|
|
ref = args[0]
|
|
trouve = 0
|
|
for cle,valeur in famous.items():
|
|
if (cle == ref):
|
|
await msg(salon,cle + " : " + valeur,sender)
|
|
trouve = 1
|
|
break
|
|
if (trouve == 0):
|
|
await msg(room,"Je n'ai pas de salons nomme " + ref,sender)
|
|
else:
|
|
# cite tous les salons
|
|
reponse = ""
|
|
trouve = 0
|
|
if ("desc" in famous):
|
|
reponse = reponse + famous["desc"] + "\n"
|
|
for cle,valeur in famous.items():
|
|
if (cle != "desc"):
|
|
reponse = reponse + cle + " : " + valeur + "\n"
|
|
trouve = 1
|
|
if (trouve == 0):
|
|
await msg(room,"Je n'ai pas de salons recommandes pour ce salon",sender)
|
|
else:
|
|
await msg(room,reponse,sender)
|
|
|
|
async def accueil(room,message): # Mettre un message d'accueil
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'welcome']
|
|
except:
|
|
modules[room.room_id, 'welcome'] = False
|
|
if (modules[room.room_id, 'welcome']):
|
|
sender = getUser(message)
|
|
mess = getMessage(message)
|
|
lmod = modos.get(room.room_id)
|
|
if (sender in admins or sender in lmod):
|
|
global welcome
|
|
args = mess.split()
|
|
args.pop(0)
|
|
reponse = " ".join(args)
|
|
if (len(args) > 0):
|
|
welcome[room.room_id] = reponse
|
|
await msg(room,"Le message d'accueil est désormais : " + reponse,sender)
|
|
|
|
else:
|
|
await msg(salon,"Vous n'êtes pas autorisés à modifier le message d'accueil.",sender)
|
|
|
|
async def bienvenue(room,message): # Affichage d'un message d'accueil aux nouveaux venus
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'welcome']
|
|
except:
|
|
modules[room.room_id, 'welcome'] = False
|
|
if (modules[room.room_id, 'welcome']):
|
|
sender = message.sender
|
|
nick = room.user_name(message.state_key) if room.user_name(message.state_key) else message.state_key
|
|
membership = message.membership
|
|
prev_member = message.prev_membership
|
|
|
|
if room.name:
|
|
alias = room.name
|
|
elif room.canonical_alias:
|
|
alias = room.canonical_alias
|
|
elif room.names:
|
|
alias = room.names[0]
|
|
else:
|
|
alias = ""
|
|
reponse = ""
|
|
try:
|
|
reponse = welcome[room.room_id]
|
|
except:
|
|
reponse = ""
|
|
if (membership == "join" and prev_member != "join"):
|
|
await msg(room,"Bienvenue sur " + alias + ", " + nick + ". " + reponse,sender)
|
|
elif (membership == "leave" and prev_member != "leave"):
|
|
await msg(room,"Au revoir " + nick + "!",sender)
|
|
else:
|
|
try:
|
|
print("current: " + membership + " prev: " + prev_member)
|
|
except:
|
|
print(message)
|
|
|
|
async def titre(room, message): # cherche le titre d'une page
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'titre']
|
|
except:
|
|
modules[room.room_id, 'titre'] = False
|
|
if (modules[room.room_id, 'titre']):
|
|
args = getMessage(message).split()
|
|
sender = getUser(message)
|
|
args.pop(0)
|
|
try:
|
|
invidious = modules[room.room_id, 'invidious']
|
|
except:
|
|
invidious = False
|
|
try:
|
|
url=args[0]
|
|
print(url)
|
|
if (re.search(r"^.*://",url) is None):
|
|
url = "http://" + url
|
|
r = requests.get(url)
|
|
res = re.search(r"<title>(.*)</title>",r.text)
|
|
if (res is not None):
|
|
await msg(room,html2text.html2text(str(re.sub("</?title>", "", res.group()))),sender)
|
|
else:
|
|
await msg(room,"Titre non trouvé",sender)
|
|
if (re.search(r"http[s]?://(www\.)?youtube\.",url) is not None and invidious is False):
|
|
res = re.sub(r"^.*\?v=(\w+).*$", r"\1", url, 0, re.MULTILINE)
|
|
await msg(room,str("https://invidious.fdn.fr/watch?v=" + res),sender)
|
|
except:
|
|
await msg(room,"URL invalide",sender)
|
|
|
|
async def addquote(room,message): # enregistrer les citations mode reponses matrix
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'quote']
|
|
except:
|
|
modules[room.room_id, 'quote'] = False
|
|
if (modules[room.room_id, 'quote']):
|
|
global citations
|
|
|
|
content = getMessage(message)
|
|
sender = getUser(message)
|
|
if len(content) > 42:
|
|
# Récupération de l'auteur
|
|
auteur = "Un nain connu"
|
|
match = re.search(r"<(@\w+:\w+.\w+)>", content)
|
|
if match:
|
|
auteur = match.group(1)
|
|
nick = room.user_name(auteur)
|
|
|
|
# Enlève la commande de la citation
|
|
try:
|
|
content = content.replace("\n!addquote", " ")
|
|
content = content.replace("\n!", "\n")
|
|
content = content.replace("<p>!addquote</p>\n", "")
|
|
content = content.replace("<p>!", "<p>")
|
|
content = content.replace("<"+auteur+">",nick+" <"+auteur+">")
|
|
except:
|
|
print("erreur content " + content)
|
|
|
|
# Id
|
|
tps = datetime.now().microsecond
|
|
|
|
# récupérations des citations du salon
|
|
famous = {}
|
|
try:
|
|
famous = citations[room.room_id]
|
|
except:
|
|
famous = {}
|
|
|
|
# enregistrement de la citation
|
|
famous[auteur,tps] = content
|
|
citations[room.room_id] = famous
|
|
await bot.api.send_markdown_message(room_id=room.room_id,message="Ajout de la citation de " + nick + ":\n" + content)
|
|
|
|
async def showquote(room, message): # afficher les citations mode reponse matrix
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'quote']
|
|
except:
|
|
modules[room.room_id, 'quote'] = False
|
|
if (modules[room.room_id, 'quote']):
|
|
args = getMessage(message).split()
|
|
sender = getUser(message)
|
|
args.pop(0)
|
|
famous = {}
|
|
try:
|
|
famous = citations[room.room_id]
|
|
except:
|
|
famous = {}
|
|
|
|
if (len(args) == 1):
|
|
# cite une quote d'une personne precise
|
|
nick = args[0]
|
|
phrases = []
|
|
for cle,valeur in famous.items():
|
|
if (cle[0] == nick):
|
|
phrases.append(valeur)
|
|
if (len(phrases) > 0 ):
|
|
await reponses(room,phrases,True)
|
|
else:
|
|
await msg(room,"Je n'ai pas de citations pour " + nick,sender)
|
|
else:
|
|
# cite une quote aleatoire
|
|
phrases = []
|
|
for cle,valeur in famous.items():
|
|
phrases.append(valeur)
|
|
if (len(phrases) > 0 ):
|
|
await reponses(room,phrases,True)
|
|
else:
|
|
await msg(room,"Je n'ai pas de citations pour ce salon",sender)
|
|
|
|
async def card(room, message): # Tirer une carte du paquet sans la retirer
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'card']
|
|
except:
|
|
modules[room.room_id, 'card'] = False
|
|
if (modules[room.room_id, 'card']):
|
|
reponse = cartes_base[random.randrange(0,len(cartes_base))]
|
|
await msg(room,reponse,getUser(message))
|
|
|
|
async def carte(room, message): # Tirer une carte du paquet en la retirant ensuite
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'carte']
|
|
except:
|
|
modules[room.room_id, 'carte'] = False
|
|
if (modules[room.room_id, 'carte']):
|
|
global paquets
|
|
sender = getUser(message)
|
|
cartes = paquets.get(room.room_id)
|
|
if (cartes is None):
|
|
cartes = list(cartes_base)
|
|
args = getMessage(message).split()
|
|
if (len(args) > 1):
|
|
cartes=list(cartes_base)
|
|
await msg(room,"Le paquet est melange",sender)
|
|
else:
|
|
if (len(cartes) < 1):
|
|
cartes=list(cartes_base)
|
|
await msg(room,"Le paquet est melange",sender)
|
|
i = random.randrange(0,len(cartes))
|
|
await msg(room,cartes[i],sender)
|
|
cartes.pop(i)
|
|
paquets[room.room_id]=cartes
|
|
|
|
#async def last(room, message): # dernière connexion d'un utilisateur
|
|
# global modules
|
|
# try:
|
|
# rmod = modules[room.room_id, 'stats']
|
|
# except:
|
|
# modules[room.room_id, 'stats'] = False
|
|
# if (modules[room.room_id, 'stats']):
|
|
# args = getMessage(message).split()
|
|
# sender = getUser(message)
|
|
# args.pop(0)
|
|
# print("analyse args " + str(args))
|
|
# if (len(args) == 1):
|
|
# try:
|
|
# print("into try")
|
|
# target = room.users.get(args[0])
|
|
# print("get target")
|
|
# if (target):
|
|
# ago = target.last_active_ago
|
|
# await msg(room,"d" + str(ago),sender)
|
|
# else:
|
|
# await msg(room,args[0] + " non trouvé.",sender)
|
|
# except:
|
|
# print(args[0])
|
|
# else:
|
|
# await msg(room,"!last <mxid>",sender)
|
|
|
|
async def last(room,message): # Regarde la dernière fois que quelqu'un a écrit un message
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'stats']
|
|
except:
|
|
modules[room.room_id, 'stats'] = False
|
|
if (modules[room.room_id, 'stats']):
|
|
global stats
|
|
args = getMessage(message).split()
|
|
sender = getUser(message)
|
|
usrstats = None
|
|
args.pop(0)
|
|
pers = ""
|
|
if (len(args) >= 1 and args[0] == "all"):
|
|
max_sign = "+"
|
|
max_duree = 0
|
|
if (len(args) > 1):
|
|
max_sign = args[1][0]
|
|
max_duree = int(args[1][1:])
|
|
ref_duree = datetime.now() - timedelta(days=max_duree)
|
|
salon = await verifPMRoom(room,message)
|
|
all_usr = {}
|
|
reponse = "Les gens ayant posté à " + max_sign + " de " + str(max_duree) + " jours :\n"
|
|
for cle,valeur in stats.items():
|
|
if (cle[0] == room.room_id):
|
|
usrstats = stats[room.room_id,cle[1]]
|
|
if ((usrstats.user in all_usr and all_usr[usrstats.user].date < usrstats.date) or not usrstats.user in all_usr):
|
|
all_usr[usrstats.user] = usrstats
|
|
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"
|
|
await msg(salon, reponse,sender)
|
|
elif (len(args) >= 1 and args[0] == "inactifs"):
|
|
max_sign = "+"
|
|
max_duree = 0
|
|
max_mess = 0
|
|
if (len(args) > 2):
|
|
max_sign = args[1][0]
|
|
max_duree = int(args[1][1:])
|
|
max_mess = int(args[2])
|
|
ref_duree = datetime.now() - timedelta(days=max_duree)
|
|
salon = await verifPMRoom(room,message)
|
|
all_usr = {}
|
|
reponse = "Les gens ayant posté à " + max_sign + " de " + str(max_duree) + " jours et n'ayant pas plus de " + str(max_mess) + " messages :\n"
|
|
for cle,valeur in stats.items():
|
|
if (cle[0] == room.room_id):
|
|
usrstats = stats[room.room_id,cle[1]]
|
|
if ((usrstats.user in all_usr and all_usr[usrstats.user].date < usrstats.date) or not usrstats.user in all_usr):
|
|
all_usr[usrstats.user] = usrstats
|
|
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"
|
|
await msg(salon, reponse, sender)
|
|
else:
|
|
if (len(args) == 0):
|
|
await msg(room,"!last <mxid>",sender)
|
|
else:
|
|
pers=" ".join(args)
|
|
id_pers=None
|
|
try:
|
|
usrstats = stats[room.room_id,pers]
|
|
except:
|
|
try:
|
|
for cle,valeur in room.users.items():
|
|
if (valeur.display_name == pers):
|
|
id_pers = valeur.user_id
|
|
try:
|
|
usrstats = stats[room.room_id, cle]
|
|
except:
|
|
usrstats = None
|
|
if (usrstats is not None):
|
|
break
|
|
except:
|
|
print(pers + " non reconnu")
|
|
if (usrstats is not None):
|
|
target = room.users.get(usrstats.user)
|
|
if (target and target.last_active_ago is not None):
|
|
ago = datetime.fromtimestamp(datetime.now().timestamp() - target.last_active_ago/1000)
|
|
await msg(room,"J'ai vu " + usrstats.nick + " pour la dernière fois le : " + ago.strftime("%Y-%m-%d %H:%M:%S") + ". Et il a posté pour la dernière fois le : " + usrstats.date.strftime("%Y-%m-%d %H:%M:%S"),sender)
|
|
else:
|
|
await msg(room,"J'ai vu " + usrstats.nick + " poster pour la dernière fois le " + usrstats.date.strftime("%Y-%m-%d %H:%M:%S"),sender)
|
|
else:
|
|
target = None
|
|
if (id_pers is not None):
|
|
target = room.users.get(id_pers)
|
|
else:
|
|
target = room.users.get(pers)
|
|
if (target and target.last_active_ago is not None):
|
|
ago = datetime.fromtimestamp(datetime.now().timestamp() - target.last_active_ago/1000)
|
|
await msg(room,"Dernière présence de " + pers + " : " + ago.strftime("%Y-%m-%d %H:%M:%S"),sender)
|
|
else:
|
|
await msg(room,pers + " : Personne non reconnue",sender)
|
|
|
|
def statistiques(room,message): # Enregistrement des statistiques
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'stats']
|
|
except:
|
|
modules[room.room_id, 'stats'] = False
|
|
if (modules[room.room_id, 'stats']):
|
|
global stats
|
|
nick = getNick(room, message)
|
|
user = getUser(message)
|
|
mess = getMessage(message)
|
|
usrstats = None
|
|
|
|
try:
|
|
usrstats = stats[room.room_id,user]
|
|
except:
|
|
usrstats = Userstats(room.room_id,user,nick)
|
|
|
|
# date de la phrase
|
|
date = datetime.now()
|
|
usrstats.date = date
|
|
|
|
# recup nb phrases +1, 1 sinon
|
|
usrstats.mess = usrstats.mess + 1
|
|
|
|
# recup nb lettres +lettres phrase, lettres phrases sinon
|
|
usrstats.char = usrstats.char + len(mess)
|
|
|
|
# insertion des objets
|
|
stats[room.room_id,user] = usrstats
|
|
|
|
async def actif(room,message): # Stats d'activité d'une personne
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'stats']
|
|
except:
|
|
modules[room.room_id, 'stats'] = False
|
|
if (modules[room.room_id, 'stats']):
|
|
global stats
|
|
args = getMessage(message).split()
|
|
sender = getUser(message)
|
|
args.pop(0)
|
|
if (len(args) > 0 and args[0] == "list"):
|
|
salon = await verifPMRoom(room,message)
|
|
room_act = []
|
|
for cle,valeur in stats.items():
|
|
if (cle[0] == room.room_id):
|
|
room_act.append(valeur)
|
|
room_act.sort(key=lambda us: us.mess, reverse=True)
|
|
reponse="Voici le tableau des plus gros posteurs!\n"
|
|
for us in room_act:
|
|
reponse = reponse + us.nick + " : " + str(us.mess) + "\n"
|
|
await msg(salon,reponse,sender)
|
|
else:
|
|
pers = ""
|
|
usrstats = None
|
|
if (len(args) == 0):
|
|
pers = getUser(message)
|
|
else:
|
|
pers=" ".join(args)
|
|
print(pers)
|
|
try:
|
|
usrstats = stats[room.room_id,pers]
|
|
except:
|
|
for cle,valeur in room.users.items():
|
|
if (valeur.display_name == pers):
|
|
try:
|
|
usrstats = stats[room.room_id, cle]
|
|
except:
|
|
usrstats = None
|
|
if (usrstats is not None):
|
|
break
|
|
if(usrstats):
|
|
try:
|
|
moy = "{:10.2f}".format(usrstats.char / usrstats.mess)
|
|
await msg(room,usrstats.nick + " a posté " + str(usrstats.mess) + " messages avec une moyenne de " + moy + " caractères par message",sender)
|
|
except:
|
|
print("erreur usrstats")
|
|
else:
|
|
await msg(room,pers + " : Personne non reconnue\n",sender)
|
|
|
|
def getNiveau(niveau):
|
|
if (niveau == 1):
|
|
return("vert")
|
|
elif (niveau == 2):
|
|
return("orange")
|
|
elif (niveau == 3):
|
|
return("rouge")
|
|
else:
|
|
return("Inconnu")
|
|
|
|
async def ecowatt(room, message):
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'ecowatt']
|
|
except:
|
|
modules[room.room_id, 'ecowatt'] = False
|
|
if (modules[room.room_id, 'ecowatt']):
|
|
args = getMessage(message).split()
|
|
sender = getUser(message)
|
|
jn = int(datetime.today().strftime("%Y%m%d"))
|
|
hn = int(datetime.today().strftime("%H"))
|
|
signals = None
|
|
global wattobj
|
|
if (wattobj.jour < jn or (wattobj.jour == jn and wattobj.heure + 1 < hn)):
|
|
try:
|
|
oauth = rte_token()
|
|
result = oauth.get(ecowatt_url)
|
|
watt = json.loads(result.text)
|
|
except Exception as e:
|
|
print(e)
|
|
await msg(room, "Veuillez attendre 15 minutes", sender)
|
|
return
|
|
sign = watt["signals"]
|
|
signals = sorted(sign, key=lambda signal: signal["jour"][0:10])
|
|
wattobj.jour = jn
|
|
wattobj.heure = hn
|
|
wattobj.signals = signals
|
|
else:
|
|
signals = wattobj.signals
|
|
args.pop(0)
|
|
mess = ""
|
|
if (len(args) > 0 and args[0] == "details"):
|
|
i=False
|
|
for jour in signals:
|
|
if (jour["dvalue"] > 1):
|
|
if (i):
|
|
mess = mess + "\n"
|
|
i=True
|
|
mess = mess + jour["jour"][0:10] + " : " + jour["message"]
|
|
heures = sorted(jour["values"], key=lambda h: h["pas"])
|
|
for heure in heures:
|
|
if (heure["hvalue"] > 1):
|
|
alerte = getNiveau(heure["hvalue"])
|
|
mess = mess + "\n" + str(heure["pas"]) + "h : niveau " + alerte
|
|
if (len(mess) < 10):
|
|
mess = "Aucune alerte sur le réseau RTE dans les trois prochains jours."
|
|
elif (len(args) > 0 and args[0].isnumeric()):
|
|
j = int(args[0])
|
|
if (len(signals) > j):
|
|
jour = signals[j]
|
|
alerte = getNiveau(jour["dvalue"])
|
|
mess = mess + "La météo RTE du " + jour["jour"][0:10] + " est de niveau " + alerte + " (" + jour["message"] + ")\n"
|
|
else:
|
|
for jour in signals:
|
|
alerte = getNiveau(jour["dvalue"])
|
|
mess = mess + "La météo RTE du " + jour["jour"][0:10] + " est de niveau " + alerte + " (" + jour["message"] + ")\n"
|
|
await msg(room, mess, sender)
|
|
|
|
async def commune(room, message):
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'commune']
|
|
except:
|
|
modules[room.room_id, 'commune'] = False
|
|
if (modules[room.room_id, 'commune']):
|
|
args = getMessage(message).split()
|
|
sender = getUser(message)
|
|
args.pop(0)
|
|
mess = ""
|
|
if (len(args) > 0):
|
|
ville = " ".join(args)
|
|
cette_commune = None
|
|
if (ville.isnumeric()):
|
|
cette_commune = commune_url.replace("<NOM>", ville).replace("<TYPE>", "codePostal")
|
|
else:
|
|
cette_commune = commune_url.replace("<NOM>", ville).replace("<TYPE>", "nom")
|
|
oauth = rte_token()
|
|
result = oauth.get(cette_commune)
|
|
villes = json.loads(result.text)
|
|
if (len(villes) > 0):
|
|
try:
|
|
cites = sorted(villes, key=lambda v: str(v["population"]).zfill(10), reverse=True)
|
|
cite = cites[0]
|
|
codePoste = cite["codesPostaux"][0]
|
|
pop = cite["population"]
|
|
insee = cite["code"]
|
|
nom = cite["nom"]
|
|
await msg(room, nom + ". CP : " + codePoste + ". Code INSEE : " + insee + ". Population : " + str(pop), sender)
|
|
except:
|
|
await msg(room, str(villes), sender)
|
|
else:
|
|
await msg(room, "Commune non trouvée", sender)
|
|
else:
|
|
await msg(room, "!commune <nom de la commune OU code postal de la commune>", sender)
|
|
|
|
async def eau(room, message):
|
|
global modules
|
|
try:
|
|
rmod = modules[room.room_id, 'eau']
|
|
except:
|
|
modules[room.room_id, 'eau'] = False
|
|
if (modules[room.room_id, 'eau']):
|
|
args = getMessage(message).split()
|
|
sender = getUser(message)
|
|
args.pop(0)
|
|
mess = ""
|
|
if (len(args) > 0):
|
|
ville = " ".join(args)
|
|
cette_commune = None
|
|
if (ville.isnumeric()):
|
|
cette_commune = eau_url.replace("<NOM>", ville).replace("<TYPE>", "code_commune")
|
|
else:
|
|
cette_commune = eau_url.replace("<NOM>", ville).replace("<TYPE>", "nom_commune")
|
|
oauth = rte_token()
|
|
result = oauth.get(cette_commune)
|
|
eaux = None
|
|
try:
|
|
eaux = json.loads(result.text)
|
|
except:
|
|
eaux = None
|
|
if (eaux is not None):
|
|
if (len(eaux["data"]) > 0):
|
|
try:
|
|
f = True
|
|
for eau in eaux["data"]:
|
|
if (f):
|
|
nom = eau["nom_commune"]
|
|
distrib = eau["nom_distributeur"]
|
|
concl = eau["conclusion_conformite_prelevement"]
|
|
await msg(room, "Prélèvement à " + nom + " réseau " + distrib + ". " + concl, sender)
|
|
f = False
|
|
date = eau["date_prelevement"][0:10]
|
|
res = eau["resultat_alphanumerique"]
|
|
unite = str(eau["libelle_unite"])
|
|
if (unite == "SANS OBJET"):
|
|
unite = ""
|
|
limite = "(" + str(eau["limite_qualite_parametre"]) + ")"
|
|
if (limite == "(None)"):
|
|
limite = ""
|
|
param = eau["libelle_parametre"] + " " + limite
|
|
await msg(room, "Résultat du " + date + " : " + res + unite + " / " + param + ".", sender)
|
|
except:
|
|
await msg(room, str(eaux), sender)
|
|
else:
|
|
await msg(room, "Commune non trouvée", sender)
|
|
else:
|
|
await msg(room, "Rapport d'eaux non trouvé", sender)
|
|
else:
|
|
await msg(room, "!eau <nom de la commune OU code INSEE de la commune>", sender)
|
|
|
|
async def help(room, message): # Aide en message privé
|
|
await help_center(room,message,"help",True)
|
|
|
|
async def aide(room, message): # Aide dans le salon
|
|
await help_center(room,message,"aide",False)
|
|
async def help_center(room,message,name,private): # Aide sur les commandes disponibles
|
|
args = getMessage(message).split()
|
|
args.pop(0)
|
|
salon = room
|
|
sender = getUser(message)
|
|
if (private):
|
|
salon = await verifPMRoom(room,message)
|
|
if (len(args) > 0):
|
|
if (re.search("roll", args[0])):
|
|
await msg(salon,":roll <options> <des> (+-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<nb> : difficulte a atteindre par de avec option n\n- g<nb> : nombre de des conserves\n- r<nb> : relance si le de a obtenu au moins ce nombre\n- m<nb> : Enleve un succes si ce nombre ou moins est atteint\n- s<nb/nb> : seuil a atteindre et niveaux de reussites\n- w<nb> : lance un wild die avec les autres.",sender, False)
|
|
elif (re.search("sw", args[0])):
|
|
await msg(salon,"- :sw <options> <des> : Lance les des en mode Savage Worlds\nVerbose/Noadd/Explosif/Seuil 4/Niveau de reussite 4/Wild Die d6.",sender, False)
|
|
elif (re.search("dom", args[0])):
|
|
await msg(salon,"- :dom <options> <des> : Lance les dommages en mode Savage Worlds\nVerbose/Explosif/seuil 4/Niveau de reussite 4.",sender, False)
|
|
elif (re.search("owod", args[0])):
|
|
await msg(salon,"- :owod <options> <des> : Lance les des en mode Ancien Monde des Tenebres\nVerbose/Noadd/Difficulte 6/Relance les 10/Les 1 enleve un succes.",sender, False)
|
|
elif (re.search("wod", args[0])):
|
|
await msg(salon,"- :wod <options> <des> : Lance les des en mode Nouveau Monde des Tenebres\nVerbose/Noadd/Difficulte 8/Relance les 10.",sender, False)
|
|
elif (re.search("ars", args[0])):
|
|
await msg(salon,"- :ars <options> <des> : Lance les des en mode Ars Magicka : de de tension\nVerbose/Noadd/Sur un 1, on relance et on double.",sender, False)
|
|
elif (re.search("des", args[0])):
|
|
await msg(salon,"- :des <options> <des> : Lance des des de desastre\nVerbose/Noadd/Difficulte 10.",sender, False)
|
|
elif (re.search("star", args[0])):
|
|
await msg(salon,"- :star <options> <des> : 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.",sender, False)
|
|
elif (re.search("carte", args[0])):
|
|
await msg(salon,"- !carte : Tire une carte et la retire du paquet\n- !carte m : remelange le paquet.",sender, False)
|
|
elif (re.search("card", args[0])):
|
|
await msg(salon,"- !card : tire une carte sans la retirer du paquet.",sender, False)
|
|
elif (re.search("liste", args[0])):
|
|
await msg(salon,"- !liste <options/de/la/liste> [Nombre d'elements souhaites] : retourne ce nombre d'elements de la liste.",sender, False)
|
|
elif (re.search("horloge", args[0])):
|
|
await msg(salon,"- !horloge : Affiche les horloges\n- !horloge <Nom de l'horloge> <niveau> : Crée ou modifie une horloge en lui mettant un niveau (normalement de 0 à 6)\n- !horloge del <Nom de l'horloge> : Supprime cette horloge.",sender, False)
|
|
elif (re.search("last", args[0])):
|
|
await msg(salon,"- !last : Date de son dernier post\n- !last <Personne> : Date du dernier post de la personne\n- !last inactifs <[+-]nombre de jours> <nombre max de message> : liste de personnes (en privé) ayant posté depuis + ou - le nombre de jours spécifiés et ayant au maximum le nombre de messages spécifiés.\n",sender, False)
|
|
elif (re.search("actif", args[0])):
|
|
await msg(salon,"- !actif : Nombre de ses messages et taille moyenne de ceux ci\n- !actif <Personne> : Nombre des messages de cette personne et taille moyenne de ceux ci\n",sender, False)
|
|
elif (re.search("quote", args[0])):
|
|
await msg(salon,"- !quote : Affiche une citation du salon au hasard\n- !quote <Personne> : Affiche une citation d'une personne du salon au hasard\n- !addquote après une réponse matrix : Enregistre une citation",sender, False)
|
|
elif (re.search("biere", args[0])):
|
|
await msg(salon,"- !biere : Fournit une boisson du salon au hasard\n- !biere <Nom de breuvage> : Fournit une boisson spécifique du salon\n- !biere give <Personne>[:Nom du Breuvage] : Offre une boisson (spécifique en option) à la personne spécifiée\n- !biere add <Nom du breuvage>:<Phrase> : 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 <id> : Supprime la phrase avec l'id spécifié",sender, False)
|
|
elif (re.search("accueil", args[0])):
|
|
await msg(salon,"- !accueil <message> : 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.'",sender, False)
|
|
elif (re.search("kick", args[0])):
|
|
await msg(salon,"- !kick <@mxid> [@mxid] ... : kick les users listés",sender, False)
|
|
elif (re.search("titre", args[0])):
|
|
await msg(salon,"- !titre <url> : retourne le titre de la page",sender, False)
|
|
elif (re.search("mails", args[0]) or re.search("mail", args[0])):
|
|
await msg(salon,"- !mail add <email> : s'abonner aux messages du salon par mail.\n -!mail del <email> : se désabonner aux messages du salon par mail.",sender, False)
|
|
elif (re.search("modo", args[0])):
|
|
await 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 <mxid> : Ajoute une personne comme modérateur du salon\n- !modo del <mxid> : Retire une personne des modérateurs.",sender, False)
|
|
elif (re.search("module", args[0])):
|
|
await msg(salon,"- !module : Affiche la liste des modules actifs sur le salon ainsi que celle des modules disponibles\n- !module add <module> : Active un module sur le salon\n- !module del <module> : Désactive un module sur le salon.",sender, False)
|
|
elif (re.search("cristal", args[0])):
|
|
await 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.",sender, False)
|
|
elif (re.search("ecowatt", args[0])):
|
|
await msg(salon,"- !ecowatt : Météo RTE des prochains jours.\n- !ecowatt 0-3 : Météo RTE d'une journée entre J et J+3.\n- !ecowatt details : Météo RTE des prochains jours, chaque heure orange ou rouge spécifiquement.",sender, False)
|
|
else:
|
|
await msg(salon,"A venir",sender, False)
|
|
else:
|
|
rid = room.room_id
|
|
message = "Commandes disponibles:"
|
|
for cle,valeur in modules.items():
|
|
if (cle[0] == rid and cle[1] == "card" and valeur):
|
|
message += "\n- !card"
|
|
if (cle[0] == rid and cle[1] == "carte" and valeur):
|
|
message += "\n- !carte"
|
|
if (cle[0] == rid and cle[1] == "liste" and valeur):
|
|
message += "\n- !liste <options/de/la/liste> [Nombre d'elements souhaites]"
|
|
if (cle[0] == rid and cle[1] == "horloge" and valeur):
|
|
message += "\n- !horloge : gestion des horloges PBTA"
|
|
if (cle[0] == rid and cle[1] == "stats" and valeur):
|
|
message += "\n- !last : Date de dernier post\n- !actif : Nombre de message et taille moyenne de ceux ci"
|
|
if (cle[0] == rid and cle[1] == "quote" and valeur):
|
|
message += "\n- !quote : citations du salon"
|
|
if (cle[0] == rid and cle[1] == "biere" and valeur):
|
|
message += "\n- !biere : breuvages du salon"
|
|
if (cle[0] == rid and cle[1] == "cristal" and valeur):
|
|
message += "\n- !cristal : Posez une question à la boule de cristal"
|
|
if (cle[0] == rid and cle[1] == "welcome" and valeur):
|
|
message += "\n- !accueil <message> : 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] == "titre" and valeur):
|
|
message += "\n- !titre <url> : retourne le titre de la page en paramètre si celle ci possède une balise titre"
|
|
if (cle[0] == rid and cle[1] == "mails" and valeur):
|
|
message += "\n- !mail : s'abonner aux messages du salon par mail."
|
|
if (cle[0] == rid and cle[1] == "ecowatt" and valeur):
|
|
message += "\n- !ecowatt : Météo des prochains jours du réseau électrique RTE."
|
|
if (cle[0] == rid and cle[1] == "roll" and valeur):
|
|
message += "\n- :roll <options> <des>\n- :sw <options> <des>\n- :dom <options> <des>\n- :wod <options> <des>\n- :owod <options> <des>\n- :ars <options> <des>\n- :des <options> <des>\n- :star <options> <des>"
|
|
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 + " <commande>\n\nRetrouvez Asmodee sur https://git.ombreport.info/nemesis/asmodee_matrix"
|
|
await msg(salon,message,sender, False)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callCommune(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("commune"):
|
|
await commune(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callEau(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("eau"):
|
|
await eau(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callEcowatt(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("ecowatt"):
|
|
await ecowatt(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callActif(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("actif"):
|
|
await actif(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callLast(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("last"):
|
|
await last(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callSave(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("save"):
|
|
save_obj(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callCard(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("card"):
|
|
await card(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callCarte(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("carte"):
|
|
await carte(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callHelp(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("help"):
|
|
await help(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callAide(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("aide"):
|
|
await aide(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callShowquote(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("quote"):
|
|
await showquote(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callAddquote(room, message):
|
|
match = botlib.MessageMatch(room, message, bot)
|
|
if match.is_not_from_this_bot() and match.contains("!addquote"):
|
|
await addquote(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callTitre(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("titre"):
|
|
await titre(room, message)
|
|
|
|
@bot.listener.on_custom_event(nio.RoomMemberEvent)
|
|
async def callBienvenue(room, message):
|
|
match = botlib.MessageMatch(room, message, bot)
|
|
if match.is_not_from_this_bot():
|
|
await bienvenue(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callAccueil(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("accueil"):
|
|
await accueil(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callSalon(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("salon"):
|
|
await salon(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callBoisson(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, "%")
|
|
if match.is_not_from_this_bot() and match.prefix():
|
|
await boissons(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callBiere(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("biere"):
|
|
await biere(room, message)
|
|
|
|
@bot.listener.on_message_event
|
|
async def callHor(room, message):
|
|
match = botlib.MessageMatch(room, message, bot, PREFIX)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("horloge"):
|
|
await horloge(room, message)
|
|
|
|
@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())
|
|
)
|
|
@bot.listener.on_message_event
|
|
async def callStats(room, message):
|
|
match = botlib.MessageMatch(room, message, bot)
|
|
if match.is_not_from_this_bot():
|
|
statistiques(room, message)
|
|
|
|
def rte_token():
|
|
auth = HTTPBasicAuth(RTE_ID, RTE_SECRET)
|
|
client = BackendApplicationClient(client_id=RTE_ID)
|
|
oauth = OAuth2Session(client=client)
|
|
token = oauth.fetch_token(token_url='https://digital.iservices.rte-france.com/token/oauth/', auth=auth)
|
|
return(oauth)
|
|
|
|
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", "ecowatt", "commune"]
|
|
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 (AUTH)")
|
|
|
|
if ('RTE' in config):
|
|
global RTE_ID
|
|
global RTE_SECRET
|
|
global wattobj
|
|
RTE_ID = config['RTE']['client_id'] # Bot's username
|
|
RTE_SECRET = config['RTE']['client_secret'] # Bot's password
|
|
wattobj = Wattobject()
|
|
else:
|
|
RTE_ID = None
|
|
RTE_SECRET = None
|
|
print("Probleme de lecture de configuration asmodee.ini (RTE)")
|
|
|
|
global liste_mod
|
|
if ('MOD' in config):
|
|
try:
|
|
< |