|
@@ -172,6 +172,8 @@ class Bot(TelegramBot, ObjectWithDatabase):
|
|
|
self.command_aliases = OrderedDict()
|
|
|
self._unknown_command_message = None
|
|
|
self.text_message_parsers = OrderedDict()
|
|
|
+
|
|
|
+ self.individual_location_handlers = dict()
|
|
|
|
|
|
self.callback_handlers = OrderedDict()
|
|
|
self._callback_data_separator = None
|
|
@@ -723,10 +725,28 @@ class Bot(TelegramBot, ObjectWithDatabase):
|
|
|
|
|
|
async def location_message_handler(self, update, user_record):
|
|
|
"""Handle `location` message update."""
|
|
|
- logging.info(
|
|
|
- "A location message update was received, "
|
|
|
- "but this handler does nothing yet."
|
|
|
- )
|
|
|
+ replier, reply = None, None
|
|
|
+ user_id = update['from']['id'] if 'from' in update else None
|
|
|
+ if user_id in self.individual_location_handlers:
|
|
|
+ replier = self.individual_location_handlers[user_id]
|
|
|
+ del self.individual_location_handlers[user_id]
|
|
|
+ if replier:
|
|
|
+ reply = await replier(
|
|
|
+ bot=self,
|
|
|
+ update=update,
|
|
|
+ user_record=user_record
|
|
|
+ )
|
|
|
+ if reply:
|
|
|
+ if type(reply) is str:
|
|
|
+ reply = dict(text=reply)
|
|
|
+ try:
|
|
|
+ return await self.reply(update=update, **reply)
|
|
|
+ except Exception as e:
|
|
|
+ logging.error(
|
|
|
+ f"Failed to handle text message:\n{e}",
|
|
|
+ exc_info=True
|
|
|
+ )
|
|
|
+ return
|
|
|
|
|
|
async def venue_message_handler(self, update, user_record):
|
|
|
"""Handle `venue` message update."""
|
|
@@ -1689,6 +1709,40 @@ class Bot(TelegramBot, ObjectWithDatabase):
|
|
|
del self.individual_text_message_handlers[identifier]
|
|
|
return
|
|
|
|
|
|
+ def set_individual_location_handler(self, handler,
|
|
|
+ update=None, user_id=None):
|
|
|
+ """Set a custom location handler for the user.
|
|
|
+
|
|
|
+ Any location update from the user will be handled by this custom
|
|
|
+ handler instead of default handlers for commands, aliases and text.
|
|
|
+ Custom handlers last one single use, but they can call this method and
|
|
|
+ set themselves as next custom handler.
|
|
|
+ """
|
|
|
+ identifier = self.get_user_identifier(
|
|
|
+ user_id=user_id,
|
|
|
+ update=update
|
|
|
+ )
|
|
|
+ assert callable(handler), (f"Handler `{handler.name}` is not "
|
|
|
+ "callable. Custom location handler "
|
|
|
+ "could not be set.")
|
|
|
+ self.individual_location_handlers[identifier] = handler
|
|
|
+ return
|
|
|
+
|
|
|
+ def remove_individual_location_handler(self,
|
|
|
+ update=None, user_id=None):
|
|
|
+ """Remove a custom location handler for the user.
|
|
|
+
|
|
|
+ Any location message update from the user will be handled by default
|
|
|
+ handlers for commands, aliases and text.
|
|
|
+ """
|
|
|
+ identifier = self.get_user_identifier(
|
|
|
+ user_id=user_id,
|
|
|
+ update=update
|
|
|
+ )
|
|
|
+ if identifier in self.individual_location_handlers:
|
|
|
+ del self.individual_location_handlers[identifier]
|
|
|
+ return
|
|
|
+
|
|
|
def set_default_keyboard(self, keyboard='set_default'):
|
|
|
"""Set a default keyboard for the bot.
|
|
|
|