mirror of
https://github.com/python-telegram-bot/python-telegram-bot.git
synced 2025-03-23 23:39:42 +01:00
add default_quote
This commit is contained in:
parent
4a5a96f516
commit
222edb871f
15 changed files with 200 additions and 24 deletions
|
@ -91,6 +91,8 @@ class Bot(TelegramObject):
|
||||||
`disable_web_page_preview` parameter used if not set explicitly in method call.
|
`disable_web_page_preview` parameter used if not set explicitly in method call.
|
||||||
default_timeout (:obj:`int` | :obj:`float`, optional): Default setting for the
|
default_timeout (:obj:`int` | :obj:`float`, optional): Default setting for the
|
||||||
`timeout` parameter used if not set explicitly in method call.
|
`timeout` parameter used if not set explicitly in method call.
|
||||||
|
default_quote (:obj:`bool`, optional): Default setting for the `quote` parameter of the
|
||||||
|
:attr:`telegram.Message.reply_text` and friends.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -136,6 +138,7 @@ class Bot(TelegramObject):
|
||||||
default_parse_mode=None,
|
default_parse_mode=None,
|
||||||
default_disable_notification=None,
|
default_disable_notification=None,
|
||||||
default_disable_web_page_preview=None,
|
default_disable_web_page_preview=None,
|
||||||
|
default_quote=None,
|
||||||
# Timeout needs special treatment, since the bot methods have two different
|
# Timeout needs special treatment, since the bot methods have two different
|
||||||
# default values for timeout (None and 20s)
|
# default values for timeout (None and 20s)
|
||||||
default_timeout=DEFAULT_NONE):
|
default_timeout=DEFAULT_NONE):
|
||||||
|
@ -145,7 +148,8 @@ class Bot(TelegramObject):
|
||||||
self.defaults = Defaults(parse_mode=default_parse_mode,
|
self.defaults = Defaults(parse_mode=default_parse_mode,
|
||||||
disable_notification=default_disable_notification,
|
disable_notification=default_disable_notification,
|
||||||
disable_web_page_preview=default_disable_web_page_preview,
|
disable_web_page_preview=default_disable_web_page_preview,
|
||||||
timeout=default_timeout)
|
timeout=default_timeout,
|
||||||
|
quote=default_quote)
|
||||||
|
|
||||||
if base_url is None:
|
if base_url is None:
|
||||||
base_url = 'https://api.telegram.org/bot'
|
base_url = 'https://api.telegram.org/bot'
|
||||||
|
@ -186,6 +190,8 @@ class Bot(TelegramObject):
|
||||||
if result is True:
|
if result is True:
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
result['default_quote'] = self.defaults.quote
|
||||||
|
|
||||||
return Message.de_json(result, self)
|
return Message.de_json(result, self)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -1050,6 +1056,9 @@ class Bot(TelegramObject):
|
||||||
|
|
||||||
result = self._request.post(url, data, timeout=timeout)
|
result = self._request.post(url, data, timeout=timeout)
|
||||||
|
|
||||||
|
for res in result:
|
||||||
|
res['default_quote'] = self.defaults.quote
|
||||||
|
|
||||||
return [Message.de_json(res, self) for res in result]
|
return [Message.de_json(res, self) for res in result]
|
||||||
|
|
||||||
@log
|
@log
|
||||||
|
@ -2063,6 +2072,9 @@ class Bot(TelegramObject):
|
||||||
else:
|
else:
|
||||||
self.logger.debug('No new updates found.')
|
self.logger.debug('No new updates found.')
|
||||||
|
|
||||||
|
for u in result:
|
||||||
|
u['default_quote'] = self.defaults.quote
|
||||||
|
|
||||||
return [Update.de_json(u, self) for u in result]
|
return [Update.de_json(u, self) for u in result]
|
||||||
|
|
||||||
@log
|
@log
|
||||||
|
@ -2238,6 +2250,8 @@ class Bot(TelegramObject):
|
||||||
|
|
||||||
result = self._request.post(url, data, timeout=timeout)
|
result = self._request.post(url, data, timeout=timeout)
|
||||||
|
|
||||||
|
result['default_quote'] = self.defaults.quote
|
||||||
|
|
||||||
return Chat.de_json(result, self)
|
return Chat.de_json(result, self)
|
||||||
|
|
||||||
@log
|
@log
|
||||||
|
|
|
@ -101,7 +101,10 @@ class CallbackQuery(TelegramObject):
|
||||||
data = super(CallbackQuery, cls).de_json(data, bot)
|
data = super(CallbackQuery, cls).de_json(data, bot)
|
||||||
|
|
||||||
data['from_user'] = User.de_json(data.get('from'), bot)
|
data['from_user'] = User.de_json(data.get('from'), bot)
|
||||||
data['message'] = Message.de_json(data.get('message'), bot)
|
message = data.get('message')
|
||||||
|
if message:
|
||||||
|
message['default_quote'] = data.get('default_quote')
|
||||||
|
data['message'] = Message.de_json(message, bot)
|
||||||
|
|
||||||
return cls(bot=bot, **data)
|
return cls(bot=bot, **data)
|
||||||
|
|
||||||
|
|
|
@ -135,7 +135,10 @@ class Chat(TelegramObject):
|
||||||
|
|
||||||
data['photo'] = ChatPhoto.de_json(data.get('photo'), bot)
|
data['photo'] = ChatPhoto.de_json(data.get('photo'), bot)
|
||||||
from telegram import Message
|
from telegram import Message
|
||||||
data['pinned_message'] = Message.de_json(data.get('pinned_message'), bot)
|
pinned_message = data.get('pinned_message')
|
||||||
|
if pinned_message:
|
||||||
|
pinned_message['default_quote'] = data.get('default_quote')
|
||||||
|
data['pinned_message'] = Message.de_json(pinned_message, bot)
|
||||||
data['permissions'] = ChatPermissions.de_json(data.get('permissions'), bot)
|
data['permissions'] = ChatPermissions.de_json(data.get('permissions'), bot)
|
||||||
|
|
||||||
return cls(bot=bot, **data)
|
return cls(bot=bot, **data)
|
||||||
|
|
|
@ -89,6 +89,8 @@ class Updater(object):
|
||||||
`disable_web_page_preview` parameter used if not set explicitly in method call.
|
`disable_web_page_preview` parameter used if not set explicitly in method call.
|
||||||
default_timeout (:obj:`int` | :obj:`float`, optional): Default setting for the
|
default_timeout (:obj:`int` | :obj:`float`, optional): Default setting for the
|
||||||
`timeout` parameter used if not set explicitly in method call.
|
`timeout` parameter used if not set explicitly in method call.
|
||||||
|
default_quote (:obj:`bool`, optional): Default setting for the `quote` parameter of the
|
||||||
|
:attr:`telegram.Message.reply_text` and friends.
|
||||||
|
|
||||||
Note:
|
Note:
|
||||||
You must supply either a :attr:`bot` or a :attr:`token` argument.
|
You must supply either a :attr:`bot` or a :attr:`token` argument.
|
||||||
|
@ -114,6 +116,7 @@ class Updater(object):
|
||||||
default_disable_notification=None,
|
default_disable_notification=None,
|
||||||
default_disable_web_page_preview=None,
|
default_disable_web_page_preview=None,
|
||||||
default_timeout=DEFAULT_NONE,
|
default_timeout=DEFAULT_NONE,
|
||||||
|
default_quote=None,
|
||||||
use_context=False):
|
use_context=False):
|
||||||
|
|
||||||
if (token is None) and (bot is None):
|
if (token is None) and (bot is None):
|
||||||
|
@ -150,7 +153,8 @@ class Updater(object):
|
||||||
default_parse_mode=default_parse_mode,
|
default_parse_mode=default_parse_mode,
|
||||||
default_disable_notification=default_disable_notification,
|
default_disable_notification=default_disable_notification,
|
||||||
default_disable_web_page_preview=default_disable_web_page_preview,
|
default_disable_web_page_preview=default_disable_web_page_preview,
|
||||||
default_timeout=default_timeout)
|
default_timeout=default_timeout,
|
||||||
|
default_quote=default_quote)
|
||||||
self.user_sig_handler = user_sig_handler
|
self.user_sig_handler = user_sig_handler
|
||||||
self.update_queue = Queue()
|
self.update_queue = Queue()
|
||||||
self.job_queue = JobQueue()
|
self.job_queue = JobQueue()
|
||||||
|
@ -172,6 +176,9 @@ class Updater(object):
|
||||||
self.__lock = Lock()
|
self.__lock = Lock()
|
||||||
self.__threads = []
|
self.__threads = []
|
||||||
|
|
||||||
|
# Just for passing to WebhookAppClass
|
||||||
|
self._default_quote = default_quote
|
||||||
|
|
||||||
def _init_thread(self, target, name, *args, **kwargs):
|
def _init_thread(self, target, name, *args, **kwargs):
|
||||||
thr = Thread(target=self._thread_wrapper, name="Bot:{}:{}".format(self.bot.id, name),
|
thr = Thread(target=self._thread_wrapper, name="Bot:{}:{}".format(self.bot.id, name),
|
||||||
args=(target,) + args, kwargs=kwargs)
|
args=(target,) + args, kwargs=kwargs)
|
||||||
|
@ -386,7 +393,8 @@ class Updater(object):
|
||||||
url_path = '/{0}'.format(url_path)
|
url_path = '/{0}'.format(url_path)
|
||||||
|
|
||||||
# Create Tornado app instance
|
# Create Tornado app instance
|
||||||
app = WebhookAppClass(url_path, self.bot, self.update_queue)
|
app = WebhookAppClass(url_path, self.bot, self.update_queue,
|
||||||
|
default_quote=self._default_quote)
|
||||||
|
|
||||||
# Form SSL Context
|
# Form SSL Context
|
||||||
# An SSLError is raised if the private key does not match with the certificate
|
# An SSLError is raised if the private key does not match with the certificate
|
||||||
|
|
|
@ -109,6 +109,8 @@ class Message(TelegramObject):
|
||||||
reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached
|
reply_markup (:class:`telegram.InlineKeyboardMarkup`): Optional. Inline keyboard attached
|
||||||
to the message.
|
to the message.
|
||||||
bot (:class:`telegram.Bot`): Optional. The Bot to use for instance methods.
|
bot (:class:`telegram.Bot`): Optional. The Bot to use for instance methods.
|
||||||
|
default_quote (:obj:`bool`): Optional. Default setting for the `quote` parameter of the
|
||||||
|
:attr:`reply_text` and friends.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
message_id (:obj:`int`): Unique message identifier inside this chat.
|
message_id (:obj:`int`): Unique message identifier inside this chat.
|
||||||
|
@ -214,6 +216,8 @@ class Message(TelegramObject):
|
||||||
information about the poll.
|
information about the poll.
|
||||||
reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached
|
reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached
|
||||||
to the message. login_url buttons are represented as ordinary url buttons.
|
to the message. login_url buttons are represented as ordinary url buttons.
|
||||||
|
default_quote (:obj:`bool`, optional): Default setting for the `quote` parameter of the
|
||||||
|
:attr:`reply_text` and friends.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -277,6 +281,7 @@ class Message(TelegramObject):
|
||||||
forward_sender_name=None,
|
forward_sender_name=None,
|
||||||
reply_markup=None,
|
reply_markup=None,
|
||||||
bot=None,
|
bot=None,
|
||||||
|
default_quote=None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
# Required
|
# Required
|
||||||
self.message_id = int(message_id)
|
self.message_id = int(message_id)
|
||||||
|
@ -328,6 +333,7 @@ class Message(TelegramObject):
|
||||||
self.poll = poll
|
self.poll = poll
|
||||||
self.reply_markup = reply_markup
|
self.reply_markup = reply_markup
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
self.default_quote = default_quote
|
||||||
|
|
||||||
self._id_attrs = (self.message_id,)
|
self._id_attrs = (self.message_id,)
|
||||||
|
|
||||||
|
@ -363,13 +369,22 @@ class Message(TelegramObject):
|
||||||
|
|
||||||
data['from_user'] = User.de_json(data.get('from'), bot)
|
data['from_user'] = User.de_json(data.get('from'), bot)
|
||||||
data['date'] = from_timestamp(data['date'])
|
data['date'] = from_timestamp(data['date'])
|
||||||
data['chat'] = Chat.de_json(data.get('chat'), bot)
|
chat = data.get('chat')
|
||||||
|
if chat:
|
||||||
|
chat['default_quote'] = data.get('default_quote')
|
||||||
|
data['chat'] = Chat.de_json(chat, bot)
|
||||||
data['entities'] = MessageEntity.de_list(data.get('entities'), bot)
|
data['entities'] = MessageEntity.de_list(data.get('entities'), bot)
|
||||||
data['caption_entities'] = MessageEntity.de_list(data.get('caption_entities'), bot)
|
data['caption_entities'] = MessageEntity.de_list(data.get('caption_entities'), bot)
|
||||||
data['forward_from'] = User.de_json(data.get('forward_from'), bot)
|
data['forward_from'] = User.de_json(data.get('forward_from'), bot)
|
||||||
data['forward_from_chat'] = Chat.de_json(data.get('forward_from_chat'), bot)
|
forward_from_chat = data.get('forward_from_chat')
|
||||||
|
if forward_from_chat:
|
||||||
|
forward_from_chat['default_quote'] = data.get('default_quote')
|
||||||
|
data['forward_from_chat'] = Chat.de_json(forward_from_chat, bot)
|
||||||
data['forward_date'] = from_timestamp(data.get('forward_date'))
|
data['forward_date'] = from_timestamp(data.get('forward_date'))
|
||||||
data['reply_to_message'] = Message.de_json(data.get('reply_to_message'), bot)
|
reply_to_message = data.get('reply_to_message')
|
||||||
|
if reply_to_message:
|
||||||
|
reply_to_message['default_quote'] = data.get('default_quote')
|
||||||
|
data['reply_to_message'] = Message.de_json(reply_to_message, bot)
|
||||||
data['edit_date'] = from_timestamp(data.get('edit_date'))
|
data['edit_date'] = from_timestamp(data.get('edit_date'))
|
||||||
data['audio'] = Audio.de_json(data.get('audio'), bot)
|
data['audio'] = Audio.de_json(data.get('audio'), bot)
|
||||||
data['document'] = Document.de_json(data.get('document'), bot)
|
data['document'] = Document.de_json(data.get('document'), bot)
|
||||||
|
@ -386,7 +401,10 @@ class Message(TelegramObject):
|
||||||
data['new_chat_members'] = User.de_list(data.get('new_chat_members'), bot)
|
data['new_chat_members'] = User.de_list(data.get('new_chat_members'), bot)
|
||||||
data['left_chat_member'] = User.de_json(data.get('left_chat_member'), bot)
|
data['left_chat_member'] = User.de_json(data.get('left_chat_member'), bot)
|
||||||
data['new_chat_photo'] = PhotoSize.de_list(data.get('new_chat_photo'), bot)
|
data['new_chat_photo'] = PhotoSize.de_list(data.get('new_chat_photo'), bot)
|
||||||
data['pinned_message'] = Message.de_json(data.get('pinned_message'), bot)
|
pinned_message = data.get('pinned_message')
|
||||||
|
if pinned_message:
|
||||||
|
pinned_message['default_quote'] = data.get('default_quote')
|
||||||
|
data['pinned_message'] = Message.de_json(pinned_message, bot)
|
||||||
data['invoice'] = Invoice.de_json(data.get('invoice'), bot)
|
data['invoice'] = Invoice.de_json(data.get('invoice'), bot)
|
||||||
data['successful_payment'] = SuccessfulPayment.de_json(data.get('successful_payment'), bot)
|
data['successful_payment'] = SuccessfulPayment.de_json(data.get('successful_payment'), bot)
|
||||||
data['passport_data'] = PassportData.de_json(data.get('passport_data'), bot)
|
data['passport_data'] = PassportData.de_json(data.get('passport_data'), bot)
|
||||||
|
@ -469,7 +487,8 @@ class Message(TelegramObject):
|
||||||
del kwargs['quote']
|
del kwargs['quote']
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if self.chat.type != Chat.PRIVATE:
|
if ((self.default_quote is None and self.chat.type != Chat.PRIVATE)
|
||||||
|
or self.default_quote):
|
||||||
kwargs['reply_to_message_id'] = self.message_id
|
kwargs['reply_to_message_id'] = self.message_id
|
||||||
|
|
||||||
def reply_text(self, *args, **kwargs):
|
def reply_text(self, *args, **kwargs):
|
||||||
|
|
|
@ -211,16 +211,31 @@ class Update(TelegramObject):
|
||||||
|
|
||||||
data = super(Update, cls).de_json(data, bot)
|
data = super(Update, cls).de_json(data, bot)
|
||||||
|
|
||||||
data['message'] = Message.de_json(data.get('message'), bot)
|
message = data.get('message')
|
||||||
data['edited_message'] = Message.de_json(data.get('edited_message'), bot)
|
if message:
|
||||||
|
message['default_quote'] = data.get('default_quote')
|
||||||
|
data['message'] = Message.de_json(message, bot)
|
||||||
|
edited_message = data.get('edited_message')
|
||||||
|
if edited_message:
|
||||||
|
edited_message['default_quote'] = data.get('default_quote')
|
||||||
|
data['edited_message'] = Message.de_json(edited_message, bot)
|
||||||
data['inline_query'] = InlineQuery.de_json(data.get('inline_query'), bot)
|
data['inline_query'] = InlineQuery.de_json(data.get('inline_query'), bot)
|
||||||
data['chosen_inline_result'] = ChosenInlineResult.de_json(
|
data['chosen_inline_result'] = ChosenInlineResult.de_json(
|
||||||
data.get('chosen_inline_result'), bot)
|
data.get('chosen_inline_result'), bot)
|
||||||
data['callback_query'] = CallbackQuery.de_json(data.get('callback_query'), bot)
|
callback_query = data.get('callback_query')
|
||||||
|
if callback_query:
|
||||||
|
callback_query['default_quote'] = data.get('default_quote')
|
||||||
|
data['callback_query'] = CallbackQuery.de_json(callback_query, bot)
|
||||||
data['shipping_query'] = ShippingQuery.de_json(data.get('shipping_query'), bot)
|
data['shipping_query'] = ShippingQuery.de_json(data.get('shipping_query'), bot)
|
||||||
data['pre_checkout_query'] = PreCheckoutQuery.de_json(data.get('pre_checkout_query'), bot)
|
data['pre_checkout_query'] = PreCheckoutQuery.de_json(data.get('pre_checkout_query'), bot)
|
||||||
data['channel_post'] = Message.de_json(data.get('channel_post'), bot)
|
channel_post = data.get('channel_post')
|
||||||
data['edited_channel_post'] = Message.de_json(data.get('edited_channel_post'), bot)
|
if channel_post:
|
||||||
|
channel_post['default_quote'] = data.get('default_quote')
|
||||||
|
data['channel_post'] = Message.de_json(channel_post, bot)
|
||||||
|
edited_channel_post = data.get('edited_channel_post')
|
||||||
|
if edited_channel_post:
|
||||||
|
edited_channel_post['default_quote'] = data.get('default_quote')
|
||||||
|
data['edited_channel_post'] = Message.de_json(edited_channel_post, bot)
|
||||||
data['poll'] = Poll.de_json(data.get('poll'), bot)
|
data['poll'] = Poll.de_json(data.get('poll'), bot)
|
||||||
|
|
||||||
return cls(**data)
|
return cls(**data)
|
||||||
|
|
|
@ -432,6 +432,9 @@ class Defaults:
|
||||||
timeout (:obj:`int` | :obj:`float`): Optional. If this value is specified, use it as the
|
timeout (:obj:`int` | :obj:`float`): Optional. If this value is specified, use it as the
|
||||||
read timeout from the server (instead of the one specified during creation of the
|
read timeout from the server (instead of the one specified during creation of the
|
||||||
connection pool).
|
connection pool).
|
||||||
|
quote (:obj:`bool`): Optional. If set to ``True``, the reply is sent as an actual reply to
|
||||||
|
the message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter will
|
||||||
|
be ignored. Default: ``True`` in group chats and ``False`` in private chats.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
parse_mode (:obj:`str`, optional): Send Markdown or HTML, if you want Telegram apps to show
|
parse_mode (:obj:`str`, optional): Send Markdown or HTML, if you want Telegram apps to show
|
||||||
|
@ -443,6 +446,9 @@ class Defaults:
|
||||||
timeout (:obj:`int` | :obj:`float`, optional): If this value is specified, use it as the
|
timeout (:obj:`int` | :obj:`float`, optional): If this value is specified, use it as the
|
||||||
read timeout from the server (instead of the one specified during creation of the
|
read timeout from the server (instead of the one specified during creation of the
|
||||||
connection pool).
|
connection pool).
|
||||||
|
quote (:obj:`bool`, opitonal): If set to ``True``, the reply is sent as an actual reply to
|
||||||
|
the message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter will
|
||||||
|
be ignored. Default: ``True`` in group chats and ``False`` in private chats.
|
||||||
"""
|
"""
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
parse_mode=None,
|
parse_mode=None,
|
||||||
|
@ -450,17 +456,20 @@ class Defaults:
|
||||||
disable_web_page_preview=None,
|
disable_web_page_preview=None,
|
||||||
# Timeout needs special treatment, since the bot methods have two different
|
# Timeout needs special treatment, since the bot methods have two different
|
||||||
# default values for timeout (None and 20s)
|
# default values for timeout (None and 20s)
|
||||||
timeout=DEFAULT_NONE):
|
timeout=DEFAULT_NONE,
|
||||||
|
quote=None):
|
||||||
self.parse_mode = parse_mode
|
self.parse_mode = parse_mode
|
||||||
self.disable_notification = disable_notification
|
self.disable_notification = disable_notification
|
||||||
self.disable_web_page_preview = disable_web_page_preview
|
self.disable_web_page_preview = disable_web_page_preview
|
||||||
self.timeout = timeout
|
self.timeout = timeout
|
||||||
|
self.quote = quote
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash((self.parse_mode,
|
return hash((self.parse_mode,
|
||||||
self.disable_notification,
|
self.disable_notification,
|
||||||
self.disable_web_page_preview,
|
self.disable_web_page_preview,
|
||||||
self.timeout))
|
self.timeout,
|
||||||
|
self.quote))
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
if isinstance(other, Defaults):
|
if isinstance(other, Defaults):
|
||||||
|
|
|
@ -71,8 +71,9 @@ class WebhookServer(object):
|
||||||
|
|
||||||
class WebhookAppClass(tornado.web.Application):
|
class WebhookAppClass(tornado.web.Application):
|
||||||
|
|
||||||
def __init__(self, webhook_path, bot, update_queue):
|
def __init__(self, webhook_path, bot, update_queue, default_quote=None):
|
||||||
self.shared_objects = {"bot": bot, "update_queue": update_queue}
|
self.shared_objects = {"bot": bot, "update_queue": update_queue,
|
||||||
|
"default_quote": default_quote}
|
||||||
handlers = [
|
handlers = [
|
||||||
(r"{0}/?".format(webhook_path), WebhookHandler,
|
(r"{0}/?".format(webhook_path), WebhookHandler,
|
||||||
self.shared_objects)
|
self.shared_objects)
|
||||||
|
@ -91,9 +92,10 @@ class WebhookHandler(tornado.web.RequestHandler):
|
||||||
super(WebhookHandler, self).__init__(application, request, **kwargs)
|
super(WebhookHandler, self).__init__(application, request, **kwargs)
|
||||||
self.logger = logging.getLogger(__name__)
|
self.logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
def initialize(self, bot, update_queue):
|
def initialize(self, bot, update_queue, default_quote=None):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
self.update_queue = update_queue
|
self.update_queue = update_queue
|
||||||
|
self._default_quote = default_quote
|
||||||
|
|
||||||
def set_default_headers(self):
|
def set_default_headers(self):
|
||||||
self.set_header("Content-Type", 'application/json; charset="utf-8"')
|
self.set_header("Content-Type", 'application/json; charset="utf-8"')
|
||||||
|
@ -105,6 +107,7 @@ class WebhookHandler(tornado.web.RequestHandler):
|
||||||
data = json.loads(json_string)
|
data = json.loads(json_string)
|
||||||
self.set_status(200)
|
self.set_status(200)
|
||||||
self.logger.debug('Webhook received data: ' + json_string)
|
self.logger.debug('Webhook received data: ' + json_string)
|
||||||
|
data['default_quote'] = self._default_quote
|
||||||
update = Update.de_json(data, self.bot)
|
update = Update.de_json(data, self.bot)
|
||||||
self.logger.debug('Received Update with ID %d on Webhook' % update.update_id)
|
self.logger.debug('Received Update with ID %d on Webhook' % update.update_id)
|
||||||
self.update_queue.put(update)
|
self.update_queue.put(update)
|
||||||
|
|
|
@ -467,6 +467,21 @@ class TestBot(object):
|
||||||
assert chat.title == '>>> telegram.Bot(test)'
|
assert chat.title == '>>> telegram.Bot(test)'
|
||||||
assert chat.id == int(super_group_id)
|
assert chat.id == int(super_group_id)
|
||||||
|
|
||||||
|
# TODO: Add bot to group to test there too
|
||||||
|
@flaky(3, 1)
|
||||||
|
@pytest.mark.timeout(10)
|
||||||
|
@pytest.mark.parametrize('default_bot', [{'default_quote': True}], indirect=True)
|
||||||
|
def test_get_chat_default_quote(self, default_bot, super_group_id):
|
||||||
|
message = default_bot.send_message(super_group_id, text="test_get_chat_default_quote")
|
||||||
|
default_bot.pin_chat_message(chat_id=super_group_id, message_id=message.message_id,
|
||||||
|
disable_notification=True)
|
||||||
|
|
||||||
|
chat = default_bot.get_chat(super_group_id)
|
||||||
|
chat.pinned_message == message
|
||||||
|
assert chat.pinned_message.default_quote is True
|
||||||
|
|
||||||
|
default_bot.unpinChatMessage(super_group_id)
|
||||||
|
|
||||||
@flaky(3, 1)
|
@flaky(3, 1)
|
||||||
@pytest.mark.timeout(10)
|
@pytest.mark.timeout(10)
|
||||||
def test_get_chat_administrators(self, bot, channel_id):
|
def test_get_chat_administrators(self, bot, channel_id):
|
||||||
|
@ -799,3 +814,10 @@ class TestBot(object):
|
||||||
message = default_bot.send_message(chat_id, test_markdown_string, parse_mode='HTML')
|
message = default_bot.send_message(chat_id, test_markdown_string, parse_mode='HTML')
|
||||||
assert message.text == test_markdown_string
|
assert message.text == test_markdown_string
|
||||||
assert message.text_markdown == escape_markdown(test_markdown_string)
|
assert message.text_markdown == escape_markdown(test_markdown_string)
|
||||||
|
|
||||||
|
@flaky(3, 1)
|
||||||
|
@pytest.mark.timeout(10)
|
||||||
|
@pytest.mark.parametrize('default_bot', [{'default_quote': True}], indirect=True)
|
||||||
|
def test_send_message_default_quote(self, default_bot, chat_id):
|
||||||
|
message = default_bot.send_message(chat_id, 'test')
|
||||||
|
assert message.default_quote is True
|
||||||
|
|
|
@ -53,13 +53,15 @@ class TestCallbackQuery(object):
|
||||||
'message': self.message.to_dict(),
|
'message': self.message.to_dict(),
|
||||||
'data': self.data,
|
'data': self.data,
|
||||||
'inline_message_id': self.inline_message_id,
|
'inline_message_id': self.inline_message_id,
|
||||||
'game_short_name': self.game_short_name}
|
'game_short_name': self.game_short_name,
|
||||||
|
'default_quote': True}
|
||||||
callback_query = CallbackQuery.de_json(json_dict, bot)
|
callback_query = CallbackQuery.de_json(json_dict, bot)
|
||||||
|
|
||||||
assert callback_query.id == self.id
|
assert callback_query.id == self.id
|
||||||
assert callback_query.from_user == self.from_user
|
assert callback_query.from_user == self.from_user
|
||||||
assert callback_query.chat_instance == self.chat_instance
|
assert callback_query.chat_instance == self.chat_instance
|
||||||
assert callback_query.message == self.message
|
assert callback_query.message == self.message
|
||||||
|
assert callback_query.message.default_quote is True
|
||||||
assert callback_query.data == self.data
|
assert callback_query.data == self.data
|
||||||
assert callback_query.inline_message_id == self.inline_message_id
|
assert callback_query.inline_message_id == self.inline_message_id
|
||||||
assert callback_query.game_short_name == self.game_short_name
|
assert callback_query.game_short_name == self.game_short_name
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from telegram import Chat, ChatAction, ChatPermissions
|
from telegram import Chat, ChatAction, ChatPermissions
|
||||||
from telegram import User
|
from telegram import User, Message
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='class')
|
@pytest.fixture(scope='class')
|
||||||
|
@ -68,6 +68,22 @@ class TestChat(object):
|
||||||
assert chat.can_set_sticker_set == self.can_set_sticker_set
|
assert chat.can_set_sticker_set == self.can_set_sticker_set
|
||||||
assert chat.permissions == self.permissions
|
assert chat.permissions == self.permissions
|
||||||
|
|
||||||
|
def test_de_json_default_quote(self, bot):
|
||||||
|
json_dict = {
|
||||||
|
'id': self.id,
|
||||||
|
'type': self.type,
|
||||||
|
'pinned_message': Message(
|
||||||
|
message_id=123,
|
||||||
|
from_user=None,
|
||||||
|
date=None,
|
||||||
|
chat=None
|
||||||
|
).to_dict(),
|
||||||
|
'default_quote': True
|
||||||
|
}
|
||||||
|
chat = Chat.de_json(json_dict, bot)
|
||||||
|
|
||||||
|
assert chat.pinned_message.default_quote is True
|
||||||
|
|
||||||
def test_to_dict(self, chat):
|
def test_to_dict(self, chat):
|
||||||
chat_dict = chat.to_dict()
|
chat_dict = chat.to_dict()
|
||||||
|
|
||||||
|
|
|
@ -329,6 +329,13 @@ class TestSendMediaGroup(object):
|
||||||
assert all([isinstance(mes, Message) for mes in messages])
|
assert all([isinstance(mes, Message) for mes in messages])
|
||||||
assert all([mes.media_group_id == messages[0].media_group_id for mes in messages])
|
assert all([mes.media_group_id == messages[0].media_group_id for mes in messages])
|
||||||
|
|
||||||
|
@flaky(3, 1)
|
||||||
|
@pytest.mark.timeout(10)
|
||||||
|
@pytest.mark.parametrize('default_bot', [{'default_quote': True}], indirect=True)
|
||||||
|
def test_send_media_group_default_quote(self, default_bot, chat_id, media_group):
|
||||||
|
messages = default_bot.send_media_group(chat_id, media_group)
|
||||||
|
assert all([mes.default_quote is True for mes in messages])
|
||||||
|
|
||||||
@flaky(3, 1)
|
@flaky(3, 1)
|
||||||
@pytest.mark.timeout(10)
|
@pytest.mark.timeout(10)
|
||||||
def test_edit_message_media(self, bot, chat_id, media_group):
|
def test_edit_message_media(self, bot, chat_id, media_group):
|
||||||
|
|
|
@ -94,7 +94,8 @@ def message(bot):
|
||||||
{'text': 'a text message', 'reply_markup': {'inline_keyboard': [[{
|
{'text': 'a text message', 'reply_markup': {'inline_keyboard': [[{
|
||||||
'text': 'start', 'url': 'http://google.com'}, {
|
'text': 'start', 'url': 'http://google.com'}, {
|
||||||
'text': 'next', 'callback_data': 'abcd'}],
|
'text': 'next', 'callback_data': 'abcd'}],
|
||||||
[{'text': 'Cancel', 'callback_data': 'Cancel'}]]}}
|
[{'text': 'Cancel', 'callback_data': 'Cancel'}]]}},
|
||||||
|
{'default_quote': True}
|
||||||
],
|
],
|
||||||
ids=['forwarded_user', 'forwarded_channel', 'reply', 'edited', 'text',
|
ids=['forwarded_user', 'forwarded_channel', 'reply', 'edited', 'text',
|
||||||
'caption_entities', 'audio', 'document', 'animation', 'game', 'photo',
|
'caption_entities', 'audio', 'document', 'animation', 'game', 'photo',
|
||||||
|
@ -103,7 +104,8 @@ def message(bot):
|
||||||
'group_created', 'supergroup_created', 'channel_created', 'migrated_to',
|
'group_created', 'supergroup_created', 'channel_created', 'migrated_to',
|
||||||
'migrated_from', 'pinned', 'invoice', 'successful_payment',
|
'migrated_from', 'pinned', 'invoice', 'successful_payment',
|
||||||
'connected_website', 'forward_signature', 'author_signature',
|
'connected_website', 'forward_signature', 'author_signature',
|
||||||
'photo_from_media_group', 'passport_data', 'poll', 'reply_markup'])
|
'photo_from_media_group', 'passport_data', 'poll', 'reply_markup',
|
||||||
|
'default_quote'])
|
||||||
def message_params(bot, request):
|
def message_params(bot, request):
|
||||||
return Message(message_id=TestMessage.id,
|
return Message(message_id=TestMessage.id,
|
||||||
from_user=TestMessage.from_user,
|
from_user=TestMessage.from_user,
|
||||||
|
@ -653,6 +655,27 @@ class TestMessage(object):
|
||||||
monkeypatch.setattr(message.bot, 'delete_message', test)
|
monkeypatch.setattr(message.bot, 'delete_message', test)
|
||||||
assert message.delete()
|
assert message.delete()
|
||||||
|
|
||||||
|
def test_default_quote(self, message):
|
||||||
|
kwargs = {}
|
||||||
|
|
||||||
|
message.default_quote = False
|
||||||
|
message._quote(kwargs)
|
||||||
|
assert 'reply_to_message_id' not in kwargs
|
||||||
|
|
||||||
|
message.default_quote = True
|
||||||
|
message._quote(kwargs)
|
||||||
|
assert 'reply_to_message_id' in kwargs
|
||||||
|
|
||||||
|
kwargs = {}
|
||||||
|
message.default_quote = None
|
||||||
|
message.chat.type = Chat.PRIVATE
|
||||||
|
message._quote(kwargs)
|
||||||
|
assert 'reply_to_message_id' not in kwargs
|
||||||
|
|
||||||
|
message.chat.type = Chat.GROUP
|
||||||
|
message._quote(kwargs)
|
||||||
|
assert 'reply_to_message_id' in kwargs
|
||||||
|
|
||||||
def test_equality(self):
|
def test_equality(self):
|
||||||
id = 1
|
id = 1
|
||||||
a = Message(id, self.from_user, self.date, self.chat)
|
a = Message(id, self.from_user, self.date, self.chat)
|
||||||
|
|
|
@ -75,6 +75,14 @@ class TestUpdate(object):
|
||||||
|
|
||||||
assert update is None
|
assert update is None
|
||||||
|
|
||||||
|
def test_de_json_default_quote(self, bot):
|
||||||
|
json_dict = {'update_id': TestUpdate.update_id}
|
||||||
|
json_dict['message'] = message.to_dict()
|
||||||
|
json_dict['default_quote'] = True
|
||||||
|
update = Update.de_json(json_dict, bot)
|
||||||
|
|
||||||
|
assert update.message.default_quote is True
|
||||||
|
|
||||||
def test_to_dict(self, update):
|
def test_to_dict(self, update):
|
||||||
update_dict = update.to_dict()
|
update_dict = update.to_dict()
|
||||||
|
|
||||||
|
|
|
@ -221,6 +221,30 @@ class TestUpdater(object):
|
||||||
assert q.get(False) == update
|
assert q.get(False) == update
|
||||||
updater.stop()
|
updater.stop()
|
||||||
|
|
||||||
|
def test_webhook_default_quote(self, monkeypatch, updater):
|
||||||
|
updater._default_quote = True
|
||||||
|
q = Queue()
|
||||||
|
monkeypatch.setattr(updater.bot, 'set_webhook', lambda *args, **kwargs: True)
|
||||||
|
monkeypatch.setattr(updater.bot, 'delete_webhook', lambda *args, **kwargs: True)
|
||||||
|
monkeypatch.setattr('telegram.ext.Dispatcher.process_update', lambda _, u: q.put(u))
|
||||||
|
|
||||||
|
ip = '127.0.0.1'
|
||||||
|
port = randrange(1024, 49152) # Select random port for travis
|
||||||
|
updater.start_webhook(
|
||||||
|
ip,
|
||||||
|
port,
|
||||||
|
url_path='TOKEN')
|
||||||
|
sleep(.2)
|
||||||
|
|
||||||
|
# Now, we send an update to the server via urlopen
|
||||||
|
update = Update(1, message=Message(1, User(1, '', False), None, Chat(1, ''),
|
||||||
|
text='Webhook'))
|
||||||
|
self._send_webhook_msg(ip, port, update.to_json(), 'TOKEN')
|
||||||
|
sleep(.2)
|
||||||
|
# assert q.get(False) == update
|
||||||
|
assert q.get(False).message.default_quote is True
|
||||||
|
updater.stop()
|
||||||
|
|
||||||
@pytest.mark.parametrize(('error',),
|
@pytest.mark.parametrize(('error',),
|
||||||
argvalues=[(TelegramError(''),)],
|
argvalues=[(TelegramError(''),)],
|
||||||
ids=('TelegramError',))
|
ids=('TelegramError',))
|
||||||
|
|
Loading…
Add table
Reference in a new issue