Pass to handlers the parameters they take and preserve update_id

This commit is contained in:
Davte 2020-05-21 14:55:32 +02:00
parent 7ad4f48de1
commit 12cca835b9
3 changed files with 34 additions and 23 deletions

View File

@ -11,7 +11,7 @@ __author__ = "Davide Testa"
__email__ = "davide@davte.it" __email__ = "davide@davte.it"
__credits__ = ["Marco Origlia", "Nick Lee @Nickoala"] __credits__ = ["Marco Origlia", "Nick Lee @Nickoala"]
__license__ = "GNU General Public License v3.0" __license__ = "GNU General Public License v3.0"
__version__ = "2.6.0" __version__ = "2.6.1"
__maintainer__ = "Davide Testa" __maintainer__ = "Davide Testa"
__contact__ = "t.me/davte" __contact__ = "t.me/davte"

View File

@ -596,11 +596,16 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
async def message_router(self, update, user_record, language): async def message_router(self, update, user_record, language):
"""Route Telegram `message` update to appropriate message handler.""" """Route Telegram `message` update to appropriate message handler."""
for key, value in update.items(): bot = self
if key in self.message_handlers: for key in self.message_handlers:
return await self.message_handlers[key](update=update, if key in update:
user_record=user_record, return await self.message_handlers[key](**{
language=language) name: argument
for name, argument in locals().items()
if name in inspect.signature(
self.message_handlers[key]
).parameters
})
logging.error( logging.error(
f"The following message update was received: {update}\n" f"The following message update was received: {update}\n"
"However, this message type is unknown." "However, this message type is unknown."
@ -2933,7 +2938,11 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
"""Set `handler` as router for `event`.""" """Set `handler` as router for `event`."""
self.routing_table[event] = handler self.routing_table[event] = handler
async def route_update(self, update): def set_message_handler(self, message_type: str, handler: Callable):
"""Set `handler` for `message_type`."""
self.message_handlers[message_type] = handler
async def route_update(self, raw_update):
"""Pass `update` to proper method. """Pass `update` to proper method.
Update objects have two keys: Update objects have two keys:
@ -2952,20 +2961,25 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
""" """
if ( if (
self.under_maintenance self.under_maintenance
and not self.is_allowed_during_maintenance(update) and not self.is_allowed_during_maintenance(raw_update)
): ):
return await self.handle_update_during_maintenance(update) return await self.handle_update_during_maintenance(raw_update)
for key, value in update.items(): for key in self.routing_table:
if key in self.routing_table: if key in raw_update:
user_record = self.get_user_record(update=value) update = raw_update[key]
update['update_id'] = raw_update['update_id']
user_record = self.get_user_record(update=update)
language = self.get_language(update=update, language = self.get_language(update=update,
user_record=user_record) user_record=user_record)
return await self.routing_table[key]( bot = self
update=value, return await self.routing_table[key](**{
user_record=user_record, name: argument
language=language for name, argument in locals().items()
) if name in inspect.signature(
logging.error(f"Unknown type of update.\n{update}") self.routing_table[key]
).parameters
})
logging.error(f"Unknown type of update.\n{raw_update}")
def additional_task(self, when='BEFORE', *args, **kwargs): def additional_task(self, when='BEFORE', *args, **kwargs):
"""Add a task before at app start or cleanup. """Add a task before at app start or cleanup.

View File

@ -381,11 +381,8 @@ async def calculate_session(bot: Bot,
return return
expression = record['expression'] or '' expression = record['expression'] or ''
reply_markup = get_calculator_keyboard(additional_data=[record['id']]) reply_markup = get_calculator_keyboard(additional_data=[record['id']])
# Process updates in order of arrival (according to Telegram servers)
# It would be nice to do: for i, update in enumerate(sorted(queue, key=lambda u: u['update_id'])):
# for update in sorted(queue, key=lambda u: u['id'])
# Alas, 'id's are not progressive... Telegram's fault!
for i, update in enumerate(queue):
if i % 5 == 0: if i % 5 == 0:
await asyncio.sleep(.1) await asyncio.sleep(.1)
data = update['data'] data = update['data']