diff --git a/telebot/__init__.py b/telebot/__init__.py index c63832288..10e186122 100644 --- a/telebot/__init__.py +++ b/telebot/__init__.py @@ -75,7 +75,7 @@ class ExceptionHandler: Class for handling exceptions while Polling """ - # noinspection PyMethodMayBeStatic,PyUnusedLocal + # noinspection PyMethodMayBeStatic,unused-parameter def handle(self, exception): return False @@ -6017,7 +6017,7 @@ def edit_message_text( def edit_message_media( - self, media: Any, chat_id: Optional[Union[int, str]]=None, + self, media: types.InputMedia, chat_id: Optional[Union[int, str]]=None, message_id: Optional[int]=None, inline_message_id: Optional[str]=None, reply_markup: Optional[types.InlineKeyboardMarkup]=None, @@ -6033,7 +6033,8 @@ def edit_message_media( Telegram documentation: https://core.telegram.org/bots/api#editmessagemedia :param media: A JSON-serialized object for a new media content of the message - :type media: :obj:`InputMedia` + :type media: :obj:`types.InputMedia` + :param chat_id: Required if inline_message_id is not specified. Unique identifier for the target chat or username of the target channel (in the format @channelusername) :type chat_id: :obj:`int` or :obj:`str` diff --git a/telebot/apihelper.py b/telebot/apihelper.py index 099751f34..bb5d1cc0b 100644 --- a/telebot/apihelper.py +++ b/telebot/apihelper.py @@ -3076,22 +3076,21 @@ def convert_input_media(media): return None, None +# noinspection protected-member def convert_input_media_array(array): media = [] files = {} for input_media in array: if isinstance(input_media, types.InputMedia) or isinstance(input_media, types.InputPaidMedia): media_dict = input_media.to_dict() - key = "x" # stub - if media_dict['media'].startswith('attach://'): - key = media_dict['media'].replace('attach://', '') - files[key] = input_media.media - if 'thumbnail' in media_dict: - thumbnail = media_dict['thumbnail'] - if isinstance(thumbnail, types.InputFile): - thumbnail_key = 'thumbnail_' + key - files[thumbnail_key] = thumbnail - media_dict['thumbnail'] = 'attach://' + thumbnail_key + if ('media' in media_dict) and media_dict['media'].startswith('attach://'): + files[input_media._media_name] = input_media.media + if ('thumbnail' in media_dict) and media_dict['thumbnail'].startswith('attach://'): + files[input_media._thumbnail_name] = input_media.thumbnail + if ('cover' in media_dict) and media_dict['cover'].startswith('attach://'): + files[input_media._cover_name] = input_media.cover + if ('photo' in media_dict) and media_dict['photo'].startswith('attach://'): + files[input_media._photo_name] = input_media.photo media.append(media_dict) return json.dumps(media), files diff --git a/telebot/async_telebot.py b/telebot/async_telebot.py index f3615a44b..f01005952 100644 --- a/telebot/async_telebot.py +++ b/telebot/async_telebot.py @@ -7680,7 +7680,7 @@ async def edit_message_text( return types.Message.de_json(result) async def edit_message_media( - self, media: Any, chat_id: Optional[Union[int, str]]=None, + self, media: types.InputMedia, chat_id: Optional[Union[int, str]]=None, message_id: Optional[int]=None, inline_message_id: Optional[str]=None, reply_markup: Optional[types.InlineKeyboardMarkup]=None, @@ -7696,7 +7696,8 @@ async def edit_message_media( Telegram documentation: https://core.telegram.org/bots/api#editmessagemedia :param media: A JSON-serialized object for a new media content of the message - :type media: :obj:`InputMedia` + :type media: :obj:`telebot.types.InputMedia` + :param chat_id: Required if inline_message_id is not specified. Unique identifier for the target chat or username of the target channel (in the format @channelusername) :type chat_id: :obj:`int` or :obj:`str` diff --git a/telebot/asyncio_helper.py b/telebot/asyncio_helper.py index a4557c6cf..789d5e929 100644 --- a/telebot/asyncio_helper.py +++ b/telebot/asyncio_helper.py @@ -2965,19 +2965,17 @@ async def convert_input_media(media): async def convert_input_media_array(array): media = [] files = {} - key = "" for input_media in array: if isinstance(input_media, types.InputMedia) or isinstance(input_media, types.InputPaidMedia): media_dict = input_media.to_dict() - if media_dict['media'].startswith('attach://'): - key = media_dict['media'].replace('attach://', '') - files[key] = input_media.media - if 'thumbnail' in media_dict: - thumbnail = media_dict['thumbnail'] - if isinstance(thumbnail, types.InputFile): - thumbnail_key = 'thumbnail_' + key - files[thumbnail_key] = thumbnail - media_dict['thumbnail'] = 'attach://' + thumbnail_key + if ('media' in media_dict) and media_dict['media'].startswith('attach://'): + files[input_media._media_name] = input_media.media + if ('thumbnail' in media_dict) and media_dict['thumbnail'].startswith('attach://'): + files[input_media._thumbnail_name] = input_media.thumbnail + if ('cover' in media_dict) and media_dict['cover'].startswith('attach://'): + files[input_media._cover_name] = input_media.cover + if ('photo' in media_dict) and media_dict['photo'].startswith('attach://'): + files[input_media._photo_name] = input_media.photo media.append(media_dict) return json.dumps(media), files diff --git a/telebot/types.py b/telebot/types.py index f46ed2a3b..adc2b424a 100644 --- a/telebot/types.py +++ b/telebot/types.py @@ -322,8 +322,9 @@ def de_json(cls, json_string): obj['invite_link'] = ChatInviteLink.de_json(obj.get('invite_link')) return cls(**obj) - def __init__(self, chat, from_user, date, old_chat_member, new_chat_member, invite_link=None, - via_join_request=None, via_chat_folder_invite_link=None, + def __init__(self, chat: Chat, from_user: User, date: int, old_chat_member: ChatMember, new_chat_member: ChatMember, + invite_link: Optional[ChatInviteLink] = None, via_join_request: Optional[bool] = None, + via_chat_folder_invite_link: Optional[bool] = None, **kwargs): self.chat: Chat = chat self.from_user: User = from_user @@ -394,10 +395,12 @@ def de_json(cls, json_string): obj['invite_link'] = ChatInviteLink.de_json(obj.get('invite_link')) return cls(**obj) - def __init__(self, chat, from_user, user_chat_id, date, bio=None, invite_link=None, query_id=None, **kwargs): + def __init__(self, chat: Chat, from_user: User, user_chat_id: int, date: int, + bio: Optional[str] = None, invite_link: Optional[ChatInviteLink] = None, + query_id: Optional[str] = None, **kwargs): self.chat: Chat = chat self.from_user: User = from_user - self.date: str = date + self.date: int = date self.bio: Optional[str] = bio self.invite_link: Optional[ChatInviteLink] = invite_link self.user_chat_id: int = user_chat_id @@ -530,11 +533,22 @@ def de_json(cls, json_string): return cls(**obj) # noinspection PyShadowingBuiltins - def __init__(self, id, is_bot, first_name, last_name=None, username=None, language_code=None, - can_join_groups=None, can_read_all_group_messages=None, supports_inline_queries=None, - is_premium=None, added_to_attachment_menu=None, can_connect_to_business=None, - has_main_web_app=None, has_topics_enabled=None, allows_users_to_create_topics=None, can_manage_bots=None, - supports_guest_queries=None, supports_join_request_queries=None, **kwargs): + def __init__( + self, id: int, is_bot: bool, first_name: str, + last_name: Optional[str] = None, username: Optional[str] = None, + language_code: Optional[str] = None, is_premium: Optional[bool] = None, + added_to_attachment_menu: Optional[bool] = None, + can_join_groups: Optional[bool] = None, + can_read_all_group_messages: Optional[bool] = None, + supports_guest_queries: Optional[bool] = None, + supports_inline_queries: Optional[bool] = None, + can_connect_to_business: Optional[bool] = None, + has_main_web_app: Optional[bool] = None, + has_topics_enabled: Optional[bool] = None, + allows_users_to_create_topics: Optional[bool] = None, + can_manage_bots: Optional[bool] = None, + supports_join_request_queries: Optional[bool] = None, + **kwargs): self.id: int = id self.is_bot: bool = is_bot self.first_name: str = first_name @@ -817,22 +831,51 @@ def de_json(cls, json_string): obj['community'] = Community.de_json(obj['community']) return cls(**obj) - def __init__(self, id, type, title=None, username=None, first_name=None, - last_name=None, photo=None, bio=None, has_private_forwards=None, - description=None, invite_link=None, pinned_message=None, - permissions=None, slow_mode_delay=None, - message_auto_delete_time=None, has_protected_content=None, sticker_set_name=None, - can_set_sticker_set=None, linked_chat_id=None, location=None, - join_to_send_messages=None, join_by_request=None, has_restricted_voice_and_video_messages=None, - is_forum=None, max_reaction_count=None, active_usernames=None, emoji_status_custom_emoji_id=None, - has_hidden_members=None, has_aggressive_anti_spam_enabled=None, emoji_status_expiration_date=None, - available_reactions=None, accent_color_id=None, background_custom_emoji_id=None, profile_accent_color_id=None, - profile_background_custom_emoji_id=None, has_visible_history=None, - unrestrict_boost_count=None, custom_emoji_sticker_set_name=None, business_intro=None, business_location=None, - business_opening_hours=None, personal_chat=None, birthdate=None, - can_send_paid_media=None, - accepted_gift_types=None, is_direct_messages=None, parent_chat=None, rating=None, paid_message_star_count=None, - unique_gift_colors=None, first_profile_audio=None, guard_bot=None, community=None, **kwargs): + def __init__(self, id: int, type: str, + title: Optional[str] = None, username: Optional[str] = None, + first_name: Optional[str] = None, last_name: Optional[str] = None, + photo: Optional[ChatPhoto] = None, bio: Optional[str] = None, + has_private_forwards: Optional[bool] = None, + description: Optional[str] = None, invite_link: Optional[str] = None, + pinned_message: Optional[Message] = None, + permissions: Optional[ChatPermissions] = None, + slow_mode_delay: Optional[int] = None, + message_auto_delete_time: Optional[int] = None, + has_protected_content: Optional[bool] = None, + sticker_set_name: Optional[str] = None, + can_set_sticker_set: Optional[bool] = None, + linked_chat_id: Optional[int] = None, location: Optional[ChatLocation] = None, + join_to_send_messages: Optional[bool] = None, + join_by_request: Optional[bool] = None, + has_restricted_voice_and_video_messages: Optional[bool] = None, + is_forum: Optional[bool] = None, + accent_color_id: int = 0, + max_reaction_count: int = 0, + active_usernames: Optional[List[str]] = None, + emoji_status_custom_emoji_id: Optional[str] = None, + has_hidden_members: Optional[bool] = None, + has_aggressive_anti_spam_enabled: Optional[bool] = None, + emoji_status_expiration_date: Optional[int] = None, + available_reactions: Optional[List[ReactionType]] = None, + background_custom_emoji_id: Optional[str] = None, + profile_accent_color_id: Optional[int] = None, + profile_background_custom_emoji_id: Optional[str] = None, + has_visible_history: Optional[bool] = None, + unrestrict_boost_count: Optional[int] = None, + custom_emoji_sticker_set_name: Optional[str] = None, + business_intro: Optional[BusinessIntro] = None, + business_location: Optional[BusinessLocation] = None, + business_opening_hours: Optional[BusinessOpeningHours] = None, + personal_chat: Optional[Chat] = None, birthdate: Optional[Birthdate] = None, + can_send_paid_media: Optional[bool] = None, + accepted_gift_types: AcceptedGiftTypes = None, + is_direct_messages: Optional[bool] = None, parent_chat: Optional[Chat] = None, + rating: Optional[UserRating] = None, + paid_message_star_count: Optional[int] = None, + unique_gift_colors: Optional[UniqueGiftColors] = None, + first_profile_audio: Optional[Audio] = None, + guard_bot: Optional[User] = None, community: Optional[Community] = None, + **kwargs): self.id: int = id self.type: str = type self.title: Optional[str] = title @@ -840,7 +883,7 @@ def __init__(self, id, type, title=None, username=None, first_name=None, self.first_name: Optional[str] = first_name self.last_name: Optional[str] = last_name self.is_forum: Optional[bool] = is_forum - self.max_reaction_count: Optional[int] = max_reaction_count + self.max_reaction_count: int = max_reaction_count self.photo: Optional[ChatPhoto] = photo self.bio: Optional[str] = bio self.join_to_send_messages: Optional[bool] = join_to_send_messages @@ -864,7 +907,7 @@ def __init__(self, id, type, title=None, username=None, first_name=None, self.has_aggressive_anti_spam_enabled: Optional[bool] = has_aggressive_anti_spam_enabled self.emoji_status_expiration_date: Optional[int] = emoji_status_expiration_date self.available_reactions: Optional[List[ReactionType]] = available_reactions - self.accent_color_id: Optional[int] = accent_color_id + self.accent_color_id: int = accent_color_id self.background_custom_emoji_id: Optional[str] = background_custom_emoji_id self.profile_accent_color_id: Optional[int] = profile_accent_color_id self.profile_background_custom_emoji_id: Optional[str] = profile_background_custom_emoji_id @@ -952,6 +995,7 @@ def __init__(self, message_id, **kwargs): log_deprecation_warning('The class "MessageID" is deprecated, use "MessageId" instead') +# noinspection missing-constructor class MessageId(MessageID): """ This object represents a unique message identifier. @@ -970,7 +1014,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, message_id, **kwargs): + def __init__(self, message_id: int, **kwargs): self.message_id: int = message_id @@ -995,7 +1039,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, data, button_text, **kwargs): + def __init__(self, data: str, button_text: str, **kwargs): self.data: str = data self.button_text: str = button_text def to_dict(self): @@ -1841,6 +1885,12 @@ def __init__(self, message_id, from_user, date, chat, content_type, options, jso self.guest_query_id: Optional[str] = None self.live_photo: Optional[LivePhoto] = None self.rich_message: Optional[RichMessage] = None + self.receiver_user: Optional[User] = None + self.ephemeral_message_id: Optional[str] = None + self.game: Optional[Game] = None + self.passport_data: Optional[PassportData] = None + self.community_chat_added: Optional[Chat] = None + self.community_chat_removed: Optional[Chat] = None for key in options: setattr(self, key, options[key]) @@ -2006,14 +2056,15 @@ def de_json(cls, json_string): obj['user'] = User.de_json(obj['user']) return cls(**obj) - def __init__(self, type, offset, length, url=None, user=None, language=None, custom_emoji_id=None, - unix_time=None, date_time_format=None, **kwargs): + def __init__(self, type: str, offset: int, length: int, url: Optional[str] = None, user: Optional[User] = None, + language: Optional[str] = None, custom_emoji_id: Optional[str] = None, unix_time: Optional[int] = None, + date_time_format: Optional[str] = None, **kwargs): self.type: str = type self.offset: int = offset self.length: int = length - self.url: str = url - self.user: User = user - self.language: str = language + self.url: Optional[str] = url + self.user: Optional[User] = user + self.language: Optional[str] = language self.custom_emoji_id: Optional[str] = custom_emoji_id self.unix_time: Optional[int] = unix_time self.date_time_format: Optional[str] = date_time_format @@ -2054,7 +2105,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, value, emoji, **kwargs): + def __init__(self, value: int, emoji: str, **kwargs): self.value: int = value self.emoji: str = emoji @@ -2096,7 +2147,8 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, file_id, file_unique_id, width, height, file_size=None, **kwargs): + def __init__(self, file_id: str, file_unique_id: str, width: int, height: int, + file_size: Optional[int] = None, **kwargs): self.file_id: str = file_id self.file_unique_id: str = file_unique_id self.width: int = width @@ -2150,8 +2202,11 @@ def de_json(cls, json_string): obj['thumbnail'] = None return cls(**obj) - def __init__(self, file_id, file_unique_id, duration, performer=None, title=None, file_name=None, mime_type=None, - file_size=None, thumbnail=None, **kwargs): + def __init__(self, file_id: str, file_unique_id: str, duration: int, + performer: Optional[str] = None, title: Optional[str] = None, + file_name: Optional[str] = None, mime_type: Optional[str] = None, + file_size: Optional[int] = None, thumbnail: Optional[PhotoSize] = None, + **kwargs): self.file_id: str = file_id self.file_unique_id: str = file_unique_id self.duration: int = duration @@ -2198,7 +2253,8 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, file_id, file_unique_id, duration, mime_type=None, file_size=None, **kwargs): + def __init__(self, file_id: str, file_unique_id: str, duration: int, + mime_type: Optional[str] = None, file_size: Optional[int] = None, **kwargs): self.file_id: str = file_id self.file_unique_id: str = file_unique_id self.duration: int = duration @@ -2243,7 +2299,9 @@ def de_json(cls, json_string): obj['thumbnail'] = None return cls(**obj) - def __init__(self, file_id, file_unique_id, thumbnail=None, file_name=None, mime_type=None, file_size=None, **kwargs): + def __init__(self, file_id: str, file_unique_id: str, thumbnail: Optional[PhotoSize] = None, + file_name: Optional[str] = None, mime_type: Optional[str] = None, + file_size: Optional[int] = None, **kwargs): self.file_id: str = file_id self.file_unique_id: str = file_unique_id self.thumbnail: Optional[PhotoSize] = thumbnail @@ -2314,8 +2372,11 @@ def de_json(cls, json_string): obj['qualities'] = [VideoQuality.de_json(q) for q in obj['qualities']] return cls(**obj) - def __init__(self, file_id, file_unique_id, width, height, duration, thumbnail=None, file_name=None, mime_type=None, file_size=None, - cover=None, start_timestamp=None, qualities=None, **kwargs): + def __init__(self, file_id: str, file_unique_id: str, width: int, height: int, duration: int, + thumbnail: Optional[PhotoSize] = None, cover: Optional[List[PhotoSize]] = None, + start_timestamp: Optional[int] = None, qualities: Optional[List[VideoQuality]] = None, + file_name: Optional[str] = None, mime_type: Optional[str] = None, file_size: Optional[int] = None, + **kwargs): self.file_id: str = file_id self.file_unique_id: str = file_unique_id self.width: int = width @@ -2370,7 +2431,8 @@ def de_json(cls, json_string): obj['thumbnail'] = PhotoSize.de_json(obj['thumbnail']) return cls(**obj) - def __init__(self, file_id, file_unique_id, length, duration, thumbnail=None, file_size=None, **kwargs): + def __init__(self, file_id: str, file_unique_id: str, length: int, duration: int, + thumbnail: Optional[PhotoSize] = None, file_size: Optional[int] = None, **kwargs): self.file_id: str = file_id self.file_unique_id: str = file_unique_id self.length: int = length @@ -2414,7 +2476,8 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, phone_number, first_name, last_name=None, user_id=None, vcard=None, **kwargs): + def __init__(self, phone_number: str, first_name: str, last_name: Optional[str] = None, + user_id: Optional[int] = None, vcard: Optional[str] = None, **kwargs): self.phone_number: str = phone_number self.first_name: str = first_name self.last_name: Optional[str] = last_name @@ -2455,8 +2518,10 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, longitude, latitude, horizontal_accuracy=None, - live_period=None, heading=None, proximity_alert_radius=None, **kwargs): + def __init__(self, latitude: float, longitude: float, + horizontal_accuracy: Optional[float] = None, live_period: Optional[int] = None, + heading: Optional[int] = None, proximity_alert_radius: Optional[int] = None, + **kwargs): self.longitude: float = longitude self.latitude: float = latitude self.horizontal_accuracy: Optional[float] = horizontal_accuracy @@ -2520,8 +2585,10 @@ def de_json(cls, json_string): obj['location'] = Location.de_json(obj['location']) return cls(**obj) - def __init__(self, location, title, address, foursquare_id=None, foursquare_type=None, - google_place_id=None, google_place_type=None, **kwargs): + def __init__(self, location: Location, title: str, address: str, + foursquare_id: Optional[str] = None, foursquare_type: Optional[str] = None, + google_place_id: Optional[str] = None, google_place_type: Optional[str] = None, + **kwargs): self.location: Location = location self.title: str = title self.address: str = address @@ -2555,9 +2622,9 @@ def de_json(cls, json_string): obj['photos'] = photos return cls(**obj) - def __init__(self, total_count, photos=None, **kwargs): + def __init__(self, total_count: int, photos: List[List[PhotoSize]] = None, **kwargs): self.total_count: int = total_count - self.photos: List[PhotoSize] = photos + self.photos: List[List[PhotoSize]] = photos class File(JsonDeserializable): @@ -2587,7 +2654,8 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, file_id, file_unique_id, file_size=None, file_path=None, **kwargs): + def __init__(self, file_id: str, file_unique_id: str, file_size: Optional[int] = None, + file_path: Optional[str] = None, **kwargs): self.file_id: str = file_id self.file_unique_id: str = file_unique_id self.file_size: Optional[int] = file_size @@ -2613,12 +2681,15 @@ class ForceReply(JsonSerializable): :return: Instance of the class :rtype: :class:`telebot.types.ForceReply` """ - def __init__(self, selective: Optional[bool]=None, input_field_placeholder: Optional[str]=None): + def __init__( + self, force_reply: bool = True, selective: Optional[bool] = None, + input_field_placeholder: Optional[str] = None): + self.force_reply: bool = force_reply self.selective: Optional[bool] = selective self.input_field_placeholder: Optional[str] = input_field_placeholder def to_json(self): - json_dict = {'force_reply': True} + json_dict = {'force_reply': self.force_reply} if self.selective is not None: json_dict['selective'] = self.selective if self.input_field_placeholder: @@ -2642,12 +2713,14 @@ class ReplyKeyboardRemove(JsonSerializable): :return: Instance of the class :rtype: :class:`telebot.types.ReplyKeyboardRemove` """ - def __init__(self, selective: Optional[bool]=None): + def __init__( + self, remove_keyboard: bool = True, selective: Optional[bool] = None): + self.remove_keyboard: bool = remove_keyboard self.selective: Optional[bool] = selective def to_json(self): - json_dict = {'remove_keyboard': True} - if self.selective: + json_dict = {'remove_keyboard': self.remove_keyboard} + if self.selective is not None: json_dict['selective'] = self.selective return json.dumps(json_dict) @@ -2670,7 +2743,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, url, **kwargs): + def __init__(self, url: str, **kwargs): self.url: str = url def to_dict(self): @@ -2822,8 +2895,8 @@ class KeyboardButtonPollType(Dictionaryable): :return: Instance of the class :rtype: :class:`telebot.types.KeyboardButtonPollType` """ - def __init__(self, type=None): - self.type: str = type + def __init__(self, type: Optional[str] = None): + self.type: Optional[str] = type def to_dict(self): return {'type': self.type} @@ -2940,11 +3013,17 @@ class KeyboardButtonRequestChat(Dictionaryable): :rtype: :class:`telebot.types.KeyboardButtonRequestChat` """ - def __init__(self, request_id: int, chat_is_channel: bool, chat_is_forum: Optional[bool]=None, - chat_has_username: Optional[bool]=None, chat_is_created: Optional[bool]=None, - user_administrator_rights: Optional[ChatAdministratorRights]=None, - bot_administrator_rights: Optional[ChatAdministratorRights]=None, bot_is_member: Optional[bool]=None, - request_title: Optional[bool]=None, request_photo: Optional[bool]=None, request_username: Optional[bool]=None): + def __init__( + self, request_id: int, chat_is_channel: bool, + chat_is_forum: Optional[bool] = None, + chat_has_username: Optional[bool] = None, + chat_is_created: Optional[bool] = None, + user_administrator_rights: Optional[ChatAdministratorRights] = None, + bot_administrator_rights: Optional[ChatAdministratorRights] = None, + bot_is_member: Optional[bool] = None, + request_title: Optional[bool] = None, + request_photo: Optional[bool] = None, + request_username: Optional[bool] = None): self.request_id: int = request_id self.chat_is_channel: bool = chat_is_channel self.chat_is_forum: Optional[bool] = chat_is_forum @@ -3024,11 +3103,16 @@ class KeyboardButton(Dictionaryable, JsonSerializable): :return: Instance of the class :rtype: :class:`telebot.types.KeyboardButton` """ - def __init__(self, text: str, request_contact: Optional[bool]=None, - request_location: Optional[bool]=None, request_poll: Optional[KeyboardButtonPollType]=None, - web_app: Optional[WebAppInfo]=None, request_user: Optional[KeyboardButtonRequestUser]=None, - request_chat: Optional[KeyboardButtonRequestChat]=None, request_users: Optional[KeyboardButtonRequestUsers]=None, - icon_custom_emoji_id: Optional[str]=None, style: Optional[str]=None, request_managed_bot: Optional[KeyboardButtonRequestManagedBot]=None): + def __init__( + self, text: str, request_contact: Optional[bool] = None, + request_location: Optional[bool] = None, + request_poll: Optional[KeyboardButtonPollType] = None, + web_app: Optional[WebAppInfo] = None, + request_user: Optional[KeyboardButtonRequestUser] = None, + request_chat: Optional[KeyboardButtonRequestChat] = None, + request_users: Optional[KeyboardButtonRequestUsers] = None, + icon_custom_emoji_id: Optional[str] = None, style: Optional[str] = None, + request_managed_bot: Optional[KeyboardButtonRequestManagedBot] = None): self.text: str = text self.request_contact: Optional[bool] = request_contact self.request_location: Optional[bool] = request_location @@ -3114,7 +3198,9 @@ def de_json(cls, json_string): inline_keyboard = [[InlineKeyboardButton.de_json(button) for button in row] for row in obj['inline_keyboard']] return cls(inline_keyboard=inline_keyboard) - def __init__(self, inline_keyboard=None, row_width=3, keyboard=None): + def __init__( + self, inline_keyboard: List[List[InlineKeyboardButton]] = None, row_width: int = 3, + keyboard: List[List[InlineKeyboardButton]] = None, **kwargs): if row_width > self.max_row_keys: # Todo: Will be replaced with Exception in future releases logger.error('Telegram does not support inline keyboard row width over %d.' % self.max_row_keys) @@ -3257,10 +3343,13 @@ def de_json(cls, json_string): return cls(**obj) - def __init__(self, text: str, url: Optional[str]=None, callback_data: Optional[str]=None, web_app: Optional[WebAppInfo]=None, - switch_inline_query: Optional[str]=None, switch_inline_query_current_chat: Optional[str]=None, - switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat]=None, callback_game=None, pay: Optional[bool]=None, - login_url: Optional[LoginUrl]=None, copy_text: Optional[CopyTextButton]=None, icon_custom_emoji_id: Optional[str]=None, style: Optional[str]=None, **kwargs): + def __init__(self, text: str, url: Optional[str] = None, callback_data: Optional[str] = None, + web_app: Optional[WebAppInfo] = None, switch_inline_query: Optional[str] = None, + switch_inline_query_current_chat: Optional[str] = None, + switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = None, + callback_game: Optional[CallbackGame] = None, pay: Optional[bool] = None, + login_url: Optional[LoginUrl] = None, copy_text: Optional[CopyTextButton] = None, + icon_custom_emoji_id: Optional[str] = None, style: Optional[str] = None, **kwargs): self.text: str = text self.url: Optional[str] = url self.callback_data: Optional[str] = callback_data @@ -3268,7 +3357,7 @@ def __init__(self, text: str, url: Optional[str]=None, callback_data: Optional[s self.switch_inline_query: Optional[str] = switch_inline_query self.switch_inline_query_current_chat: Optional[str] = switch_inline_query_current_chat self.switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = switch_inline_query_chosen_chat - self.callback_game = callback_game # Not Implemented + self.callback_game: Optional[CallbackGame] = callback_game # Not Implemented self.pay: Optional[bool] = pay self.login_url: Optional[LoginUrl] = login_url self.copy_text: Optional[CopyTextButton] = copy_text @@ -3334,8 +3423,10 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, url: str, forward_text: Optional[str]=None, bot_username: Optional[str]=None, request_write_access: Optional[bool]=None, - **kwargs): + def __init__( + self, url: str, forward_text: Optional[str] = None, + bot_username: Optional[str] = None, + request_write_access: Optional[bool] = None, **kwargs): self.url: str = url self.forward_text: Optional[str] = forward_text self.bot_username: Optional[str] = bot_username @@ -3405,13 +3496,15 @@ def de_json(cls, json_string): return cls(**obj) def __init__( - self, id, from_user, data, chat_instance, json_string, message=None, inline_message_id=None, - game_short_name=None, **kwargs): - self.id: int = id + self, id: str, from_user: User, chat_instance: str, json_string: str, + data: Optional[str] = None, + message: Optional[MaybeInaccessibleMessage] = None, inline_message_id: Optional[str] = None, + game_short_name: Optional[str] = None, **kwargs): + self.id: str = id self.from_user: User = from_user - self.message: Optional[Union[Message, InaccessibleMessage]] = message + self.message: Optional[MaybeInaccessibleMessage] = message self.inline_message_id: Optional[str] = inline_message_id - self.chat_instance: Optional[str] = chat_instance + self.chat_instance: str = chat_instance self.data: Optional[str] = data self.game_short_name: Optional[str] = game_short_name self.json = json_string @@ -3444,7 +3537,8 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, small_file_id, small_file_unique_id, big_file_id, big_file_unique_id, **kwargs): + def __init__(self, small_file_id: str, small_file_unique_id: str, + big_file_id: str, big_file_unique_id: str, **kwargs): self.small_file_id: str = small_file_id self.small_file_unique_id: str = small_file_unique_id self.big_file_id: str = big_file_id @@ -3513,7 +3607,7 @@ class ChatMemberOwner(ChatMember): :return: Instance of the class :rtype: :class:`telebot.types.ChatMemberOwner` """ - def __init__(self, user, status, is_anonymous, custom_title=None, **kwargs): + def __init__(self, user, status, is_anonymous: bool, custom_title: Optional[str] = None, **kwargs): super().__init__(user, status, **kwargs) self.is_anonymous: bool = is_anonymous self.custom_title: Optional[str] = custom_title @@ -3592,11 +3686,16 @@ class ChatMemberAdministrator(ChatMember): :return: Instance of the class :rtype: :class:`telebot.types.ChatMemberAdministrator` """ - def __init__(self, user, status, can_be_edited, is_anonymous, can_manage_chat, can_delete_messages, - can_manage_video_chats, can_restrict_members, can_promote_members, can_change_info, can_invite_users, - can_post_stories, can_edit_stories, can_delete_stories, can_post_messages=None, can_edit_messages=None, - can_pin_messages=None, can_manage_topics=None, custom_title=None, can_manage_direct_messages=None, - can_manage_tags=None, **kwargs): + def __init__( + self, user: User, status: str, can_be_edited: bool, is_anonymous: bool, + can_manage_chat: bool, can_delete_messages: bool, + can_manage_video_chats: bool, can_restrict_members: bool, can_promote_members: bool, + can_change_info: bool, can_invite_users: bool, can_post_stories: bool, + can_edit_stories: bool, can_delete_stories: bool, + can_post_messages: Optional[bool] = None, can_edit_messages: Optional[bool] = None, + can_pin_messages: Optional[bool] = None, can_manage_topics: Optional[bool] = None, + custom_title: Optional[str] = None, can_manage_direct_messages: Optional[bool] = None, + can_manage_tags: Optional[bool] = None, **kwargs): super().__init__(user, status, **kwargs) self.can_be_edited: bool = can_be_edited self.is_anonymous: bool = is_anonymous @@ -3646,7 +3745,7 @@ class ChatMemberMember(ChatMember): :return: Instance of the class :rtype: :class:`telebot.types.ChatMemberMember` """ - def __init__(self, user, status, until_date=None, tag=None, **kwargs): + def __init__(self, user, status, until_date: Optional[int] = None, tag: Optional[str] = None, **kwargs): super().__init__(user, status, **kwargs) self.until_date: Optional[int] = until_date self.tag: Optional[str] = tag @@ -3725,11 +3824,15 @@ class ChatMemberRestricted(ChatMember): :return: Instance of the class :rtype: :class:`telebot.types.ChatMemberRestricted` """ - def __init__(self, user, status, is_member, can_send_messages, can_send_audios, can_send_documents, - can_send_photos, can_send_videos, can_send_video_notes, can_send_voice_notes, can_send_polls, - can_send_other_messages, can_add_web_page_previews, - can_change_info, can_invite_users, can_pin_messages, can_manage_topics, - until_date=None, tag=None, can_edit_tag=None, can_react_to_messages=None, **kwargs): + def __init__( + self, user: ChatMember, status: str, is_member: bool, + can_send_messages: bool, can_send_audios: bool, can_send_documents: bool, + can_send_photos: bool, can_send_videos: bool, can_send_video_notes: bool, + can_send_voice_notes: bool, can_send_polls: bool, + can_send_other_messages: bool, can_add_web_page_previews: bool, + can_change_info: bool, can_invite_users: bool, can_pin_messages: bool, + can_manage_topics: bool, until_date: int = None, tag: Optional[str] = None, + can_edit_tag: bool = None, can_react_to_messages: bool = None, **kwargs): super().__init__(user, status, **kwargs) self.is_member: bool = is_member self.can_send_messages: bool = can_send_messages @@ -3746,10 +3849,10 @@ def __init__(self, user, status, is_member, can_send_messages, can_send_audios, self.can_invite_users: bool = can_invite_users self.can_pin_messages: bool = can_pin_messages self.can_manage_topics: bool = can_manage_topics - self.until_date: Optional[int] = until_date + self.until_date: int = until_date self.tag: Optional[str] = tag - self.can_edit_tag: Optional[bool] = can_edit_tag - self.can_react_to_messages: Optional[bool] = can_react_to_messages + self.can_edit_tag: bool = can_edit_tag + self.can_react_to_messages: bool = can_react_to_messages # noinspection PyUnresolvedReferences @@ -3790,9 +3893,9 @@ class ChatMemberBanned(ChatMember): :return: Instance of the class :rtype: :class:`telebot.types.ChatMemberBanned` """ - def __init__(self, user, status, until_date=None, **kwargs): + def __init__(self, user, status, until_date: int = 0, **kwargs): super().__init__(user, status, **kwargs) - self.until_date: Optional[int] = until_date + self.until_date: int = until_date class ChatPermissions(JsonDeserializable, JsonSerializable, Dictionaryable): @@ -3861,13 +3964,17 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj, de_json = True) - def __init__(self, can_send_messages=None, can_send_media_messages=None,can_send_audios=None, - can_send_documents=None, can_send_photos=None, - can_send_videos=None, can_send_video_notes=None, - can_send_voice_notes=None, can_send_polls=None, can_send_other_messages=None, - can_add_web_page_previews=None, can_change_info=None, - can_invite_users=None, can_pin_messages=None, - can_manage_topics=None, can_edit_tag=None, can_react_to_messages=None, **kwargs): + def __init__(self, + can_send_messages: Optional[bool] = None, can_send_media_messages=None, + can_send_audios: Optional[bool] = None, can_send_documents: Optional[bool] = None, + can_send_photos: Optional[bool] = None, + can_send_videos: Optional[bool] = None, can_send_video_notes: Optional[bool] = None, + can_send_voice_notes: Optional[bool] = None, can_send_polls: Optional[bool] = None, + can_send_other_messages: Optional[bool] = None, + can_add_web_page_previews: Optional[bool] = None, can_change_info: Optional[bool] = None, + can_invite_users: Optional[bool] = None, can_pin_messages: Optional[bool] = None, + can_manage_topics: Optional[bool] = None, can_edit_tag: Optional[bool] = None, + can_react_to_messages: Optional[bool] = None, **kwargs): self.can_send_messages: Optional[bool] = can_send_messages self.can_send_polls: Optional[bool] = can_send_polls self.can_send_other_messages: Optional[bool] = can_send_other_messages @@ -4651,7 +4758,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, inline_message_id=None, **kwargs): + def __init__(self, inline_message_id: Optional[str] = None, **kwargs): self.inline_message_id: Optional[str] = inline_message_id def to_dict(self): @@ -6187,13 +6294,16 @@ def de_json(cls, json_string): obj['thumbnail'] = None return cls(**obj) - def __init__(self, file_id, file_unique_id, width=None, height=None, duration=None, - thumbnail=None, file_name=None, mime_type=None, file_size=None, **kwargs): + def __init__( + self, file_id: str, file_unique_id: str, width: int = None, height: int = None, + duration: int = None, thumbnail: Optional[PhotoSize] = None, + file_name: Optional[str] = None, mime_type: Optional[str] = None, + file_size: Optional[int] = None, **kwargs): self.file_id: str = file_id self.file_unique_id: str = file_unique_id - self.width: Optional[int] = width - self.height: Optional[int] = height - self.duration: Optional[int] = duration + self.width: int = width + self.height: int = height + self.duration: int = duration self.thumbnail: Optional[PhotoSize] = thumbnail self.file_name: Optional[str] = file_name self.mime_type: Optional[str] = mime_type @@ -6792,31 +6902,37 @@ class InputMedia(Dictionaryable, JsonSerializable): Telegram documentation: https://core.telegram.org/bots/api#inputmedia """ - def __init__(self, type, media=None, caption=None, parse_mode=None, caption_entities=None, thumbnail=None): + def __init__(self, type: str, media: Optional[Union[str, InputFile]] = None, caption: Optional[str] = None, + parse_mode: Optional[str] = None, caption_entities: Optional[List[MessageEntity]] = None, + thumbnail: Optional[InputFile] = None): self.type: str = type - self.media: Optional[str] = media + self.media: Optional[Union[str, InputFile]] = media self.caption: Optional[str] = caption self.parse_mode: Optional[str] = parse_mode self.caption_entities: Optional[List[MessageEntity]] = caption_entities - self.thumbnail: Optional[Union[str, InputFile]] = thumbnail + self.thumbnail: Optional[InputFile] = thumbnail + + if media is None: + self._media_name = '' + self._media_dic = None + elif service_utils.is_string(self.media): + self._media_name = '' + self._media_dic = self.media + else: + self._media_name = service_utils.generate_random_token() + self._media_dic = 'attach://{0}'.format(self._media_name) if thumbnail is None: self._thumbnail_name = '' self._thumbnail_dic = None elif service_utils.is_string(self.thumbnail): + # In fact t cannot be string because cannot be reused self._thumbnail_name = '' self._thumbnail_dic = self.thumbnail else: self._thumbnail_name = service_utils.generate_random_token() self._thumbnail_dic = 'attach://{0}'.format(self._thumbnail_name) - if service_utils.is_string(self.media): - self._media_name = '' - self._media_dic = self.media - else: - self._media_name = service_utils.generate_random_token() - self._media_dic = 'attach://{0}'.format(self._media_name) - if self.__class__ is InputMedia: # Make InputMedia as ABC some time... log_deprecation_warning('The InputMedia class should not be instantiated directly. Use particular InputMediaXXX class instead') @@ -6842,16 +6958,20 @@ def convert_input_media(self): """ :meta private: """ + files = {} if self.media is None: - return self.to_json(), None + pass elif service_utils.is_string(self.media): - return self.to_json(), None - - media_dict = {self._media_name: self.media} - if self._thumbnail_name: - media_dict[self._thumbnail_name] = self.thumbnail - - return self.to_json(), media_dict + pass + else: + files[self._media_name] = self.media + if self.thumbnail is None: + pass + elif service_utils.is_string(self.thumbnail): + pass + else: + files[self._thumbnail_name] = self.thumbnail + return self.to_json(), files class InputMediaPhoto(InputMedia): @@ -6861,10 +6981,10 @@ class InputMediaPhoto(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmediaphoto :param type: Type of the media, must be photo - :type type: :class:`InputMedia` + :type type: :obj:`str` :param media: File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name - :type media: :obj:`str` + :type media: :obj:`str` or :class:`telebot.types.InputFile` :param caption: Optional. Caption of the photo to be sent, 0-1024 characters after entities parsing :type caption: :obj:`str` @@ -6912,13 +7032,13 @@ class InputMediaVideo(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmediavideo :param type: Type of the media, must be video - :type type: :class:`InputMedia` + :type type: :obj:`str` :param media: File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. - :type media: :obj:`str` + :type media: :obj:`str` or :class:`telebot.types.InputFile` :param thumbnail: Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://” if the thumbnail was uploaded using multipart/form-data under . - :type thumbnail: InputFile or :obj:`str` + :type thumbnail: :class:`telebot.types.InputFile` :param cover: Optional. Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. :type cover: :obj:`str` or :class:`telebot.types.InputFile` @@ -6956,7 +7076,7 @@ class InputMediaVideo(InputMedia): :return: Instance of the class :rtype: :class:`telebot.types.InputMediaVideo` """ - def __init__(self, media: Union[str, InputFile], thumbnail: Optional[Union[str, InputFile]] = None, + def __init__(self, media: Union[str, InputFile], thumbnail: Optional[InputFile] = None, caption: Optional[str] = None, parse_mode: Optional[str] = None, caption_entities: Optional[List[MessageEntity]] = None, width: Optional[int] = None, height: Optional[int] = None, duration: Optional[int] = None, @@ -6971,9 +7091,19 @@ def __init__(self, media: Union[str, InputFile], thumbnail: Optional[Union[str, self.supports_streaming: Optional[bool] = supports_streaming self.has_spoiler: Optional[bool] = has_spoiler self.show_caption_above_media: Optional[bool] = show_caption_above_media - self.cover: Optional[str] = cover + self.cover: Optional[Union[str, InputFile]] = cover self.start_timestamp: Optional[int] = start_timestamp + if cover is None: + self._cover_name = '' + self._cover_dic = None + elif service_utils.is_string(self.cover): + self._cover_name = '' + self._cover_dic = self.cover + else: + self._cover_name = service_utils.generate_random_token() + self._cover_dic = 'attach://{0}'.format(self._cover_name) + @property def thumb(self) -> Optional[Union[str, Any]]: log_deprecation_warning('The parameter "thumb" is deprecated, use "thumbnail" instead') @@ -6993,12 +7123,22 @@ def to_dict(self): ret['has_spoiler'] = self.has_spoiler if self.show_caption_above_media is not None: ret['show_caption_above_media'] = self.show_caption_above_media - if self.cover: - ret['cover'] = self.cover + if self._cover_dic: + ret['cover'] = self._cover_dic if self.start_timestamp: ret['start_timestamp'] = self.start_timestamp return ret + def convert_input_media(self): + media_json, files = super(InputMediaVideo, self).convert_input_media() + if self.cover is None: + pass + elif service_utils.is_string(self.cover): + pass + else: + files[self._cover_name] = self.cover + return media_json, files + class InputMediaAnimation(InputMedia): """ @@ -7007,13 +7147,13 @@ class InputMediaAnimation(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmediaanimation :param type: Type of the media, must be animation - :type type: :obj:`typing.Any` + :type type: :obj:`str` :param media: File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name - :type media: :obj:`str` + :type media: :obj:`str` or :class:`telebot.types.InputFile` :param thumbnail: Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://” if the thumbnail was uploaded using multipart/form-data under - :type thumbnail: InputFile or :obj:`str` + :type thumbnail: :class:`telebot.types.InputFile` :param caption: Optional. Caption of the animation to be sent, 0-1024 characters after entities parsing :type caption: :obj:`str` @@ -7043,7 +7183,7 @@ class InputMediaAnimation(InputMedia): :rtype: :class:`telebot.types.InputMediaAnimation` """ - def __init__(self, media: Union[str, InputFile], thumbnail: Optional[Union[str, InputFile]] = None, + def __init__(self, media: Union[str, InputFile], thumbnail: Optional[InputFile] = None, caption: Optional[str] = None, parse_mode: Optional[str] = None, caption_entities: Optional[List[MessageEntity]] = None, width: Optional[int] = None, height: Optional[int] = None, duration: Optional[int] = None, @@ -7056,7 +7196,6 @@ def __init__(self, media: Union[str, InputFile], thumbnail: Optional[Union[str, self.has_spoiler: Optional[bool] = has_spoiler self.show_caption_above_media: Optional[bool] = show_caption_above_media - @property def thumb(self) -> Optional[Union[str, Any]]: log_deprecation_warning('The parameter "thumb" is deprecated, use "thumbnail" instead') @@ -7084,13 +7223,13 @@ class InputMediaAudio(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmediaaudio :param type: Type of the media, must be audio - :type type: :class:`InputMedia` + :type type: :obj:`str` :param media: File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name - :type media: :obj:`str` + :type media: :obj:`str` or :class:`telebot.types.InputFile` :param thumbnail: Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://” if the thumbnail was uploaded using multipart/form-data under - :type thumbnail: InputFile or :obj:`str` + :type thumbnail: :class:`telebot.types.InputFile` :param caption: Optional. Caption of the audio to be sent, 0-1024 characters after entities parsing :type caption: :obj:`str` @@ -7113,7 +7252,7 @@ class InputMediaAudio(InputMedia): :return: Instance of the class :rtype: :class:`telebot.types.InputMediaAudio` """ - def __init__(self, media: Union[str, InputFile], thumbnail: Optional[Union[str, InputFile]] = None, + def __init__(self, media: Union[str, InputFile], thumbnail: Optional[InputFile] = None, caption: Optional[str] = None, parse_mode: Optional[str] = None, caption_entities: Optional[List[MessageEntity]] = None, duration: Optional[int] = None, performer: Optional[str] = None, title: Optional[str] = None): @@ -7146,13 +7285,13 @@ class InputMediaDocument(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmediadocument :param type: Type of the media, must be document - :type type: :class:`InputMedia` + :type type: :obj:`str` :param media: File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name - :type media: :obj:`str` + :type media: :obj:`str` or :class:`telebot.types.InputFile` :param thumbnail: Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://” if the thumbnail was uploaded using multipart/form-data under - :type thumbnail: InputFile or :obj:`str` + :type thumbnail: :class:`telebot.types.InputFile` :param caption: Optional. Caption of the document to be sent, 0-1024 characters after entities parsing :type caption: :obj:`str` @@ -7169,7 +7308,7 @@ class InputMediaDocument(InputMedia): :return: Instance of the class :rtype: :class:`telebot.types.InputMediaDocument` """ - def __init__(self, media: Union[str, InputFile], thumbnail: Optional[Union[str, InputFile]] = None, + def __init__(self, media: Union[str, InputFile], thumbnail: Optional[InputFile] = None, caption: Optional[str] = None, parse_mode: Optional[str] = None, caption_entities: Optional[List[MessageEntity]] = None, disable_content_type_detection: Optional[bool] = None): @@ -7196,13 +7335,13 @@ class InputMediaLivePhoto(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmedialivephoto :param type: Type of the media, must be live_photo - :type type: :class:`InputMedia` + :type type: :obj:`str` :param media: Video of the live photo to send. Pass a file_id to send a file that exists on the Telegram servers (recommended) or pass “attach://” to upload a new one using multipart/form-data under name. Sending live photos by a URL is currently unsupported. - :type media: :obj:`str` + :type media: :obj:`str` or :class:`telebot.types.InputFile` :param photo: The static photo to send. Pass a file_id to send a file that exists on the Telegram servers (recommended) or pass “attach://” to upload a new one using multipart/form-data under name. Sending live photos by a URL is currently unsupported. - :type photo: :obj:`str` + :type photo: :obj:`str` or :class:`telebot.types.InputFile` :param caption: Optional. Caption of the live photo to be sent, 0-1024 characters after entities parsing :type caption: :obj:`str` @@ -7222,17 +7361,26 @@ class InputMediaLivePhoto(InputMedia): :return: Instance of the class :rtype: :class:`telebot.types.InputMediaLivePhoto` """ - def __init__(self, media: str, photo: str, caption: Optional[str] = None, parse_mode: Optional[str] = None, - caption_entities: Optional[List[MessageEntity]] = None, show_caption_above_media: Optional[bool] = None, has_spoiler: Optional[bool] = None): - super(InputMediaLivePhoto, self).__init__(type="live_photo", media=media, caption=caption, parse_mode=parse_mode, caption_entities=caption_entities) - self.photo: str = photo + def __init__( + self, media: Union[str, InputFile], photo: Union[str, InputFile], + caption: Optional[str] = None, parse_mode: Optional[str] = None, + caption_entities: Optional[List[MessageEntity]] = None, + show_caption_above_media: Optional[bool] = None, + has_spoiler: Optional[bool] = None): + super(InputMediaLivePhoto, self).__init__( + type="live_photo", media=media, caption=caption, + parse_mode=parse_mode, caption_entities=caption_entities) + self.photo: Union[str, InputFile] = photo self.show_caption_above_media: Optional[bool] = show_caption_above_media self.has_spoiler: Optional[bool] = has_spoiler self._photo_name = service_utils.generate_random_token() - if not service_utils.is_string(photo): - self._photo_dic = 'attach://{0}'.format(self._photo_name) + + if service_utils.is_string(self.photo): + self._photo_name = '' + self._photo_dic = self.photo else: - self._photo_dic = photo + self._photo_name = service_utils.generate_random_token() + self._photo_dic = 'attach://{0}'.format(self._photo_name) def to_dict(self): json_dict = super(InputMediaLivePhoto, self).to_dict() @@ -7244,12 +7392,13 @@ def to_dict(self): return json_dict def convert_input_media(self): - media, files = super(InputMediaLivePhoto, self).convert_input_media() - if not service_utils.is_string(self.photo): - if files is None: - files = {} + media_json, files = super(InputMediaLivePhoto, self).convert_input_media() + if service_utils.is_string(self.photo): + pass + else: files[self._photo_name] = self.photo - return media, files + return media_json, files + class InputMediaLocation(InputMedia): """ @@ -7258,7 +7407,7 @@ class InputMediaLocation(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmedialocation :param type: Type of the media, must be location - :type type: :class:`InputMedia` + :type type: :obj:`str` :param latitude: Latitude of the location :type latitude: :obj:`float` @@ -7284,10 +7433,9 @@ def to_dict(self): json_dict['longitude'] = self.longitude if self.horizontal_accuracy is not None: json_dict['horizontal_accuracy'] = self.horizontal_accuracy - # Remove 'media' field as it's not used for location - json_dict.pop('media', None) return json_dict + class InputMediaSticker(InputMedia): """ Represents a sticker file to be sent. @@ -7295,10 +7443,10 @@ class InputMediaSticker(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmediasticker :param type: Type of the media, must be sticker - :type type: :class:`InputMedia` + :type type: :obj:`str` :param media: File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a .WEBP sticker from the Internet, or pass “attach://” to upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data under name. - :type media: :obj:`str` + :type media: :obj:`str` or :class:`telebot.types.InputFile` :param emoji: Optional. Emoji associated with the sticker; only for just uploaded stickers :type emoji: :obj:`str` @@ -7306,7 +7454,7 @@ class InputMediaSticker(InputMedia): :return: Instance of the class :rtype: :class:`telebot.types.InputMediaSticker` """ - def __init__(self, media: str, emoji: Optional[str] = None): + def __init__(self, media: Union[str, InputFile], emoji: Optional[str] = None): super(InputMediaSticker, self).__init__(type="sticker", media=media) self.emoji: Optional[str] = emoji @@ -7316,6 +7464,7 @@ def to_dict(self): json_dict['emoji'] = self.emoji return json_dict + class InputMediaVenue(InputMedia): """ Represents a venue to be sent. @@ -7323,7 +7472,7 @@ class InputMediaVenue(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmediavenue :param type: Type of the media, must be venue - :type type: :class:`InputMedia` + :type type: :obj:`str` :param latitude: Latitude of the location :type latitude: :obj:`float` @@ -7352,8 +7501,12 @@ class InputMediaVenue(InputMedia): :return: Instance of the class :rtype: :class:`telebot.types.InputMediaVenue` """ - def __init__(self, latitude: float, longitude: float, title: str, address: str, foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, google_place_id: Optional[str] = None, google_place_type: Optional[str] = None): + def __init__( + self, latitude: float, longitude: float, title: str, address: str, + foursquare_id: Optional[str] = None, + foursquare_type: Optional[str] = None, + google_place_id: Optional[str] = None, + google_place_type: Optional[str] = None): super(InputMediaVenue, self).__init__(type="venue", media="") self.latitude: float = latitude self.longitude: float = longitude @@ -7378,8 +7531,6 @@ def to_dict(self): json_dict['google_place_id'] = self.google_place_id if self.google_place_type: json_dict['google_place_type'] = self.google_place_type - # Remove 'media' field as it's not used for venue - json_dict.pop('media', None) return json_dict @@ -7430,7 +7581,10 @@ def de_json(cls, json_string): obj['media'] = PollMedia.de_json(obj['media']) return cls(**obj) - def __init__(self, text, persistent_id, voter_count = 0, text_entities=None, added_by_user=None, added_by_chat=None, addition_date=None, media=None, **kwargs): + def __init__(self, persistent_id: str, text: str, voter_count: int = 0, + text_entities: Optional[List[MessageEntity]] = None, added_by_user: Optional[User] = None, + added_by_chat: Optional[Chat] = None, addition_date: Optional[int] = None, + media: Optional[PollMedia] = None, **kwargs): self.text: str = text self.persistent_id: str = persistent_id self.voter_count: int = voter_count @@ -7466,8 +7620,10 @@ class InputPollOption(JsonSerializable): :return: Instance of the class :rtype: :class:`telebot.types.PollOption` """ - def __init__(self, text: str, text_parse_mode: Optional[str] = None, text_entities: Optional[List[MessageEntity]] = None, - media: Optional[InputPollOptionMedia] = None, **kwargs): + def __init__( + self, text: str, text_parse_mode: Optional[str] = None, + text_entities: Optional[List[MessageEntity]] = None, + media: Optional[InputPollOptionMedia] = None, **kwargs): self.text: str = text self.text_parse_mode: Optional[str] = text_parse_mode self.text_entities: Optional[List[MessageEntity]] = text_entities @@ -7583,19 +7739,22 @@ def de_json(cls, json_string): obj['media'] = PollMedia.de_json(obj['media']) if 'explanation_media' in obj: obj['explanation_media'] = PollMedia.de_json(obj['explanation_media']) - return cls(**obj) def __init__( - self, - question: str, options: List[PollOption], - id: str = None, total_voter_count: int = None, is_closed: bool = None, is_anonymous: bool = None, + self, question: str, options: List[PollOption], + id: str = None, total_voter_count: int = None, + is_closed: bool = None, is_anonymous: bool = None, type: str = None, allows_multiple_answers: bool = None, - explanation: str = None, explanation_entities: List[MessageEntity] = None, open_period: int = None, - close_date: int = None, poll_type: str = None, question_entities: List[MessageEntity] = None, - correct_option_ids: List[int] = None, allows_revoting: bool = None, - description: str = None, description_entities: List[MessageEntity] = None, - media: PollMedia = None, members_only: bool = None, country_codes: List[str] = None, explanation_media: PollMedia = None, **kwargs): + explanation: Optional[str] = None, explanation_entities: Optional[List[MessageEntity]] = None, + question_entities: Optional[List[MessageEntity]] = None, + open_period: Optional[int] = None, close_date: Optional[int] = None, + poll_type: Optional[str] = None, correct_option_ids: Optional[List[int]] = None, + allows_revoting: bool = None, description: Optional[str] = None, + description_entities: Optional[List[MessageEntity]] = None, + media: Optional[PollMedia] = None, members_only: bool = None, + country_codes: Optional[List[str]] = None, + explanation_media: Optional[PollMedia] = None, **kwargs): self.id: str = id self.question: str = question self.options: List[PollOption] = options @@ -7608,19 +7767,19 @@ def __init__( if type is None: self.type: str = poll_type self.allows_multiple_answers: bool = allows_multiple_answers - self.explanation: str = explanation - self.explanation_entities: List[MessageEntity] = explanation_entities - self.question_entities: List[MessageEntity] = question_entities - self.open_period: int = open_period - self.close_date: int = close_date - self.correct_option_ids: List[int] = correct_option_ids + self.explanation: Optional[str] = explanation + self.explanation_entities: Optional[List[MessageEntity]] = explanation_entities + self.question_entities: Optional[List[MessageEntity]] = question_entities + self.open_period: Optional[int] = open_period + self.close_date: Optional[int] = close_date + self.correct_option_ids: Optional[List[int]] = correct_option_ids self.allows_revoting: bool = allows_revoting - self.description: str = description - self.description_entities: List[MessageEntity] = description_entities - self.media: PollMedia = media - self.explanation_media: PollMedia = explanation_media + self.description: Optional[str] = description + self.description_entities: Optional[List[MessageEntity]] = description_entities + self.media: Optional[PollMedia] = media + self.explanation_media: Optional[PollMedia] = explanation_media self.members_only: bool = members_only - self.country_codes: List[str] = country_codes + self.country_codes: Optional[List[str]] = country_codes @property def correct_option_id(self) -> Optional[int]: @@ -7788,9 +7947,14 @@ def de_json(cls, json_string): obj['creator'] = User.de_json(obj['creator']) return cls(**obj) - def __init__(self, invite_link: str, creator: User, creates_join_request: bool, is_primary: bool, is_revoked: bool, - name: Optional[str] = None, expire_date: Optional[int] = None, member_limit: Optional[int] = None, - pending_join_request_count: Optional[int] = None, **kwargs): + def __init__( + self, invite_link: str, creator: User, creates_join_request: bool, + is_primary: bool, is_revoked: bool, + name: Optional[str] = None, expire_date: Optional[int] = None, + member_limit: Optional[int] = None, + pending_join_request_count: Optional[int] = None, + subscription_period: Optional[int] = None, + subscription_price: Optional[int] = None, **kwargs): self.invite_link: str = invite_link self.creator: User = creator self.creates_join_request: bool = creates_join_request @@ -7800,6 +7964,8 @@ def __init__(self, invite_link: str, creator: User, creates_join_request: bool, self.expire_date: Optional[int] = expire_date self.member_limit: Optional[int] = member_limit self.pending_join_request_count: Optional[int] = pending_join_request_count + self.subscription_period: Optional[int] = subscription_period + self.subscription_price: Optional[int] = subscription_price def to_json(self): return json.dumps(self.to_dict()) @@ -7847,7 +8013,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, traveler, watcher, distance, **kwargs): + def __init__(self, traveler: User, watcher: User, distance: int, **kwargs): self.traveler: User = traveler self.watcher: User = watcher self.distance: int = distance @@ -7895,7 +8061,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, start_date, **kwargs): + def __init__(self, start_date: int, **kwargs): self.start_date: int = start_date @@ -7926,7 +8092,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, duration, **kwargs): + def __init__(self, duration: int, **kwargs): self.duration: int = duration @@ -7959,7 +8125,7 @@ def de_json(cls, json_string): obj['users'] = [User.de_json(u) for u in obj['users']] return cls(**obj) - def __init__(self, users=None, **kwargs): + def __init__(self, users: List[User], **kwargs): self.users: List[User] = users @@ -7990,7 +8156,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string, dict_copy=False) return cls(**obj) - def __init__(self, message_auto_delete_time, **kwargs): + def __init__(self, message_auto_delete_time: int, **kwargs): self.message_auto_delete_time: int = message_auto_delete_time @@ -8045,7 +8211,7 @@ class MenuButtonCommands(MenuButton): :rtype: :class:`telebot.types.MenuButtonCommands` """ - def __init__(self, type: str = None, **kwargs): + def __init__(self, **kwargs): self.type: str = "commands" def to_dict(self): @@ -8075,7 +8241,7 @@ class MenuButtonWebApp(MenuButton): :rtype: :class:`telebot.types.MenuButtonWebApp` """ - def __init__(self, type: str, text: str, web_app: WebAppInfo, **kwargs): + def __init__(self, text: str, web_app: WebAppInfo, **kwargs): self.type: str = "web_app" self.text: str = text self.web_app: WebAppInfo = web_app @@ -8100,7 +8266,7 @@ class MenuButtonDefault(MenuButton): :return: Instance of the class :rtype: :class:`telebot.types.MenuButtonDefault` """ - def __init__(self, type: str = None, **kwargs): + def __init__(self, **kwargs): self.type: str = "default" def to_dict(self): @@ -8182,12 +8348,9 @@ def __init__(self, is_anonymous: bool, can_manage_chat: bool, can_promote_members: bool, can_change_info: bool, can_invite_users: bool, can_post_messages: Optional[bool]=None, can_edit_messages: Optional[bool]=None, can_pin_messages: Optional[bool]=None, can_manage_topics: Optional[bool]=None, - can_post_stories: Optional[bool]=None, can_edit_stories: Optional[bool]=None, - can_delete_stories: Optional[bool]=None, can_manage_direct_messages: Optional[bool]=None, - can_manage_tags: Optional[bool]=None, - **kwargs - ) -> None: - + can_post_stories: bool = False, can_edit_stories: bool = False, + can_delete_stories: bool = False, can_manage_direct_messages: Optional[bool] = None, + can_manage_tags: Optional[bool]=None, **kwargs) -> None: self.is_anonymous: bool = is_anonymous self.can_manage_chat: bool = can_manage_chat self.can_delete_messages: bool = can_delete_messages @@ -8200,9 +8363,9 @@ def __init__(self, is_anonymous: bool, can_manage_chat: bool, self.can_edit_messages: Optional[bool] = can_edit_messages self.can_pin_messages: Optional[bool] = can_pin_messages self.can_manage_topics: Optional[bool] = can_manage_topics - self.can_post_stories: Optional[bool] = can_post_stories - self.can_edit_stories: Optional[bool] = can_edit_stories - self.can_delete_stories: Optional[bool] = can_delete_stories + self.can_post_stories: bool = can_post_stories + self.can_edit_stories: bool = can_edit_stories + self.can_delete_stories: bool = can_delete_stories self.can_manage_direct_messages: Optional[bool] = can_manage_direct_messages self.can_manage_tags: Optional[bool] = can_manage_tags @@ -8499,8 +8662,10 @@ def de_json(cls, json_string): return cls(**obj) - def __init__(self, from_request: Optional[bool]=None, web_app_name: Optional[str]=None, from_attachment_menu: Optional[bool]=None, - **kwargs) -> None: + def __init__( + self, from_request: Optional[bool] = None, + web_app_name: Optional[str] = None, + from_attachment_menu: Optional[bool] = None, **kwargs) -> None: self.web_app_name: Optional[str] = web_app_name self.from_request: Optional[bool] = from_request self.from_attachment_menu: Optional[bool] = from_attachment_menu @@ -8637,10 +8802,7 @@ def __init__(self, sticker: Union[str, InputFile], emoji_list: List[str], forma self._sticker_name = '' self._sticker_dic = self.sticker else: - # work like in inputmedia: convert_input_media self._sticker_name = service_utils.generate_random_token() - # uses attach://_sticker_name for sticker param. then, - # actual file is sent using files param of the request self._sticker_dic = 'attach://{0}'.format(self._sticker_name) def to_dict(self) -> dict: @@ -8649,7 +8811,6 @@ def to_dict(self) -> dict: 'emoji_list': self.emoji_list, 'format': self.format } - if self.mask_position is not None: json_dict['mask_position'] = self.mask_position.to_dict() if self.keywords is not None: @@ -8663,7 +8824,6 @@ def to_json(self) -> str: def convert_input_sticker(self) -> Tuple[str, Optional[dict]]: if service_utils.is_string(self.sticker): return self.to_json(), None - return self.to_json(), {self._sticker_name: self.sticker} @@ -8699,8 +8859,11 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, query: Optional[str]=None, allow_user_chats: Optional[bool]=None, allow_bot_chats: Optional[bool]=None, - allow_group_chats: Optional[bool]=None, allow_channel_chats: Optional[bool]=None) -> None: + def __init__( + self, query: Optional[str] = None, allow_user_chats: Optional[bool] = None, + allow_bot_chats: Optional[bool] = None, + allow_group_chats: Optional[bool] = None, + allow_channel_chats: Optional[bool] = None) -> None: self.query: Optional[str] = query self.allow_user_chats: Optional[bool] = allow_user_chats self.allow_bot_chats: Optional[bool] = allow_bot_chats @@ -8990,8 +9153,11 @@ def de_json(cls, json_string): obj['new_reaction'] = [ReactionType.de_json(reaction) for reaction in obj['new_reaction']] return cls(**obj) - def __init__(self, chat: Chat, message_id: int, date: int, old_reaction: List[ReactionType], new_reaction: List[ReactionType], - user: Optional[User]=None, actor_chat: Optional[Chat]=None, **kwargs) -> None: + def __init__( + self, chat: Chat, message_id: int, date: int, + old_reaction: List[ReactionType], new_reaction: List[ReactionType], + user: Optional[User] = None, actor_chat: Optional[Chat] = None, + **kwargs) -> None: self.chat: Chat = chat self.message_id: int = message_id self.user: Optional[User] = user @@ -9517,7 +9683,8 @@ def de_json(cls, json_string): def __init__(self, chats: List[Chat], winners_selection_date: int, winner_count: int, only_new_members: Optional[bool] = None, has_public_winners: Optional[bool] = None, prize_description: Optional[str] = None, country_codes: Optional[List[str]] = None, - premium_subscription_month_count: Optional[int] = None, prize_star_count: Optional[int] = None, **kwargs) -> None: + premium_subscription_month_count: Optional[int] = None, + prize_star_count: Optional[int] = None, **kwargs) -> None: self.chats: List[Chat] = chats self.winners_selection_date: int = winners_selection_date self.winner_count: int = winner_count @@ -9632,8 +9799,11 @@ def de_json(cls, json_string): obj['giveaway_message'] = Message.de_json(obj['giveaway_message']) return cls(**obj) - def __init__(self, winner_count: int, unclaimed_prize_count: Optional[int] = None, - giveaway_message: Optional[Message] = None, is_star_giveaway: Optional[bool] = None, **kwargs) -> None: + def __init__( + self, winner_count: int, + unclaimed_prize_count: Optional[int] = None, + giveaway_message: Optional[Message] = None, + is_star_giveaway: Optional[bool] = None, **kwargs) -> None: self.winner_count: int = winner_count self.unclaimed_prize_count: Optional[int] = unclaimed_prize_count self.giveaway_message: Optional[Message] = giveaway_message @@ -9659,8 +9829,8 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, prize_star_count=None, **kwargs) -> None: - self.prize_star_count: Optional[str] = prize_star_count + def __init__(self, prize_star_count: Optional[int] = None, **kwargs) -> None: + self.prize_star_count: Optional[int] = prize_star_count class TextQuote(JsonDeserializable): @@ -9698,7 +9868,7 @@ def __init__(self, text: str, position: int, is_manual: Optional[bool] = None, **kwargs) -> None: self.text: str = text self.entities: Optional[List[MessageEntity]] = entities - self.position: Optional[int] = position + self.position: int = position self.is_manual: Optional[bool] = is_manual @property @@ -9764,7 +9934,7 @@ def __init__(self, message_id: Optional[int] = None, chat_id: Optional[Union[int quote_parse_mode: Optional[str] = None, quote_entities: Optional[List[MessageEntity]] = None, quote_position: Optional[int] = None, checklist_task_id: Optional[int] = None, poll_option_id: Optional[str] = None, ephemeral_message_id: Optional[int] = None, **kwargs) -> None: - self.message_id: int = message_id + self.message_id: Optional[int] = message_id self.chat_id: Optional[Union[int, str]] = chat_id self.allow_sending_without_reply: Optional[bool] = allow_sending_without_reply self.quote: Optional[str] = quote @@ -9867,7 +10037,7 @@ def de_json(cls, json_string): obj['boost'] = ChatBoost.de_json(obj['boost']) return cls(**obj) - def __init__(self, chat, boost, **kwargs): + def __init__(self, chat: Chat, boost: ChatBoost, **kwargs): self.chat: Chat = chat self.boost: ChatBoost = boost @@ -9902,7 +10072,7 @@ def de_json(cls, json_string): obj['source'] = ChatBoostSource.de_json(obj['source']) return cls(**obj) - def __init__(self, chat, boost_id, remove_date, source, **kwargs): + def __init__(self, chat: Chat, boost_id: str, remove_date: int, source: ChatBoostSource, **kwargs): self.chat: Chat = chat self.boost_id: str = boost_id self.remove_date: int = remove_date @@ -9945,7 +10115,7 @@ class ChatBoostSourcePremium(ChatBoostSource): :param source: Source of the boost, always “premium” :type source: :obj:`str` - :param user: User that boosted the chat + :param user: User who subscribed to Telegram Premium or gifted a subscription :type user: :class:`User` :return: Instance of the class @@ -9959,7 +10129,7 @@ def de_json(cls, json_string): obj['user'] = User.de_json(obj['user']) return cls(**obj) - def __init__(self, source, user, **kwargs): + def __init__(self, source: str, user: User, **kwargs): self.source: str = source self.user: User = user @@ -9988,7 +10158,7 @@ def de_json(cls, json_string): obj['user'] = User.de_json(obj['user']) return cls(**obj) - def __init__(self, source, user, **kwargs): + def __init__(self, source: str, user: User, **kwargs): self.source: str = source self.user: User = user @@ -10026,7 +10196,8 @@ def de_json(cls, json_string): obj['user'] = User.de_json(obj.get('user')) return cls(**obj) - def __init__(self, source, giveaway_message_id, user=None, is_unclaimed=None, prize_star_count=None, **kwargs): + def __init__(self, source: str, giveaway_message_id: int, user: Optional[User] = None, + is_unclaimed: Optional[bool] = None, prize_star_count: Optional[int] = None, **kwargs): self.source: str = source self.giveaway_message_id: int = giveaway_message_id self.user: Optional[User] = user @@ -10076,7 +10247,7 @@ def de_json(cls, json_string): obj['source'] = ChatBoostSource.de_json(source) if source else None return cls(**obj) - def __init__(self, boost_id, add_date, expiration_date, source, **kwargs): + def __init__(self, boost_id: str, add_date: int, expiration_date: int, source: ChatBoostSource, **kwargs): self.boost_id: str = boost_id self.add_date: int = add_date self.expiration_date: int = expiration_date @@ -10103,7 +10274,7 @@ def de_json(cls, json_string): obj['boosts'] = [ChatBoost.de_json(boost) for boost in obj['boosts']] return cls(**obj) - def __init__(self, boosts, **kwargs): + def __init__(self, boosts: List[ChatBoost], **kwargs): self.boosts: List[ChatBoost] = boosts @@ -10133,7 +10304,7 @@ def de_json(cls, json_string): obj['chat'] = Chat.de_json(obj['chat']) return cls(**obj) - def __init__(self, chat, message_id, date, **kwargs): + def __init__(self, chat: Chat, message_id: int, date: int, **kwargs): self.chat: Chat = chat self.message_id: int = message_id self.date: int = date @@ -10141,7 +10312,6 @@ def __init__(self, chat, message_id, date, **kwargs): @staticmethod def __universal_deprecation(property_name): log_deprecation_warning(f'Deprecation warning: the field "{property_name}" is not accessible for InaccessibleMessage. You should check if your object is Message instance before access.') - return None def __getattr__(self, item): if item in [ @@ -10159,7 +10329,8 @@ def __getattr__(self, item): 'giveaway', 'giveaway_winners', 'giveaway_completed', 'video_chat_scheduled', 'video_chat_started', 'video_chat_ended', 'video_chat_participants_invited', 'web_app_data', 'reply_markup' ]: - return self.__universal_deprecation(item) + self.__universal_deprecation(item) + return else: raise AttributeError(f'"{self.__class__.__name__}" object has no attribute "{item}"') @@ -10183,7 +10354,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, boost_count, **kwargs): + def __init__(self, boost_count: int, **kwargs): self.boost_count: int = boost_count @@ -10227,8 +10398,8 @@ def de_json(cls, json_string): obj['rights'] = BusinessBotRights.de_json(obj.get('rights')) return cls(**obj) - def __init__(self, id, user, user_chat_id, date, is_enabled, - rights=None, **kwargs): + def __init__(self, id: str, user: User, user_chat_id: int, date: int, is_enabled: bool, + rights: Optional[BusinessBotRights] = None, **kwargs): self.id: str = id self.user: User = user self.user_chat_id: int = user_chat_id @@ -10273,7 +10444,7 @@ def de_json(cls, json_string): return cls(**obj) - def __init__(self, business_connection_id, chat, message_ids, **kwargs): + def __init__(self, business_connection_id: str, chat: Chat, message_ids: List[int], **kwargs): self.business_connection_id: str = business_connection_id self.chat: Chat = chat self.message_ids: List[int] = message_ids @@ -10306,7 +10477,8 @@ def de_json(cls, json_string): obj['sticker'] = Sticker.de_json(obj['sticker']) return cls(**obj) - def __init__(self, title=None, message=None, sticker=None, **kwargs): + def __init__(self, title: Optional[str] = None, message: Optional[str] = None, + sticker: Optional[Sticker] = None, **kwargs): self.title: Optional[str] = title self.message: Optional[str] = message self.sticker: Optional[Sticker] = sticker @@ -10336,7 +10508,7 @@ def de_json(cls, json_string): obj['location'] = Location.de_json(obj['location']) return cls(**obj) - def __init__(self, address, location=None, **kwargs): + def __init__(self, address: str, location: Optional[Location] = None, **kwargs): self.address: str = address self.location: Optional[Location] = location @@ -10363,7 +10535,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, opening_minute, closing_minute, **kwargs): + def __init__(self, opening_minute: int, closing_minute: int, **kwargs): self.opening_minute: int = opening_minute self.closing_minute: int = closing_minute @@ -10392,7 +10564,7 @@ def de_json(cls, json_string): obj['opening_hours'] = [BusinessOpeningHoursInterval.de_json(interval) for interval in obj['opening_hours']] return cls(**obj) - def __init__(self, time_zone_name, opening_hours, **kwargs): + def __init__(self, time_zone_name: str, opening_hours: List[BusinessOpeningHoursInterval], **kwargs): self.time_zone_name: str = time_zone_name self.opening_hours: List[BusinessOpeningHoursInterval] = opening_hours @@ -10430,7 +10602,8 @@ def de_json(cls, json_string): obj['photo'] = [PhotoSize.de_json(photo) for photo in obj['photo']] return cls(**obj) - def __init__(self, user_id, first_name=None, last_name=None, username=None, photo=None, **kwargs): + def __init__(self, user_id: int, first_name: Optional[str] = None, last_name: Optional[str] = None, + username: Optional[str] = None, photo: Optional[List[PhotoSize]] = None, **kwargs): self.user_id: int = user_id self.first_name: Optional[str] = first_name self.last_name: Optional[str] = last_name @@ -10463,7 +10636,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, day, month, year=None, **kwargs): + def __init__(self, day: int, month: int, year: Optional[int] = None, **kwargs): self.day: int = day self.month: int = month self.year: Optional[int] = year @@ -10518,7 +10691,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, type, color, **kwargs): + def __init__(self, type: str, color: int, **kwargs): self.type: str = type self.color: int = color @@ -10552,7 +10725,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, type, top_color, bottom_color, rotation_angle, **kwargs): + def __init__(self, type: str, top_color: int, bottom_color: int, rotation_angle: int, **kwargs): self.type: str = type self.top_color: int = top_color self.bottom_color: int = bottom_color @@ -10582,7 +10755,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, type, colors, **kwargs): + def __init__(self, type: str, colors: List[int], **kwargs): self.type: str = type self.colors: List[int] = colors @@ -10643,7 +10816,7 @@ def de_json(cls, json_string): obj['fill'] = BackgroundFill.de_json(obj['fill']) return cls(**obj) - def __init__(self, type, fill, dark_theme_dimming, **kwargs): + def __init__(self, type: str, fill: BackgroundFill, dark_theme_dimming: int, **kwargs): self.type: str = type self.fill: BackgroundFill = fill self.dark_theme_dimming: int = dark_theme_dimming @@ -10682,7 +10855,8 @@ def de_json(cls, json_string): obj['document'] = Document.de_json(obj['document']) return cls(**obj) - def __init__(self, type, document, dark_theme_dimming, is_blurred=None, is_moving=None, **kwargs): + def __init__(self, type: str, document: Document, dark_theme_dimming: int, + is_blurred: Optional[bool] = None, is_moving: Optional[bool] = None, **kwargs): self.type: str = type self.document: Document = document self.dark_theme_dimming: int = dark_theme_dimming @@ -10726,7 +10900,8 @@ def de_json(cls, json_string): obj['document'] = Document.de_json(obj['document']) return cls(**obj) - def __init__(self, type, document, fill, intensity, is_inverted=None, is_moving=None, **kwargs): + def __init__(self, type: str, document: Document, fill: BackgroundFill, intensity: int, + is_inverted: Optional[bool] = None, is_moving: Optional[bool] = None, **kwargs): self.type: str = type self.document: Document = document self.fill: BackgroundFill = fill @@ -10758,7 +10933,7 @@ def de_json(cls, json_string): obj = cls.check_json(json_string) return cls(**obj) - def __init__(self, type, theme_name, **kwargs): + def __init__(self, type: str, theme_name: str, **kwargs): self.type: str = type self.theme_name: str = theme_name @@ -10784,7 +10959,7 @@ def de_json(cls, json_string): obj['type'] = BackgroundType.de_json(obj['type']) return cls(**obj) - def __init__(self, type, **kwargs): + def __init__(self, type: BackgroundType, **kwargs): self.type: BackgroundType = type @@ -11243,7 +11418,8 @@ class PaidMediaPreview(PaidMedia): :rtype: :class:`PaidMediaPreview` """ - def __init__(self, type, width=None, height=None, duration=None, **kwargs): + def __init__(self, type: str, width: Optional[int] = None, height: Optional[int] = None, + duration: Optional[int] = None, **kwargs): self.type: str = type self.width: Optional[int] = width self.height: Optional[int] = height @@ -11256,6 +11432,7 @@ def de_json(cls, json_string): return cls(**obj) +# noinspection PyShadowingBuiltins class PaidMediaLivePhoto(PaidMedia): """ The paid media is a live photo. @@ -11272,7 +11449,7 @@ class PaidMediaLivePhoto(PaidMedia): :rtype: :class:`PaidMediaLivePhoto` """ - def __init__(self, type, live_photo, **kwargs): + def __init__(self, type: str, live_photo: LivePhoto, **kwargs): self.type: str = type self.live_photo: LivePhoto = live_photo @@ -11302,7 +11479,7 @@ class PaidMediaPhoto(PaidMedia): """ - def __init__(self, type, photo, **kwargs): + def __init__(self, type: str, photo: List[PhotoSize], **kwargs): self.type: str = type self.photo: List[PhotoSize] = photo @@ -11332,7 +11509,7 @@ class PaidMediaVideo(PaidMedia): :rtype: :class:`PaidMediaVideo` """ - def __init__(self, type, video, **kwargs): + def __init__(self, type: str, video: Video, **kwargs): self.type: str = type self.video: Video = video @@ -11367,7 +11544,7 @@ def de_json(cls, json_string): obj['paid_media'] = [PaidMedia.de_json(media) for media in obj['paid_media']] return cls(**obj) - def __init__(self, star_count, paid_media, **kwargs): + def __init__(self, star_count: int, paid_media: List[PaidMedia], **kwargs): self.star_count: int = star_count self.paid_media: List[PaidMedia] = paid_media @@ -11422,7 +11599,7 @@ class InputPaidMediaPhoto(InputPaidMedia): :type type: :obj:`str` :param media: File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. - :type media: :obj:`str` + :type media: :obj:`str` or :class:`telebot.types.InputFile` :return: Instance of the class :rtype: :class:`InputPaidMediaPhoto` @@ -11431,6 +11608,7 @@ class InputPaidMediaPhoto(InputPaidMedia): def __init__(self, media: Union[str, InputFile], **kwargs): super().__init__(type='photo', media=media) + class InputPaidMediaLivePhoto(InputPaidMedia): """ The paid media to send is a live photo. @@ -11452,13 +11630,13 @@ class InputPaidMediaLivePhoto(InputPaidMedia): def __init__(self, media: Union[str, InputFile], photo: Union[str, InputFile], **kwargs): super().__init__(type='live_photo', media=media) self.photo: Union[str, InputFile] = photo - self._photo_name = service_utils.generate_random_token() - self._photo_dic = None - if not service_utils.is_string(self.photo): - self._photo_dic = 'attach://{0}'.format(self._photo_name) - else: + if service_utils.is_string(self.photo): + self._photo_name = '' self._photo_dic = self.photo + else: + self._photo_name = service_utils.generate_random_token() + self._photo_dic = 'attach://{0}'.format(self._photo_name) def to_dict(self): data = super().to_dict() @@ -11476,10 +11654,10 @@ class InputPaidMediaVideo(InputPaidMedia): :type type: :obj:`str` :param media: File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. - :type media: :obj:`str` + :type media: :obj:`str` or :class:`telebot.types.InputFile` :param thumbnail: Optional. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://” if the thumbnail was uploaded using multipart/form-data under . - :type thumbnail: :class:`InputFile` + :type thumbnail: :class:`telebot.types.InputFile` :param cover: Optional. Cover for the video in the message. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. :type cover: :obj:`str` or :class:`telebot.types.InputFile` @@ -11503,22 +11681,47 @@ class InputPaidMediaVideo(InputPaidMedia): :rtype: :class:`InputPaidMediaVideo` """ - def __init__(self, media: Union[str, InputFile], thumbnail: Optional[InputFile] = None, width: Optional[int] = None, - height: Optional[int] = None, duration: Optional[int] = None, supports_streaming: Optional[bool] = None, - cover: Optional[Union[str,InputFile]] = None, start_timestamp: Optional[int] = None, **kwargs): + def __init__( + self, media: Union[str, InputFile], thumbnail: Optional[InputFile] = None, + width: Optional[int] = None, height: Optional[int] = None, + duration: Optional[int] = None, + supports_streaming: Optional[bool] = None, + cover: Optional[Union[str, InputFile]] = None, start_timestamp: Optional[int] = None, + **kwargs): super().__init__(type='video', media=media) - self.thumbnail: Optional[Union[str,InputFile]] = thumbnail + self.thumbnail: Optional[InputFile] = thumbnail self.width: Optional[int] = width self.height: Optional[int] = height self.duration: Optional[int] = duration self.supports_streaming: Optional[bool] = supports_streaming - self.cover: Optional[Union[str,InputFile]] = cover + self.cover: Optional[Union[str, InputFile]] = cover self.start_timestamp: Optional[int] = start_timestamp + if thumbnail is None: + self._thumbnail_name = '' + self._thumbnail_dic = None + elif service_utils.is_string(self.thumbnail): + # It cannot be string because cannot be reused + self._thumbnail_name = '' + self._thumbnail_dic = self.thumbnail + else: + self._thumbnail_name = service_utils.generate_random_token() + self._thumbnail_dic = 'attach://{0}'.format(self._thumbnail_name) + + if cover is None: + self._cover_name = '' + self._cover_dic = None + elif service_utils.is_string(self.cover): + self._cover_name = '' + self._cover_dic = self.cover + else: + self._cover_name = service_utils.generate_random_token() + self._cover_dic = 'attach://{0}'.format(self._cover_name) + def to_dict(self): data = super().to_dict() - if self.thumbnail: - data['thumbnail'] = self.thumbnail + if self._thumbnail_dic: + data['thumbnail'] = self._thumbnail_dic if self.width: data['width'] = self.width if self.height: @@ -11527,8 +11730,8 @@ def to_dict(self): data['duration'] = self.duration if self.supports_streaming is not None: data['supports_streaming'] = self.supports_streaming - if self.cover: - data['cover'] = self.cover + if self._cover_dic: + data['cover'] = self._cover_dic if self.start_timestamp: data['start_timestamp'] = self.start_timestamp return data @@ -11649,7 +11852,7 @@ class PreparedInlineMessage(JsonDeserializable): :rtype: :class:`PreparedInlineMessage` """ - def __init__(self, id, expiration_date, **kwargs): + def __init__(self, id: str, expiration_date: int, **kwargs): self.id: str = id self.expiration_date: int = expiration_date @@ -11710,9 +11913,12 @@ class Gift(JsonDeserializable): :rtype: :class:`Gift` """ - def __init__(self, id, sticker, star_count, total_count=None, remaining_count=None, upgrade_star_count=None, - personal_total_count=None, personal_remaining_count=None, is_premium=None, has_colors=None, - background=None, publisher_chat=None, unique_gift_variant_count=None, **kwargs): + def __init__(self, id: str, sticker: Sticker, star_count: int, upgrade_star_count: Optional[int] = None, + is_premium: Optional[bool] = None, has_colors: Optional[bool] = None, + total_count: Optional[int] = None, remaining_count: Optional[int] = None, + personal_total_count: Optional[int] = None, personal_remaining_count: Optional[int] = None, + background: Optional[GiftBackground] = None, unique_gift_variant_count: Optional[int] = None, + publisher_chat: Optional[Chat] = None, **kwargs): self.id: str = id self.sticker: Sticker = sticker self.star_count: int = star_count @@ -11752,7 +11958,7 @@ class Gifts(JsonDeserializable): :rtype: :class:`Gifts` """ - def __init__(self, gifts, **kwargs): + def __init__(self, gifts: List[Gift], **kwargs): self.gifts: List[Gift] = gifts @classmethod @@ -11927,10 +12133,15 @@ class BusinessBotRights(JsonDeserializable): :return: Instance of the class :rtype: :class:`BusinessBotRights` """ - def __init__(self, can_reply=None, can_read_messages=None, can_delete_sent_messages=None, can_delete_all_messages=None, - can_edit_name=None, can_edit_bio=None, can_edit_profile_photo=None, can_edit_username=None, - can_change_gift_settings=None, can_view_gifts_and_stars=None, can_convert_gifts_to_stars=None, - can_transfer_and_upgrade_gifts=None, can_transfer_stars=None, can_manage_stories=None, **kwargs): + def __init__(self, + can_reply: Optional[bool] = None, can_read_messages: Optional[bool] = None, + can_delete_sent_messages: Optional[bool] = None, can_delete_all_messages: Optional[bool] = None, + can_edit_name: Optional[bool] = None, can_edit_bio: Optional[bool] = None, + can_edit_profile_photo: Optional[bool] = None, can_edit_username: Optional[bool] = None, + can_change_gift_settings: Optional[bool] = None, can_view_gifts_and_stars: Optional[bool] = None, + can_convert_gifts_to_stars: Optional[bool] = None, + can_transfer_and_upgrade_gifts: Optional[bool] = None, can_transfer_stars: Optional[bool] = None, + can_manage_stories: Optional[bool] = None, **kwargs): self.can_reply: Optional[bool] = can_reply self.can_read_messages: Optional[bool] = can_read_messages self.can_delete_sent_messages: Optional[bool] = can_delete_sent_messages @@ -12026,7 +12237,7 @@ class StarAmount(JsonDeserializable): :return: Instance of the class :rtype: :class:`StarAmount` """ - def __init__(self, amount, nanostar_amount=None, **kwargs): + def __init__(self, amount: int, nanostar_amount: Optional[int] = None, **kwargs): self.amount: int = amount self.nanostar_amount: Optional[int] = nanostar_amount @@ -12118,14 +12329,17 @@ class OwnedGiftRegular(OwnedGift): :return: Instance of the class :rtype: :class:`OwnedGiftRegular` """ - def __init__(self, type, gift, owned_gift_id=None, sender_user=None, send_date=None, text=None, entities=None, - is_private=None, is_saved=None, can_be_upgraded=None, was_refunded=None, convert_star_count=None, - prepaid_upgrade_star_count=None, is_upgrade_separate=None, unique_gift_number=None, **kwargs): + def __init__(self, type, gift: Gift, owned_gift_id: Optional[str] = None, sender_user: Optional[User] = None, + send_date: int = None, text: Optional[str] = None, entities: Optional[List[MessageEntity]] = None, + is_private: Optional[bool] = None, is_saved: Optional[bool] = None, + can_be_upgraded: Optional[bool] = None, was_refunded: Optional[bool] = None, + convert_star_count: Optional[int] = None, prepaid_upgrade_star_count: Optional[int] = None, + is_upgrade_separate: Optional[bool] = None, unique_gift_number: Optional[int] = None, **kwargs): super().__init__(type=type) self.gift: Gift = gift self.owned_gift_id: Optional[str] = owned_gift_id self.sender_user: Optional[User] = sender_user - self.send_date: Optional[int] = send_date + self.send_date: int = send_date self.text: Optional[str] = text self.entities: Optional[List[MessageEntity]] = entities self.is_private: Optional[bool] = is_private @@ -12186,13 +12400,14 @@ class OwnedGiftUnique(OwnedGift): :return: Instance of the class :rtype: :class:`OwnedGiftUnique` """ - def __init__(self, type, gift, owned_gift_id=None, sender_user=None, send_date=None, is_saved=None, - can_be_transferred=None, transfer_star_count=None, next_transfer_date=None, **kwargs): + def __init__(self, type, gift: UniqueGift, owned_gift_id: Optional[str] = None, sender_user: Optional[User] = None, + send_date: int = None, is_saved: Optional[bool] = None, can_be_transferred: Optional[bool] = None, + transfer_star_count: Optional[int] = None, next_transfer_date: Optional[int] = None, **kwargs): super().__init__(type=type) self.gift: UniqueGift = gift self.owned_gift_id: Optional[str] = owned_gift_id self.sender_user: Optional[User] = sender_user - self.send_date: Optional[int] = send_date + self.send_date: int = send_date self.is_saved: Optional[bool] = is_saved self.can_be_transferred: Optional[bool] = can_be_transferred self.transfer_star_count: Optional[int] = transfer_star_count @@ -12227,7 +12442,7 @@ class OwnedGifts(JsonDeserializable): :rtype: :class:`OwnedGifts` """ - def __init__(self, total_count, gifts, next_offset=None, **kwargs): + def __init__(self, total_count: int, gifts: List[OwnedGift], next_offset: Optional[str] = None, **kwargs): self.total_count: int = total_count self.gifts: List[OwnedGift] = gifts self.next_offset: Optional[str] = next_offset @@ -12285,8 +12500,11 @@ class UniqueGift(JsonDeserializable): :return: Instance of the class :rtype: :class:`UniqueGift` """ - def __init__(self, base_name, name, number, model, symbol, backdrop, gift_id, publisher_chat=None, is_from_blockchain=None, is_premium=None, colors=None, - is_burned=None, **kwargs): + def __init__(self, base_name: str, name: str, number: int, model: UniqueGiftModel, symbol: UniqueGiftSymbol, + backdrop: UniqueGiftBackdrop, gift_id: str, + is_premium: Optional[bool] = None, is_burned: Optional[bool] = None, + is_from_blockchain: Optional[bool] = None, colors: Optional[UniqueGiftColors] = None, + publisher_chat: Optional[Chat] = None, **kwargs): self.base_name: str = base_name self.name: str = name self.number: int = number @@ -12336,7 +12554,8 @@ class UniqueGiftModel(JsonDeserializable): :rtype: :class:`UniqueGiftModel` """ - def __init__(self, name, sticker, rarity_per_mille, rarity=None, **kwargs): + def __init__(self, name: str, sticker: Sticker, rarity_per_mille: int, + rarity: Optional[str] = None, **kwargs): self.name: str = name self.sticker: Sticker = sticker self.rarity_per_mille: int = rarity_per_mille @@ -12369,7 +12588,7 @@ class UniqueGiftSymbol(JsonDeserializable): :rtype: :class:`UniqueGiftSymbol` """ - def __init__(self, name, sticker, rarity_per_mille, **kwargs): + def __init__(self, name: str, sticker: Sticker, rarity_per_mille: int, **kwargs): self.name: str = name self.sticker: Sticker = sticker self.rarity_per_mille: int = rarity_per_mille @@ -12403,7 +12622,7 @@ class UniqueGiftBackdropColors(JsonDeserializable): :return: Instance of the class :rtype: :class:`UniqueGiftBackdropColors` """ - def __init__(self, center_color, edge_color, symbol_color, text_color, **kwargs): + def __init__(self, center_color: int, edge_color: int, symbol_color: int, text_color: int, **kwargs): self.center_color: int = center_color self.edge_color: int = edge_color self.symbol_color: int = symbol_color @@ -12434,7 +12653,7 @@ class UniqueGiftBackdrop(JsonDeserializable): :return: Instance of the class :rtype: :class:`UniqueGiftBackdrop` """ - def __init__(self, name, colors, rarity_per_mille, **kwargs): + def __init__(self, name: str, colors: UniqueGiftBackdropColors, rarity_per_mille: int, **kwargs): self.name: str = name self.colors: UniqueGiftBackdropColors = colors self.rarity_per_mille: int = rarity_per_mille @@ -12467,7 +12686,7 @@ class InputStoryContentPhoto(InputStoryContent): Telegram documentation: https://core.telegram.org/bots/api#inputstorycontentphoto :param type: Type of the content, must be photo - :type type: :class:`InputMedia` + :type type: :obj:`str` :param photo: The photo to post as a story. The photo must be of the size 1080x1920 and must not exceed 10 MB. The photo can't be reused and can only be uploaded as a new file, so you can pass “attach://” if the photo was uploaded using multipart/form-data under . :type photo: :class:`telebot.types.InputFile` @@ -12502,7 +12721,7 @@ class InputStoryContentVideo(InputStoryContent): Telegram documentation: https://core.telegram.org/bots/api#inputstorycontentvideo :param type: Type of the content, must be video - :type type: :class:`InputMediaVideo` + :type type: :obj:`str` :param video: The video to post as a story. The video must be of the size 720x1280, streamable, encoded with H.265 codec, with key frames added each second in the MPEG4 format, and must not exceed 30 MB. The video can't be reused and can only be uploaded as a new file, so you can pass “attach://” if the video was uploaded using multipart/form-data under . :type video: :class:`telebot.types.InputFile` @@ -12519,8 +12738,10 @@ class InputStoryContentVideo(InputStoryContent): :return: Instance of the class :rtype: :class:`InputStoryContentVideo` """ - def __init__(self, video: InputFile, duration: Optional[float] = None, cover_frame_timestamp: Optional[float] = None, - is_animation: Optional[bool] = None, **kwargs): + def __init__( + self, video: InputFile, duration: Optional[float] = None, + cover_frame_timestamp: Optional[float] = None, + is_animation: Optional[bool] = None, **kwargs): super().__init__(type="video") self.video: InputFile = video self._video_name = service_utils.generate_random_token() @@ -12684,7 +12905,8 @@ class StoryAreaTypeLocation(StoryAreaType): :return: Instance of the class :rtype: :class:`StoryAreaTypeLocation` """ - def __init__(self,latitude: float, longitude: float, address: LocationAddress = None, **kwargs): + def __init__(self, latitude: float, longitude: float, address: Optional[LocationAddress] = None, + **kwargs): super().__init__(type="location") self.latitude: float = latitude self.longitude: float = longitude @@ -12725,7 +12947,8 @@ class StoryAreaTypeSuggestedReaction(StoryAreaType): :return: Instance of the class :rtype: :class:`StoryAreaTypeSuggestedReaction` """ - def __init__(self, reaction_type: ReactionType, is_dark: Optional[bool] = None, is_flipped: Optional[bool] = None, **kwargs): + def __init__(self, reaction_type: ReactionType, is_dark: Optional[bool] = None, + is_flipped: Optional[bool] = None, **kwargs): super().__init__(type="suggested_reaction") self.reaction_type: ReactionType = reaction_type self.is_dark: Optional[bool] = is_dark @@ -13049,8 +13272,8 @@ class InputProfilePhotoStatic(InputProfilePhoto): :param type: Type of the profile photo, must be static :type type: :obj:`str` - :param photo: The static profile photo. Profile photos can't be reused and can only be uploaded as a new file, so you can pass “attach://” if the photo was uploaded using multipart/form-data under . - :type photo: :obj:`str` + :param photo: The static profile photo. Profile photos can't be reused and can only be uploaded as a new file, so you can pass “attach://” if the photo was uploaded using multipart/form-data under + :type photo: :class:`telebot.types.InputFile` :return: Instance of the class :rtype: :class:`InputProfilePhotoStatic` @@ -13085,8 +13308,8 @@ class InputProfilePhotoAnimated(InputProfilePhoto): :param type: Type of the profile photo, must be animated :type type: :obj:`str` - :param animation: The animated profile photo. Profile photos can't be reused and can only be uploaded as a new file, so you can pass “attach://” if the photo was uploaded using multipart/form-data under . - :type animation: :obj:`str` + :param animation: The animated profile photo. Profile photos can't be reused and can only be uploaded as a new file, so you can pass “attach://” if the photo was uploaded using multipart/form-data under + :type animation: :class:`telebot.types.InputFile` :param main_frame_timestamp: Optional. Timestamp in seconds of the frame that will be used as the static profile photo. Defaults to 0.0. :type main_frame_timestamp: :obj:`float` @@ -13874,7 +14097,9 @@ class VideoQuality(JsonDeserializable): :return: Instance of the class :rtype: :class:`VideoQuality` """ - def __init__(self, file_id: str, file_unique_id: str, width: int, height: int, codec: str, file_size: Optional[int] = None, **kwargs): + def __init__( + self, file_id: str, file_unique_id: str, width: int, height: int, + codec: str, file_size: Optional[int] = None, **kwargs): self.file_id: str = file_id self.file_unique_id: str = file_unique_id self.width: int = width @@ -13936,7 +14161,10 @@ class KeyboardButtonRequestManagedBot(JsonSerializable): :return: Instance of the class :rtype: :class:`KeyboardButtonRequestManagedBot` """ - def __init__(self, request_id: int, suggested_name: Optional[str] = None, suggested_username: Optional[str] = None, **kwargs): + def __init__( + self, request_id: int, + suggested_name: Optional[str] = None, + suggested_username: Optional[str] = None, **kwargs): self.request_id: int = request_id self.suggested_name: Optional[str] = suggested_name self.suggested_username: Optional[str] = suggested_username @@ -14182,10 +14410,16 @@ class PollMedia(JsonDeserializable): :rtype: :class:`PollMedia` """ - def __init__(self, animation: Optional[Animation] = None, audio: Optional[Audio] = None, document: Optional[Document] = None, - live_photo: Optional[LivePhoto] = None, location: Optional[Location] = None, photo: Optional[List[PhotoSize]] = None, - sticker: Optional[Sticker] = None, venue: Optional[Venue] = None, video: Optional[Video] = None, link: Optional[Link] = None, - **kwargs): + def __init__( + self, animation: Optional[Animation] = None, + audio: Optional[Audio] = None, + document: Optional[Document] = None, + live_photo: Optional[LivePhoto] = None, + location: Optional[Location] = None, + photo: Optional[List[PhotoSize]] = None, + sticker: Optional[Sticker] = None, venue: Optional[Venue] = None, + video: Optional[Video] = None, link: Optional[Link] = None, + **kwargs): self.animation: Optional[Animation] = animation self.audio: Optional[Audio] = audio self.document: Optional[Document] = document @@ -14231,7 +14465,7 @@ class InputMediaLink(InputMedia): Telegram documentation: https://core.telegram.org/bots/api#inputmedialink :param type: Type of the media, must be link - :type type: :class:`InputMedia` + :type type: :obj:`str` :param url: HTTP URL of the link :type url: :obj:`str` @@ -14296,8 +14530,12 @@ class LivePhoto(JsonDeserializable): :return: Instance of the class :rtype: :class:`LivePhoto` """ - def __init__(self, file_id: str, file_unique_id: str, width: int, height: int, duration: int, photo: Optional[List[PhotoSize]] = None, - mime_type: Optional[str] = None, file_size: Optional[int] = None, **kwargs): + def __init__( + self, file_id: str, file_unique_id: str, width: int, height: int, + duration: int, + photo: Optional[List[PhotoSize]] = None, + mime_type: Optional[str] = None, file_size: Optional[int] = None, + **kwargs): self.photo: Optional[List[PhotoSize]] = photo self.file_id: str = file_id self.file_unique_id: str = file_unique_id @@ -14344,6 +14582,7 @@ def de_json(cls, json_string): return cls(**obj) +# noinspection shadowing-builtins class RichText(JsonDeserializable, Dictionaryable, ABC): """ This object represents a rich formatted text. Currently, it can be either a String for plain text, @@ -15443,7 +15682,8 @@ def to_dict(self): data['rowspan'] = self.rowspan return data - + +# noinspection shadowing-builtins class RichBlockListItem(JsonDeserializable): """ This object represents an item of a list. @@ -15487,6 +15727,7 @@ def de_json(cls, json_string): return cls(**obj) +# noinspection shadowing-builtins class RichBlock(JsonDeserializable, ABC): """ This object represents a block in a rich formatted message. Currently, it can be any of the following types: @@ -16368,9 +16609,13 @@ class InputMediaVoiceNote(InputMedia): :return: Instance of the class :rtype: :class:`InputMediaVoiceNote` """ - def __init__(self, media: str, caption: Optional[str] = None, parse_mode: Optional[str] = None, caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, **kwargs): - super().__init__(type='voice_note', media=media, caption=caption, parse_mode=parse_mode, caption_entities=caption_entities) + def __init__( + self, media: str, caption: Optional[str] = None, parse_mode: Optional[str] = None, + caption_entities: Optional[List[MessageEntity]] = None, + duration: Optional[int] = None, **kwargs): + super().__init__( + type='voice_note', media=media, caption=caption, + parse_mode=parse_mode, caption_entities=caption_entities) self.duration: Optional[int] = duration def to_dict(self) -> dict: @@ -16380,6 +16625,7 @@ def to_dict(self) -> dict: return data +# noinspection shadowing-builtins class InputRichMessageMedia(Dictionaryable, JsonSerializable): """ This object represents a media element embedded in an outgoing rich message. @@ -16410,6 +16656,7 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) +# noinspection shadowing-builtins class InputRichBlockListItem(Dictionaryable, JsonSerializable): """ An item of a list to be sent. @@ -16460,6 +16707,7 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) +# noinspection shadowing-builtins class InputRichBlock(Dictionaryable, JsonSerializable): """ This object represents a block in a rich formatted message to be sent. @@ -17156,6 +17404,7 @@ def to_dict(self) -> dict: return data +# noinspection shadowing-builtins class Community(JsonDeserializable): """ Represents a community (a group of chats).