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 + "/&amp; >/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