Queer European MD passionate about IT
Przeglądaj źródła

Handle command aliases and text message update parsers

Davte 5 lat temu
rodzic
commit
af64241d81
1 zmienionych plików z 20 dodań i 2 usunięć
  1. 20 2
      davtelepot/bot.py

+ 20 - 2
davtelepot/bot.py

@@ -6,6 +6,7 @@ camelCase methods mirror API directly, while snake_case ones act as middlewares
 
 # Standard library modules
 import asyncio
+from collections import OrderedDict
 import logging
 import re
 
@@ -112,6 +113,8 @@ class Bot(TelegramBot):
         }
         self.individual_text_message_handlers = dict()
         self.commands = dict()
+        self.command_aliases = dict()
+        self.text_message_parsers = OrderedDict()
         self._unknown_command_message = None
         self._under_maintenance = False
         self._allowed_during_maintenance = []
@@ -369,10 +372,25 @@ class Bot(TelegramBot):
             ).group(0)  # Get the first group of characters matching pattern
             if command in self.commands:
                 replier = self.commands[command]['function']
-            elif update['chat']['id'] > 0:
+            elif 'chat' in update and update['chat']['id'] > 0:
                 reply = self.unknown_command_message
         else:  # Handle command aliases and text parsers
-            logging.info("#TODO alias and text parsers")
+            # Aliases are case insensitive: text and alias are both .lower()
+            for alias, function in self.command_aliases.items():
+                if text.startswith(alias.lower()):
+                    replier = function
+                    break
+            # Text message update parsers
+            for check_function, parser in self.text_message_parsers.items():
+                if (
+                    parser['argument'] == 'text'
+                    and check_function(text)
+                ) or (
+                    parser['argument'] == 'update'
+                    and check_function(update)
+                ):
+                    replier = parser['function']
+                    break
         if replier:
             if asyncio.iscoroutinefunction(replier):
                 reply = await replier(update)