From 4fc69166d5de6d7af73094cb1fa51823b7bfa4dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Wikle=20DUBARD?= <loic97429@gmail.com> Date: Tue, 20 Aug 2019 09:01:01 +0200 Subject: [PATCH] shitpostbot500 + double trigger --- bot.py | 109 ++++++++++++++++++++++++++++----------- shitpostbot5k_latest.jpg | Bin 0 -> 20967 bytes useless/__init__.py | 3 +- useless/shitpostbot5k.py | 52 +++++++++++++++++++ 4 files changed, 134 insertions(+), 30 deletions(-) create mode 100644 shitpostbot5k_latest.jpg create mode 100755 useless/shitpostbot5k.py diff --git a/bot.py b/bot.py index a99fbd4..c1d13c6 100755 --- a/bot.py +++ b/bot.py @@ -9,13 +9,14 @@ import usefull import random from auth_file import USERNAME, PASSWORD from googletrans import Translator +import threading translator = Translator() -quizzes = {} - class Bot(Client): ahah_liste = ['ahah', 'mdr', 'lol', 'Mort de rire !', 'Trop marrant', 'tu m\'as tué', 'xD', 'PTDR'] what_liste = ['wat', 'What', 'Nani', 'keske', 'dafuk', 'da fuk'] + Bot.quizzes = {} + shitpostbot = {} def onMessage(self, author_id, message_object, thread_id, thread_type, **kwargs): self.markAsDelivered(thread_id, message_object.uid) @@ -23,14 +24,22 @@ class Bot(Client): log.info("{} from {} in {}".format(message_object, thread_id, thread_type.name)) - if 'Ah' in message_object.text: - self.sendLocalImage('images/ah.png', thread_id=thread_id, thread_type=thread_type) - 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 (author_id != self.uid or 'BOT :' not in message_object.text) and to_send is not None: self.send(Message('BOT :' + to_send), thread_id=thread_id, thread_type=thread_type) + self.trigger_double_mots(message_object.text, thread_id, thread_type) + Bot.shitpostbot5000() + + @classmethod + def shitpostbot5000(self): + for chan in Bot.shitpostbot: + if Bot.shitpostbot[chan][0].get_status(): + if Bot.shitpostbot[chan][0].get_latest(): + self.sendLocalImage(Bot.shitpostbot[chan][0].get_out(), thread_id=chan, thread_type=Bot.shitpostbot[chan][1]) + def tests(self, texte, thread_id, thread_type, author_id, channel=''): + if texte == '!help': help_text = 'Ce que je sais faire :\n \ !meteo <ville> ; <pays> ; <dans_n_heure(facultatif)>\n \ @@ -50,6 +59,7 @@ class Bot(Client): !memes <image_name_or_url> ; <texte1> ; <texte2(facultatif)> ... not yet implemented\n\ !ping \n\ !translate <phrase> ; <lang_source> ; <lang_dest>\n\ + !shitpostbot5000 [status|on|off|random] ... ne pas utiliser PLEASE\n\ !about -> vas-y test-moi !\n' return help_text elif '!translate' in texte: @@ -79,9 +89,23 @@ class Bot(Client): else: return random.choice(['T\'es sur de ton coup là ?', 'chais pas qui c\'est...']) + # SHitpostbot5000 + 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 texte == '!shitpostbot5000 random': + self.sendLocalImage(Shitpostbot5000.random(), thread_id=thread_id, thread_type=thread_type) + # pour rigoler - elif any(word.lower() in texte.lower() for word in Bot.what_liste): - return random.choice(Bot.what_liste) elif '!memes templates' in texte: return useless.Memes.get_templates() elif '!memes ' in texte: @@ -100,8 +124,8 @@ class Bot(Client): 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() for word in ['noice ', 'nice ']): - self.send(Message(text="👍", emoji_size=EmojiSize.LARGE), thread_id=thread_id, thread_type=thread_type) + 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 ', '') @@ -110,42 +134,40 @@ class Bot(Client): return useless.pipo('useless/pipotron.txt') elif texte == '!ping': return 'Pong !' - elif any(word.lower() in texte.lower() for word in Bot.ahah_liste): - return random.choice(Bot.ahah_liste) elif texte == '!rateau': return useless.getRateau() # petit jeu de quizz elif '!quizz' in texte: if 'start' in texte: - if thread_id not in quizzes.keys(): - quizzes[thread_id] = useless.Quizz() - return quizzes[thread_id].start() - elif thread_id not in quizzes.keys(): + 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 quizzes[thread_id].new() + return Bot.quizzes[thread_id].new() if 'scoreboard' in texte: if texte.replace('!quizz scoreboard ', '') != '': - return quizzes[thread_id].scoreboard(texte.replace('!quizz scoreboard ', '')) + return Bot.quizzes[thread_id].scoreboard(texte.replace('!quizz scoreboard ', '')) else: - return quizzes[thread_id].scoreboard() + return Bot.quizzes[thread_id].scoreboard() if 'reset' in texte: - return quizzes[thread_id].reset() + return Bot.quizzes[thread_id].reset() if 'indice' in texte: - return quizzes[thread_id].indice() + return Bot.quizzes[thread_id].indice() if 'round' in texte: - return quizzes[thread_id].get_round() + return Bot.quizzes[thread_id].get_round() if 'question' in texte: - return quizzes[thread_id].get_question() - elif '!q ' in texte and thread_id in quizzes.keys(): + 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 quizzes[thread_id].answer(texte.replace('!q ', ''), personne) - elif "!indice" in texte and thread_id in quizzes.keys(): - return quizzes[thread_id].indice() - elif "!scoreboard" in texte and thread_id in quizzes.keys(): - return quizzes[thread_id].scoreboard() + 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: @@ -170,10 +192,39 @@ class Bot(Client): return usefull.maps(texte.replace('!maps ', '')) except: return 'Houston, on a un problème...' - elif texte == '!about': + elif texte == '!about' or texte == '!cyborg': return 'Hello, je suis A.N.U.B.I.S. A Not Usefull But Intelligent System, 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) + 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__': diff --git a/shitpostbot5k_latest.jpg b/shitpostbot5k_latest.jpg new file mode 100644 index 0000000000000000000000000000000000000000..85a5246aca2a59a33b4ebdde90929414dc6b771c GIT binary patch literal 20967 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 literal 0 HcmV?d00001 diff --git a/useless/__init__.py b/useless/__init__.py index c871796..0fddb37 100644 --- a/useless/__init__.py +++ b/useless/__init__.py @@ -9,4 +9,5 @@ from .pipotron import pipo from .haddock import haddock from .quizz import Quizz from .kohlanta import * -from .memes import Memes \ No newline at end of file +from .memes import Memes +from .shitpostbot5k import * \ No newline at end of file diff --git a/useless/shitpostbot5k.py b/useless/shitpostbot5k.py new file mode 100755 index 0000000..5236ef8 --- /dev/null +++ b/useless/shitpostbot5k.py @@ -0,0 +1,52 @@ +#!/usr/bin/python3 +from urllib.request import urlopen +from bs4 import BeautifulSoup +import re +import urllib.request +import datetime + + +class Shitpostbot5000(object): + def __init__(self, out="shitpostbot5k_latest.jpg"): + self.state = False + self.image = '' + self.date = datetime.datetime.now() + self.out = out + + def get_latest(self): + if datetime.datetime.now() > self.date + datetime.timedelta(minutes=30): + html = urlopen('https://www.facebook.com/shitpostbot5k/feed') + bs = BeautifulSoup(html, 'html.parser') + image = bs.find_all('img', {'src': re.compile('.jpg')})[-1]['src'] + if image != self.image: + urllib.request.urlretrieve(image, self.out) + self.image = image + self.date = datetime.datetime.now() + return True # new one ! + return False # nothing new + + def get_status(self): + return self.state + + def set_on(self): + self.state = True + + def set_off(self): + self.state = False + + def get_out(self): + return self.out + + @classmethod + def random(self): + html = urlopen('https://www.facebook.com/pg/shitpostbot5k/photos') + bs = BeautifulSoup(html, 'html.parser') + images = bs.find_all('img', {'src': re.compile('.jpg')}) + images2 = bs.find_all('image_src') + for image in images: + print(image["src"]) + return None + +if __name__ == "__main__": + img = Shitpostbot5000() + print(img.get_latest()) -- GitLab