From a8a797a17648ed0b6807fd94197086ba76199357 Mon Sep 17 00:00:00 2001 From: Davte Date: Mon, 15 Jul 2019 13:06:02 +0200 Subject: [PATCH] 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). --- davtelepot/bot.py | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/davtelepot/bot.py b/davtelepot/bot.py index fa93304..39246d9 100644 --- a/davtelepot/bot.py +++ b/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,