Sélectionner une révision Git
-
Loïc Wikle DUBARD a rédigéLoïc Wikle DUBARD a rédigé
bot.py 14,75 Kio
#!/usr/bin/python3
# https://fbchat.readthedocs.io/en/latest/examples.html
from fbchat import log, Client
from getpass import getpass
from fbchat.models import *
import useless
import usefull
import random
from auth_file import USERNAME, PASSWORD
from googletrans import Translator
import threading
from time import sleep
translator = Translator()
class Bot(Client):
ahah_liste = ['ahah', 'mdr', 'lol', 'Mort de rire !', 'Trop marrant', 'xD', 'PTDR']
what_liste = ['wat', 'What', 'Nani', 'keske', 'dafuk', 'da fuk']
quizzes = {}
shitpostbot = {}
kicked = {}
def onMessage(self, author_id, message_object, thread_id, thread_type, **kwargs):
self.markAsDelivered(thread_id, message_object.uid)
self.markAsRead(thread_id)
log.info("{} from {} in {}".format(message_object, thread_id, thread_type.name))
# pour éviter le spam... et oui j'ai fait cette erreur là.....
if author_id != self.uid:
to_send = self.tests(message_object.text, thread_id=thread_id, thread_type=thread_type, author_id=author_id, channel=self.fetchThreadInfo(thread_id)[thread_id].name)
if to_send is not None:
self.send(Message(to_send), thread_id=thread_id, thread_type=thread_type)
sleep(2)
self.trigger_double_mots(message_object.text, thread_id, thread_type)
# self.shitpostbot5000()
def shitpostbot5000(self):
for chan in Bot.shitpostbot:
if Bot.shitpostbot[chan][0].get_status():
if Bot.shitpostbot[chan][0].get_latest():
print('Shitpostbot5000 a dégoté une nouvelle image...')
self.sendLocalImage(Bot.shitpostbot[chan][0].get_out(), thread_id=chan, thread_type=Bot.shitpostbot[chan][1])
# TODO: move test in a standard module to use it with different bots
def tests(self, texte, thread_id, thread_type, author_id, channel=''):
if texte == '!help':
help_text = 'Ce que je sais faire :\n\n' + \
'!meteo <ville> ; <pays> ; <dans_n_heure(facultatif)>\n' + \
'!wikipedia <truc_a_chercher>\n' + \
'!useless \n' + \
'!chuck \n' + \
'!nordpress \n '\
'!quizz [start|new|reset|scoreboard|indice|round|question] \n' + \
'!q <reponse> pour répondre au quizz\n' + \
'!haddock \n' + \
'!philo \n' + \
'!pipo\n' + \
'!rename <personne> ; <pseudo> \n' + \
'!remove <personne> ; <raison(facultatif)> \n' + \
'!reinvite <personne(facultatif)>\n' + \
'!kohlanta <nom>\n' + \
'!rateau \n' + \
'!maps <nom_du_lieu> <destination(facultatif)> ... not yet fully fonctionnal\n' + \
'!memes <image_name_or_url> ; <texte1> ; <texte2(facultatif)>\n' + \
'!ping \n' + \
'!translate <phrase> ; <lang_source> ; <lang_dest>\n' + \
'!shitpostbot5000 [status|on|off|random <keyword(facultatif)>] ... ne pas utiliser PLEASE\n' + \
'!title <newtitle>\n'\
'!userlist\n'\
'!about -> vas-y test-moi !\n'
return random.choice('Hummmm non j\'ai la flemme là', help_text)
elif '!translate' in texte:
texte = texte.replace('!translate ', '').split(' ; ')
try:
return translator.translate(text=texte[0], dest=texte[2], src=texte[1]).text
except Exception as e:
print(e)
return 'Tiens j\'y arrive pas, Apparement, ça ne marche pas comme ça.'
elif texte == '!useless':
return useless.useless()
elif texte == '!nordpress':
return useless.nordpresse()
elif texte == '!chuck':
return useless.chuck()
elif texte == '!philo':
return useless.genererSujet()
elif texte == '!haddock':
return useless.haddock()
elif '!title ' in texte:
texte = texte.replace("!title ", '')
client.changeThreadTitle(texte, thread_id=thread_id, thread_type=thread_type)
# renomer qqn
# FIXME: make rename command work
elif '!rename' in texte:
texte = texte.replace('!rename ', '').split(' ; ')
for user in self.fetchAllUsersFromThreads([self.fetchThreadInfo(thread_id)[thread_id]]):
if user.name == texte[0]:
self.changeNickname(nickname=texte[1], user_id=user.uid, thread_id=thread_id, thread_type=thread_type)
return None
else:
return random.choice(['T\'es sur de ton coup là ?', 'chais pas qui c\'est...'])
# TODO: test remove
# kick qqn d'un groupe
elif '!remove ' in texte and thread_type == ThreadType.GROUP:
texte = texte.replace('!remove ', '').split(' ; ')
user_to_remove = None
for user in self.fetchAllUsersFromThreads([self.fetchThreadInfo(thread_id)[thread_id]]):
if user.name == texte[0]:
user_to_remove = user
if user.uid == author_id:
author_name = user.name
if user_to_remove is not None:
log.info("{} will be removed from {} by {}".format(user_to_remove.uid, thread_id, author_id))
try:
self.removeUserFromGroup(user_to_remove.uid, thread_id=thread_id)
except:
return "J'ai pas le droit de faire ça moi"
if thread_id in Bot.kicked:
Bot.kicked[thread_id].append(user_to_remove)
else:
Bot.kicked[thread_id] = [user_to_remove]
return '{} a été kick du groupe par {} {}'.format(texte[0], author_name, 'pour la raison : {}'.format(texte[1]) if len(texte) == 2 else '')
else:
return random.choice(['T\'es sur de ton coup là ?', 'chais pas qui c\'est...'])
elif texte == '!userlist' and thread_type == Thread.GROUP:
return ", ".join([user.name for user in self.fetchAllUsersFromThreads([self.fetchThreadInfo(thread_id)[thread_id]])])
# réinviter le dernier mec kické du group
# TODO: test reinvite
elif texte == '!reinvite' and thread_type == Thread.GROUP:
if 'thread_id' in Bot.kicked:
self.addUsersToGroup(Bot.kicked[thread_id][-1].uid, thread_id=thread_id)
elif '!reinvite ' in texte:
if 'thread_id' in Bot.kicked:
finded = False
for user in Bot.kicked[thread_id]:
if user.name == texte.replace('!reinvite ', ''):
finded = True
self.addUsersToGroup(user.uid, thread_id=thread_id)
indice = Bot.kicked[thread_id].index(user)
if finded:
# faut supprimer l'utilisateur réinvité de la liste des gens kickés
del Bot.kicked[thread_id][indice]
if len(Bot.kicked[thread_id]) == 0:
# on supprime le groupe de la liste des groupes où des gens ont étés kickés
del Bot.kicked[thread_id]
else:
return 'Mec je l\'ai pas encore kick, mais tu peux reinviter ces gens là :\n' + "\n".join([user.name for user in Bot.kicked[thread_id]])
else:
return 'T\'es débile ou quoi ? Je peux pas réinviter des gens que je n\'ai pas kické moi même en fait... \n\n\n Hummmm par contre je pourais éventuellement inviter des random mec...ou meuf...'
# SHitpostbot5000
# TODO: shitpostbot5000 random auto with timer
elif texte == '!shitpostbot5000 on':
if thread_id not in Bot.shitpostbot:
Bot.shitpostbot[thread_id] = [useless.Shitpostbot5000(), thread_type]
Bot.shitpostbot[thread_id][0].set_on()
elif texte == '!shitpostbot5000 status':
if thread_id not in Bot.shitpostbot:
return 'Ce truc n\'est pas activé et doit, à mon avis rester éteint...'
else:
return 'Eh oui, c\'est trop tard, le démon est déjà à l\'oeuvre' if Bot.shitpostbot[thread_id][0].get_status() else 'Le diable se repose...'
elif texte == '!shitpostbot5000 off':
if thread_id in Bot.shitpostbot:
Bot.shitpostbot[thread_id][0].set_off()
elif '!shitpostbot5000 random' in texte:
texte = texte.replace('!shitpostbot5000 random', '')
if texte == '':
self.sendLocalImage(useless.Shitpostbot5000.random(), thread_id=thread_id, thread_type=thread_type)
else:
self.sendLocalImage(useless.Shitpostbot5000.random(texte), thread_id=thread_id, thread_type=thread_type)
# générateur de memes
elif texte == '!memes templates':
return useless.Memes.get_templates()
elif texte == '!memes help':
return useless.Memes.get_help()
elif '!memes ' in texte:
texte = texte.replace('!memes ', '').split(' ; ')
if len(texte) == 3:
image, text1, text2 = texte
elif len(texte) == 2:
image, text1 = texte
text2 = ''
try:
meme = useless.Memes(image, text1, text2)
meme.process()
self.sendLocalImage(meme.get_result(), thread_id=thread_id, thread_type=thread_type)
sleep(2)
except:
return 'Ya un problème dans la plantation...'
elif any(word.lower() in texte.lower() for word in ["let\'s go", "c'est parti", "go ", "allons "]):
return 'é zé bardi !'
elif any(word.lower() in texte.lower().split(' ') for word in ['noice', 'nice']):
self.sendEmoji(emoji="👍", size=EmojiSize.LARGE, thread_id=thread_id, thread_type=thread_type)
# self.send(Message(emoji_size=EmojiSize.LARGE), thread_id=thread_id, thread_type=thread_type)
elif '!kohlanta' in texte:
texte = texte.replace('!kohlanta ', '')
return useless.kohlanta(texte, channel)
elif texte == '!pipo':
return useless.pipo('useless/pipotron.txt')
elif texte == '!ping':
return 'Pong !'
elif texte == '!rateau':
return useless.getRateau()
# petit jeu de quizz
elif '!quizz' in texte:
if 'start' in texte:
if thread_id not in Bot.quizzes.keys():
Bot.quizzes[thread_id] = useless.Quizz()
return Bot.quizzes[thread_id].start()
elif thread_id not in Bot.quizzes.keys():
return 'Perdu ! T\'as oublié de lancer une game looser'
if 'new' in texte:
return Bot.quizzes[thread_id].new()
if 'scoreboard' in texte:
if texte.replace('!quizz scoreboard ', '') != '':
return Bot.quizzes[thread_id].scoreboard(texte.replace('!quizz scoreboard ', ''))
else:
return Bot.quizzes[thread_id].scoreboard()
if 'reset' in texte:
return Bot.quizzes[thread_id].reset()
if 'indice' in texte:
return Bot.quizzes[thread_id].indice()
if 'round' in texte:
return Bot.quizzes[thread_id].get_round()
if 'question' in texte:
return Bot.quizzes[thread_id].get_question()
elif '!q ' in texte and thread_id in Bot.quizzes.keys():
personne = self.fetchUserInfo(author_id)[author_id].name
print(personne)
return Bot.quizzes[thread_id].answer(texte.replace('!q ', ''), personne)
elif "!indice" in texte and thread_id in Bot.quizzes.keys():
return Bot.quizzes[thread_id].indice()
elif "!scoreboard" in texte and thread_id in Bot.quizzes.keys():
return Bot.quizzes[thread_id].scoreboard()
# meteo
elif '!meteo' in texte:
try:
texte = texte.replace('!meteo ', '').split(' ; ')
if len(texte) == 2:
return usefull.meteo_de(texte[0], texte[1])
else:
return usefull.meteo_de(texte[0], texte[1], dans_n_heures=int(texte[2]))
except:
return 'Ousp, c\'est cassé...'
# wikipédia
elif '!wikipedia' in texte:
try:
texte = texte.replace('!wikipedia ', '')
return usefull.wiki(texte)
except:
return 'Ousp, j\'ai glissé chef...'
elif '!maps' in texte:
try:
return usefull.maps(texte.replace('!maps ', ''))
except:
return 'Houston, on a un problème...'
elif texte == '!about' or texte == '!cyborg':
return 'Hello, je suis A.N.U.B.I.S. A Not Usefull But Intelligent System, petit frère de nardco créé par le talentueux LawiK aka Wikle aka Cyborg aka Loïc Dub que je vénère !'
# les triggers en tout genre
elif 'Ah' in texte:
self.sendLocalImage('images/ah.png', thread_id=thread_id, thread_type=thread_type)
sleep(2)
elif any(word.lower() in texte.lower() for word in Bot.ahah_liste):
return random.choice(Bot.ahah_liste)
elif any(word.lower() in texte.lower() for word in Bot.what_liste):
return random.choice(Bot.what_liste) + '?!'
# doit rester à la fin des elif
elif '!' in texte and not any(word in texte for word in [' ! ', '! ', ' !']):
return 'Gné ?'
return None
def trigger_double_mots(self, texte, thread_id, thread_type):
# genre coucou coucou donnera : Oh, coucoucou c'est marrant ça... et faire faire donnera faifaire
texte = texte.split(' ')
indice = len(texte)
voyelles = ['a', 'e', 'i', 'o', 'u', 'y']
for i in range(len(texte) - 1):
if texte[i] == texte[i + 1]:
for v in voyelles:
if texte[i].find(v) != -1:
indice = min(texte[i].find(v), indice)
if texte[i][indice] in voyelles:
indice += 1
mot = texte[i][:indice + 1] + texte[i]
self.sendMessage(message="Oh, {} c'est marrant ça...".format(mot), thread_id=thread_id, thread_type=thread_type)
return None
if __name__ == '__main__':
# username = str(input("Username: "))
# client = Bot(username, getpass())
client = Bot(USERNAME, PASSWORD)
# Bot.shitpostbot['1627890897259691'] = [useless.Shitpostbot5000(), ThreadType.GROUP]
# Bot.shitpostbot['1627890897259691'][0].set_on()
client.listen()