Telegram API 6.5 (#1111)

* docs: telegram api version bump

* feat: add KeyboardButtonRequestUser and KeyboardButtonRequestChat

* feat: added the classes UserShared, ChatShared

* feat: added the parameter use_independent_chat_permissions

* fix: permissions field is mandatory for restrictChatMember

* feat: added the field user_chat_id

* feat: replaced the fields can_send_media_messages

* docs: add comment with replacement

* Update types/__init__.py

* Added new content types

* Fixed types

---------

Co-authored-by: Alex Root Junior <jroot.junior@gmail.com>
This commit is contained in:
Oleg A 2023-02-04 03:29:40 +03:00 committed by GitHub
parent 69c9ecb7e0
commit 598ecdb588
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 186 additions and 28 deletions

View file

@ -43,5 +43,5 @@ __all__ = (
'utils', 'utils',
) )
__version__ = '2.24' __version__ = '2.25'
__api_version__ = '6.4' __api_version__ = '6.5'

View file

@ -1900,16 +1900,20 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin):
return await self.request(api.Methods.UNBAN_CHAT_MEMBER, payload) return await self.request(api.Methods.UNBAN_CHAT_MEMBER, payload)
async def restrict_chat_member(self, chat_id: typing.Union[base.Integer, base.String], async def restrict_chat_member(
user_id: base.Integer, self,
permissions: typing.Optional[types.ChatPermissions] = None, chat_id: typing.Union[base.Integer, base.String],
# permissions argument need to be required after removing other `can_*` arguments user_id: base.Integer,
until_date: typing.Union[ permissions: typing.Optional[types.ChatPermissions],
base.Integer, datetime.datetime, datetime.timedelta, None] = None, use_independent_chat_permissions: typing.Optional[base.Boolean] = None,
can_send_messages: typing.Optional[base.Boolean] = None, # permissions argument need to be required after removing other `can_*` arguments
can_send_media_messages: typing.Optional[base.Boolean] = None, until_date: typing.Union[
can_send_other_messages: typing.Optional[base.Boolean] = None, base.Integer, datetime.datetime, datetime.timedelta, None] = None,
can_add_web_page_previews: typing.Optional[base.Boolean] = None) -> base.Boolean: can_send_messages: typing.Optional[base.Boolean] = None,
can_send_media_messages: typing.Optional[base.Boolean] = None,
can_send_other_messages: typing.Optional[base.Boolean] = None,
can_add_web_page_previews: typing.Optional[base.Boolean] = None,
) -> base.Boolean:
""" """
Use this method to restrict a user in a supergroup. Use this method to restrict a user in a supergroup.
The bot must be an administrator in the supergroup for this to work and must have the appropriate admin rights. The bot must be an administrator in the supergroup for this to work and must have the appropriate admin rights.
@ -1923,6 +1927,15 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin):
:type user_id: :obj:`base.Integer` :type user_id: :obj:`base.Integer`
:param permissions: New user permissions :param permissions: New user permissions
:type permissions: :obj:`ChatPermissions` :type permissions: :obj:`ChatPermissions`
:param use_independent_chat_permissions: Pass True if chat
permissions are set independently. Otherwise,
the can_send_other_messages and can_add_web_page_previews
permissions will imply the can_send_messages,
can_send_audios, can_send_documents, can_send_photos,
can_send_videos, can_send_video_notes, and
can_send_voice_notes permissions; the can_send_polls
permission will imply the can_send_messages permission.
:type use_independent_chat_permissions: :obj:`typing.Optional[base.Boolean]`
:param until_date: Date when restrictions will be lifted for the user, unix time :param until_date: Date when restrictions will be lifted for the user, unix time
:type until_date: :obj:`typing.Optional[base.Integer]` :type until_date: :obj:`typing.Optional[base.Integer]`
:param can_send_messages: Pass True, if the user can send text messages, contacts, locations and venues :param can_send_messages: Pass True, if the user can send text messages, contacts, locations and venues
@ -2106,8 +2119,12 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin):
return await self.request(api.Methods.UNBAN_CHAT_SENDER_CHAT, payload) return await self.request(api.Methods.UNBAN_CHAT_SENDER_CHAT, payload)
async def set_chat_permissions(self, chat_id: typing.Union[base.Integer, base.String], async def set_chat_permissions(
permissions: types.ChatPermissions) -> base.Boolean: self,
chat_id: typing.Union[base.Integer, base.String],
permissions: types.ChatPermissions,
use_independent_chat_permissions: base.Boolean = None,
) -> base.Boolean:
""" """
Use this method to set default chat permissions for all members. Use this method to set default chat permissions for all members.
The bot must be an administrator in the group or a supergroup for this to work and must have the The bot must be an administrator in the group or a supergroup for this to work and must have the
@ -2117,6 +2134,15 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin):
:param chat_id: Unique identifier for the target chat or username of the target supergroup :param chat_id: Unique identifier for the target chat or username of the target supergroup
:param permissions: New default chat permissions :param permissions: New default chat permissions
:param use_independent_chat_permissions: Pass True if chat
permissions are set independently. Otherwise,
the can_send_other_messages and can_add_web_page_previews
permissions will imply the can_send_messages,
can_send_audios, can_send_documents, can_send_photos,
can_send_videos, can_send_video_notes, and
can_send_voice_notes permissions; the can_send_polls
permission will imply the can_send_messages permission.
:type use_independent_chat_permissions: :obj:`typing.Optional[base.Boolean]`
:return: True on success. :return: True on success.
""" """
permissions = prepare_arg(permissions) permissions = prepare_arg(permissions)

View file

@ -21,6 +21,7 @@ from .chat_member import ChatMember, ChatMemberAdministrator, ChatMemberBanned,
from .chat_member_updated import ChatMemberUpdated from .chat_member_updated import ChatMemberUpdated
from .chat_permissions import ChatPermissions from .chat_permissions import ChatPermissions
from .chat_photo import ChatPhoto from .chat_photo import ChatPhoto
from .chat_shared import ChatShared
from .chosen_inline_result import ChosenInlineResult from .chosen_inline_result import ChosenInlineResult
from .contact import Contact from .contact import Contact
from .dice import Dice, DiceEmoji from .dice import Dice, DiceEmoji
@ -71,7 +72,8 @@ from .photo_size import PhotoSize
from .poll import PollOption, Poll, PollAnswer, PollType from .poll import PollOption, Poll, PollAnswer, PollType
from .pre_checkout_query import PreCheckoutQuery from .pre_checkout_query import PreCheckoutQuery
from .proximity_alert_triggered import ProximityAlertTriggered from .proximity_alert_triggered import ProximityAlertTriggered
from .reply_keyboard import KeyboardButton, ReplyKeyboardMarkup, ReplyKeyboardRemove, KeyboardButtonPollType from .reply_keyboard import KeyboardButton, ReplyKeyboardMarkup, ReplyKeyboardRemove, KeyboardButtonPollType, \
KeyboardButtonRequestChat, KeyboardButtonRequestUser
from .response_parameters import ResponseParameters from .response_parameters import ResponseParameters
from .sent_web_app_message import SentWebAppMessage from .sent_web_app_message import SentWebAppMessage
from .shipping_address import ShippingAddress from .shipping_address import ShippingAddress
@ -83,6 +85,7 @@ from .successful_payment import SuccessfulPayment
from .update import AllowedUpdates, Update from .update import AllowedUpdates, Update
from .user import User from .user import User
from .user_profile_photos import UserProfilePhotos from .user_profile_photos import UserProfilePhotos
from .user_shared import UserShared
from .venue import Venue from .venue import Venue
from .video import Video from .video import Video
from .video_chat_ended import VideoChatEnded from .video_chat_ended import VideoChatEnded
@ -189,6 +192,8 @@ __all__ = (
'Invoice', 'Invoice',
'KeyboardButton', 'KeyboardButton',
'KeyboardButtonPollType', 'KeyboardButtonPollType',
'KeyboardButtonRequestChat',
'KeyboardButtonRequestUser',
'LabeledPrice', 'LabeledPrice',
'Location', 'Location',
'LoginUrl', 'LoginUrl',
@ -252,10 +257,12 @@ __all__ = (
'ForumTopicCreated', 'ForumTopicCreated',
'ForumTopicClosed', 'ForumTopicClosed',
'ForumTopicReopened', 'ForumTopicReopened',
"ForumTopicEdited", 'ForumTopicEdited',
"GeneralForumTopicHidden", 'GeneralForumTopicHidden',
"GeneralForumTopicUnhidden", 'GeneralForumTopicUnhidden',
"WriteAccessAllowed", 'WriteAccessAllowed',
"ChatShared",
"UserShared",
'base', 'base',
'fields', 'fields',
) )

View file

@ -16,6 +16,7 @@ class ChatJoinRequest(base.TelegramObject):
chat: Chat = fields.Field(base=Chat) chat: Chat = fields.Field(base=Chat)
from_user: User = fields.Field(alias="from", base=User) from_user: User = fields.Field(alias="from", base=User)
user_chat_id: base.Integer = fields.Field()
date: datetime = fields.DateTimeField() date: datetime = fields.DateTimeField()
bio: base.String = fields.Field() bio: base.String = fields.Field()
invite_link: ChatInviteLink = fields.Field(base=ChatInviteLink) invite_link: ChatInviteLink = fields.Field(base=ChatInviteLink)

View file

@ -189,7 +189,16 @@ class ChatMemberRestricted(ChatMember):
can_pin_messages: base.Boolean = fields.Field() can_pin_messages: base.Boolean = fields.Field()
can_manage_topics: base.Boolean = fields.Field() can_manage_topics: base.Boolean = fields.Field()
can_send_messages: base.Boolean = fields.Field() can_send_messages: base.Boolean = fields.Field()
can_send_audios: base.Boolean = fields.Field()
can_send_documents: base.Boolean = fields.Field()
can_send_photos: base.Boolean = fields.Field()
can_send_videos: base.Boolean = fields.Field()
can_send_video_notes: base.Boolean = fields.Field()
can_send_voice_notes: base.Boolean = fields.Field()
# warning! field was replaced: https://core.telegram.org/bots/api#february-3-2023
can_send_media_messages: base.Boolean = fields.Field() can_send_media_messages: base.Boolean = fields.Field()
can_send_polls: base.Boolean = fields.Field() can_send_polls: base.Boolean = fields.Field()
can_send_other_messages: base.Boolean = fields.Field() can_send_other_messages: base.Boolean = fields.Field()
can_add_web_page_previews: base.Boolean = fields.Field() can_add_web_page_previews: base.Boolean = fields.Field()

View file

@ -0,0 +1,12 @@
from . import base, fields
class ChatShared(base.TelegramObject):
"""
This object contains information about the chat whose identifier was
shared with the bot using a KeyboardButtonRequestChat button.
https://core.telegram.org/bots/api#chatshared
"""
request_id: base.Integer = fields.Field()
user_id: base.Integer = fields.Field()

View file

@ -8,6 +8,7 @@ from . import base, fields
from .animation import Animation from .animation import Animation
from .audio import Audio from .audio import Audio
from .chat import Chat, ChatType from .chat import Chat, ChatType
from .chat_shared import ChatShared
from .contact import Contact from .contact import Contact
from .dice import Dice from .dice import Dice
from .document import Document from .document import Document
@ -34,6 +35,7 @@ from .reply_keyboard import ReplyKeyboardMarkup, ReplyKeyboardRemove
from .sticker import Sticker from .sticker import Sticker
from .successful_payment import SuccessfulPayment from .successful_payment import SuccessfulPayment
from .user import User from .user import User
from .user_shared import UserShared
from .venue import Venue from .venue import Venue
from .video import Video from .video import Video
from .video_chat_ended import VideoChatEnded from .video_chat_ended import VideoChatEnded
@ -112,6 +114,8 @@ class Message(base.TelegramObject):
pinned_message: Message = fields.Field(base="Message") pinned_message: Message = fields.Field(base="Message")
invoice: Invoice = fields.Field(base=Invoice) invoice: Invoice = fields.Field(base=Invoice)
successful_payment: SuccessfulPayment = fields.Field(base=SuccessfulPayment) successful_payment: SuccessfulPayment = fields.Field(base=SuccessfulPayment)
user_shared: UserShared = fields.Field(base=UserShared)
chat_shared: ChatShared = fields.Field(base=ChatShared)
connected_website: base.String = fields.Field() connected_website: base.String = fields.Field()
passport_data: PassportData = fields.Field(base=PassportData) passport_data: PassportData = fields.Field(base=PassportData)
proximity_alert_triggered: ProximityAlertTriggered = fields.Field(base=ProximityAlertTriggered) proximity_alert_triggered: ProximityAlertTriggered = fields.Field(base=ProximityAlertTriggered)
@ -229,6 +233,10 @@ class Message(base.TelegramObject):
return ContentType.GENERAL_FORUM_TOPIC_UNHIDDEN return ContentType.GENERAL_FORUM_TOPIC_UNHIDDEN
if self.write_access_allowed: if self.write_access_allowed:
return ContentType.WRITE_ACCESS_ALLOWED return ContentType.WRITE_ACCESS_ALLOWED
if self.chat_shared:
return ContentType.CHAT_SHARED
if self.user_shared:
return ContentType.USER_SHARED
return ContentType.UNKNOWN return ContentType.UNKNOWN
@ -3366,6 +3374,9 @@ class ContentType(helper.Helper):
GENERAL_FORUM_TOPIC_HIDDEN = helper.Item() # general_forum_topic_hidden GENERAL_FORUM_TOPIC_HIDDEN = helper.Item() # general_forum_topic_hidden
GENERAL_FORUM_TOPIC_UNHIDDEN = helper.Item() # general_forum_topic_unhidden GENERAL_FORUM_TOPIC_UNHIDDEN = helper.Item() # general_forum_topic_unhidden
WRITE_ACCESS_ALLOWED = helper.Item() # write_access_allowed WRITE_ACCESS_ALLOWED = helper.Item() # write_access_allowed
CHAT_SHARED = helper.Item() # chat_shared
USER_SHARED = helper.Item() # user_shared
UNKNOWN = helper.Item() # unknown UNKNOWN = helper.Item() # unknown
ANY = helper.Item() # any ANY = helper.Item() # any
@ -3431,18 +3442,20 @@ class ContentTypes(helper.Helper):
DELETE_CHAT_PHOTO = helper.ListItem() # delete_chat_photo DELETE_CHAT_PHOTO = helper.ListItem() # delete_chat_photo
GROUP_CHAT_CREATED = helper.ListItem() # group_chat_created GROUP_CHAT_CREATED = helper.ListItem() # group_chat_created
PASSPORT_DATA = helper.ListItem() # passport_data PASSPORT_DATA = helper.ListItem() # passport_data
WEB_APP_DATA = helper.Item() # web_app_data WEB_APP_DATA = helper.ListItem() # web_app_data
FORUM_TOPIC_CREATED = helper.ListItem() # forum_topic_created FORUM_TOPIC_CREATED = helper.ListItem() # forum_topic_created
FORUM_TOPIC_CLOSED = helper.ListItem() # forum_topic_closed FORUM_TOPIC_CLOSED = helper.ListItem() # forum_topic_closed
FORUM_TOPIC_REOPENED = helper.ListItem() # forum_topic_reopened FORUM_TOPIC_REOPENED = helper.ListItem() # forum_topic_reopened
VIDEO_CHAT_SCHEDULED = helper.Item() # video_chat_scheduled VIDEO_CHAT_SCHEDULED = helper.ListItem() # video_chat_scheduled
VIDEO_CHAT_STARTED = helper.Item() # video_chat_started VIDEO_CHAT_STARTED = helper.ListItem() # video_chat_started
VIDEO_CHAT_ENDED = helper.Item() # video_chat_ended VIDEO_CHAT_ENDED = helper.ListItem() # video_chat_ended
VIDEO_CHAT_PARTICIPANTS_INVITED = helper.Item() # video_chat_participants_invited VIDEO_CHAT_PARTICIPANTS_INVITED = helper.ListItem() # video_chat_participants_invited
FORUM_TOPIC_EDITED = helper.Item() # forum_topic_edited FORUM_TOPIC_EDITED = helper.ListItem() # forum_topic_edited
GENERAL_FORUM_TOPIC_HIDDEN = helper.Item() # general_forum_topic_hidden GENERAL_FORUM_TOPIC_HIDDEN = helper.ListItem() # general_forum_topic_hidden
GENERAL_FORUM_TOPIC_UNHIDDEN = helper.Item() # general_forum_topic_unhidden GENERAL_FORUM_TOPIC_UNHIDDEN = helper.ListItem() # general_forum_topic_unhidden
WRITE_ACCESS_ALLOWED = helper.Item() # write_access_allowed WRITE_ACCESS_ALLOWED = helper.ListItem() # write_access_allowed
CHAT_SHARED = helper.ListItem() # chat_shared
USER_SHARED = helper.ListItem() # user_shared
UNKNOWN = helper.ListItem() # unknown UNKNOWN = helper.ListItem() # unknown
ANY = helper.ListItem() # any ANY = helper.ListItem() # any

View file

@ -2,6 +2,7 @@ import typing
from . import base from . import base
from . import fields from . import fields
from .chat_administrator_rights import ChatAdministratorRights
from .web_app_info import WebAppInfo from .web_app_info import WebAppInfo
@ -105,6 +106,76 @@ class ReplyKeyboardMarkup(base.TelegramObject):
return self return self
class KeyboardButtonRequestUser(base.TelegramObject):
"""
This object defines the criteria used to request a suitable user.
The identifier of the selected user will be shared with the bot when
the corresponding button is pressed.
https://core.telegram.org/bots/api#keyboardbuttonrequestuser
"""
request_id: base.Integer = fields.Field()
user_is_bot: base.Boolean = fields.Field()
user_is_premium: base.Boolean = fields.Field()
def __init__(
self,
request_id: base.Integer,
user_is_bot: typing.Optional[base.Boolean] = None,
user_is_premium: typing.Optional[base.Boolean] = None,
**kwargs,
):
super().__init__(
request_id=request_id,
user_is_bot=user_is_bot,
user_is_premium=user_is_premium,
**kwargs,
)
class KeyboardButtonRequestChat(base.TelegramObject):
"""
This object defines the criteria used to request a suitable chat.
The identifier of the selected chat will be shared with the bot when
the corresponding button is pressed.
https://core.telegram.org/bots/api#keyboardbuttonrequestchat
"""
request_id: base.Integer = fields.Field()
chat_is_channel: base.Boolean = fields.Field()
chat_is_forum: base.Boolean = fields.Field()
chat_has_username: base.Boolean = fields.Field()
chat_is_created: base.Boolean = fields.Field()
user_administrator_rights: ChatAdministratorRights = fields.Field()
bot_administrator_rights: ChatAdministratorRights = fields.Field()
bot_is_member: base.Boolean = fields.Field()
def __init__(
self,
request_id: base.Integer,
chat_is_channel: base.Boolean,
chat_is_forum: typing.Optional[base.Boolean] = None,
chat_has_username: typing.Optional[base.Boolean] = None,
chat_is_created: typing.Optional[base.Boolean] = None,
user_administrator_rights: typing.Optional[ChatAdministratorRights] = None,
bot_administrator_rights: typing.Optional[ChatAdministratorRights] = None,
bot_is_member: typing.Optional[base.Boolean] = None,
**kwargs,
):
super().__init__(
request_id=request_id,
chat_is_channel=chat_is_channel,
chat_is_forum=chat_is_forum,
chat_has_username=chat_has_username,
chat_is_created=chat_is_created,
user_administrator_rights=user_administrator_rights,
bot_administrator_rights=bot_administrator_rights,
bot_is_member=bot_is_member,
**kwargs,
)
class KeyboardButton(base.TelegramObject): class KeyboardButton(base.TelegramObject):
""" """
This object represents one button of the reply keyboard. This object represents one button of the reply keyboard.
@ -118,18 +189,24 @@ class KeyboardButton(base.TelegramObject):
https://core.telegram.org/bots/api#keyboardbutton https://core.telegram.org/bots/api#keyboardbutton
""" """
text: base.String = fields.Field() text: base.String = fields.Field()
request_user: KeyboardButtonRequestUser = fields.Field()
request_chat: KeyboardButtonRequestChat = fields.Field()
request_contact: base.Boolean = fields.Field() request_contact: base.Boolean = fields.Field()
request_location: base.Boolean = fields.Field() request_location: base.Boolean = fields.Field()
request_poll: KeyboardButtonPollType = fields.Field() request_poll: KeyboardButtonPollType = fields.Field()
web_app: WebAppInfo = fields.Field(base=WebAppInfo) web_app: WebAppInfo = fields.Field(base=WebAppInfo)
def __init__(self, text: base.String, def __init__(self, text: base.String,
request_user: typing.Optional[KeyboardButtonRequestUser] = None,
request_chat: typing.Optional[KeyboardButtonRequestChat] = None,
request_contact: base.Boolean = None, request_contact: base.Boolean = None,
request_location: base.Boolean = None, request_location: base.Boolean = None,
request_poll: KeyboardButtonPollType = None, request_poll: KeyboardButtonPollType = None,
web_app: WebAppInfo = None, web_app: WebAppInfo = None,
**kwargs): **kwargs):
super(KeyboardButton, self).__init__(text=text, super(KeyboardButton, self).__init__(text=text,
request_user=request_user,
request_chat=request_chat,
request_contact=request_contact, request_contact=request_contact,
request_location=request_location, request_location=request_location,
request_poll=request_poll, request_poll=request_poll,
@ -137,6 +214,7 @@ class KeyboardButton(base.TelegramObject):
**kwargs) **kwargs)
class ReplyKeyboardRemove(base.TelegramObject): class ReplyKeyboardRemove(base.TelegramObject):
""" """
Upon receiving a message with this object, Telegram clients will remove the current custom keyboard Upon receiving a message with this object, Telegram clients will remove the current custom keyboard

View file

@ -0,0 +1,12 @@
from . import base, fields
class UserShared(base.TelegramObject):
"""
This object contains information about the user whose identifier was
shared with the bot using a KeyboardButtonRequestUser button.
https://core.telegram.org/bots/api#usershared
"""
request_id: base.Integer = fields.Field()
user_id: base.Integer = fields.Field()