mirror of
https://github.com/eternnoir/pyTelegramBotAPI.git
synced 2023-08-10 21:12:57 +03:00
Added AsyncTeleBot, an Asynchronous version of TeleBot.
All API calls on this class (except for getUpdates, since that is already done in a separate Thread) are piped through AsyncTask.
This commit is contained in:
parent
21231a3f01
commit
523c7d433a
@ -74,7 +74,6 @@ class TeleBot:
|
|||||||
Do not call this function more than once!
|
Do not call this function more than once!
|
||||||
|
|
||||||
Always get updates.
|
Always get updates.
|
||||||
:param interval: interval secs.
|
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
self.__stop_polling = False
|
self.__stop_polling = False
|
||||||
@ -126,8 +125,9 @@ class TeleBot:
|
|||||||
:param reply_markup:
|
:param reply_markup:
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
return apihelper.send_message(self.token, chat_id, text, disable_web_page_preview, reply_to_message_id,
|
return types.Message.de_json(
|
||||||
reply_markup)
|
apihelper.send_message(self.token, chat_id, text, disable_web_page_preview, reply_to_message_id,
|
||||||
|
reply_markup))
|
||||||
|
|
||||||
def forward_message(self, chat_id, from_chat_id, message_id):
|
def forward_message(self, chat_id, from_chat_id, message_id):
|
||||||
"""
|
"""
|
||||||
@ -137,7 +137,7 @@ class TeleBot:
|
|||||||
:param message_id: message id
|
:param message_id: message id
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
return apihelper.forward_message(self.token, chat_id, from_chat_id, message_id)
|
return types.Message.de_json(apihelper.forward_message(self.token, chat_id, from_chat_id, message_id))
|
||||||
|
|
||||||
def send_photo(self, chat_id, photo, caption=None, reply_to_message_id=None, reply_markup=None):
|
def send_photo(self, chat_id, photo, caption=None, reply_to_message_id=None, reply_markup=None):
|
||||||
"""
|
"""
|
||||||
@ -149,7 +149,8 @@ class TeleBot:
|
|||||||
:param reply_markup:
|
:param reply_markup:
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
return apihelper.send_photo(self.token, chat_id, photo, caption, reply_to_message_id, reply_markup)
|
return types.Message.de_json(
|
||||||
|
apihelper.send_photo(self.token, chat_id, photo, caption, reply_to_message_id, reply_markup))
|
||||||
|
|
||||||
def send_audio(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
def send_audio(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
||||||
"""
|
"""
|
||||||
@ -161,7 +162,8 @@ class TeleBot:
|
|||||||
:param reply_markup:
|
:param reply_markup:
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
return apihelper.send_data(self.token, chat_id, data, 'audio', reply_to_message_id, reply_markup)
|
return types.Message.de_json(
|
||||||
|
apihelper.send_data(self.token, chat_id, data, 'audio', reply_to_message_id, reply_markup))
|
||||||
|
|
||||||
def send_document(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
def send_document(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
||||||
"""
|
"""
|
||||||
@ -172,7 +174,8 @@ class TeleBot:
|
|||||||
:param reply_markup:
|
:param reply_markup:
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
return apihelper.send_data(self.token, chat_id, data, 'document', reply_to_message_id, reply_markup)
|
return types.Message.de_json(
|
||||||
|
apihelper.send_data(self.token, chat_id, data, 'document', reply_to_message_id, reply_markup))
|
||||||
|
|
||||||
def send_sticker(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
def send_sticker(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
||||||
"""
|
"""
|
||||||
@ -183,7 +186,8 @@ class TeleBot:
|
|||||||
:param reply_markup:
|
:param reply_markup:
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
return apihelper.send_data(self.token, chat_id, data, 'sticker', reply_to_message_id, reply_markup)
|
return types.Message.de_json(
|
||||||
|
apihelper.send_data(self.token, chat_id, data, 'sticker', reply_to_message_id, reply_markup))
|
||||||
|
|
||||||
def send_video(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
def send_video(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
||||||
"""
|
"""
|
||||||
@ -194,7 +198,8 @@ class TeleBot:
|
|||||||
:param reply_markup:
|
:param reply_markup:
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
return apihelper.send_data(self.token, chat_id, data, 'video', reply_to_message_id, reply_markup)
|
return types.Message.de_json(
|
||||||
|
apihelper.send_data(self.token, chat_id, data, 'video', reply_to_message_id, reply_markup))
|
||||||
|
|
||||||
def send_location(self, chat_id, latitude, longitude, reply_to_message_id=None, reply_markup=None):
|
def send_location(self, chat_id, latitude, longitude, reply_to_message_id=None, reply_markup=None):
|
||||||
"""
|
"""
|
||||||
@ -206,7 +211,8 @@ class TeleBot:
|
|||||||
:param reply_markup:
|
:param reply_markup:
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
return apihelper.send_location(self.token, chat_id, latitude, longitude, reply_to_message_id, reply_markup)
|
return types.Message.de_json(
|
||||||
|
apihelper.send_location(self.token, chat_id, latitude, longitude, reply_to_message_id, reply_markup))
|
||||||
|
|
||||||
def send_chat_action(self, chat_id, action):
|
def send_chat_action(self, chat_id, action):
|
||||||
"""
|
"""
|
||||||
@ -218,7 +224,7 @@ class TeleBot:
|
|||||||
'record_audio', 'upload_audio', 'upload_document', 'find_location'.
|
'record_audio', 'upload_audio', 'upload_document', 'find_location'.
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
return apihelper.send_chat_action(self.token, chat_id, action)
|
return types.Message.de_json(apihelper.send_chat_action(self.token, chat_id, action))
|
||||||
|
|
||||||
def reply_to(self, message, text, **kwargs):
|
def reply_to(self, message, text, **kwargs):
|
||||||
return self.send_message(message.chat.id, text, reply_to_message_id=message.message_id, **kwargs)
|
return self.send_message(message.chat.id, text, reply_to_message_id=message.message_id, **kwargs)
|
||||||
@ -252,6 +258,7 @@ class TeleBot:
|
|||||||
:param func: Optional lambda function. The lambda receives the message to test as the first parameter. It must return True if the command should handle the message.
|
:param func: Optional lambda function. The lambda receives the message to test as the first parameter. It must return True if the command should handle the message.
|
||||||
:param content_types: This commands' supported content types. Must be a list. Defaults to ['text'].
|
:param content_types: This commands' supported content types. Must be a list. Defaults to ['text'].
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def decorator(fn):
|
def decorator(fn):
|
||||||
func_dict = {'function': fn, 'content_types': content_types}
|
func_dict = {'function': fn, 'content_types': content_types}
|
||||||
if regexp:
|
if regexp:
|
||||||
@ -262,6 +269,7 @@ class TeleBot:
|
|||||||
func_dict['commands'] = commands if 'text' in content_types else None
|
func_dict['commands'] = commands if 'text' in content_types else None
|
||||||
self.message_handlers.append(func_dict)
|
self.message_handlers.append(func_dict)
|
||||||
return fn
|
return fn
|
||||||
|
|
||||||
return decorator
|
return decorator
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -295,7 +303,8 @@ class TeleBot:
|
|||||||
return False
|
return False
|
||||||
if 'commands' in message_handler and message.content_type == 'text':
|
if 'commands' in message_handler and message.content_type == 'text':
|
||||||
return TeleBot.extract_command(message.text) in message_handler['commands']
|
return TeleBot.extract_command(message.text) in message_handler['commands']
|
||||||
if 'regexp' in message_handler and message.content_type == 'text' and re.search(message_handler['regexp'], message.text):
|
if 'regexp' in message_handler and message.content_type == 'text' and re.search(message_handler['regexp'],
|
||||||
|
message.text):
|
||||||
return False
|
return False
|
||||||
if 'lambda' in message_handler:
|
if 'lambda' in message_handler:
|
||||||
return message_handler['lambda'](message)
|
return message_handler['lambda'](message)
|
||||||
@ -308,3 +317,88 @@ class TeleBot:
|
|||||||
t = threading.Thread(target=message_handler['function'], args=(message,))
|
t = threading.Thread(target=message_handler['function'], args=(message,))
|
||||||
t.start()
|
t.start()
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncTask:
|
||||||
|
def __init__(self, target, *args, **kwargs):
|
||||||
|
self.target = target
|
||||||
|
self.args = args
|
||||||
|
self.kwargs = kwargs
|
||||||
|
|
||||||
|
self.done = False
|
||||||
|
self.thread = threading.Thread(target=self._run)
|
||||||
|
self.thread.start()
|
||||||
|
|
||||||
|
def _run(self):
|
||||||
|
try:
|
||||||
|
self.result = self.target(*self.args, **self.kwargs)
|
||||||
|
except Exception as e:
|
||||||
|
self.result = e
|
||||||
|
self.done = True
|
||||||
|
|
||||||
|
def wait(self):
|
||||||
|
if not self.done:
|
||||||
|
self.thread.join()
|
||||||
|
if isinstance(self.result, Exception):
|
||||||
|
raise self.result
|
||||||
|
else:
|
||||||
|
return self.result
|
||||||
|
|
||||||
|
|
||||||
|
def async():
|
||||||
|
def decorator(fn):
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
return AsyncTask(fn, *args, **kwargs)
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncTeleBot(TeleBot):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
TeleBot.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def get_me(self):
|
||||||
|
return TeleBot.get_me(self)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def get_user_profile_photos(self, *args, **kwargs):
|
||||||
|
return TeleBot.get_user_profile_photos(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def send_message(self, *args, **kwargs):
|
||||||
|
return TeleBot.send_message(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def forward_message(self, *args, **kwargs):
|
||||||
|
return TeleBot.forward_message(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def send_photo(self, *args, **kwargs):
|
||||||
|
return TeleBot.send_photo(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def send_audio(self, *args, **kwargs):
|
||||||
|
return TeleBot.send_audio(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def send_document(self, *args, **kwargs):
|
||||||
|
return TeleBot.send_document(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def send_sticker(self, *args, **kwargs):
|
||||||
|
return TeleBot.send_sticker(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def send_video(self, *args, **kwargs):
|
||||||
|
return TeleBot.send_video(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def send_location(self, *args, **kwargs):
|
||||||
|
return TeleBot.send_location(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@async()
|
||||||
|
def send_chat_action(self, *args, **kwargs):
|
||||||
|
return TeleBot.send_chat_action(self, *args, **kwargs)
|
||||||
|
Loading…
Reference in New Issue
Block a user