From 4c64693b2982f900abfde432247641e9fec78eae Mon Sep 17 00:00:00 2001 From: Rahiel Kasim Date: Mon, 17 Jul 2017 18:23:56 +0200 Subject: [PATCH] bot.py: global timeout argument for all methods (closes #676) --- telegram/bot.py | 72 ++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/telegram/bot.py b/telegram/bot.py index 9e08800..a9f31e1 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -83,11 +83,14 @@ class Bot(TelegramObject): token (str): Bot's unique authentication. base_url (Optional[str]): Telegram Bot API service URL. base_file_url (Optional[str]): Telegram Bot API file URL. + timeout (Optional[int|float]): The read timeout from the server, used + for all methods. When a method also specifies its own timeout, the + longest one is used. request (Optional[Request]): Pre initialized `Request` class. """ - def __init__(self, token, base_url=None, base_file_url=None, request=None): + def __init__(self, token, base_url=None, base_file_url=None, request=None, timeout=None): self.token = self._validate_token(token) if base_url is None: @@ -100,6 +103,7 @@ def __init__(self, token, base_url=None, base_file_url=None, request=None): self.base_file_url = str(base_file_url) + str(self.token) self.bot = None self._request = request or Request() + self.timeout = timeout self.logger = logging.getLogger(__name__) @property @@ -156,7 +160,7 @@ def _message_wrapper(self, url, data, *args, **kwargs): else: data['reply_markup'] = reply_markup - result = self._request.post(url, data, timeout=kwargs.get('timeout')) + result = self._request.post(url, data, timeout=self._get_timeout(kwargs.get('timeout'))) if result is True: return result @@ -182,7 +186,7 @@ def get_me(self, timeout=None, **kwargs): """ url = '{0}/getMe'.format(self.base_url) - result = self._request.get(url, timeout=timeout) + result = self._request.get(url, timeout=self._get_timeout(timeout)) self.bot = User.de_json(result, self) @@ -276,7 +280,7 @@ def delete_message(self, chat_id, message_id, timeout=None, **kwargs): data = {'chat_id': chat_id, 'message_id': message_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -906,7 +910,7 @@ def send_chat_action(self, chat_id, action, timeout=None, **kwargs): data = {'chat_id': chat_id, 'action': action} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -971,7 +975,7 @@ def answer_inline_query(self, if switch_pm_parameter: data['switch_pm_parameter'] = switch_pm_parameter - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -1007,7 +1011,7 @@ def get_user_profile_photos(self, user_id, offset=None, limit=100, timeout=None, if limit: data['limit'] = limit - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return UserProfilePhotos.de_json(result, self) @@ -1034,7 +1038,7 @@ def get_file(self, file_id, timeout=None, **kwargs): data = {'file_id': file_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) if result.get('file_path'): result['file_path'] = '%s/%s' % (self.base_file_url, result['file_path']) @@ -1082,7 +1086,7 @@ def kick_chat_member(self, chat_id, user_id, timeout=None, until_date=None, **kw until_date = to_timestamp(until_date) data['until_date'] = until_date - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -1112,7 +1116,7 @@ def unban_chat_member(self, chat_id, user_id, timeout=None, **kwargs): data = {'chat_id': chat_id, 'user_id': user_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -1164,7 +1168,7 @@ def answer_callback_query(self, if cache_time is not None: data['cache_time'] = cache_time - result = self._request.post(url_, data, timeout=timeout) + result = self._request.post(url_, data, timeout=self._get_timeout(timeout)) return result @@ -1488,7 +1492,7 @@ def set_webhook(self, if allowed_updates is not None: data['allowed_updates'] = allowed_updates - result = self._request.post(url_, data, timeout=timeout) + result = self._request.post(url_, data, timeout=self._get_timeout(timeout)) return result @@ -1513,7 +1517,7 @@ def delete_webhook(self, timeout=None, **kwargs): data = {} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -1540,7 +1544,7 @@ def leave_chat(self, chat_id, timeout=None, **kwargs): data = {'chat_id': chat_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -1569,7 +1573,7 @@ def get_chat(self, chat_id, timeout=None, **kwargs): data = {'chat_id': chat_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return Chat.de_json(result, self) @@ -1599,7 +1603,7 @@ def get_chat_administrators(self, chat_id, timeout=None, **kwargs): data = {'chat_id': chat_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return [ChatMember.de_json(x, self) for x in result] @@ -1626,7 +1630,7 @@ def get_chat_members_count(self, chat_id, timeout=None, **kwargs): data = {'chat_id': chat_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -1654,7 +1658,7 @@ def get_chat_member(self, chat_id, user_id, timeout=None, **kwargs): data = {'chat_id': chat_id, 'user_id': user_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return ChatMember.de_json(result, self) @@ -1677,7 +1681,7 @@ def get_webhook_info(self, timeout=None, **kwargs): data = {} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return WebhookInfo.de_json(result, self) @@ -1785,7 +1789,7 @@ def get_game_high_scores(self, if inline_message_id: data['inline_message_id'] = inline_message_id - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return [GameHighScore.de_json(hs, self) for hs in result] @@ -1956,7 +1960,7 @@ def answer_shipping_query(self, if error_message is not None: data['error_message'] = error_message - result = self._request.post(url_, data, timeout=timeout) + result = self._request.post(url_, data, timeout=self._get_timeout(timeout)) return result @@ -2005,7 +2009,7 @@ def answer_pre_checkout_query(self, pre_checkout_query_id, ok, if error_message is not None: data['error_message'] = error_message - result = self._request.post(url_, data, timeout=timeout) + result = self._request.post(url_, data, timeout=self._get_timeout(timeout)) return result @@ -2063,7 +2067,7 @@ def restrict_chat_member(self, chat_id, user_id, until_date=None, can_send_messa if can_add_web_page_previews is not None: data['can_add_web_page_previews'] = can_add_web_page_previews - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -2133,7 +2137,7 @@ def promote_chat_member(self, chat_id, user_id, can_change_info=None, if can_promote_members is not None: data['can_promote_members'] = can_promote_members - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -2163,7 +2167,7 @@ def export_chat_invite_link(self, chat_id, timeout=None, **kwargs): data = {'chat_id': chat_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -2198,7 +2202,7 @@ def set_chat_photo(self, chat_id, photo, timeout=None, **kwargs): data = {'chat_id': chat_id, 'photo': photo} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -2232,7 +2236,7 @@ def delete_chat_photo(self, chat_id, timeout=None, **kwargs): data = {'chat_id': chat_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -2267,7 +2271,7 @@ def set_chat_title(self, chat_id, title, timeout=None, **kwargs): data = {'chat_id': chat_id, 'title': title} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -2298,7 +2302,7 @@ def set_chat_description(self, chat_id, description, timeout=None, **kwargs): data = {'chat_id': chat_id, 'description': description} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -2335,7 +2339,7 @@ def pin_chat_message(self, chat_id, message_id, disable_notification=None, timeo if disable_notification is not None: data['disable_notification'] = disable_notification - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result @@ -2365,10 +2369,16 @@ def unpin_chat_message(self, chat_id, timeout=None, **kwargs): data = {'chat_id': chat_id} - result = self._request.post(url, data, timeout=timeout) + result = self._request.post(url, data, timeout=self._get_timeout(timeout)) return result + def _get_timeout(self, t): + timeout = t or self.timeout + if timeout and self.timeout: + timeout = max(timeout, self.timeout) + return timeout + @staticmethod def de_json(data, bot): data = super(Bot, Bot).de_json(data, bot)