Added full support of Bot API 6.2

This commit is contained in:
Alex Root Junior 2022-08-13 23:01:10 +03:00
parent a697a9d5cc
commit 11d2e6f31a
No known key found for this signature in database
GPG key ID: 074C1D455EBEA4AC
12 changed files with 70 additions and 39 deletions

View file

@ -6,7 +6,7 @@
[![PyPi status](https://img.shields.io/pypi/status/aiogram.svg?style=flat-square)](https://pypi.python.org/pypi/aiogram)
[![Downloads](https://img.shields.io/pypi/dm/aiogram.svg?style=flat-square)](https://pypi.python.org/pypi/aiogram)
[![Supported python versions](https://img.shields.io/pypi/pyversions/aiogram.svg?style=flat-square)](https://pypi.python.org/pypi/aiogram)
[![Telegram Bot API](https://img.shields.io/badge/Telegram%20Bot%20API-6.1-blue.svg?style=flat-square&logo=telegram)](https://core.telegram.org/bots/api)
[![Telegram Bot API](https://img.shields.io/badge/Telegram%20Bot%20API-6.2-blue.svg?style=flat-square&logo=telegram)](https://core.telegram.org/bots/api)
[![Documentation Status](https://img.shields.io/readthedocs/aiogram?style=flat-square)](http://docs.aiogram.dev/en/latest/?badge=latest)
[![Github issues](https://img.shields.io/github/issues/aiogram/aiogram.svg?style=flat-square)](https://github.com/aiogram/aiogram/issues)
[![MIT License](https://img.shields.io/pypi/l/aiogram.svg?style=flat-square)](https://opensource.org/licenses/MIT)

View file

@ -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

View file

@ -43,5 +43,5 @@ __all__ = (
'utils',
)
__version__ = '2.21'
__api_version__ = '6.1'
__version__ = '2.22'
__api_version__ = '6.2'

View file

@ -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

View file

@ -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)

View file

@ -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()

View file

@ -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

View file

@ -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:

View file

@ -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)

View file

@ -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()

View file

@ -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

View file

@ -1,22 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://telegram.org/js/telegram-web-app.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<title>Hello, world!</title>
</head>
<body>
<h1>Hello, world!</h1>
<div id="content">not inited</div>
<button onclick="validateData()" type="button" class="btn btn-primary">Show</button>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
crossorigin="anonymous"></script>
<script src="static/app.js"></script>
</body>
</html>