diff --git a/telebot/__init__.py b/telebot/__init__.py index 1eb02fe..026d32e 100644 --- a/telebot/__init__.py +++ b/telebot/__init__.py @@ -5678,7 +5678,7 @@ class TeleBot: """ self.my_chat_member_handlers.append(handler_dict) - def register_my_chat_member_handler(self, callback: Callable, func: Optional[Callable]=None, pass_bot: Optional[Callable]=False, **kwargs): + def register_my_chat_member_handler(self, callback: Callable, func: Optional[Callable]=None, pass_bot: Optional[bool]=False, **kwargs): """ Registers my chat member handler. @@ -5898,7 +5898,8 @@ class TeleBot: data = {} params =[] handler_error = None - skip_handler = False + skip_handlers = False + if middlewares: for middleware in middlewares: if middleware.update_sensitive: @@ -5913,60 +5914,56 @@ class TeleBot: # Also, we will not run other middlewares if isinstance(result, CancelUpdate): return - elif isinstance(result, SkipHandler) and skip_handler is False: - skip_handler = True + elif isinstance(result, SkipHandler): + skip_handlers = True - try: - if handlers and not skip_handler: + if handlers and not(skip_handlers): + try: for handler in handlers: process_handler = self._test_message_handler(handler, message) if not process_handler: continue - else: - for i in inspect.signature(handler['function']).parameters: - params.append(i) - if len(params) == 1: - handler['function'](message) + for i in inspect.signature(handler['function']).parameters: + params.append(i) + if len(params) == 1: + handler['function'](message) + elif "data" in params: + if len(params) == 2: + handler['function'](message, data) + elif len(params) == 3: + handler['function'](message, data=data, bot=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 - - else: - - data_copy = data.copy() - - for key in list(data_copy): - # remove data from data_copy if handler does not accept it - if key not in params: - del data_copy[key] - if handler.get('pass_bot'): data_copy["bot"] = self - if len(data_copy) > 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 - - handler["function"](message, **data_copy) - break - except Exception as e: - handler_error = e - if self.exception_handler: - self.exception_handler.handle(e) - else: logging.error(str(e)) - + logger.error("It is not allowed to pass data and values inside data to the handler. Check your handler: {}".format(handler['function'])) + return + else: + data_copy = data.copy() + for key in list(data_copy): + # remove data from data_copy if handler does not accept it + if key not in params: + del data_copy[key] + if handler.get('pass_bot'): + data_copy["bot"] = self + if len(data_copy) > len(params) - 1: # remove the message parameter + logger.error("You are passing more parameters than the handler needs. Check your handler: {}".format(handler['function'])) + return + handler["function"](message, **data_copy) + break + except Exception as e: + handler_error = e + if self.exception_handler: + self.exception_handler.handle(e) + else: + logging.error(str(e)) + logger.debug("Exception traceback:\n%s", traceback.format_exc()) if middlewares: for middleware in middlewares: if middleware.update_sensitive: if hasattr(middleware, f'post_process_{update_type}'): - result = getattr(middleware, f'post_process_{update_type}')(message, data, handler_error) + getattr(middleware, f'post_process_{update_type}')(message, data, handler_error) else: logger.error("Middleware: {} does not have post_process_{} method. Post process function was not executed.".format(middleware.__class__.__name__, update_type)) else: - result = middleware.post_process(message, data, handler_error) + middleware.post_process(message, data, handler_error) def _notify_command_handlers(self, handlers, new_messages, update_type): """ diff --git a/telebot/async_telebot.py b/telebot/async_telebot.py index 4ede1b4..68e1768 100644 --- a/telebot/async_telebot.py +++ b/telebot/async_telebot.py @@ -359,8 +359,9 @@ class AsyncTeleBot: async def _run_middlewares_and_handlers(self, handlers, message, middlewares, update_type): handler_error = None data = {} - process_handler = True + skip_handlers = False params = [] + if middlewares: for middleware in middlewares: if middleware.update_sensitive: @@ -371,60 +372,51 @@ class AsyncTeleBot: middleware_result = None else: middleware_result = await middleware.pre_process(message, data) - if isinstance(middleware_result, SkipHandler): - await middleware.post_process(message, data, handler_error) - process_handler = False if isinstance(middleware_result, CancelUpdate): return - for handler in handlers: - if not process_handler: - break + elif isinstance(middleware_result, SkipHandler): + await middleware.post_process(message, data, handler_error) + skip_handlers = True - process_update = await self._test_message_handler(handler, message) - if not process_update: - continue - elif process_update: - try: + if handlers and not(skip_handlers): + try: + for handler in handlers: + process_update = await self._test_message_handler(handler, message) + if not process_update: continue for i in signature(handler['function']).parameters: params.append(i) if len(params) == 1: await handler['function'](message) break - else: - if "data" in params: - if len(params) == 2: - await handler['function'](message, data) - break - elif len(params) == 3: - await handler['function'](message, data=data, bot=self) - break - 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: - - data_copy = data.copy() - - for key in list(data_copy): - # remove data from data_copy if handler does not accept it - if key not in params: - del data_copy[key] - if handler.get('pass_bot'): data_copy["bot"] = self - if len(data_copy) > 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 - - await handler["function"](message, **data_copy) + elif "data" in params: + if len(params) == 2: + await handler['function'](message, data) break - except Exception as e: - handler_error = e - - if self.exception_handler: - self.exception_handler.handle(e) - else: logger.error(str(e)) - break - + elif len(params) == 3: + await handler['function'](message, data=data, bot=self) + break + 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: + data_copy = data.copy() + for key in list(data_copy): + # remove data from data_copy if handler does not accept it + if key not in params: + del data_copy[key] + if handler.get('pass_bot'): + data_copy["bot"] = self + if len(data_copy) > 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 + await handler["function"](message, **data_copy) + break + except Exception as e: + if self.exception_handler: + self.exception_handler.handle(e) + else: + logger.error(str(e)) + logger.debug("Exception traceback:\n%s", traceback.format_exc()) if middlewares: for middleware in middlewares: @@ -1619,7 +1611,7 @@ class AsyncTeleBot: """ self.my_chat_member_handlers.append(handler_dict) - def register_my_chat_member_handler(self, callback: Awaitable, func: Optional[Callable]=None, pass_bot: Optional[Callable]=False, **kwargs): + def register_my_chat_member_handler(self, callback: Awaitable, func: Optional[Callable]=None, pass_bot: Optional[bool]=False, **kwargs): """ Registers my chat member handler.