Handle location updates
This commit is contained in:
parent
fb3e05681b
commit
10cc0bbb2d
@ -7,7 +7,7 @@ __author__ = "Davide Testa"
|
|||||||
__email__ = "davte@libero.it"
|
__email__ = "davte@libero.it"
|
||||||
__credits__ = "Marco Origlia"
|
__credits__ = "Marco Origlia"
|
||||||
__license__ = "GNU General Public License v3.0"
|
__license__ = "GNU General Public License v3.0"
|
||||||
__version__ = "1.4.22"
|
__version__ = "1.4.23"
|
||||||
__maintainer__ = "Davide Testa"
|
__maintainer__ = "Davide Testa"
|
||||||
__contact__ = "t.me/davte"
|
__contact__ = "t.me/davte"
|
||||||
|
|
||||||
|
@ -156,7 +156,8 @@ class Bot(telepot.aio.Bot, Gettable):
|
|||||||
self.chat_message_handlers = {
|
self.chat_message_handlers = {
|
||||||
'text': self.handle_text_message,
|
'text': self.handle_text_message,
|
||||||
'pinned_message': self.handle_pinned_message,
|
'pinned_message': self.handle_pinned_message,
|
||||||
'photo': self.handle_photo_message
|
'photo': self.handle_photo_message,
|
||||||
|
'location': self.handle_location
|
||||||
}
|
}
|
||||||
if db_name:
|
if db_name:
|
||||||
self._db_url = 'sqlite:///{name}{ext}'.format(
|
self._db_url = 'sqlite:///{name}{ext}'.format(
|
||||||
@ -181,6 +182,7 @@ class Bot(telepot.aio.Bot, Gettable):
|
|||||||
self.parsers = MyOD()
|
self.parsers = MyOD()
|
||||||
self.custom_parsers = dict()
|
self.custom_parsers = dict()
|
||||||
self.custom_photo_parsers = dict()
|
self.custom_photo_parsers = dict()
|
||||||
|
self.custom_location_parsers = dict()
|
||||||
self.bot_name = None
|
self.bot_name = None
|
||||||
self.default_reply_keyboard_elements = []
|
self.default_reply_keyboard_elements = []
|
||||||
self._default_keyboard = dict()
|
self._default_keyboard = dict()
|
||||||
@ -914,6 +916,33 @@ class Bot(telepot.aio.Bot, Gettable):
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
async def handle_location(self, update):
|
||||||
|
"""Handle location sent by user."""
|
||||||
|
user_id = update['from']['id'] if 'from' in update else None
|
||||||
|
answerer, answer = None, None
|
||||||
|
if self.maintenance:
|
||||||
|
if update['chat']['id'] > 0:
|
||||||
|
answer = self.maintenance_message
|
||||||
|
elif user_id in self.custom_location_parsers:
|
||||||
|
answerer = self.custom_location_parsers[user_id]
|
||||||
|
del self.custom_location_parsers[user_id]
|
||||||
|
if answerer:
|
||||||
|
if asyncio.iscoroutinefunction(answerer):
|
||||||
|
answer = await answerer(update)
|
||||||
|
else:
|
||||||
|
answer = answerer(update)
|
||||||
|
if answer:
|
||||||
|
try:
|
||||||
|
return await self.send_message(answer=answer, chat_id=update)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(
|
||||||
|
"Failed to process answer:\n{}".format(
|
||||||
|
e
|
||||||
|
),
|
||||||
|
exc_info=True
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
def set_custom_parser(self, parser, update=None, user=None):
|
def set_custom_parser(self, parser, update=None, user=None):
|
||||||
"""Set a custom parser for the user.
|
"""Set a custom parser for the user.
|
||||||
|
|
||||||
@ -1011,6 +1040,54 @@ class Bot(telepot.aio.Bot, Gettable):
|
|||||||
self.custom_photo_parsers[user] = parser
|
self.custom_photo_parsers[user] = parser
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def set_custom_location_parser(self, parser, update=None, user=None):
|
||||||
|
"""Set a custom location parser for the user.
|
||||||
|
|
||||||
|
Any location chat update coming from the user will be handled by
|
||||||
|
this custom parser instead of default parsers.
|
||||||
|
Custom location parsers last one single use, but their handler can
|
||||||
|
call this function to provide multiple tries.
|
||||||
|
"""
|
||||||
|
if user and type(user) is int:
|
||||||
|
pass
|
||||||
|
elif type(update) is int:
|
||||||
|
user = update
|
||||||
|
elif type(user) is dict:
|
||||||
|
user = (
|
||||||
|
user['from']['id']
|
||||||
|
if 'from' in user
|
||||||
|
and 'id' in user['from']
|
||||||
|
else None
|
||||||
|
)
|
||||||
|
elif not user and type(update) is dict:
|
||||||
|
user = (
|
||||||
|
update['from']['id']
|
||||||
|
if 'from' in update
|
||||||
|
and 'id' in update['from']
|
||||||
|
else None
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
raise TypeError(
|
||||||
|
'Invalid user.\nuser: {}\nupdate: {}'.format(
|
||||||
|
user,
|
||||||
|
update
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if not type(user) is int:
|
||||||
|
raise TypeError(
|
||||||
|
'User {} is not an int id'.format(
|
||||||
|
user
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if not callable(parser):
|
||||||
|
raise TypeError(
|
||||||
|
'Parser {} is not a callable'.format(
|
||||||
|
parser.__name__
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.custom_location_parsers[user] = parser
|
||||||
|
return
|
||||||
|
|
||||||
def command(self, command, aliases=None, show_in_keyboard=False,
|
def command(self, command, aliases=None, show_in_keyboard=False,
|
||||||
descr="", auth='admin'):
|
descr="", auth='admin'):
|
||||||
"""Define a bot command.
|
"""Define a bot command.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user