From 1686ce4f445d3bf1982242c2eb887b490e1e8d98 Mon Sep 17 00:00:00 2001 From: _run Date: Sat, 25 Jun 2022 21:48:44 +0500 Subject: [PATCH 1/2] Middleware update: everything in data will be passed to handler if needed. --- telebot/__init__.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/telebot/__init__.py b/telebot/__init__.py index 85454c5..278721e 100644 --- a/telebot/__init__.py +++ b/telebot/__init__.py @@ -3998,6 +3998,7 @@ class TeleBot: return elif isinstance(result, SkipHandler) and skip_handler is False: skip_handler = True + try: if handlers and not skip_handler: @@ -4009,24 +4010,23 @@ class TeleBot: params.append(i) if len(params) == 1: handler['function'](message) - - elif len(params) == 2: - if handler.get('pass_bot') is True: - handler['function'](message, self) - - elif handler.get('pass_bot') is False: - handler['function'](message, data) - - elif len(params) == 3: - if params[2] == 'bot' and handler.get('pass_bot') is True: - handler['function'](message, data, self) + else: + if "data" in params: + if len(params) == 2: + handler['function'](message, data) + elif len(params) == 3: + handler['function'](message, data=data, bot=self) + else: + logger.error("It is not allowed to pass data and values inside data to the handler. Check your handler: {}".format(handler['function'])) + return - elif not handler.get('pass_bot'): - raise RuntimeError('Your handler accepts 3 parameters but pass_bot is False. Please re-check your handler.') - else: - handler['function'](message, self, data) - + if len(data) > len(params) -2: + logger.error("You are passing more data than the handler needs. Check your handler: {}".format(handler['function'])) + return + if handler.get('pass_bot'): data["bot"] = self + handler["function"](message, **data) + except Exception as e: handler_error = e From a2893945b2c80650c0745f63f9e8b6e8e4ae81df Mon Sep 17 00:00:00 2001 From: _run Date: Sat, 25 Jun 2022 22:15:53 +0500 Subject: [PATCH 2/2] Async changes and sync improvements --- telebot/__init__.py | 11 ++++++++--- telebot/async_telebot.py | 37 ++++++++++++++++++++----------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/telebot/__init__.py b/telebot/__init__.py index 278721e..23887c1 100644 --- a/telebot/__init__.py +++ b/telebot/__init__.py @@ -9,6 +9,7 @@ import time import traceback from typing import Any, Callable, List, Optional, Union + # these imports are used to avoid circular import error import telebot.util import telebot.types @@ -3977,7 +3978,7 @@ class TeleBot: middlewares = [i for i in self.middlewares if update_type in i.update_types] return middlewares - def _run_middlewares_and_handler(self, message, handlers, middlewares, *args, **kwargs): + def _run_middlewares_and_handler(self, message, handlers, middlewares): """ This class is made to run handler and middleware in queue. @@ -4021,10 +4022,11 @@ class TeleBot: return else: - if len(data) > len(params) -2: + if handler.get('pass_bot'): data["bot"] = self + if len(data) > len(params) - 1: # remove the message parameter logger.error("You are passing more data than the handler needs. Check your handler: {}".format(handler['function'])) return - if handler.get('pass_bot'): data["bot"] = self + handler["function"](message, **data) except Exception as e: @@ -4035,6 +4037,9 @@ class TeleBot: return self.exception_handler.handle(e) logging.error(str(e)) return + # remove the bot from data + if "bot" in data: + del data["bot"] if middlewares: for middleware in middlewares: middleware.post_process(message, data, handler_error) diff --git a/telebot/async_telebot.py b/telebot/async_telebot.py index 1566657..f41f5cd 100644 --- a/telebot/async_telebot.py +++ b/telebot/async_telebot.py @@ -277,7 +277,7 @@ class AsyncTeleBot: handler_error = None data = {} process_handler = True - + params = [] if middlewares: for middleware in middlewares: middleware_result = await middleware.pre_process(message, data) @@ -295,27 +295,27 @@ class AsyncTeleBot: continue elif process_update: try: - params = [] - for i in signature(handler['function']).parameters: params.append(i) if len(params) == 1: await handler['function'](message) - break - elif len(params) == 2: - if handler['pass_bot']: - await handler['function'](message, self) - break + else: + if "data" in params: + if len(params) == 2: + await handler['function'](message, data) + elif len(params) == 3: + await handler['function'](message, data=data, bot=self) + else: + logger.error("It is not allowed to pass data and values inside data to the handler. Check your handler: {}".format(handler['function'])) + return + else: - await handler['function'](message, data) - break - elif len(params) == 3: - if handler['pass_bot'] and params[1] == 'bot': - await handler['function'](message, self, data) - break - else: - await handler['function'](message, data) - break + + if handler.get('pass_bot'): data["bot"] = self + if len(data) > len(params) - 1: + logger.error("You are passing more data than the handler needs. Check your handler: {}".format(handler['function'])) + return + await handler["function"](message, **data) except Exception as e: handler_error = e @@ -324,6 +324,9 @@ class AsyncTeleBot: return self.exception_handler.handle(e) logging.error(str(e)) return + # remove the bot from data + if "bot" in data: + del data["bot"] if middlewares: for middleware in middlewares: