mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-06 07:50:32 +00:00
Added full support of Bot API 6.2
This commit is contained in:
parent
a697a9d5cc
commit
11d2e6f31a
12 changed files with 70 additions and 39 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -43,5 +43,5 @@ __all__ = (
|
|||
'utils',
|
||||
)
|
||||
|
||||
__version__ = '2.21'
|
||||
__api_version__ = '6.1'
|
||||
__version__ = '2.22'
|
||||
__api_version__ = '6.2'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
22
test.html
22
test.html
|
|
@ -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>
|
||||
Loading…
Add table
Add a link
Reference in a new issue