diff --git a/README.md b/README.md index a820b766..fbc5c5bf 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [](https://pypi.python.org/pypi/aiogram) [](https://pypi.python.org/pypi/aiogram) [](https://pypi.python.org/pypi/aiogram) -[](https://core.telegram.org/bots/api) +[](https://core.telegram.org/bots/api) [](http://docs.aiogram.dev/en/latest/?badge=latest) [](https://github.com/aiogram/aiogram/issues) [](https://opensource.org/licenses/MIT) diff --git a/README.rst b/README.rst index fd95af67..ee48c1be 100644 --- a/README.rst +++ b/README.rst @@ -21,7 +21,7 @@ AIOGramBot :target: https://pypi.python.org/pypi/aiogram :alt: Supported python versions -.. image:: https://img.shields.io/badge/Telegram%20Bot%20API-6.1-blue.svg?style=flat-square&logo=telegram +.. image:: https://img.shields.io/badge/Telegram%20Bot%20API-6.2-blue.svg?style=flat-square&logo=telegram :target: https://core.telegram.org/bots/api :alt: Telegram Bot API diff --git a/aiogram/__init__.py b/aiogram/__init__.py index 85725de0..7ae9bfd2 100644 --- a/aiogram/__init__.py +++ b/aiogram/__init__.py @@ -43,5 +43,5 @@ __all__ = ( 'utils', ) -__version__ = '2.21' -__api_version__ = '6.1' +__version__ = '2.22' +__api_version__ = '6.2' diff --git a/aiogram/bot/api.py b/aiogram/bot/api.py index 509e6c71..f287e32f 100644 --- a/aiogram/bot/api.py +++ b/aiogram/bot/api.py @@ -269,6 +269,7 @@ class Methods(Helper): SEND_STICKER = Item() # sendSticker GET_STICKER_SET = Item() # getStickerSet UPLOAD_STICKER_FILE = Item() # uploadStickerFile + GET_CUSTOM_EMOJI_STICKERS = Item() # getCustomEmojiStickers CREATE_NEW_STICKER_SET = Item() # createNewStickerSet ADD_STICKER_TO_SET = Item() # addStickerToSet SET_STICKER_POSITION_IN_SET = Item() # setStickerPositionInSet diff --git a/aiogram/bot/bot.py b/aiogram/bot/bot.py index c883409f..0e82ad77 100644 --- a/aiogram/bot/bot.py +++ b/aiogram/bot/bot.py @@ -3012,6 +3012,23 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): result = await self.request(api.Methods.UPLOAD_STICKER_FILE, payload, files) return types.File(**result) + async def get_custom_emoji_stickers(self, custom_emoji_ids: typing.List[base.String]) -> typing.List[types.Sticker]: + """ + Use this method to get information about custom emoji stickers by their identifiers. + + + Source: https://core.telegram.org/bots/api#uploadstickerfile + + :param custom_emoji_ids: User identifier of sticker file owner + :type custom_emoji_ids: :obj:`typing.List[base.String]` + :return: Returns an Array of Sticker objects. + :rtype: :obj:`typing.List[types.Sticker]` + """ + payload = generate_payload(**locals()) + + result = await self.request(api.Methods.GET_CUSTOM_EMOJI_STICKERS, payload) + return [types.Sticker(**item) for item in result] + async def create_new_sticker_set(self, user_id: base.Integer, name: base.String, @@ -3021,6 +3038,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): tgs_sticker: base.InputFile = None, webm_sticker: base.InputFile = None, contains_masks: typing.Optional[base.Boolean] = None, + sticker_type: typing.Optional[base.String] = None, mask_position: typing.Optional[types.MaskPosition] = None) -> base.Boolean: """ Use this method to create a new sticker set owned by a user. @@ -3049,7 +3067,11 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): :type tgs_sticker: :obj:`base.InputFile` :param webm_sticker: WEBM video with the sticker, uploaded using multipart/form-data. See https://core.telegram.org/stickers#video-sticker-requirements for technical requirements - :type webm_sticker: :obj:`base.InputFile` + :type webm_sticker: :obj:`base.String` + :param sticker_type: Type of stickers in the set, pass “regular” or “mask”. + Custom emoji sticker sets can't be created via the Bot API at the moment. + By default, a regular sticker set is created. + :type sticker_type: :obj:`base.InputFile` :param emojis: One or more emoji corresponding to the sticker :type emojis: :obj:`base.String` :param contains_masks: Pass True, if a set of mask stickers should be created @@ -3061,6 +3083,12 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): """ mask_position = prepare_arg(mask_position) payload = generate_payload(**locals(), exclude=['png_sticker', 'tgs_sticker', 'webm_sticker']) + if contains_masks is not None: + warnings.warn( + message="The parameter `contains_masks` deprecated, use `sticker_type` instead.", + category=DeprecationWarning, + stacklevel=2 + ) files = {} prepare_file(payload, files, 'png_sticker', png_sticker) diff --git a/aiogram/types/chat.py b/aiogram/types/chat.py index 4377851a..506856cd 100644 --- a/aiogram/types/chat.py +++ b/aiogram/types/chat.py @@ -31,6 +31,7 @@ class Chat(base.TelegramObject): photo: ChatPhoto = fields.Field(base=ChatPhoto) bio: base.String = fields.Field() has_private_forwards: base.Boolean = fields.Field() + has_restricted_voice_and_video_messages: base.Boolean = fields.Field() join_to_send_messages: base.Boolean = fields.Field() join_by_request: base.Boolean = fields.Field() description: base.String = fields.Field() diff --git a/aiogram/types/message_entity.py b/aiogram/types/message_entity.py index 9788af05..9c910256 100644 --- a/aiogram/types/message_entity.py +++ b/aiogram/types/message_entity.py @@ -1,9 +1,9 @@ import sys -from ..utils import helper, markdown -from ..utils.deprecated import deprecated from . import base, fields from .user import User +from ..utils import helper, markdown +from ..utils.deprecated import deprecated class MessageEntity(base.TelegramObject): @@ -19,16 +19,18 @@ class MessageEntity(base.TelegramObject): url: base.String = fields.Field() user: User = fields.Field(base=User) language: base.String = fields.Field() + custom_emoji_id: 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 + self, + type: base.String, + offset: base.Integer, + length: base.Integer, + url: base.String = None, + user: User = None, + language: base.String = None, + custom_emoji_id: base.String = None, + **kwargs ): super().__init__( type=type, @@ -37,6 +39,7 @@ class MessageEntity(base.TelegramObject): url=url, user=user, language=language, + custom_emoji_id=custom_emoji_id, **kwargs ) @@ -94,6 +97,8 @@ class MessageEntity(base.TelegramObject): return method(entity_text, self.url) if self.type == MessageEntityType.TEXT_MENTION and self.user: return self.user.get_mention(entity_text, as_html=as_html) + if self.type == MessageEntityType.CUSTOM_EMOJI and self.user: + return entity_text return entity_text @@ -118,6 +123,7 @@ class MessageEntityType(helper.Helper): :key: PRE :key: TEXT_LINK :key: TEXT_MENTION + :key: CUSTOM_EMOJI """ mode = helper.HelperMode.snake_case @@ -138,3 +144,4 @@ class MessageEntityType(helper.Helper): PRE = helper.Item() # pre - monowidth block TEXT_LINK = helper.Item() # text_link - for clickable text URLs TEXT_MENTION = helper.Item() # text_mention - for users without usernames + CUSTOM_EMOJI = helper.Item() # custom_emoji diff --git a/aiogram/types/sticker.py b/aiogram/types/sticker.py index f1c0f527..b8e0c4ed 100644 --- a/aiogram/types/sticker.py +++ b/aiogram/types/sticker.py @@ -5,6 +5,7 @@ from .mask_position import MaskPosition from .photo_size import PhotoSize from .file import File + class Sticker(base.TelegramObject, mixins.Downloadable): """ This object represents a sticker. @@ -13,6 +14,7 @@ class Sticker(base.TelegramObject, mixins.Downloadable): """ file_id: base.String = fields.Field() file_unique_id: base.String = fields.Field() + type: base.String = fields.Field() width: base.Integer = fields.Field() height: base.Integer = fields.Field() is_animated: base.Boolean = fields.Field() @@ -22,6 +24,7 @@ class Sticker(base.TelegramObject, mixins.Downloadable): set_name: base.String = fields.Field() premium_animation: File = fields.Field(base=File) mask_position: MaskPosition = fields.Field(base=MaskPosition) + custom_emoji_id: base.String = fields.Field() file_size: base.Integer = fields.Field() async def set_position_in_set(self, position: base.Integer) -> base.Boolean: diff --git a/aiogram/types/sticker_set.py b/aiogram/types/sticker_set.py index dabae5db..809094c2 100644 --- a/aiogram/types/sticker_set.py +++ b/aiogram/types/sticker_set.py @@ -14,8 +14,9 @@ class StickerSet(base.TelegramObject): """ name: base.String = fields.Field() title: base.String = fields.Field() + sticker_type: base.String = fields.Field() is_animated: base.Boolean = fields.Field() is_video: base.Boolean = fields.Field() - contains_masks: base.Boolean = fields.Field() + contains_masks: base.Boolean = fields.Field() # Deprecated stickers: typing.List[Sticker] = fields.ListField(base=Sticker) thumb: PhotoSize = fields.Field(base=PhotoSize) diff --git a/aiogram/utils/text_decorations.py b/aiogram/utils/text_decorations.py index ae9af7d4..a62c0b94 100644 --- a/aiogram/utils/text_decorations.py +++ b/aiogram/utils/text_decorations.py @@ -44,6 +44,8 @@ class TextDecoration(ABC): return self.link(value=text, link=f"tg://user?id={user.id}") if entity.type == "text_link": return self.link(value=text, link=cast(str, entity.url)) + if entity.type == "custom_emoji": + return self.custom_emoji(value=text, custom_emoji_id=entity.custom_emoji_id) return self.quote(text) @@ -143,6 +145,10 @@ class TextDecoration(ABC): def quote(self, value: str) -> str: # pragma: no cover pass + @abstractmethod + def custom_emoji(self, value: str, custom_emoji_id: str) -> str: # pragma: no cover + pass + class HtmlDecoration(TextDecoration): def link(self, value: str, link: str) -> str: @@ -175,6 +181,9 @@ class HtmlDecoration(TextDecoration): def quote(self, value: str) -> str: return html.escape(value, quote=False) + def custom_emoji(self, value: str, custom_emoji_id: str) -> str: + return value + class MarkdownDecoration(TextDecoration): MARKDOWN_QUOTE_PATTERN: Pattern[str] = re.compile(r"([_*\[\]()~`>#+\-=|{}.!\\])") @@ -209,6 +218,9 @@ class MarkdownDecoration(TextDecoration): def quote(self, value: str) -> str: return re.sub(pattern=self.MARKDOWN_QUOTE_PATTERN, repl=r"\\\1", string=value) + def custom_emoji(self, value: str, custom_emoji_id: str) -> str: + return value + html_decoration = HtmlDecoration() markdown_decoration = MarkdownDecoration() diff --git a/docs/source/index.rst b/docs/source/index.rst index 84ce6405..5cdc2efa 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -22,7 +22,7 @@ Welcome to aiogram's documentation! :target: https://pypi.python.org/pypi/aiogram :alt: Supported python versions - .. image:: https://img.shields.io/badge/Telegram%20Bot%20API-6.1-blue.svg?style=flat-square&logo=telegram + .. image:: https://img.shields.io/badge/Telegram%20Bot%20API-6.2-blue.svg?style=flat-square&logo=telegram :target: https://core.telegram.org/bots/api :alt: Telegram Bot API diff --git a/test.html b/test.html deleted file mode 100644 index 61f09a01..00000000 --- a/test.html +++ /dev/null @@ -1,22 +0,0 @@ - - -
- - - - - - -