From d7570633a737d0e9c887fca40637ef92ac4f65e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Wikle=20DUBARD?= <loic97429@gmail.com> Date: Mon, 19 Aug 2019 11:05:58 +0200 Subject: [PATCH] =?UTF-8?q?bot=20fonctionnel=20=C3=A0=20voir=20pour=20l'ut?= =?UTF-8?q?ilisation=20du=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 + bot.py | 95 ++++++++-- requirements.txt | 17 +- routes/__init__.py | 5 - routes/auth.py | 14 -- routes/respond.py | 26 --- server.py | 18 -- usefull/__init__.py | 4 + usefull/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 199 bytes usefull/__pycache__/maps.cpython-37.pyc | Bin 0 -> 561 bytes usefull/__pycache__/meteo.cpython-37.pyc | Bin 0 -> 4452 bytes usefull/__pycache__/wiki.cpython-37.pyc | Bin 0 -> 651 bytes usefull/maps.py | 15 ++ usefull/meteo.py | 174 ++++++++++++++++++ usefull/wiki.py | 22 +++ useless/__init__.py | 3 +- useless/__pycache__/__init__.cpython-37.pyc | Bin 410 -> 449 bytes useless/__pycache__/chuck.cpython-37.pyc | Bin 540 -> 547 bytes useless/__pycache__/haddock.cpython-37.pyc | Bin 555 -> 562 bytes useless/__pycache__/kohlanta.cpython-37.pyc | Bin 0 -> 723 bytes useless/__pycache__/nordpresse.cpython-37.pyc | Bin 577 -> 584 bytes useless/__pycache__/philotron.cpython-37.pyc | Bin 3059 -> 3066 bytes useless/__pycache__/pipotron.cpython-37.pyc | Bin 704 -> 711 bytes useless/__pycache__/quizz.cpython-37.pyc | Bin 998 -> 3579 bytes useless/__pycache__/rateau.cpython-37.pyc | Bin 2354 -> 2361 bytes useless/__pycache__/useless.cpython-37.pyc | Bin 549 -> 556 bytes 26 files changed, 306 insertions(+), 93 deletions(-) mode change 100644 => 100755 bot.py delete mode 100644 routes/__init__.py delete mode 100644 routes/auth.py delete mode 100644 routes/respond.py delete mode 100644 server.py create mode 100644 usefull/__init__.py create mode 100644 usefull/__pycache__/__init__.cpython-37.pyc create mode 100644 usefull/__pycache__/maps.cpython-37.pyc create mode 100644 usefull/__pycache__/meteo.cpython-37.pyc create mode 100644 usefull/__pycache__/wiki.cpython-37.pyc create mode 100644 usefull/maps.py create mode 100644 usefull/meteo.py create mode 100644 usefull/wiki.py create mode 100644 useless/__pycache__/kohlanta.cpython-37.pyc diff --git a/CHANGELOG.md b/CHANGELOG.md index 83e0320..88e1417 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # CHANGELOG: +## 19 aout 2019 +**Ajout:** +- script bot.py quasi complet + +--- + ## 17 aout 2019 - Script useless/quizz.py complet diff --git a/bot.py b/bot.py old mode 100644 new mode 100755 index 4973fdb..24051d4 --- a/bot.py +++ b/bot.py @@ -1,17 +1,86 @@ #!/usr/bin/python3 +# https://fbchat.readthedocs.io/en/latest/examples.html -import fbchat +from fbchat import log, Client from getpass import getpass +from fbchat.models import * +import useless +import usefull -username = str(input("Username: ")) -client = fbchat.Client(username, getpass()) - -no_of_friends = int(input("Number of friends: ")) -for i in range(no_of_friends): - name = str(input("Name: ")) - friends = client.getUsers(name) # return a list of names - friend = friends[0] - msg = str(input("Message: ")) - sent = client.send(friend.uid, msg) - if sent: - print("Message sent successfully!") + +class Bot(Client): + 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)) + + to_send = Bot.tests(message_object.text, self.fetchThreadInfo(thread_id)[thread_id].name) + if (author_id != self.uid or 'A.N.U.B.I.S. :' not in message_object.text) and to_send is not None: + self.send(Message('A.N.U.B.I.S. :' + to_send), thread_id=thread_id, thread_type=thread_type) + + @classmethod + def tests(self, texte, channel=''): + if texte == '!help': + help_text = 'Ce que je sais faire :\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] , not yet implemented\n \ + !haddock \n \ + !philo \n \ + !pipo\n \ + !kohlanta <nom>\n \ + !rateau \n \ + !maps <nom_du_lieu> <destination(facultatif)>, not yet fully fonctionnal\n \ + !about -> vas-y test-moi !\n' + return help_text + if texte == '!useless': + return useless.useless() + if texte == '!nordpress': + return useless.nordpresse() + if texte == '!chuck': + return useless.chuck() + if texte == '!philo': + return useless.genererSujet() + if texte == '!haddock': + return useless.haddock() + if texte == '!kohlanta': + texte = texte.replace('!kohlanta ', '') + return useless.kohlanta(texte, channel) + if texte == '!pipo': + return useless.pipo() + if texte == '!rateau': + return useless.getRateau() + if '!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=texte[2]) + except: + return 'Ousp, c\'est cassé...' + if '!wikipedia' in texte: + try: + texte = texte.replace('!wikipedia ', '') + return usefull.wiki(texte) + except: + return 'Ousp, j\'ai glissé chef...' + if '!maps' in texte: + try: + usefull.maps(texte.replace('!maps ', '')) + except: + return 'Houston, on a un problème...' + if texte == '!about': + 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 !' + return None + + +if __name__ == '__main__': + + username = str(input("Username: ")) + client = Bot(username, getpass()) + client.listen() diff --git a/requirements.txt b/requirements.txt index 28da7cb..625bdc8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,18 +1,3 @@ requests fbchat -alembic -cffi -Flask -itsdangerous -Jinja2 -Mako -MarkupSafe -pycparser -python-editor -six -Werkzeug -cycler -pyparsing -pytz -repoze.lru -Routes \ No newline at end of file +wikipedia \ No newline at end of file diff --git a/routes/__init__.py b/routes/__init__.py deleted file mode 100644 index 17512b5..0000000 --- a/routes/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from flask import Blueprint -routes = Blueprint('routes', __name__) - -from .auth import * -from .respond import * \ No newline at end of file diff --git a/routes/auth.py b/routes/auth.py deleted file mode 100644 index 1c5856e..0000000 --- a/routes/auth.py +++ /dev/null @@ -1,14 +0,0 @@ -from flask import Flask, request, jsonify, Response -import json -from . import routes -import requests -from pprint import pprint -VERIFY_TOKEN = 'kameronkales' - - -@routes.route("/auth", methods=['GET']) -def handle_verification(): - if request.args['hub.verify_token'] == VERIFY_TOKEN: - return request.args['hub.challenge'] - else: - return "Invalid verification token" diff --git a/routes/respond.py b/routes/respond.py deleted file mode 100644 index 95fcf70..0000000 --- a/routes/respond.py +++ /dev/null @@ -1,26 +0,0 @@ -from flask import Flask, request, jsonify, Response -import json -from . import routes -import requests -from pprint import pprint -VERIFY_TOKEN = 'kameronkales' -ACCESS_TOKEN = 'EAAGZCfOZCdjZBwBANkL6JEMJ8BQodNR76c2HLpteN63F3phr4b9sqVjeGsapiCS1ZC5MzGJxXZA4dpLk6OHUZA0KJp1ZAnYaEijZBllkvbpnFCejFyCxj9y8nrCmjASxWTspIZAhBuEnWh3UBTOyJxGSDiZBAIxeKZBHiUeLcTBuZCkrHwZDZD' - - -def reply(user_id, msg): - data = { - "recipient": {"id": user_id}, - "message": {"text": msg} - } - url = "https://graph.facebook.com/v2.6/me/messages?access_token={}".format(ACCESS_TOKEN) - resp = requests.post(url, json=data) - print(resp.content) - - -@routes.route("/auth", methods=['POST']) -def handle_incoming_messages(): - data = request.json - sender = data['entry'][0]['messaging'][0]['sender']['id'] - message = data['entry'][0]['messaging'][0]['message']['text'] - reply(sender, message) - return "ok" diff --git a/server.py b/server.py deleted file mode 100644 index 3e74038..0000000 --- a/server.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python3 - -from flask import Flask, request, jsonify, Response -import json -from routes import * - -app = Flask(__name__) - -app.register_blueprint(routes) - - -@app.route('/') -def hello_world(): - return 'Hello, World!' - - -if __name__ == "__main__": - app.run(debug=True, port=5000) diff --git a/usefull/__init__.py b/usefull/__init__.py new file mode 100644 index 0000000..9c76126 --- /dev/null +++ b/usefull/__init__.py @@ -0,0 +1,4 @@ +#!/usr/bin/python3 +from .meteo import * +from .wiki import * +from .maps import * \ No newline at end of file diff --git a/usefull/__pycache__/__init__.cpython-37.pyc b/usefull/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23f74f4439da180b01bc249f30ad42568e257e52 GIT binary patch literal 199 zcmZ?b<>g{vU|^W<85Qf#z`*br#DQTZ1_lNP1_p*=83qQ16owSW9EK1G%?PELLKsq* zf*CZKUotW<FlaK~V$|}}WR7CZO)W{yzr|9XnVoryB{#94cqKy-D+2?B_+_PEl%HRs z?~<Qfnwy$eQmh{k<nQI`91^UblwYEon_66)nwOqhq+eQ`npT>VqaPoinU`4-AFo$X ad5gm)H$SB`C)Ez*xMCIt1_lmB4n_d-Mlfvv literal 0 HcmV?d00001 diff --git a/usefull/__pycache__/maps.cpython-37.pyc b/usefull/__pycache__/maps.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ff05c644fec870b581acd61f5ae8a0a5e39cb07 GIT binary patch literal 561 zcmZ?b<>g{vU|{I;jEXI0WMFs<;=nL70|SEt0|P^`4g&*23PTh_3VRAu3Udo%6k{q= z3QIOqkwz+W3Trdt0+tlEg^V#wQLIsHDU87knjEF!3=9lhiD_w>$r-5%rFp3e1&QgY z3b}~|#R`dKsmThZc?vn1sig`<smU3sMIg+@72@yWuVAHs(4~-Bl9_jSWl>^gQK~|5 zX%SdImtQgy)P*3Lm4Si58RSSAkRurvFw`(CU`%0J$heTPmLY|?hC!Smg+-hpm_d`( z?-!%?FGhtb#f*}Yf?_Lu{qpj1z4ZM2^qf?^yc~Uy<Ma!15|dN)s|5Ac5_1cz73}m= zQp@!7N^^2FnQpOU<!9#IVl6Jn$t=-iy2X)`pPX2dnV)xyB_*}EWF<opI|Bp5FEjn3 z{QMGqm;B_?+|<01V*P+1e=k?(kYN3!{1V;V)Z*gQy!6x}{nFypw9*`iwR#1Ww^%^- zbAo)r0`eZC0Amq|cZ(xFJ~uHlFFw9XJ~gkTD76X}cKV=T1=*aL2X=<tFGhV$Mn6sV zTkP@iDf!9q@o)q35_41I<8QHM<`tBd6oJf-VgUtz5gP*o#MxlCLkJEA28LT4Ho5sJ Tr8%i~AQi<Rf`yrjm4gugQO=kY literal 0 HcmV?d00001 diff --git a/usefull/__pycache__/meteo.cpython-37.pyc b/usefull/__pycache__/meteo.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f2d537a5f008a8449ff869176f2522b999d9710 GIT binary patch literal 4452 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 Tlgow6mxGamk&jV^iHi{cxo!Ni literal 0 HcmV?d00001 diff --git a/usefull/__pycache__/wiki.cpython-37.pyc b/usefull/__pycache__/wiki.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ee2698199c2ea3020085524db681d31012c29b6 GIT binary patch literal 651 zcmZ?b<>g{vU|{fZkBUuVVqka-;=nKq0|SEt0|P^`9s>hI3PTEG4nq_}3VRB33QG%P z6k{q=3Trk~kya{mDq|{33R^QH2r@FHFa|Sda=ZkY;&+QFttgoZ#AIM#0GY?mz`)=P zGP8<-fuV$90b>p0LPkc0bcRHxN}Uph1<W-J3mI#fYM8QEYME=87qBj5SiqLTxR7xH zYYI~e^FpQtY$;3&8G{)Z!LWp30Xs-XB2x-W3hM%n5~hWW;tcq8rZ5CEXtMcLv6hyk z=~~=kO)ju7HMqr=nVy$llv*VmmS0+|P?leslUk*al3A3hV5LySq@$q8d5g0=Gdr^& zH6=4KilaESBt9oGFFlH_B)=dtx%d`KL1KDp6nk-LZf;^x<t?_<yyX0p)LU#RsSvt2 zHL)l;;}%O+erBE~%PrQD)QXbSTPz?mir5$!7^2v~B8Dp&ig+0q7=D@Q7v<-d=)2@6 zm*%GCl@#j-1o?ZpI)?=7C*_yu=B5@Gr{<-n7U`E3r>2$W<miLkrdLpTiv`30g>tb7 zDA<{}7+DyZ7`YhP7-bmQ7`Yhv7>oEB7#MDG#K-3*X6D7mSLu}{7VB0jq~z!2r7D!> zDU=kICMzT=Bxj@+fv`exkwQ+Y0?1eedj%^6O~xWngle)Du`)0)zzxew%uS7tzr|Wm ql$lp@i#0Q^ptJ<+6C{EUY_UyleoARhsvRgf6ob6Z!OX?S!3Y32%%^Pt literal 0 HcmV?d00001 diff --git a/usefull/maps.py b/usefull/maps.py new file mode 100644 index 0000000..f6ac3f2 --- /dev/null +++ b/usefull/maps.py @@ -0,0 +1,15 @@ +#!/usr/bin/python3 +''' +affiche une page maps avec un lieu rechercher + +TODO : affiche un itinéraire sur maps +''' + + +def maps(location, dest=None): + location = ("+").join(location.split(" ")) + return "https://www.google.nl/maps/place/" + location + "/& >/dev/null" + + +if __name__ == '__main__': + lieu, dest = input('entrez un lieu/une destination>').split('/') diff --git a/usefull/meteo.py b/usefull/meteo.py new file mode 100644 index 0000000..fbe9808 --- /dev/null +++ b/usefull/meteo.py @@ -0,0 +1,174 @@ +#!/usr/bin/python3 +# donne la meteo +import requests + + +def var_name(var): + """return the name of the variable var""" + for name, value in globals().items(): + if value is var and name != "i": + return name + return '?????' + + +def printv(var): + ''' + return the name of the variable var associated with the value of the var itself + exemple: + toto_is_toto = 'tata';printv(toto) returns the string : 'toto is toto : tata' + ''' + return str(var_name(var).replace("_", " ") + ' : ' + var) + + +def meteo_de(villes="petite-ile", pay="RE", all_data=True, dans_n_heures=None): + global compris, ville, pays, lattitude, longitude, température,\ + température_minimum, température_max, humidité, pression,\ + vitesse_du_vent, direction_du_vent, nuages, \ + description, volume_pluie_des_3_dernière_heures, \ + volume_neige_des_3_dernière_heures + if dans_n_heures is not None: + return forecast(villes, pay, all_data, dans_n_heures=dans_n_heures) + + pay = pay.upper()[:2] + api = "c23d0a0ffe081307fb6fbba06125aef3" + adresseid = "http://api.openweathermap.org/data/2.5/weather?q=" + requette = requests.get("{}{},{}&appid={}".format(adresseid, "%20".join(villes.split(" ")), pay, api)).json() + try: + vitesse_du_vent = str(requette["wind"]["speed"]) + " m/s" + température = str(int(requette["main"]["temp"]) - 273) + "°" + température_max = "%d °C" % (int(requette["main"]["temp_max"]) - 273) + humidité = str(requette["main"]["humidity"]) + "%" + température_minimum = "%d °C" % (int(requette["main"]["temp_min"] - 273)) + direction_du_vent = str(requette["wind"]["deg"]) + "°" + longitude = str(requette["coord"]["lon"]) + lattitude = str(requette["coord"]["lat"]) + pression = str(requette["main"]["pressure"]) + "hPa" + pays = str(requette["sys"]["country"]) + ville = str(requette["name"]) + nuages = str(requette["clouds"]["all"]) + "%" + description = str(requette["weather"][0]["description"]) + except Exception as e: + return e + + try: + volume_pluie_des_3_dernière_heures = str(requette["rain"]["3h"]) + a1 = True + except: + a1 = False + try: + volume_neige_des_3_dernière_heures = str(requette["snow"]["3h"]) + a2 = True + except: + a2 = False + + if all_data: + liste = [pays, + ville, + lattitude, longitude, + température, + température_minimum, température_max, + humidité, pression, vitesse_du_vent, + direction_du_vent, + nuages, description] + else: + liste = [pays, + ville, + # lattitude, longitude, + température, + # température_minimum, température_max, + humidité, pression, vitesse_du_vent, + # direction_du_vent, + nuages, description] + + result = ", ".join([printv(i) for i in liste]) + if a1: + result += ' ' + printv(volume_pluie_des_3_dernière_heures) + if a2: + result += ' ' + printv(volume_neige_des_3_dernière_heures) + return result + '.' + + +def forecast(villes="petite-ile", pay="RE", all_data=True, dans_n_heures=None): + global compris, ville, pays, lattitude, longitude, température,\ + temp_min, temp_max, humidité, pression,\ + vent, direction, nuages, \ + description, volume_pluie_des_3_dernière_heures, \ + volume_neige_des_3_dernière_heures, date + + pay = pay.upper()[:2] + api = "c23d0a0ffe081307fb6fbba06125aef3" + adresseid = "http://api.openweathermap.org/data/2.5/forecast?q=" + requette = requests.get("{}{},{}&appid={}".format(adresseid, "%20".join(villes.split(" ")), pay, api)).json() + result = '' + result_dans_n_heure = '' + try: + pays = str(requette["city"]["country"]) + ville = str(requette['city']["name"]) + longitude = str(requette['city']["coord"]["lon"]) + lattitude = str(requette['city']["coord"]["lat"]) + except Exception as e: + return e + + for i in range(len(requette['list'])): + try: + vent = str(requette['list'][i]["wind"]["speed"]) + " m/s" + température = str(int(requette['list'][i]['main']["temp"]) - 273) + "°" + temp_max = "%d °C" % (int(requette['list'][i]["main"]["temp_max"]) - 273) + humidité = str(requette['list'][i]["main"]["humidity"]) + "%" + temp_min = "%d °C" % (int(requette['list'][i]["main"]["temp_min"] - 273)) + direction = str(requette['list'][i]["wind"]["deg"]) + "°" + pression = str(requette['list'][i]["main"]["pressure"]) + "hPa" + nuages = str(requette['list'][i]["clouds"]["all"]) + "%" + description = str(requette['list'][i]["weather"][0]["description"]) + date = str(requette['list'][i]["dt_txt"]) + except Exception as e: + return e + + try: + volume_pluie_des_3_dernière_heures = str(requette['list'][i]["rain"]["3h"]) + a1 = True + except: + a1 = False + try: + volume_neige_des_3_dernière_heures = str(requette['list'][i]["snow"]["3h"]) + a2 = True + except: + a2 = False + + if all_data: + liste = [date, température, + temp_min, temp_max, + humidité, pression, vent, + direction, + nuages, description] + else: + liste = [date, température, + # temp_min, temp_max, + humidité, pression, vent, + # direction, + nuages, description] + + result += ", ".join([printv(i) for i in liste]) + if dans_n_heures // 3 == i: + result_dans_n_heure = ", ".join([printv(i) for i in liste]) + if a1: + result += ' ' + printv(volume_pluie_des_3_dernière_heures) + if dans_n_heures // 3 == i: + result_dans_n_heure += ' ' + printv(volume_pluie_des_3_dernière_heures) + if a2: + result += ' ' + printv(volume_neige_des_3_dernière_heures) + if dans_n_heures // 3 == i: + result_dans_n_heure += ' ' + printv(volume_neige_des_3_dernière_heures) + result += '\n\n' + if dans_n_heures is not None: + return result_dans_n_heure + return result + + +if __name__ == '__main__': + import sys + if len(sys.argv) == 3: + print(meteo_de(sys.argv[1], sys.argv[2])) + else: + print(meteo_de()) + print(forecast(dans_n_heures=24)) diff --git a/usefull/wiki.py b/usefull/wiki.py new file mode 100644 index 0000000..22f1d3d --- /dev/null +++ b/usefull/wiki.py @@ -0,0 +1,22 @@ +#!/usr/bin/python3 +# wikipedia + +import wikipedia + + +def wiki(texte, lang='fr'): + global topics + wikipedia.set_lang(lang) + topics = [] + try: + page = wikipedia.page(texte) + texte1 = page.summary + return texte1.encode().decode('utf-8').encode('cp850', 'ignore').decode('cp850') + except: + topics = wikipedia.search(texte) + texte1 = "Vous voulez dire : " + ", ".join(topics) + return texte1.encode().decode('utf-8').encode('cp850', 'ignore').decode('cp850') + + +if __name__ == '__main__': + print(wiki(input('vas-y donne un truc a chercher sr le wiki ? : '))) diff --git a/useless/__init__.py b/useless/__init__.py index da54f6a..f9df4fc 100644 --- a/useless/__init__.py +++ b/useless/__init__.py @@ -7,4 +7,5 @@ from .nordpresse import nordpresse from .philotron import genererSujet from .pipotron import pipo from .haddock import haddock -from .quizz import quizz +from .quizz import Quizz +from .kohlanta import * \ No newline at end of file diff --git a/useless/__pycache__/__init__.cpython-37.pyc b/useless/__pycache__/__init__.cpython-37.pyc index cf412b6c085ef2c5780461e4d76434a47e1bd2be..85db6bfc32a7e089403b2ee93b06ad2d82d0f9d1 100644 GIT binary patch delta 167 zcmbQme2|&XiI<m)fq{WxcTiNU5aUEX3C5g>>T$x{QQV9SDGVu`IXoc@DO|w}n%om7 zMDqrgW>!^cGTvg;^3&v<_}RfLinS0VRK&@^z;KHrJ3k{QF|Q<XB|{Mp0|SKkWu;$~ zpI@TylAm0fo0?ZrtRE2M@8#+o60Dz;U!t3vT3no(m!4WQIh9daM1X;Tfrk+l0stOs BDiZ(z delta 128 zcmX@eJd2sniI<m)fq{WxL2O9uZ-$9{5{xMm)#JFiqPQ3tQaFPdG`S|uh~_9P&8({O z)8wAS=wMXD$-uy{lA#Es4NUwp)-TG>FVT0&PcF?(%_}L^4+!%2a&-;~*3U{TD$6XM Q+{LIY#K*wEz{7|P0pFV)qyPW_ diff --git a/useless/__pycache__/chuck.cpython-37.pyc b/useless/__pycache__/chuck.cpython-37.pyc index 46c212a0f1d915544fc769c3ebc5e87d3b17d219..44dc14e38bf4787d8a763881c918ac3d469b5e99 100644 GIT binary patch delta 133 zcmbQkvY3V2iI<m)fq{V`Ejnx?H!CA!)MP=%K)xvEqSS(w3`HCa3=F@_Cl@eE@+Re% z=;o#t7pLZ>rxs1_XVh~9>AS@dAD^3;nHL|g$y&t3z`#(%3L;=qd5O8H@$t7<3yL!H PO2DQe5uB6%G0Fh|m&73^ delta 136 zcmZ3?GKYoRiI<m)fq{Wx*N)(g+^md@w<ZfR2J+ovE=ny}$xsB6`eiV=fKieyE3v37 zvv~3}Mm-rG1_p*(9P#nFiJ5uv@tUkf%nS?+MQk8~XYvC^Q9Y10uwDqk4OVZHo1ape WlWGT2T+G41z`()C!OX$M!3Y58a2+K8 diff --git a/useless/__pycache__/haddock.cpython-37.pyc b/useless/__pycache__/haddock.cpython-37.pyc index 52a059dad3d953fafa9bbdf6e857dee7502eec79..312d204fd81cd59f6d2828c8386298088b437db0 100644 GIT binary patch delta 64 zcmZ3@vWbP;iI<m)fq{V`Ejnx?cLk%mrG8O<eu=(IesXDUYF<gPen61Fm#cF~uzpg0 TiEeIcadB#1dTP<+#f%*QH<J_@ delta 57 zcmdnQvYLh4iI<m)fq{X+W_|ER?g~Z)BmJWM{1Sba{N&Qy)Vz{n{eU2UFIVS~VEwGb MqO#25$*UMU0J?J#jQ{`u diff --git a/useless/__pycache__/kohlanta.cpython-37.pyc b/useless/__pycache__/kohlanta.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31f47bebe9f9c059a858d4630d0f359f0cfaf028 GIT binary patch literal 723 zcmZ?b<>g{vU|>j#4vRHnVqka-;=nK~0|SEt0|P^`4Fdy13PTEG4nq_}3R4Pm3QIb3 z6k`f&3R??96jLg53VSwFkwq#?DpM+J3P&?zDr*X7Gh;JTGb1BI3S%&XCf7@lnSQ02 z3=9k^evZDbItn?d#R`dKsd*)(MVYBZ#R@5@3OR`iB}JJ@r3xy}9*%x~3i){@3Mr|{ znJI@?g5}HdON$j!b24)?^HPg+6jDnRa#Bl+6pB;xN>cNZQx#H+OB6DTic-t+lM|D2 zQmgD8JrooboD&twQcFt|QZkED6$(pJ6~GQq$V*iyPRuM(C`c?;NY2kIE-5MnDJacL zRY*=uO3X`DurKvPb}m>|YG#f?BFs@BH<Re5WF}BRFfcHHXch(r24_(CN-;1nlrSt{ zEMZ#6xPUo@v4&wG(*oucrW(eDOu-DA%zjm@U`JQ6K|)58<rZ5}VqQvq?k%?DjQq^x z)LWdeP$<5|UX)splbD>U$#jb)FEKau7JG6=VqRWq&Ps+N4h9B>Usn1>`S~UKF8Rr& zxv6<2#rgq3{$8%mA;J1d`6ar!sl~;qdFiP|`lZFGIjP0P`q}vzIf;2CiFyT<w>V%N z9+1O9zF=T10wtka9P#nFiJ5uv@l|}Oc_l@u3Z;1pdHJ~tc2$BfekwG6?KIhnKw67H zApqA6a%+72E!Kjf%)F9YteJTQr6phoBN3bo3=Fq8Y;yBcN^?@}K-!Bz4&h*CVq{`u KW9DGtU<3d{W6W;= literal 0 HcmV?d00001 diff --git a/useless/__pycache__/nordpresse.cpython-37.pyc b/useless/__pycache__/nordpresse.cpython-37.pyc index 1a3b83f68f812837bde4de32d3146b6646f0f4a6..841e4898779aa0b5a638a95b177e731a1188bfb7 100644 GIT binary patch delta 44 zcmX@ea)O21iI<m)fq{V`Ejnx?cM~I{&E!5tN#3OV65ZU?;^Nf2^wgrsYZ<2i0QFrA A?f?J) delta 37 tcmX@Xa*&1FiI<m)fq{X6Z(Z<4?j}Y?)5(2|l5AOtMP-@AleaKV0RW`p3Nruz diff --git a/useless/__pycache__/philotron.cpython-37.pyc b/useless/__pycache__/philotron.cpython-37.pyc index b9bee385255e11d32884df8d1fb9bfdf620df497..47a52a610a0cc4efc1f31bf1e956cf93d46010bf 100644 GIT binary patch delta 45 zcmew?{!5(OiI<m)fq{V`Ejnx?_k1o!>&dIRBzcqaOLTKni;Gk9(o>5zpW@PF1OOpo B4W9r2 delta 38 ucmew*{#l&ciI<m)fq{X+bY<{H?)hAdCX-ilNwQ@n7L{cdZ@$Q-$p`?;p$i58 diff --git a/useless/__pycache__/pipotron.cpython-37.pyc b/useless/__pycache__/pipotron.cpython-37.pyc index b8a6c842328015cbffbc0380873cd10a3de433cf..77eeb132529797dd8b8545d4f5ed41438ebf8a78 100644 GIT binary patch delta 45 zcmX@WdYqNpiI<m)fq{V`Ejnx?w=g54)ns`_N#3OV65ZU?;^Nf2^wgrwc8pDo0PC9z At^fc4 delta 38 tcmX@kdVrPNiI<m)fq{YHpK<6$Zed17<H_=jl5AOtMP-@An_U^37y+uA32FcU diff --git a/useless/__pycache__/quizz.cpython-37.pyc b/useless/__pycache__/quizz.cpython-37.pyc index 6be4cc40a3225f6e3b69648fda439ec0f3b0ac70..35910c75677a4fcc860ecef6f6e0a8e3858c2472 100644 GIT binary patch literal 3579 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 AyZ`_I delta 739 zcmew@{fxcdiI<m)fq{YH-qzsQNz4okk3k$5W@2DqaA06yC=Ov@U`Sy|Va#EOg3ydn zj42E$OgT)s%u&pYATj0~mR!~-Rz`+Y)@Ft%wiK2W))s~+_7t`h_7;XHj#SPRj%=o) zfK;wjj%J2tMn;Ad#$X1`i7yrF8KKsJXch(r24|3sLJSNHH4F<FQWzI9E?`VyN?~5e z6wIK>;&+Rsv?R@<icPJsG{4097o)l+(=E2tyyX0p)LZODsRcQS$*G!*w^%Yta&uNP z6mc>zF#IymFUrp^(RayDF3nBND=F3w2=e!Gbq)#E&q^$EF3T*|FD*{ZNi8ncFD%Wh zs?sZ{yv3GUoSayY$_sJ}C>R(Ri?|sW7?PoGW#C|7U|@qecGl$ejH>k|%nMj*m{V9J z85T0uvOsyPU><7?YdT{sTZKUla|)Xzg9}5fN-cX0(*jnoD)xnp3mF+1YS>Wug?`}- zC2Tcppuj3&&*G?INnuanNa5^d&f=_LtzoNSO5vKr63n2<?N?=zQ8L+@sg;p;@<Ap= z1+H5hMX80Qsl_G5x0usYOK!1b73b#_f!qxC#pEAMX7wTr3=FrJi&6`UK%OiD1$dD# zNQ^NJ9BL2(lsIm&f`dg66c!So0AS=|<X~iB<YD4t<YQ!G<YN?I6k+6GEK&ez=ZKHb zP0Y-TkJscb5@ldu09$*Dttc@sB|o<a6qdKR)ARFF(sNQviW2jRi<m)*BtZlygyDwd zCFZ8a$KPTtD9X$$fj9;fnGhD(SsXUG`6;D2sdk`LQ!K#1z`()8!NkMJ!^p<W!NMWH G!3Y52<fMK8 diff --git a/useless/__pycache__/rateau.cpython-37.pyc b/useless/__pycache__/rateau.cpython-37.pyc index 9c21e82af81a396ed606abeb11499e53c49d981b..a94143de6d3cc72bb344bb86914e529a32e92797 100644 GIT binary patch delta 65 zcmdlav{Q)NiI<m)fq{V`Ejnx?_g{8(3;m+}{1Sba{N&Qy)Vz{n{eU2UFIVS~VEv^0 U65ZU?;^Nf2^wgrw8XR1V0Btc7`~Uy| delta 58 zcmdlfv`L8DiI<m)fq{WRXjAY;?!W8`hWbVM`6c=;`N^fZsd**E`T;@yUarm|!TMQ= NMP-@AoAo)k7y;qC5lH|5 diff --git a/useless/__pycache__/useless.cpython-37.pyc b/useless/__pycache__/useless.cpython-37.pyc index 491705d56e0fb86d2223ccc403cefdca977b942b..6ed1f3edad9eb53064c0a34223c48739b4cc3230 100644 GIT binary patch delta 44 zcmZ3=vWA7*iI<m)fq{V`Ejnx?cL5`#<>VShN#3OV65ZU?;^Nf2^wgrsvl+Vp=pqbr delta 37 tcmZ3(vXq6}iI<m)fq{XcaeeSc?gB<eqscXll5AOtMP-@AlNT{|0RW{R3M>Es -- GitLab