From 537a26b4e0a329c5f8edcde7dbb3788b7309c6a2 Mon Sep 17 00:00:00 2001
From: Remy Moll <mollator2@gmail.com>
Date: Wed, 13 May 2020 15:42:37 +0200
Subject: [PATCH] Ok, features kicking in

---
 .google-cookie |   5 +
 main.py        | 350 +++++++++++++++++++++++++++++--------------------
 2 files changed, 215 insertions(+), 140 deletions(-)
 create mode 100644 .google-cookie

diff --git a/.google-cookie b/.google-cookie
new file mode 100644
index 0000000..9decb19
--- /dev/null
+++ b/.google-cookie
@@ -0,0 +1,5 @@
+#LWP-Cookies-2.0
+Set-Cookie3: 1P_JAR="2020-05-13-15"; path="/"; domain=".google.com"; path_spec; domain_dot; secure; expires="2020-06-12 15:07:25Z"; version=0
+Set-Cookie3: NID="204=n_wUpdR_TRFItRjyHxZ36B0EybjpBvLOa2ZsmpYnFPdVyLkmIaHc86rv9Ne06Ky5XEPRNNnsIHNzfmZc0NVnCf3HujqVbmYxN9OocwqASX0dYmH4B8Iy9UdLmvAUUfKC5FB3EkMMi_Q491lUiFSSbznjktAAMgcuHvJ7MBFAC7w"; path="/"; domain=".google.com"; path_spec; domain_dot; expires="2020-11-12 15:07:25Z"; HttpOnly=None; version=0
+Set-Cookie3: CGIC=""; path="/complete/search"; domain=".google.com"; path_spec; domain_dot; expires="2020-11-09 15:07:25Z"; HttpOnly=None; version=0
+Set-Cookie3: CGIC=""; path="/search"; domain=".google.com"; path_spec; domain_dot; expires="2020-11-09 15:07:25Z"; HttpOnly=None; version=0
diff --git a/main.py b/main.py
index ed6404d..5cb0319 100644
--- a/main.py
+++ b/main.py
@@ -8,174 +8,244 @@ import datetime
 import googlesearch
 import emoji
 
-chat_members = {}
-base_url = "https://api.telegram.org/bot" + telegram_api + "/"
-chat_id = ""
-offset = 0
 
-start_time = datetime.datetime.now()
-message_read = 0
-message_sent = 0
+class ChatBot():
+
+    def __init__(self, name, api_key, version):
+        """Inits the Bot with a few conf. vars
+        Args:   -> name:str - Name of the bot
+                -> api_key:str - t.me api-key
+                -> version:str - Version number
+        """
+
+        self.base_url = "https://api.telegram.org/bot" + api_key + "/"
+        self.version = version
+        self.name = name
+
+        # Counters
+        self.start_time = datetime.datetime.now()
+        self.message_read = 0
+        self.message_sent = 0
+        self.log = []
+
+        # Dynamic variables for answering
+        self.chat_id = ""
+        self.offset = 0
+
+        # People in use
+        self.chat_members = {}
+
+        # Available commands
+        self.commands = {
+            "help" : self.bot_show_help,
+            "status" : self.bot_print_status,
+            "log" : self.bot_print_log,
+            "lorem" : self.bot_print_lorem,
+            "weather" : self.bot_show_weather,
+            "google" : self.bot_google_search,
+            "events" : self.bot_print_events,
+            "emojify" : self.bot_emojify,
+            "wikipedia" : self.bot_show_wikipedia,
+        }
+
+        self.message_loop()
 
 
-def bot_print_lorem(params):
-    send_message("Lorem ipsum dolor sit amet....")
-
-def bot_print_status(params):
-    delta = str(datetime.datetime.now() - start_time)
-    message = "<pre>Status: Running \nUptime: " + delta + "\nMessages read: " + str(message_read) + "\nMessages sent: " + str(message_sent) + "</pre>"
-    send_message(message)
-
-def bot_show_weather(params):
-    if len(params) != 1:
-        send_message("Invalid Syntax, please give one parameter, the location")
-        return
-    send_message("Probably sunny I guess? Yes yes I'm still learning")
-
-def bot_google_search(params):
-    if len(params) < 1:
-        send_message("Please tell me what to look for")
-        return
-    param_string = ""
-    for word in params:
-        param_string += word + "+"
-    param_string = param_string[:-1]
-    search_url = "https://google.com/search?q=" + param_string
-    try:
-        res = googlesearch.search(param_string.replace("+"," ") ,num=5,start=0,stop=5)
-        send_string = "Google search for <b>" + param_string.replace("+"," ") + "</b>:\n"
-        for url in res:
-            print(url)
-            send_string += url + "\n\n"
-        send_string += "Search url:\n" + search_url
-    except:
-        send_string = "Search url:\n" + search_url
-    send_message(send_string)
+    def message_loop(self):
+        """"""
+        while(True):
+            result = self.fetch_updates()
+            if len(result) == 0:
+                time.sleep(5)
+            else:
+                self.handle_result(result)
+                time.sleep(5)
 
 
-def bot_print_events(params):
-    events = {
-        "anniversary" : datetime.date(datetime.datetime.now().year,12,7),
-        "valentine's day": datetime.date(datetime.datetime.now().year,2,14),
-        "Marine's birthday": datetime.date(datetime.datetime.now().year,8,31),
-        "Remy's birthday": datetime.date(datetime.datetime.now().year,3,25),
-    }
-    send_string = "Upcoming events: \n"
-    for key in events:
-        delta = events[key] - datetime.date.today()
-        if delta < datetime.timedelta(0):
-            delta += datetime.timedelta(days = 365)
-        send_string += key + ": " + str(delta.days) + " days \n"
-
-    send_message(send_string)
+    def fetch_updates(self):
+        """"""
+        update_url = self.base_url + "getUpdates"
+        data = {"offset":self.offset}
+        result = requests.post(update_url,data=data)
+        try:
+            result = result.json()["result"]
+        except:
+            result = ""
+        return result
 
 
-def bot_emojify(params):
+    def handle_result(self, result):
+        """Inspects the message and reacts accordingly. Can easily be extended"""
+        for message_data in result:
+            self.message_read += 1
+            self.offset = message_data["update_id"] + 1
+            message = message_data["message"]
+            self.chat_id = message["chat"]["id"]
+            author = message["from"]
 
-    if len(params) < 2:
-        send_message(emoji.emojize("Please send a separator as the first argument, and the text afterwards.\nExample:\n/emojify :heart: Example text"))
-    sep = params[0]
-    emoji_dict = {"a" : ":regional_indicator_symbol_letter_a:","b" : ":regional_indicator_symbol_letter_b:","c" : ":regional_indicator_symbol_letter_c:","d" : ":regional_indicator_symbol_letter_d:","e" : ":regional_indicator_symbol_letter_e:","f" : ":regional_indicator_symbol_letter_f:","g" : ":regional_indicator_symbol_letter_g:","h" : ":regional_indicator_symbol_letter_h:","i" : ":regional_indicator_symbol_letter_i:","j" : ":regional_indicator_symbol_letter_j:","k" : ":regional_indicator_symbol_letter_k:","l" : ":regional_indicator_symbol_letter_l:","m" : ":regional_indicator_symbol_letter_m:","n" : ":regional_indicator_symbol_letter_n:","o" : ":regional_indicator_symbol_letter_o:","p" : ":regional_indicator_symbol_letter_p:","q" : ":regional_indicator_symbol_letter_q:","r" : ":regional_indicator_symbol_letter_r:","s" : ":regional_indicator_symbol_letter_s:","t" : ":regional_indicator_symbol_letter_t:","u" : ":regional_indicator_symbol_letter_u:","v" : ":regional_indicator_symbol_letter_v:","w" : ":regional_indicator_symbol_letter_w:","x" : ":regional_indicator_symbol_letter_x:","y" : ":regional_indicator_symbol_letter_y:","z" : ":regional_indicator_symbol_letter_z:"," " : sep}
+            if author["id"] not in self.chat_members:
+                self.chat_members[author["id"]] = author["first_name"] + " " + author["last_name"]
+                self.send_message("Welcome to this chat " + self.chat_members[author["id"]] + " !")
 
-    prep_string = ""
-    for i in params[1:]:
-        prep_string += i.lower() + " "
-    out_string = ""
-    for i in prep_string[:-1]:
-        if i in emoji_dict:
-            out_string += emoji_dict[i] + " "
+            if "text" in message:
+                print("Chat said: ", emoji.demojize(message["text"]))
+
+                if "entities" in message:
+                    for entry in message["entities"]:
+                        if entry["type"] == "bot_command":
+                            self.handle_command(message["text"][1:])
+
+            elif "photo" in message:
+                print("Photo received, what do I do?")
+
+
+    def handle_command(self, command):
+        """Handles commands and stuff, using a bash-like syntax:
+        /[command] [argument 1] [argument 2] ...
+        """
+        full = command.split(" ")
+        if full[0] in self.commands:
+            self.commands[full[0]](full[1:])
         else:
-            out_string += i
-    send_message(emoji.emojize(out_string))
+            self.send_message("Command <code>" + full[0] + "</code> not found. Please try again.")
 
 
+    def send_message(self, message):
+        print("SENDING: " + emoji.demojize(message))
+
+        data = {'chat_id': self.chat_id, 'text': message, "parse_mode": "HTML"}
+        send_url = self.base_url + "sendMessage"
+        try:
+            r = requests.post(send_url, data=data)
+        except:
+            self.log.append(str(datetime.datetime.now()) + " - did not send:\n" + message)
+        self.message_sent += 1
+
+    ############################################################################
+    """Command-implementation"""
+
+    def bot_print_lorem(self, params):
+        """Prints a placeholder text"""
+        self.send_message("Lorem ipsum dolor sit amet....")
 
 
-commands = {
-    "status" : bot_print_status,
-    "lorem" : bot_print_lorem,
-    "weather" : bot_show_weather,
-    "google" : bot_google_search,
-    "events" : bot_print_events,
-    "emojify" : bot_emojify,
-}
+    def bot_print_status(self, params):
+        """Prints the bots current status and relevant information"""
+        delta = str(datetime.datetime.now() - self.start_time)
+        message = "<pre>Status: Running \n"
+        message += "Uptime: " + delta + "\n"
+        message += "Messages read: " + str(self.message_read) + "\n"
+        message += "Messages sent: " + str(self.message_sent) + "</pre>"
+        self.send_message(message)
 
 
+    def bot_show_weather(self, params):
+        """Shows a weather-forecast for a given location"""
+        if len(params) != 1:
+            self.send_message("Invalid Syntax, please give one parameter, the location")
+            return
+        self.send_message("Probably sunny I guess? Yes yes I'm still learning")
 
 
+    def bot_google_search(self, params):
+        """Does a google search and shows relevant links"""
+        if len(params) < 1:
+            self.send_message("Please tell me what to look for")
+            return
+
+        param_string = ""
+        for word in params:
+            param_string += word + "+"
+        param_string = param_string[:-1]
+        search_url = "https://google.com/search?q=" + param_string
+
+        try:
+            res = googlesearch.search(param_string.replace("+"," ") ,num=5,start=0,stop=5)
+            send_string = "Google search for <b>" + param_string.replace("+"," ") + "</b>:\n"
+            for url in res:
+                send_string += url + "\n\n"
+            send_string += "Search url:\n" + search_url
+        except:
+            send_string = "Search url:\n" + search_url
+        self.send_message(send_string)
 
 
+    def bot_print_events(self, params):
+        """Shows a list of couple-related events and a countdown"""
+        events = {
+            "anniversary" : datetime.date(datetime.datetime.now().year,12,7),
+            "valentine's day": datetime.date(datetime.datetime.now().year,2,14),
+            "Marine's birthday": datetime.date(datetime.datetime.now().year,8,31),
+            "Remy's birthday": datetime.date(datetime.datetime.now().year,3,25),
+        }
+        send_string = "Upcoming events: \n"
+        for key in events:
+            delta = events[key] - datetime.date.today()
+            if delta < datetime.timedelta(0):
+                delta += datetime.timedelta(days = 365)
+            send_string += key + ": " + str(delta.days) + " days \n"
+
+        self.send_message(send_string)
 
 
-def fetch_updates():
-    update_url = base_url + "getUpdates"
-    data = {"offset":offset}
-    result = requests.post(update_url,data=data)
-    try:
-        result = result.json()["result"]
-    except:
-        result = ""
-    return result
+    def bot_emojify(self, params):
+        """Converts a string to emojis"""
 
-def send_message(message):
-    print("SENDING: " + emoji.demojize(message))
-    global message_sent
-    data = {'chat_id': chat_id, 'text': message, "parse_mode": "HTML"}
-    send_url = base_url + "sendMessage"
-    r = requests.post(send_url, data=data)
-    message_sent += 1
+        if len(params) < 2:
+            self.send_message(emoji.emojize("Please send a separator as the first argument, and the text afterwards.\nExample:\n/emojify :heart: Example text"))
+        sep = params[0]
+        emoji_dict = {"a" : ":regional_indicator_symbol_letter_a:","b" : ":regional_indicator_symbol_letter_b:","c" : ":regional_indicator_symbol_letter_c:","d" : ":regional_indicator_symbol_letter_d:","e" : ":regional_indicator_symbol_letter_e:","f" : ":regional_indicator_symbol_letter_f:","g" : ":regional_indicator_symbol_letter_g:","h" : ":regional_indicator_symbol_letter_h:","i" : ":regional_indicator_symbol_letter_i:","j" : ":regional_indicator_symbol_letter_j:","k" : ":regional_indicator_symbol_letter_k:","l" : ":regional_indicator_symbol_letter_l:","m" : ":regional_indicator_symbol_letter_m:","n" : ":regional_indicator_symbol_letter_n:","o" : ":regional_indicator_symbol_letter_o:","p" : ":regional_indicator_symbol_letter_p:","q" : ":regional_indicator_symbol_letter_q:","r" : ":regional_indicator_symbol_letter_r:","s" : ":regional_indicator_symbol_letter_s:","t" : ":regional_indicator_symbol_letter_t:","u" : ":regional_indicator_symbol_letter_u:","v" : ":regional_indicator_symbol_letter_v:","w" : ":regional_indicator_symbol_letter_w:","x" : ":regional_indicator_symbol_letter_x:","y" : ":regional_indicator_symbol_letter_y:","z" : ":regional_indicator_symbol_letter_z:"," " : sep}
 
-def handle_command(command):
-    """Handles commands and stuff, using a bash-like syntax:
-    /[command] [argument 1] [argument 2] ...
-    """
-    full = command.split(" ")
-    if full[0] in commands:
-        commands[full[0]](full[1:])
-    else:
-        send_message("Command <code>" + full[0] + "</code> not found. Please try again.")
+        prep_string = ""
+        for i in params[1:]:
+            prep_string += i.lower() + " "
+        out_string = ""
+        for i in prep_string[:-1]:
+            if i in emoji_dict:
+                out_string += emoji_dict[i] + " "
+            else:
+                out_string += i
+        self.send_message(emoji.emojize(out_string))
 
 
-def handle_result(result):
-    """Inspects the message and reacts accordingly. Can easily be extended"""
-    print("handling")
-    for message_data in result:
-        global chat_id
-        global offset
-        global message_read
-        message_read += 1
-        offset = message_data["update_id"] + 1
-        message = message_data["message"]
-        chat_id = message["chat"]["id"]
-        author = message["from"]
+    def bot_show_help(self, params):
+        """Shows a list of all commands and their description"""
+        send_text = "Hello, this is " + self.name + ", V." + self.version + "\n"
+        send_text += "Here is a list of the available commands:\n"
+        for entry in self.commands:
+            send_text += "<code>" + entry + "</code> - "
+            send_text += self.commands[entry].__doc__ + "\n\n"
+        self.send_message(send_text)
 
-        if author["id"] not in chat_members:
-            chat_members[author["id"]] = author["first_name"] + " " + author["last_name"]
-            send_message("Welcome to this chat " + chat_members[author["id"]] + " !")
+    def bot_print_log(self, params):
+        """Shows an error-log, mostly of bad api-requests"""
+        send_text = ""
+        for event in self.log:
+            send_text += event + "\n"
+        if send_text == "":
+            send_text += "No errors up to now"
+        self.send_message(send_text)
 
-        if "text" in message:
-            print("Chat said: ", emoji.demojize(message["text"]))
+    def bot_show_wikipedia(self,params):
+        """Shows the wikipedia entry for a given therm"""
+        if len(params) > 2 or len(params) == 0:
+            self.send_message("Please only search for one word at a time. 1rst param is for language (de or fr or en or ...)")
+            return
 
-            if "entities" in message:
-                for entry in message["entities"]:
-                    if entry["type"] == "bot_command":
-                        handle_command(message["text"][1:])
-
-        elif "photo" in message:
-            print("Photo received, what do I do?")
-
-
-
-
-
-def message_loop():
-    while(True):
-        result = fetch_updates()
-        if len(result) == 0:
-            print("Nada")
-            time.sleep(5)
+        if len(params) == 2:
+            url = "https://" + params[0] + ".wikipedia.org/wiki/" + params[1]
         else:
-            handle_result(result)
-            time.sleep(5)
+            url = "https://en.wikipedia.org/wiki/" + params[0]
 
-message_loop()
+        try:
+            r = requests.get(url)
+        except:
+            url = "https://en.wikipedia.org/wiki/" + params[0]
+            r = requests.get(url)
+            if r.status_code == 404:
+                self.send_message("No result found for query")
+                return
+        self.send_message(url)
+
+
+bot = ChatBot("ChatterBot", telegram_api, version="1.0")