From d0bfa8a13bb5dc006908be4df447b656d175503b Mon Sep 17 00:00:00 2001 From: Alex Root Junior Date: Sun, 8 Nov 2020 18:58:06 +0200 Subject: [PATCH] Fix MessageEntity serialization for API calls #457 --- aiogram/bot/bot.py | 11 +++++++++ aiogram/types/message_entity.py | 41 +++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/aiogram/bot/bot.py b/aiogram/bot/bot.py index 0ac13702..8e7c1137 100644 --- a/aiogram/bot/bot.py +++ b/aiogram/bot/bot.py @@ -310,6 +310,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): """ reply_markup = prepare_arg(reply_markup) + entities = prepare_arg(entities) payload = generate_payload(**locals()) if self.parse_mode: payload.setdefault('parse_mode', self.parse_mode) @@ -410,6 +411,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`types.Message` """ reply_markup = prepare_arg(reply_markup) + caption_entities = prepare_arg(caption_entities) payload = generate_payload(**locals()) if self.parse_mode: @@ -473,6 +475,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`types.Message` """ reply_markup = prepare_arg(reply_markup) + caption_entities = prepare_arg(caption_entities) payload = generate_payload(**locals(), exclude=['photo']) if self.parse_mode: payload.setdefault('parse_mode', self.parse_mode) @@ -557,6 +560,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`types.Message` """ reply_markup = prepare_arg(reply_markup) + caption_entities = prepare_arg(caption_entities) payload = generate_payload(**locals(), exclude=['audio', 'thumb']) if self.parse_mode: payload.setdefault('parse_mode', self.parse_mode) @@ -641,6 +645,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`types.Message` """ reply_markup = prepare_arg(reply_markup) + caption_entities = prepare_arg(caption_entities) payload = generate_payload(**locals(), exclude=['document']) if self.parse_mode: payload.setdefault('parse_mode', self.parse_mode) @@ -726,6 +731,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`types.Message` """ reply_markup = prepare_arg(reply_markup) + caption_entities = prepare_arg(caption_entities) payload = generate_payload(**locals(), exclude=['video', 'thumb']) if self.parse_mode: payload.setdefault('parse_mode', self.parse_mode) @@ -815,6 +821,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`types.Message` """ reply_markup = prepare_arg(reply_markup) + caption_entities = prepare_arg(caption_entities) payload = generate_payload(**locals(), exclude=["animation", "thumb"]) if self.parse_mode: payload.setdefault('parse_mode', self.parse_mode) @@ -889,6 +896,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`types.Message` """ reply_markup = prepare_arg(reply_markup) + caption_entities = prepare_arg(caption_entities) payload = generate_payload(**locals(), exclude=['voice']) if self.parse_mode: payload.setdefault('parse_mode', self.parse_mode) @@ -1413,6 +1421,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`types.Message` """ options = prepare_arg(options) + explanation_entities = prepare_arg(explanation_entities) open_period = prepare_arg(open_period) close_date = prepare_arg(close_date) payload = generate_payload(**locals()) @@ -2199,6 +2208,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`typing.Union[types.Message, base.Boolean]` """ reply_markup = prepare_arg(reply_markup) + entities = prepare_arg(entities) payload = generate_payload(**locals()) if self.parse_mode: payload.setdefault('parse_mode', self.parse_mode) @@ -2250,6 +2260,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :rtype: :obj:`typing.Union[types.Message, base.Boolean]` """ reply_markup = prepare_arg(reply_markup) + caption_entities = prepare_arg(caption_entities) payload = generate_payload(**locals()) if self.parse_mode: payload.setdefault('parse_mode', self.parse_mode) diff --git a/aiogram/types/message_entity.py b/aiogram/types/message_entity.py index 77b23c5c..58705265 100644 --- a/aiogram/types/message_entity.py +++ b/aiogram/types/message_entity.py @@ -1,10 +1,9 @@ import sys -from . import base -from . import fields -from .user import User from ..utils import helper, markdown from ..utils.deprecated import deprecated +from . import base, fields +from .user import User class MessageEntity(base.TelegramObject): @@ -13,6 +12,7 @@ class MessageEntity(base.TelegramObject): https://core.telegram.org/bots/api#messageentity """ + type: base.String = fields.Field() offset: base.Integer = fields.Field() length: base.Integer = fields.Field() @@ -20,6 +20,26 @@ class MessageEntity(base.TelegramObject): user: User = fields.Field(base=User) language: base.String = fields.Field() + def __init__( + self, + type: base.String, + offset: base.Integer, + length: base.Integer, + url: base.String = None, + user: User = None, + language: base.String = None, + **kwargs + ): + super().__init__( + type=type, + offset=offset, + length=length, + url=url, + user=user, + language=language, + **kwargs + ) + def get_text(self, text): """ Get value of entity @@ -27,18 +47,20 @@ class MessageEntity(base.TelegramObject): :param text: full text :return: part of text """ - if sys.maxunicode == 0xffff: - return text[self.offset:self.offset + self.length] + if sys.maxunicode == 0xFFFF: + return text[self.offset : self.offset + self.length] if not isinstance(text, bytes): - entity_text = text.encode('utf-16-le') + entity_text = text.encode("utf-16-le") else: entity_text = text - entity_text = entity_text[self.offset * 2:(self.offset + self.length) * 2] - return entity_text.decode('utf-16-le') + entity_text = entity_text[self.offset * 2 : (self.offset + self.length) * 2] + return entity_text.decode("utf-16-le") - @deprecated("This method doesn't work with nested entities and will be removed in aiogram 3.0") + @deprecated( + "This method doesn't work with nested entities and will be removed in aiogram 3.0" + ) def parse(self, text, as_html=True): """ Get entity value with markup @@ -95,6 +117,7 @@ class MessageEntityType(helper.Helper): :key: TEXT_LINK :key: TEXT_MENTION """ + mode = helper.HelperMode.snake_case MENTION = helper.Item() # mention - @username