Queer European MD passionate about IT
Browse Source

Bot decorators will pass only supported arguments to decorated functions

Command, parser, button and query decorators will not pass unsupported 
arguments to their decorated functions anymore (legacy compatibility 
with custombot and new feature for bot).
Davte 5 years ago
parent
commit
a8a797a176
1 changed files with 36 additions and 7 deletions
  1. 36 7
      davtelepot/bot.py

+ 36 - 7
davtelepot/bot.py

@@ -31,6 +31,7 @@ Usage
 import asyncio
 from collections import OrderedDict
 import io
+import inspect
 import logging
 import os
 import re
@@ -1310,8 +1311,16 @@ class Bot(TelegramBot, ObjectWithDatabase):
                     user_record=user_record,
                     authorization_level=authorization_level
                 ):
-                    return await command_handler(bot=bot, update=update,
-                                                 user_record=user_record)
+                    # Pass supported arguments from locals() to command_handler
+                    return await command_handler(
+                        **{
+                            name: argument
+                            for name, argument in locals().items()
+                            if name in inspect.signature(
+                                command_handler
+                            ).parameters
+                        }
+                    )
                 return self.unauthorized_message
             self.commands[command] = dict(
                 handler=decorated_command_handler,
@@ -1370,7 +1379,14 @@ class Bot(TelegramBot, ObjectWithDatabase):
                     user_record=user_record,
                     authorization_level=authorization_level
                 ):
-                    return await parser(bot, message, user_record)
+                    # Pass supported arguments from locals() to parser
+                    return await parser(
+                        **{
+                            name: argument
+                            for name, argument in locals().items()
+                            if name in inspect.signature(parser).parameters
+                        }
+                    )
                 return bot.unauthorized_message
             self.text_message_parsers[condition] = dict(
                 handler=decorated_parser,
@@ -1442,8 +1458,7 @@ class Bot(TelegramBot, ObjectWithDatabase):
                     user_record=user_record,
                     authorization_level=authorization_level
                 ):
-                    return await handler(bot, update, user_record)
-                    # Remove `prefix` from `ðata`
+                    # Remove `prefix` from `data`
                     data = extract(update['data'], prefix)
                     # If a specific separator or default separator is set,
                     #   use it to split `data` string in a list.
@@ -1455,6 +1470,14 @@ class Bot(TelegramBot, ObjectWithDatabase):
                             else element
                             for element in data.split(_separator)
                         ]
+                    # Pass supported arguments from locals() to handler
+                    return await handler(
+                        **{
+                            name: argument
+                            for name, argument in locals().items()
+                            if name in inspect.signature(handler).parameters
+                        }
+                    )
                 return bot.unauthorized_message
             self.callback_handlers[prefix] = dict(
                 handler=decorated_button_handler,
@@ -1493,8 +1516,14 @@ class Bot(TelegramBot, ObjectWithDatabase):
                     user_record=user_record,
                     authorization_level=authorization_level
                 ):
-                    return await handler(bot=self, update=update,
-                                         user_record=user_record)
+                    # Pass supported arguments from locals() to handler
+                    return await handler(
+                        **{
+                            name: argument
+                            for name, argument in locals().items()
+                            if name in inspect.signature(handler).parameters
+                        }
+                    )
                 return self.unauthorized_message
             self.inline_query_handlers[condition] = dict(
                 handler=decorated_query_handler,