@ -11,6 +11,7 @@ import sys
import pickle
import threading
import asyncio
import nio
# Var
bot = None
@ -22,6 +23,11 @@ admins = [] # Admins du bot
modos = { } # Moderateurs des salons
modules = { } # Modules activés par salon
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
# Connexion du bot
config = configparser . ConfigParser ( )
@ -44,6 +50,52 @@ 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 :
@ -69,6 +121,29 @@ def save_obj(room=None, event=None):
with open ( " modules " , " wb " ) as fichier :
saver = pickle . Pickler ( fichier )
saver . dump ( modules )
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 )
def signal_handler ( signal , frame ) : # Sauvegarder les données persistantes avant sortie
save_obj ( None , None )
@ -671,7 +746,429 @@ async def liste(room, message): # Afficher un élement aléatoire d'une liste fo
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 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 [ 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 ( 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 , event [ ' 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 = verifPMRoom(room,event)
# if (len(args) == 0):
# Liste les breuvages du salon
# reponse = "Voici les reponses du salon " + room.room_id + "\n"
# if (len(room.aliases) > 0):
# reponse = reponse + "(alias : " + room.aliases[0] + "\n"
# for cle,valeur in breuvages.items():
# reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n"
# if (len(reponse) > 500):
# msg(salon,reponse,event['sender'])
# reponse = ""
# msg(salon,reponse,event['sender'])
# elif (args[0] == "all"):
# # tous les breuvages de tous les salons
# reponse = "Les breuvages de tous les salons : " + "\n"
# msg(salon,reponse,event['sender'])
# for rid,fame in bieres.items():
# reponse = "Voici les reponses du salon " + rid + "\n"
# for cle,valeur in fame.items():
# reponse = reponse + cle[0] + " / " + str(cle[1]) + " : " + valeur + "\n"
# if (len(reponse) > 500):
# msg(salon,reponse,event['sender'])
# reponse = ""
# msg(salon,reponse,event['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"
# msg(salon,reponse,event['sender'])
elif ( len ( args ) > 1 and args [ 0 ] == " del " ) :
# salon = verifPMRoom(room,event)
salon = room . room_id
lmod = modos [ 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 " , event [ ' 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 = verifPMRoom(room,event)
salon = room . room_id
lmod = modos [ 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 [ 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 :
print ( " current: " + membership + " prev: " + prev_member )
@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 ) :
@ -736,6 +1233,17 @@ def main():
modules_read ( )
modos_read ( )
if ( ' horloge ' in liste_mod ) :
horloge_read ( )
if ( ' quote ' in liste_mod ) :
#quotes_read()
citations_read ( )
if ( ' biere ' in liste_mod ) :
bieres_read ( )
if ( ' salon ' in liste_mod ) :
salons_read ( )
if ( ' welcome ' in liste_mod ) :
welcome_read ( )
if __name__ == " __main__ " :
main ( )