From 2b51d265d8c171d8354f7bd552f04a4877abe1a8 Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Mon, 9 Feb 2026 15:55:57 +0600 Subject: [PATCH 01/17] Fix ruff linting issues and pytest failures (#57) * Fix ruff issues and pytest failures - Installed missing dependencies (tgcrypto) to fix pytest failures. - Replaced star imports with explicit imports in `pyrogram/types/__init__.py` to resolve F405 issues. - Fixed unused imports in sub-package `__init__.py` files using explicit re-exports (as Class). - Added `__hash__ = None` to `Object` and `TLObject` to resolve PLW1641. - Updated compiler scripts to use `pathlib` and resolved other ruff warnings (B007, PERF401, C901). - Corrected grouping of story-related types in the main types entry point. Co-authored-by: 5hojib <107526130+5hojib@users.noreply.github.com> * Fix ruff issues and pytest failures - Installed missing dependencies (tgcrypto) to fix pytest failures. - Replaced star imports with explicit imports in `pyrogram/types/__init__.py`. - Fixed unused imports in sub-package `__init__.py` files using `__all__` for re-exports. - Added `__hash__ = None` to `Object` and `TLObject` to resolve PLW1641. - Updated compiler scripts to use `pathlib` and resolved other ruff warnings (B007, PERF401, C901). - Corrected grouping of story-related types in the main types entry point. Co-authored-by: 5hojib <107526130+5hojib@users.noreply.github.com> * Fix ruff issues and pytest failures - Installed missing dependencies (tgcrypto) to fix pytest failures. - Replaced star imports with explicit imports in `pyrogram/types/__init__.py`. - Fixed unused imports in sub-package `__init__.py` files using `__all__` for re-exports. - Added `__hash__ = None` to `Object` and `TLObject` to resolve PLW1641. - Updated compiler scripts to use `pathlib` and resolved other ruff warnings (B007, PERF401, C901). - Corrected grouping of story-related types in the main types entry point. Co-authored-by: 5hojib <107526130+5hojib@users.noreply.github.com> --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- compiler/docs/compiler.py | 41 ++-- compiler/errors/compiler.py | 3 +- hatch_build.py | 4 +- pyrogram/raw/core/tl_object.py | 2 + pyrogram/types/__init__.py | 248 ++++++++++++++++++++++-- pyrogram/types/bot_commands/__init__.py | 12 ++ pyrogram/types/bots/__init__.py | 7 + pyrogram/types/object.py | 2 + pyrogram/types/stories/__init__.py | 14 ++ 9 files changed, 296 insertions(+), 37 deletions(-) diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index 61a2a41e5..c2f50f323 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -1,7 +1,6 @@ from __future__ import annotations import ast -import os import re import shutil from pathlib import Path @@ -49,14 +48,16 @@ def generate_raw(source_path, base) -> None: all_entities = {} def build(path, level=0) -> None: - last = path.split("/")[-1] + path_obj = Path(path) - for i in os.listdir(path): - try: - if not i.startswith("__"): - build("/".join([path, i]), level=level + 1) - except NotADirectoryError: - with Path(path, i).open(encoding="utf-8") as f: + for i in path_obj.iterdir(): + if i.is_dir(): + if not i.name.startswith("__"): + build(str(i), level=level + 1) + else: + if i.name.startswith("__"): + continue + with i.open(encoding="utf-8") as f: p = ast.parse(f.read()) for node in ast.walk(p): @@ -95,10 +96,10 @@ def build(path, level=0) -> None: ), ) - if last not in all_entities: - all_entities[last] = [] + if path_obj.name not in all_entities: + all_entities[path_obj.name] = [] - all_entities[last].append(name) + all_entities[path_obj.name].append(name) build(source_path) @@ -151,7 +152,7 @@ def pyrogram_api() -> None: continue # Check if it defines a class or is special function (idle, compose) - with open(file, encoding="utf-8") as f: + with Path(file).open(encoding="utf-8") as f: tree = ast.parse(f.read()) has_class = any( @@ -186,9 +187,11 @@ def pyrogram_api() -> None: tree = ast.parse(f.read()) except Exception: continue - for node in ast.walk(tree): - if isinstance(node, ast.ClassDef): - types.append(node.name) + types.extend( + node.name + for node in ast.walk(tree) + if isinstance(node, ast.ClassDef) + ) if types: title = TYPES_TITLES.get( category_name, @@ -234,9 +237,9 @@ def pyrogram_api() -> None: tree = ast.parse(f.read()) except Exception: continue - for node in ast.walk(tree): - if isinstance(node, ast.ClassDef): - enums_list.append(node.name) + enums_list.extend( + node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef) + ) # Methods Generation @@ -346,7 +349,7 @@ def pyrogram_api() -> None: f.write("-----\n\n") f.write(".. currentmodule:: pyrogram.types\n\n") - for cat_name, (title, t_list) in sorted(types_categories.items()): + for _, (title, t_list) in sorted(types_categories.items()): f.write(f"{title}\n" + "-" * len(title) + "\n\n") f.write(".. autosummary::\n :nosignatures:\n\n") f.writelines(f" {t}\n" for t in sorted(t_list)) diff --git a/compiler/errors/compiler.py b/compiler/errors/compiler.py index 11bb7b31d..a9f497f88 100644 --- a/compiler/errors/compiler.py +++ b/compiler/errors/compiler.py @@ -1,7 +1,6 @@ from __future__ import annotations import csv -import os import re import shutil from pathlib import Path @@ -23,7 +22,7 @@ def camel(s): def start() -> None: shutil.rmtree(DEST, ignore_errors=True) Path(DEST).mkdir(parents=True, exist_ok=True) - files = list(os.listdir(f"{HOME}/source")) + files = [i.name for i in Path(HOME, "source").iterdir() if i.is_file()] with Path(DEST, "all.py").open("w", encoding="utf-8") as f_all: f_all.write("count = {count}\n\n") diff --git a/hatch_build.py b/hatch_build.py index fd31505e6..66343d22b 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -13,8 +13,8 @@ def initialize(self, version, build_data) -> None: if self.target_name not in {"wheel", "install"}: return - from compiler.api.compiler import start as compile_api - from compiler.errors.compiler import start as compile_errors + from compiler.api.compiler import start as compile_api # noqa: PLC0415 + from compiler.errors.compiler import start as compile_errors # noqa: PLC0415 compile_api() compile_errors() diff --git a/pyrogram/raw/core/tl_object.py b/pyrogram/raw/core/tl_object.py index c6abf475b..4f28fc3d8 100644 --- a/pyrogram/raw/core/tl_object.py +++ b/pyrogram/raw/core/tl_object.py @@ -54,6 +54,8 @@ def __repr__(self) -> str: ), ) + __hash__ = None + def __eq__(self, other: object) -> bool: for attr in self.__slots__: try: diff --git a/pyrogram/types/__init__.py b/pyrogram/types/__init__.py index 92b232fe7..e04376ab9 100644 --- a/pyrogram/types/__init__.py +++ b/pyrogram/types/__init__.py @@ -1,21 +1,240 @@ from __future__ import annotations -from .authorization import * -from .bot_commands import * -from .bots import * -from .bots_and_keyboards import * -from .business import * -from .inline_mode import * -from .input_media import * -from .input_message_content import * -from .input_privacy_rule import * +from .authorization import ( + ActiveSession, + ActiveSessions, + SentCode, + TermsOfService, +) +from .bot_commands import ( + BotCommand, + BotCommandScope, + BotCommandScopeAllChatAdministrators, + BotCommandScopeAllGroupChats, + BotCommandScopeAllPrivateChats, + BotCommandScopeChat, + BotCommandScopeChatAdministrators, + BotCommandScopeChatMember, + BotCommandScopeDefault, +) +from .bots import ( + BotAllowed, + BotApp, + BotBusinessConnection, + BotInfo, +) +from .bots_and_keyboards import ( + CallbackGame, + CallbackQuery, + CollectibleItemInfo, + ForceReply, + GameHighScore, + InlineKeyboardButton, + InlineKeyboardButtonBuy, + InlineKeyboardMarkup, + KeyboardButton, + KeyboardButtonStyle, + LoginUrl, + MenuButton, + MenuButtonCommands, + MenuButtonDefault, + MenuButtonWebApp, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + RequestedChat, + RequestedChats, + RequestedUser, + RequestPeerTypeChannel, + RequestPeerTypeChat, + RequestPeerTypeUser, + SentWebAppMessage, + WebAppInfo, +) +from .business import ( + ExtendedMediaPreview, + InputStarsTransaction, + Invoice, + PaidMedia, + PaidMediaPreview, + PaymentInfo, + PaymentRefunded, + PreCheckoutQuery, + ShippingAddress, + ShippingOption, + ShippingQuery, + StarsStatus, + StarsTransaction, + SuccessfulPayment, +) +from .inline_mode import ( + ChosenInlineResult, + InlineQuery, + InlineQueryResult, + InlineQueryResultAnimation, + InlineQueryResultArticle, + InlineQueryResultAudio, + InlineQueryResultCachedAnimation, + InlineQueryResultCachedAudio, + InlineQueryResultCachedDocument, + InlineQueryResultCachedPhoto, + InlineQueryResultCachedSticker, + InlineQueryResultCachedVideo, + InlineQueryResultCachedVoice, + InlineQueryResultContact, + InlineQueryResultDocument, + InlineQueryResultLocation, + InlineQueryResultPhoto, + InlineQueryResultVenue, + InlineQueryResultVideo, + InlineQueryResultVoice, +) +from .input_media import ( + InputMedia, + InputMediaAnimation, + InputMediaAudio, + InputMediaDocument, + InputMediaPhoto, + InputMediaVideo, + InputPhoneContact, +) +from .input_message_content import ( + InputContactMessageContent, + InputInvoiceMessageContent, + InputLocationMessageContent, + InputMessageContent, + InputReplyToMessage, + InputReplyToStory, + InputTextMessageContent, + InputVenueMessageContent, +) +from .input_privacy_rule import ( + InputPrivacyRule, + InputPrivacyRuleAllowAll, + InputPrivacyRuleAllowChats, + InputPrivacyRuleAllowContacts, + InputPrivacyRuleAllowPremium, + InputPrivacyRuleAllowUsers, + InputPrivacyRuleDisallowAll, + InputPrivacyRuleDisallowChats, + InputPrivacyRuleDisallowContacts, + InputPrivacyRuleDisallowUsers, +) from .list import List -from .messages_and_media import * +from .messages_and_media import ( + AlternativeVideo, + Animation, + Audio, + AvailableEffect, + Contact, + ContactRegistered, + Dice, + Document, + DraftMessage, + ExportedStoryLink, + Game, + GiftedPremium, + Giveaway, + GiveawayLaunched, + GiveawayResult, + LabeledPrice, + Location, + Message, + MessageEntity, + MessageReactionCountUpdated, + MessageReactions, + MessageReactionUpdated, + MessageReactor, + MessageStory, + PaymentForm, + Photo, + Poll, + PollOption, + Reaction, + ReactionCount, + ReactionType, + ReactionTypeCustomEmoji, + ReactionTypeEmoji, + ReactionTypePaid, + ScreenshotTaken, + Sticker, + StickerSet, + StrippedThumbnail, + Thumbnail, + TranslatedText, + Venue, + Video, + VideoNote, + Voice, + WebAppData, + WebPage, + WebPageEmpty, + WebPagePreview, +) from .object import Object -from .payments import * -from .stories import * -from .update import * -from .user_and_chats import * +from .payments import ( + Gift, + UserGift, +) +from .stories import ( + InputMediaArea, + InputMediaAreaChannelPost, + MediaArea, + MediaAreaChannelPost, + MediaAreaCoordinates, + StoriesPrivacyRules, + Story, + StoryDeleted, + StoryForwardHeader, + StorySkipped, + StoryViews, +) +from .update import Update +from .user_and_chats import ( + Birthday, + BusinessInfo, + BusinessMessage, + BusinessRecipients, + BusinessWeeklyOpen, + BusinessWorkingHours, + Chat, + ChatAdminWithInviteLinks, + ChatColor, + ChatEvent, + ChatEventFilter, + ChatInviteLink, + ChatJoinedByRequest, + ChatJoiner, + ChatJoinRequest, + ChatMember, + ChatMemberUpdated, + ChatPermissions, + ChatPhoto, + ChatPreview, + ChatPrivileges, + ChatReactions, + Dialog, + EmojiStatus, + Folder, + ForumTopic, + ForumTopicClosed, + ForumTopicCreated, + ForumTopicEdited, + ForumTopicReopened, + FoundContacts, + GeneralTopicHidden, + GeneralTopicUnhidden, + InviteLinkImporter, + PeerChannel, + PeerUser, + PrivacyRule, + Restriction, + User, + Username, + VideoChatEnded, + VideoChatMembersInvited, + VideoChatScheduled, + VideoChatStarted, +) __all__ = [ "ActiveSession", @@ -210,6 +429,7 @@ "TermsOfService", "Thumbnail", "TranslatedText", + "Update", "User", "UserGift", "Username", diff --git a/pyrogram/types/bot_commands/__init__.py b/pyrogram/types/bot_commands/__init__.py index eeaaba9d5..6f5e789c8 100644 --- a/pyrogram/types/bot_commands/__init__.py +++ b/pyrogram/types/bot_commands/__init__.py @@ -11,3 +11,15 @@ from .bot_command_scope_chat_administrators import BotCommandScopeChatAdministrators from .bot_command_scope_chat_member import BotCommandScopeChatMember from .bot_command_scope_default import BotCommandScopeDefault + +__all__ = [ + "BotCommand", + "BotCommandScope", + "BotCommandScopeAllChatAdministrators", + "BotCommandScopeAllGroupChats", + "BotCommandScopeAllPrivateChats", + "BotCommandScopeChat", + "BotCommandScopeChatAdministrators", + "BotCommandScopeChatMember", + "BotCommandScopeDefault", +] diff --git a/pyrogram/types/bots/__init__.py b/pyrogram/types/bots/__init__.py index e2515b286..d1dbbad18 100644 --- a/pyrogram/types/bots/__init__.py +++ b/pyrogram/types/bots/__init__.py @@ -4,3 +4,10 @@ from .bot_app import BotApp from .bot_business_connection import BotBusinessConnection from .bot_info import BotInfo + +__all__ = [ + "BotAllowed", + "BotApp", + "BotBusinessConnection", + "BotInfo", +] diff --git a/pyrogram/types/object.py b/pyrogram/types/object.py index 4a2032ff9..2af7d6207 100644 --- a/pyrogram/types/object.py +++ b/pyrogram/types/object.py @@ -69,6 +69,8 @@ def __repr__(self) -> str: ), ) + __hash__ = None + def __eq__(self, other: Object) -> bool: for attr in self.__dict__: try: diff --git a/pyrogram/types/stories/__init__.py b/pyrogram/types/stories/__init__.py index fef7a49e9..febf4e198 100644 --- a/pyrogram/types/stories/__init__.py +++ b/pyrogram/types/stories/__init__.py @@ -11,3 +11,17 @@ from .story_forward_header import StoryForwardHeader from .story_skipped import StorySkipped from .story_views import StoryViews + +__all__ = [ + "InputMediaArea", + "InputMediaAreaChannelPost", + "MediaArea", + "MediaAreaChannelPost", + "MediaAreaCoordinates", + "StoriesPrivacyRules", + "Story", + "StoryDeleted", + "StoryForwardHeader", + "StorySkipped", + "StoryViews", +] From 839c4aa11eff06b1fa53187f9f810f712e7e21ad Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Mon, 9 Feb 2026 16:13:47 +0600 Subject: [PATCH 02/17] fix: configure pytest to support async tests natively (#58) Added `[tool.pytest.ini_options]` to `pyproject.toml` with: - `asyncio_mode = "auto"` to automatically handle `async def` tests. - `asyncio_default_test_loop_scope = "function"` to comply with newer `pytest-asyncio` requirements. This resolves the issue where pytest failed with "async def functions are not natively supported". Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index b4d7328cd..f65e6a5a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,6 +56,10 @@ docs = [ [tool.hatch.metadata] allow-direct-references = true +[tool.pytest.ini_options] +asyncio_mode = "auto" +asyncio_default_test_loop_scope = "function" + [tool.hatch.build.targets.sdist] exclude = [ ".github/", From c2d5b650bd6d8a0344e8a7d0a1bcb80be526abb0 Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Mon, 9 Feb 2026 16:15:26 +0600 Subject: [PATCH 03/17] Update format_and_test.yml --- .github/workflows/format_and_test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/format_and_test.yml b/.github/workflows/format_and_test.yml index 88af7f9a7..98382a8da 100644 --- a/.github/workflows/format_and_test.yml +++ b/.github/workflows/format_and_test.yml @@ -31,7 +31,7 @@ jobs: uv run -m ensurepip --upgrade uv run -m pip install --upgrade pip uv tool install pytest - uv run -m pip install pytest + uv run -m pip install pytest pytest-asyncio uv lock --upgrade - name: Run ruff to lint and format code @@ -55,4 +55,4 @@ jobs: - name: Run tests run: uv run -m pytest - continue-on-error: true \ No newline at end of file + continue-on-error: true From cbad924aec767f60e5f79eb0d76a273ea1af1c9e Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Mon, 9 Feb 2026 21:38:43 +0600 Subject: [PATCH 04/17] Add documentation scraper and update docs.json (#59) This commit adds a new script `compiler/api/scrape_docs.py` that scrapes the latest Telegram MTProto API documentation from Corefork. It also updates `compiler/api/docs.json` with the newly scraped data, providing better descriptions and parameter documentation for many API methods and types. The generated files in `pyrogram/raw` were verified to be in sync with the updated documentation. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- compiler/api/docs.json | 5316 +++++++++++++++++++++++++++-------- compiler/api/scrape_docs.py | 187 ++ 2 files changed, 4337 insertions(+), 1166 deletions(-) create mode 100644 compiler/api/scrape_docs.py diff --git a/compiler/api/docs.json b/compiler/api/docs.json index bae465027..aec832475 100644 --- a/compiler/api/docs.json +++ b/compiler/api/docs.json @@ -6,12 +6,6 @@ "days": "This account will self-destruct in the specified number of days" } }, - "AppWebViewResultUrl": { - "desc": "Contains the link that must be used to open a direct link Mini App.", - "params": { - "url": "The URL to open" - } - }, "AttachMenuBot": { "desc": "Represents a bot mini app that can be launched from the attachment/side menu \u00bb", "params": { @@ -48,7 +42,7 @@ "desc": "Represents a list of bot mini apps that can be launched from the attachment menu \u00bb", "params": { "bots": "List of bot mini apps that can be launched from the attachment menu \u00bb", - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "users": "Info about related users/bots" } }, @@ -83,6 +77,10 @@ "desc": "The bot attachment menu entry is available in the chat with the bot that offers it", "params": {} }, + "AuctionBidLevel": { + "desc": "", + "params": {} + }, "Authorization": { "desc": "Logged-in session", "params": { @@ -141,15 +139,15 @@ } }, "AvailableEffect": { - "desc": "{schema}", + "desc": "Represents a message effect \u00bb.", "params": { - "effect_animation_id": "", - "effect_sticker_id": "", - "emoticon": "", + "effect_animation_id": "If set, contains the actual animated effect (TGS format \u00bb). If not set, the animated effect must be set equal to the premium animated sticker effect associated to the animated sticker specified in effect_sticker_id (always different from the preview animation, fetched thanks to the videoSize of type f as specified here \u00bb).", + "effect_sticker_id": "Contains the preview animation (TGS format \u00bb), used for the effect selection menu.", + "emoticon": "Emoji corresponding to the effect, to be used as icon for the effect if static_icon_id is not set.", "flags": "Flags, see TL conditional fields", - "id": "", - "premium_required": "", - "static_icon_id": "" + "id": "Unique effect ID.", + "premium_required": "Whether a Premium subscription is required to use this effect.", + "static_icon_id": "ID of the document containing the static icon (WEBP) of the effect." } }, "AvailableReaction": { @@ -197,12 +195,12 @@ "params": {} }, "Birthday": { - "desc": "{schema}", + "desc": "Birthday information for a user.", "params": { - "day": "", + "day": "Birth day", "flags": "Flags, see TL conditional fields", - "month": "", - "year": "" + "month": "Birth month", + "year": "(Optional) birth year." } }, "Boost": { @@ -211,11 +209,12 @@ "date": "When was the boost applied", "expires": "When does the boost expire", "flags": "Flags, see TL conditional fields", - "gift": "Whether this boost was applied because the channel directly gifted a subscription to the user.", - "giveaway": "Whether this boost was applied because the user was chosen in a giveaway started by the channel.", + "gift": "Whether this boost was applied because the channel/supergroup directly gifted a subscription to the user.", + "giveaway": "Whether this boost was applied because the user was chosen in a giveaway started by the channel/supergroup.", "giveaway_msg_id": "The message ID of the giveaway", "id": "Unique ID for this set of boosts.", "multiplier": "If set, this boost counts as multiplier boosts, otherwise it counts as a single boost.", + "stars": "Number of Telegram Stars distributed among the winners of the giveaway.", "unclaimed": "If set, the user hasn't yet invoked payments.applyGiftCode to claim a subscription gifted directly or in a giveaway by the channel.", "used_gift_slug": "The created Telegram Premium gift code, only set if either gift or giveaway are set AND it is either a gift code for the currently logged in user or if it was already claimed.", "user_id": "ID of the user that applied the boost." @@ -239,16 +238,27 @@ "desc": "Bot app info hasn't changed.", "params": {} }, + "BotAppSettings": { + "desc": "Mini app \u00bb settings", + "params": { + "background_color": "Default light mode background color", + "background_dark_color": "Default dark mode background color", + "flags": "Flags, see TL conditional fields", + "header_color": "Default light mode header color", + "header_dark_color": "Default dark mode header color", + "placeholder_path": "SVG placeholder logo, compressed using the same format used for vector thumbnails \u00bb." + } + }, "BotBusinessConnection": { - "desc": "{schema}", + "desc": "Contains info about a bot business connection.", "params": { - "can_reply": "", - "connection_id": "", - "date": "", - "dc_id": "", - "disabled": "", + "connection_id": "Business connection ID, used to identify messages coming from the connection and to reply to them as specified here \u00bb.", + "date": "When was the connection created.", + "dc_id": "ID of the datacenter where to send queries wrapped in a invokeWithBusinessConnection as specified here \u00bb.", + "disabled": "Whether this business connection is currently disabled", "flags": "Flags, see TL conditional fields", - "user_id": "" + "rights": "Business bot rights.", + "user_id": "ID of the user that the bot is connected to via this connection." } }, "BotCommand": { @@ -296,13 +306,17 @@ "BotInfo": { "desc": "Info about bots (available bot commands, etc)", "params": { + "app_settings": "Mini app \u00bb settings", "commands": "Bot commands that can be used in the chat", "description": "Description of the bot", "description_document": "Description animation in MPEG4 format", "description_photo": "Description photo", "flags": "Flags, see TL conditional fields", + "has_preview_medias": "If set, the bot has some preview medias for the configured Main Mini App, see here \u00bb for more info on Main Mini App preview medias.", "menu_button": "Indicates the action to execute when pressing the in-UI menu button for bots", - "user_id": "ID of the bot" + "privacy_policy_url": "The HTTP link to the privacy policy of the bot. If not set, then the /privacy command must be used, if supported by the bot (i.e. if it's present in the commands vector). If it isn't supported, then https://telegram.org/privacy-tpa must be opened, instead.", + "user_id": "ID of the bot", + "verifier_settings": "This bot can verify peers: this field contains more info about the verification the bot can assign to peers." } }, "BotInlineMediaResult": { @@ -353,7 +367,7 @@ "BotInlineMessageMediaInvoice": { "desc": "Send an invoice", "params": { - "currency": "Three-letter ISO 4217 currency code", + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", "description": "Product description, 1-255 characters", "flags": "Flags, see TL conditional fields", "photo": "Product photo", @@ -432,143 +446,151 @@ "desc": "Placeholder bot menu button never returned to users: see the docs for more info.", "params": {} }, - "BroadcastRevenueBalances": { - "desc": "{schema}", - "params": { - "available_balance": "", - "current_balance": "", - "overall_revenue": "" - } - }, - "BroadcastRevenueTransactionProceeds": { - "desc": "{schema}", + "BotPreviewMedia": { + "desc": "Represents a Main Mini App preview media, see here \u00bb for more info.", "params": { - "amount": "", - "from_date": "", - "to_date": "" + "date": "When was this media last updated.", + "media": "The actual photo/video." } }, - "BroadcastRevenueTransactionRefund": { - "desc": "{schema}", + "BotVerification": { + "desc": "Describes a bot verification icon \u00bb.", "params": { - "amount": "", - "date": "", - "provider": "" + "bot_id": "ID of the bot that verified this peer", + "description": "Verification description", + "icon": "Verification icon" } }, - "BroadcastRevenueTransactionWithdrawal": { - "desc": "{schema}", + "BotVerifierSettings": { + "desc": "Info about the current verifier bot \u00bb.", "params": { - "amount": "", - "date": "", - "failed": "", + "can_modify_custom_description": "Indicates whether the bot is allowed to set a custom description field for individual verified peers, different from the custom_description provided here.", + "company": "The name of the organization that provides the verification", + "custom_description": "An optional default description for the verification", "flags": "Flags, see TL conditional fields", - "pending": "", - "provider": "", - "transaction_date": "", - "transaction_url": "" + "icon": "Verification icon" } }, "BusinessAwayMessage": { - "desc": "{schema}", + "desc": "Describes a Telegram Business away message, automatically sent to users writing to us when we're offline, during closing hours, while we're on vacation, or in some other custom time period when we cannot immediately answer to the user.", "params": { "flags": "Flags, see TL conditional fields", - "offline_only": "", - "recipients": "", - "schedule": "", - "shortcut_id": "" + "offline_only": "If set, the messages will not be sent if the account was online in the last 10 minutes.", + "recipients": "Allowed recipients for the away messages.", + "schedule": "Specifies when should the away messages be sent.", + "shortcut_id": "ID of a quick reply shorcut, containing the away messages to send, see here \u00bb for more info." } }, "BusinessAwayMessageScheduleAlways": { - "desc": "{schema}", + "desc": "Always send Telegram Business away messages to users writing to us in private.", "params": {} }, "BusinessAwayMessageScheduleCustom": { - "desc": "{schema}", + "desc": "Send Telegram Business away messages to users writing to us in private in the specified time span.", "params": { - "end_date": "", - "start_date": "" + "end_date": "End date (UNIX timestamp).", + "start_date": "Start date (UNIX timestamp)." } }, "BusinessAwayMessageScheduleOutsideWorkHours": { - "desc": "{schema}", + "desc": "Send Telegram Business away messages to users writing to us in private outside of the configured Telegram Business working hours.", "params": {} }, "BusinessBotRecipients": { - "desc": "{schema}", + "desc": "Specifies the private chats that a connected business bot \u00bb may receive messages and interact with.", + "params": { + "contacts": "Selects all private chats with contacts.", + "exclude_selected": "If set, then all private chats except the ones selected by existing_chats, new_chats, contacts, non_contacts and users are chosen. Note that if this flag is set, any values passed in exclude_users will be merged and moved into users by the server, thus exclude_users will always be empty.", + "exclude_users": "Identifiers of private chats that are always excluded.", + "existing_chats": "Selects all existing private chats.", + "flags": "Flags, see TL conditional fields", + "new_chats": "Selects all new private chats.", + "non_contacts": "Selects all private chats with non-contacts.", + "users": "Explicitly selected private chats." + } + }, + "BusinessBotRights": { + "desc": "Business bot rights.", "params": { - "contacts": "", - "exclude_selected": "", - "exclude_users": "", - "existing_chats": "", + "change_gift_settings": "Whether the bot can change the privacy settings pertaining to gifts for the business account.", + "delete_received_messages": "Whether the bot can delete received private messages in managed chats.", + "delete_sent_messages": "Whether the bot can delete messages sent by the bot.", + "edit_bio": "Whether the bot can edit the bio of the business account.", + "edit_name": "Whether the bot can edit the first and last name of the business account.", + "edit_profile_photo": "Whether the bot can edit the profile photo of the business account.", + "edit_username": "Whether the bot can edit the username of the business account.", "flags": "Flags, see TL conditional fields", - "new_chats": "", - "non_contacts": "", - "users": "" + "manage_stories": "Whether the bot can post, edit and delete stories on behalf of the business account.", + "read_messages": "Whether the bot can mark incoming private messages as read.", + "reply": "Whether the bot can send and edit messages in private chats that had incoming messages in the last 24 hours.", + "sell_gifts": "Whether the bot can convert regular gifts owned by the business account to Telegram Stars.", + "transfer_and_upgrade_gifts": "Whether the bot can transfer and upgrade gifts owned by the business account.", + "transfer_stars": "Whether the bot can transfer Telegram Stars received by the business account to its own account, or use them to upgrade and transfer gifts.", + "view_gifts": "Whether the bot can view gifts and the amount of Telegram Stars owned by the business account." } }, "BusinessChatLink": { - "desc": "{schema}", + "desc": "Contains info about a business chat deep link \u00bb created by the current account.", "params": { "entities": "Message entities for styled text", "flags": "Flags, see TL conditional fields", - "link": "", - "message": "", - "title": "", - "views": "" + "link": "Business chat deep link.", + "message": "Message to pre-fill in the message input field.", + "title": "Human-readable name of the link, to simplify management in the UI (only visible to the creator of the link).", + "views": "Number of times the link was resolved (clicked/scanned/etc...)." } }, "BusinessGreetingMessage": { - "desc": "{schema}", + "desc": "Describes a Telegram Business greeting, automatically sent to new users writing to us in private for the first time, or after a certain inactivity period.", "params": { - "no_activity_days": "", - "recipients": "", - "shortcut_id": "" + "no_activity_days": "The number of days after which a private chat will be considered as inactive; currently, must be one of 7, 14, 21, or 28.", + "recipients": "Allowed recipients for the greeting messages.", + "shortcut_id": "ID of a quick reply shorcut, containing the greeting messages to send, see here \u00bb for more info." } }, "BusinessIntro": { - "desc": "{schema}", + "desc": "Telegram Business introduction \u00bb.", "params": { - "description": "", + "description": "Profile introduction (max intro_description_length_limit \u00bb UTF-8 characters).", "flags": "Flags, see TL conditional fields", - "sticker": "", - "title": "" + "sticker": "Optional introduction sticker.", + "title": "Title of the introduction message (max intro_title_length_limit \u00bb UTF-8 characters)." } }, "BusinessLocation": { - "desc": "{schema}", + "desc": "Represents the location of a Telegram Business \u00bb.", "params": { - "address": "", + "address": "Textual description of the address (mandatory).", "flags": "Flags, see TL conditional fields", - "geo_point": "" + "geo_point": "Geographical coordinates (optional)." } }, "BusinessRecipients": { - "desc": "{schema}", + "desc": "Specifies the chats that can receive Telegram Business away \u00bb and greeting \u00bb messages.", "params": { - "contacts": "", - "exclude_selected": "", - "existing_chats": "", + "contacts": "All private chats with contacts.", + "exclude_selected": "If set, inverts the selection.", + "existing_chats": "All existing private chats.", "flags": "Flags, see TL conditional fields", - "new_chats": "", - "non_contacts": "", - "users": "" + "new_chats": "All new private chats.", + "non_contacts": "All private chats with non-contacts.", + "users": "Only private chats with the specified users." } }, "BusinessWeeklyOpen": { - "desc": "{schema}", + "desc": "A time interval, indicating the opening hours of a business.", "params": { - "end_minute": "", - "start_minute": "" + "end_minute": "End minute in minutes of the week, 1 to 8*24*60 inclusively (8 and not 7 because this allows to specify intervals that, for example, start on Sunday 21:00 and end on Monday 04:00 (6*24*60+21*60 to 7*24*60+4*60) without passing an invalid end_minute < start_minute). See here \u00bb for more info.", + "start_minute": "Start minute in minutes of the week, 0 to 7*24*60 inclusively." } }, "BusinessWorkHours": { - "desc": "{schema}", + "desc": "Specifies a set of Telegram Business opening hours.", "params": { "flags": "Flags, see TL conditional fields", - "open_now": "", - "timezone_id": "", - "weekly_open": "" + "open_now": "Ignored if set while invoking account.updateBusinessWorkHours, only returned by the server in userFull.business_work_hours, indicating whether the business is currently open according to the current time and the values in weekly_open and timezone.", + "timezone_id": "An ID of one of the timezones returned by help.getTimezonesList. The timezone ID is contained timezone.id, a human-readable, localized name of the timezone is available in timezone.name and the timezone.utc_offset field contains the UTC offset in seconds, which may be displayed in hh:mm format by the client together with the human-readable name (i.e. $name UTC -01:00).", + "weekly_open": "A list of time intervals (max 28) represented by businessWeeklyOpen \u00bb, indicating the opening hours of their business." } }, "CdnConfig": { @@ -587,10 +609,13 @@ "Channel": { "desc": "Channel/supergroup info", "params": { - "access_hash": "Access hash", + "access_hash": "Access hash, see here \u00bb for more info", "admin_rights": "Admin rights of the user in this channel (see rights)", + "autotranslation": "If set, autotranslation was enabled for all users by the admin of the channel, as specified here \u00bb.", "banned_rights": "Banned rights of the user in this channel (see rights)", + "bot_verification_icon": "Describes a bot verification icon \u00bb.", "broadcast": "Is this a channel?", + "broadcast_messages_allowed": "If set, this channel has an associated monoforum \u00bb, and its ID is specified in the linked_monoforum_id flag.", "call_active": "Whether a group call or livestream is currently active", "call_not_empty": "Whether there's anyone in the group call or livestream", "color": "The channel's accent color.", @@ -598,35 +623,41 @@ "date": "Date when the user joined the supergroup/channel, or if the user isn't a member, its creation date", "default_banned_rights": "Default chat rights (see rights)", "emoji_status": "Emoji status", - "fake": "If set, this supergroup/channel was reported by many users as a fake or scam: be careful when interacting with it.", + "fake": "If set, this supergroup/channel was reported by many users as a fake or scam: be careful when interacting with it. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", "flags": "Flags, see TL conditional fields", "flags2": "Flags, see TL conditional fields", - "forum": "Whether this supergroup is a forum", - "gigagroup": "Whether this supergroup is a gigagroup", + "forum": "Whether this supergroup is a forum. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "forum_tabs": "If set, enables the tabbed forum UI \u00bb.", + "gigagroup": "Whether this supergroup is a gigagroupChanges to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", "has_geo": "Whether this chanel has a geoposition", - "has_link": "Whether this channel has a private join link", - "id": "ID of the channel", - "join_request": "Whether a user's join request will have to be approved by administrators, toggle using channels.toggleJoinToSend", - "join_to_send": "Whether a user needs to join the supergroup before they can send messages: can be false only for discussion groups \u00bb, toggle using channels.toggleJoinToSend", + "has_link": "Whether this channel has a linked discussion group \u00bb (or this supergroup is a channel's discussion group). The actual ID of the linked channel/supergroup is contained in channelFull.linked_chat_id. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "id": "ID of the channel, see here \u00bb for more info and the available ID range.", + "join_request": "Whether a user's join request will have to be approved by administrators, toggle using channels.toggleJoinToSendChanges to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "join_to_send": "Whether a user needs to join the supergroup before they can send messages: can be false only for discussion groups \u00bb, toggle using channels.toggleJoinToSendChanges to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", "left": "Whether the current user has left or is not a member of this channel", - "level": "Boost level", - "megagroup": "Is this a supergroup?", + "level": "Boost level. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "linked_monoforum_id": "For channels with associated monoforums, the monoforum ID. For Monoforums, the ID of the associated channel.", + "megagroup": "Is this a supergroup? Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", "min": "See min", + "monoforum": "If set, this is a monoforum \u00bb, and the ID of the associated channel is specified in the linked_monoforum_id.", "noforwards": "Whether this channel or group is protected, thus does not allow forwarding messages from it", "participants_count": "Participant count", "photo": "Profile photo", "profile_color": "The channel's profile color.", - "restricted": "Whether viewing/writing in this channel for a reason (see restriction_reason", - "restriction_reason": "Contains the reason why access to this channel must be restricted.", - "scam": "This channel/supergroup is probably a scam", + "restricted": "Whether viewing/writing in this channel for a reason (see restriction_reason)", + "restriction_reason": "Contains the reason why access to this channel must be restricted. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "scam": "This channel/supergroup is probably a scam Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "send_paid_messages_stars": "If set, this supergroup or monoforum has enabled paid messages \u00bb, we might need to pay the specified amount of Stars to send messages to it, depending on the configured exceptions: check channelFull.send_paid_messages_stars to see if the currently logged in user actually has to pay or not, see here \u00bb for the full flow (only set for the monoforum, not the associated channel).", + "signature_profiles": "If set, messages sent by admins to this channel will link to the admin's profile (just like with groups).", "signatures": "Whether signatures are enabled (channels)", - "slowmode_enabled": "Whether slow mode is enabled for groups to prevent flood in chat", + "slowmode_enabled": "Whether slow mode is enabled for groups to prevent flood in chat. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", "stories_hidden": "Whether we have hidden all stories posted by this channel \u00bb.", "stories_hidden_min": "If set, indicates that the stories_hidden flag was not populated, and its value must cannot be relied on; use the previously cached value, or re-fetch the constructor using channels.getChannels to obtain the latest value of the stories_hidden flag.", "stories_max_id": "ID of the maximum read story.", "stories_unavailable": "No stories from the channel are visible.", + "subscription_until_date": "Expiration date of the Telegram Star subscription \u00bb the current user has bought to gain access to this channel.", "title": "Title", - "username": "Username", + "username": "Main active username.", "usernames": "Additional usernames", "verified": "Is this channel verified by telegram?" } @@ -662,10 +693,10 @@ } }, "ChannelAdminLogEventActionChangeEmojiStickerSet": { - "desc": "{schema}", + "desc": "The supergroup's custom emoji stickerset was changed.", "params": { - "new_stickerset": "", - "prev_stickerset": "" + "new_stickerset": "New value", + "prev_stickerset": "Old value" } }, "ChannelAdminLogEventActionChangeHistoryTTL": { @@ -717,6 +748,13 @@ "prev_stickerset": "Previous stickerset" } }, + "ChannelAdminLogEventActionChangeTheme": { + "desc": "The chat theme was changed", + "params": { + "new_value": "New theme emoji", + "prev_value": "Previous theme emoji" + } + }, "ChannelAdminLogEventActionChangeTitle": { "desc": "Channel/supergroup title was changed", "params": { @@ -844,6 +882,13 @@ "participant": "The participant that was muted" } }, + "ChannelAdminLogEventActionParticipantSubExtend": { + "desc": "A paid subscriber has extended their Telegram Star subscription \u00bb.", + "params": { + "new_participant": "The subscriber that extended the subscription.", + "prev_participant": "Same as new_participant." + } + }, "ChannelAdminLogEventActionParticipantToggleAdmin": { "desc": "The admin rights of a user were changed", "params": { @@ -902,6 +947,12 @@ "new_value": "Whether antispam functionality was enabled or disabled." } }, + "ChannelAdminLogEventActionToggleAutotranslation": { + "desc": "Channel autotranslation was toggled \u00bb.", + "params": { + "new_value": "New value of the toggle" + } + }, "ChannelAdminLogEventActionToggleForum": { "desc": "Forum functionality was enabled or disabled.", "params": { @@ -932,6 +983,12 @@ "new_value": "New value" } }, + "ChannelAdminLogEventActionToggleSignatureProfiles": { + "desc": "Channel signature profiles were enabled/disabled.", + "params": { + "new_value": "New value" + } + }, "ChannelAdminLogEventActionToggleSignatures": { "desc": "Channel signatures were enabled/disabled", "params": { @@ -971,6 +1028,7 @@ "promote": "Admin promotion events", "send": "A message was posted in a channel", "settings": "Settings change events (invites, hidden prehistory, signatures, default banned rights, forum toggle events)", + "sub_extend": "Telegram Star subscription extension events \u00bb", "unban": "Unban events", "unkick": "Unkick events" } @@ -997,20 +1055,22 @@ "available_reactions": "Allowed message reactions \u00bb", "banned_count": "Number of users banned from the channel", "blocked": "Whether any anonymous admin of this supergroup was blocked: if set, you won't receive messages from anonymous group admins in discussion replies via @replies", - "boosts_applied": "", - "boosts_unrestrict": "", + "boosts_applied": "The number of boosts the current user has applied to the current supergroup.", + "boosts_unrestrict": "The number of boosts this supergroup requires to bypass slowmode and other restrictions, see here \u00bb for more info.", "bot_info": "Info about bots in the channel/supergroup", + "bot_verification": "Bot verification icon", "call": "Livestream or group call information", "can_delete_channel": "Can we delete this channel?", "can_set_location": "Can we set the geolocation of this group (for geogroups)", "can_set_stickers": "Can we associate a stickerpack to the supergroup?", "can_set_username": "Can we set the channel's username?", "can_view_participants": "Can we view the participant list?", - "can_view_revenue": "", + "can_view_revenue": "If set, this user can view ad revenue statistics \u00bb for this channel.", + "can_view_stars_revenue": "If set, this user can view Telegram Star revenue statistics \u00bb for this channel.", "can_view_stats": "Can the user view channel/supergroup statistics", "chat_photo": "Channel picture", "default_send_as": "Default peer used for sending messages to this channel", - "emojiset": "", + "emojiset": "Custom emoji stickerset associated to the current supergroup, set using channels.setEmojiStickers after reaching the appropriate boost level, see here \u00bb for more info.", "exported_invite": "Invite link", "flags": "Flags, see TL conditional fields", "flags2": "Flags, see TL conditional fields", @@ -1020,25 +1080,32 @@ "hidden_prehistory": "Is the history before we joined hidden to us?", "id": "ID of the channel", "kicked_count": "Number of users kicked from the channel", - "linked_chat_id": "ID of the linked discussion chat for channels", + "linked_chat_id": "ID of the linked discussion chat for channels (and vice versa, the ID of the linked channel for discussion chats).", "location": "Location of the geogroup", + "main_tab": "The main tab for the channel's profile, see here \u00bb for more info.", "migrated_from_chat_id": "The chat ID from which this group was migrated", "migrated_from_max_id": "The message ID in the original chat at which this group was migrated", "notify_settings": "Notification settings", "online_count": "Number of users currently online", + "paid_media_allowed": "Whether the current user can send or forward paid media \u00bb to this channel.", + "paid_messages_available": "If set, admins may enable enable paid messages \u00bb in this supergroup.", + "paid_reactions_available": "If set, users may send paid Telegram Star reactions \u00bb to messages of this channel.", "participants_count": "Number of participants of the channel", "participants_hidden": "Whether the participant list is hidden.", "pending_suggestions": "A list of suggested actions for the supergroup admin, see here for more info \u00bb.", "pinned_msg_id": "Message ID of the last pinned message", "pts": "Latest PTS for this channel", - "reactions_limit": "", + "reactions_limit": "This flag may be used to impose a custom limit of unique reactions (i.e. a customizable version of appConfig.reactions_uniq_max).", "read_inbox_max_id": "Position up to which all incoming messages are read.", "read_outbox_max_id": "Position up to which all outgoing messages are read.", "recent_requesters": "IDs of users who requested to join recently", "requests_pending": "Pending join requests \u00bb", - "restricted_sponsored": "", + "restricted_sponsored": "Whether ads on this channel were disabled as specified here \u00bb (this flag is only visible to the owner of the channel).", + "send_paid_messages_stars": "If set and bigger than 0, this supergroup, monoforum or the monoforum associated to this channel has enabled paid messages \u00bb and we must pay the specified amount of Stars to send messages to it, see here \u00bb for the full flow. This flag will be set both for the monoforum and for channelFull of the associated channel). If set and equal to 0, the monoforum requires payment in general but we were exempted from paying.", "slowmode_next_send_date": "Indicates when the user will be allowed to send another message in the supergroup (unixtime)", "slowmode_seconds": "If specified, users in supergroups will only be able to send one message every slowmode_seconds seconds", + "stargifts_available": "If set, users may send Gifts \u00bb to this channel.", + "stargifts_count": "Admins with chatAdminRights.post_messages rights will see the total number of received gifts, everyone else will see the number of gifts added to the channel's profile.", "stats_dc": "If set, specifies the DC to use for fetching channel statistics", "stickerset": "Associated stickerset", "stories": "Channel stories", @@ -1078,6 +1145,8 @@ "desc": "Channel/supergroup participant", "params": { "date": "Date joined", + "flags": "Flags, see TL conditional fields", + "subscription_until_date": "If set, contains the expiration date of the current Telegram Star subscription period \u00bb for the specified participant.", "user_id": "Participant user ID" } }, @@ -1127,6 +1196,7 @@ "date": "When did I join the channel/supergroup", "flags": "Flags, see TL conditional fields", "inviter_id": "User that invited me to the channel/supergroup", + "subscription_until_date": "If set, contains the expiration date of the current Telegram Star subscription period \u00bb for the specified participant.", "user_id": "User ID", "via_request": "Whether I joined upon specific approval of an admin" } @@ -1176,7 +1246,7 @@ } }, "Chat": { - "desc": "Info about a group", + "desc": "Info about a group.", "params": { "admin_rights": "Admin rights of the user in the group", "call_active": "Whether a group call is currently active", @@ -1186,7 +1256,7 @@ "deactivated": "Whether the group was migrated", "default_banned_rights": "Default banned rights of all users in the group", "flags": "Flags, see TL conditional fields", - "id": "ID of the group", + "id": "ID of the group, see here \u00bb for more info and the available ID range.", "left": "Whether the current user has left the group", "migrated_to": "Means this chat was upgraded to a supergroup", "noforwards": "Whether this group is protected, thus does not allow forwarding messages from it", @@ -1210,6 +1280,7 @@ "flags": "Flags, see TL conditional fields", "invite_users": "If set, allows the admin to invite users in the channel/supergroup", "manage_call": "If set, allows the admin to change group call/livestream settings", + "manage_direct_messages": "If set, allows the admin to manage the direct messages monoforum \u00bb and decline suggested posts \u00bb.", "manage_topics": "If set, allows the admin to create, delete or modify forum topics \u00bb.", "other": "Set this flag if none of the other flags are set, but you still want the user to be an admin: if this or any of the other flags are set, the admin can get the chat admin log, get chat statistics, get message statistics in channels, get channel members, see anonymous administrators in supergroups and ignore slow mode.", "pin_messages": "If set, allows the admin to pin messages in the channel/supergroup", @@ -1283,7 +1354,7 @@ "notify_settings": "Notification settings", "participants": "Participant list", "pinned_msg_id": "Message ID of the last pinned message", - "reactions_limit": "", + "reactions_limit": "This flag may be used to impose a custom limit of unique reactions (i.e. a customizable version of appConfig.reactions_uniq_max).", "recent_requesters": "IDs of users who requested to join recently", "requests_pending": "Pending join requests \u00bb", "theme_emoticon": "Emoji representing a specific chat theme", @@ -1295,7 +1366,9 @@ "desc": "Chat invite info", "params": { "about": "Description of the group of channel", + "bot_verification": "Describes a bot verification icon \u00bb.", "broadcast": "Whether this is a channel", + "can_refulfill_subscription": "If set, indicates that the user has already paid for the associated Telegram Star subscriptions \u00bb and it hasn't expired yet, so they may re-join the channel using messages.importChatInvite without repeating the payment.", "channel": "Whether this is a channel/supergroup or a normal group", "color": "Profile color palette ID", "fake": "If set, this chat was reported by many users as a fake or scam: be careful when interacting with it.", @@ -1307,6 +1380,8 @@ "public": "Whether this is a public channel/supergroup", "request_needed": "Whether the join request \u00bb must be first approved by an administrator", "scam": "This chat is probably a scam", + "subscription_form_id": "For Telegram Star subscriptions \u00bb, the ID of the payment form for the subscription.", + "subscription_pricing": "For Telegram Star subscriptions \u00bb, contains the pricing of the subscription the user must activate to join the private channel.", "title": "Chat/supergroup/channel title", "verified": "Is this chat or channel verified by Telegram?" } @@ -1330,6 +1405,8 @@ "requested": "Number of users that have already used this link to join", "revoked": "Whether this chat invite was revoked", "start_date": "When was this chat invite last modified", + "subscription_expired": "For Telegram Star subscriptions \u00bb, contains the number of chat members which have already joined the chat using the link, but have already left due to expiration of their subscription.", + "subscription_pricing": "For Telegram Star subscriptions \u00bb, contains the pricing of the subscription the user must activate to join the private channel.", "title": "Custom description for the invite link, visible only to admins", "usage": "How many users joined using this link", "usage_limit": "Maximum number of users that can join using this link" @@ -1433,6 +1510,19 @@ "reactions": "Allowed set of reactions: the reactions_in_chat_max configuration field indicates the maximum number of reactions that can be specified in this field." } }, + "ChatTheme": { + "desc": "A chat theme", + "params": { + "emoticon": "The emoji identifying the chat theme." + } + }, + "ChatThemeUniqueGift": { + "desc": "A chat theme based on a collectible gift \u00bb.", + "params": { + "gift": "The owned collectible gift on which this theme is based, as a starGiftUnique constructor.", + "theme_settings": "Theme settings." + } + }, "CodeSettings": { "desc": "Settings used by telegram servers for sending the confirm code.", "params": { @@ -1445,7 +1535,7 @@ "flags": "Flags, see TL conditional fields", "logout_tokens": "Previously stored future auth tokens, see the documentation for more info \u00bb", "token": "Used only by official iOS apps for Firebase auth: device token for apple push.", - "unknown_number": "" + "unknown_number": "Set this flag if there is a SIM card in the current device, but it is not possible to check whether the specified phone number matches the SIM's phone number." } }, "Config": { @@ -1502,12 +1592,26 @@ } }, "ConnectedBot": { - "desc": "{schema}", + "desc": "Contains info about a connected business bot \u00bb.", + "params": { + "bot_id": "ID of the connected bot", + "flags": "Flags, see TL conditional fields", + "recipients": "Specifies the private chats that a connected business bot \u00bb may receive messages and interact with.", + "rights": "Business bot rights." + } + }, + "ConnectedBotStarRef": { + "desc": "Info about an active affiliate program we have with a Mini App", "params": { - "bot_id": "", - "can_reply": "", + "bot_id": "ID of the mini app that created the affiliate program", + "commission_permille": "The number of Telegram Stars received by the affiliate for each 1000 Telegram Stars received by bot_id", + "date": "When did we affiliate with bot_id", + "duration_months": "Number of months the program will be active; if not set, there is no expiration date.", "flags": "Flags, see TL conditional fields", - "recipients": "" + "participants": "The number of users that used the affiliate program", + "revenue": "The number of Telegram Stars that were earned by the affiliate program", + "revoked": "If set, this affiliation was revoked by the affiliate using payments.editConnectedStarRefBot, or by the affiliation program owner using bots.updateStarRefProgram", + "url": "Referral link to be shared" } }, "Contact": { @@ -1518,10 +1622,10 @@ } }, "ContactBirthday": { - "desc": "{schema}", + "desc": "Birthday information of a contact.", "params": { - "birthday": "", - "contact_id": "" + "birthday": "Birthday information.", + "contact_id": "User ID." } }, "ContactStatus": { @@ -1585,7 +1689,7 @@ "params": { "bots": "Whether to include all bots in this folder", "broadcasts": "Whether to include all channels in this folder", - "color": "", + "color": "A color ID for the folder tag associated to this folder, see here \u00bb for more info.", "contacts": "Whether to include all contacts in this folder", "emoticon": "Emoji to use as icon for the folder.", "exclude_archived": "Whether to exclude archived chats from this folder", @@ -1598,20 +1702,22 @@ "include_peers": "Include the following chats in this folder", "non_contacts": "Whether to include all non-contacts in this folder", "pinned_peers": "Pinned chats, folders can have unlimited pinned chats", - "title": "Folder name (max 12 UTF-8 chars)" + "title": "Folder name (max 12 UTF-8 chars)", + "title_noanimate": "If set, any animated emojis present in title should not be animated and should be instead frozen on the first frame." } }, "DialogFilterChatlist": { "desc": "A folder imported using a chat folder deep link \u00bb.", "params": { - "color": "", + "color": "A color ID for the folder tag associated to this folder, see here \u00bb for more info.", "emoticon": "Emoji to use as icon for the folder.", "flags": "Flags, see TL conditional fields", "has_my_invites": "Whether the current user has created some chat folder deep links \u00bb to share the folder as well.", "id": "ID of the folder", "include_peers": "Chats to include in the folder", "pinned_peers": "Pinned chats, folders can have unlimited pinned chats", - "title": "Name of the folder (max 12 UTF-8 chars)" + "title": "Name of the folder (max 12 UTF-8 chars)", + "title_noanimate": "If set, any animated emojis present in title should not be animated and should be instead frozen on the first frame." } }, "DialogFilterDefault": { @@ -1651,6 +1757,16 @@ "folder_id": "Peer folder ID, for more info click here" } }, + "DisallowedGiftsSettings": { + "desc": "Disallow the reception of specific gift types.", + "params": { + "disallow_limited_stargifts": "Disallow the reception of limited-supply gifts (those with the starGift.limited flag set).", + "disallow_premium_gifts": "Disallow the reception of gifted Telegram Premium subscriptions \u00bb.", + "disallow_unique_stargifts": "Disallow the reception of collectible gifts \u00bb.", + "disallow_unlimited_stargifts": "Disallow the reception of gifts with an unlimited supply (those with the starGift.limited flag not set).", + "flags": "Flags, see TL conditional fields" + } + }, "Document": { "desc": "Document", "params": { @@ -1725,10 +1841,12 @@ "duration": "Duration in seconds", "flags": "Flags, see TL conditional fields", "h": "Video height", - "nosound": "Whether the specified document is a video file with no audio tracks (a GIF animation (even as MPEG4), for example)", + "nosound": "Whether the specified document is a video file with no audio tracks", "preload_prefix_size": "Number of bytes to preload when preloading videos (particularly video stories).", "round_message": "Whether this is a round video", "supports_streaming": "Whether the video supports streaming", + "video_codec": "Codec used for the video, i.e. \"h264\", \"h265\", or \"av1\"", + "video_start_ts": "Floating point UNIX timestamp in seconds, indicating the frame of the video that should be used as static preview and thumbnail.", "w": "Video width" } }, @@ -1742,13 +1860,15 @@ "desc": "Represents a message draft.", "params": { "date": "Date of last update of the draft.", + "effect": "A message effect that should be played as specified here \u00bb.", "entities": "Message entities for styled text.", "flags": "Flags, see TL conditional fields", "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", "media": "Media.", "message": "The draft", "no_webpage": "Whether no webpage preview will be generated", - "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story." + "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.", + "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow." } }, "DraftMessageEmpty": { @@ -1800,18 +1920,18 @@ } }, "EmojiGroupGreeting": { - "desc": "{schema}", + "desc": "Represents an emoji category, that should be moved to the top of the list when choosing a sticker for a business introduction", "params": { - "emoticons": "", - "icon_emoji_id": "", - "title": "" + "emoticons": "A list of UTF-8 emojis, matching the category.", + "icon_emoji_id": "A single custom emoji used as preview for the category.", + "title": "Category name, i.e. \"Animals\", \"Flags\", \"Faces\" and so on..." } }, "EmojiGroupPremium": { - "desc": "{schema}", + "desc": "An emoji category, used to select all Premium-only stickers (i.e. those with a Premium effect \u00bb)/Premium-only custom emojis (i.e. those where the documentAttributeCustomEmoji.free flag is not set)", "params": { - "icon_emoji_id": "", - "title": "" + "icon_emoji_id": "A single custom emoji used as preview for the category.", + "title": "Category name, i.e. \"Animals\", \"Flags\", \"Faces\" and so on..." } }, "EmojiKeyword": { @@ -1847,7 +1967,7 @@ "desc": "Represents a list of custom emojis.", "params": { "document_id": "Custom emoji IDs", - "hash": "Hash for pagination, for more info click here" + "hash": "Hash used for caching, for more info click here" } }, "EmojiListNotModified": { @@ -1857,20 +1977,31 @@ "EmojiStatus": { "desc": "An emoji status", "params": { - "document_id": "Custom emoji document ID" + "document_id": "Custom emoji document ID", + "flags": "Flags, see TL conditional fields", + "until": "If set, the emoji status will be active until the specified unixtime." + } + }, + "EmojiStatusCollectible": { + "desc": "An owned collectible gift \u00bb as emoji status.", + "params": { + "center_color": "Color of the center of the profile backdrop in RGB24 format, from the gift's starGiftAttributeBackdrop.", + "collectible_id": "ID of the collectible (from starGiftUnique.id).", + "document_id": "ID of the custom emoji representing the status.", + "edge_color": "Color of the edges of the profile backdrop in RGB24 format, from the gift's starGiftAttributeBackdrop.", + "flags": "Flags, see TL conditional fields", + "pattern_color": "Color of the pattern_document_id applied on the profile backdrop in RGB24 format, from the gift's starGiftAttributeBackdrop.", + "pattern_document_id": "The ID of a pattern to apply on the profile's backdrop, correlated to the starGiftAttributePattern from the gift in slug.", + "slug": "Unique identifier of the collectible that may be used to create a collectible gift link \u00bb for the current collectible, or to fetch further info about the collectible using payments.getUniqueStarGift.", + "text_color": "Color of text on the profile backdrop in RGB24 format, from the gift's starGiftAttributeBackdrop.", + "title": "Name of the collectible.", + "until": "If set, the emoji status will be active until the specified unixtime." } }, "EmojiStatusEmpty": { "desc": "No emoji status is set", "params": {} }, - "EmojiStatusUntil": { - "desc": "An emoji status valid until the specified date", - "params": { - "document_id": "Custom emoji document ID", - "until": "This status is valid until this date" - } - }, "EmojiURL": { "desc": "An HTTP URL which can be used to automatically log in into translation platform and suggest new emoji replacements. The URL will be valid for 30 seconds after generation", "params": { @@ -1989,13 +2120,13 @@ } }, "FactCheck": { - "desc": "{schema}", + "desc": "Represents a fact-check \u00bb created by an independent fact-checker.", "params": { - "country": "", + "country": "A two-letter ISO 3166-1 alpha-2 country code of the country for which the fact-check should be shown.", "flags": "Flags, see TL conditional fields", - "hash": "Hash for pagination, for more info click here", - "need_check": "", - "text": "" + "hash": "Hash used for caching, for more info click here", + "need_check": "If set, the country/text fields will not be set, and the fact check must be fetched manually by the client (if it isn't already cached with the key specified in hash) using bundled messages.getFactCheck requests, when the message with the factcheck scrolls into view.", + "text": "The fact-check." } }, "FileHash": { @@ -2056,6 +2187,13 @@ "id": "The ID of the deleted forum topic." } }, + "FoundStory": { + "desc": "A story found using global story search \u00bb.", + "params": { + "peer": "The peer that posted the story.", + "story": "The story." + } + }, "Game": { "desc": "Indicates an already sent game", "params": { @@ -2079,6 +2217,16 @@ "long": "Longitude" } }, + "GeoPointAddress": { + "desc": "Address optionally associated to a geoPoint.", + "params": { + "city": "City", + "country_iso2": "Two-letter ISO 3166-1 alpha-2 country code", + "flags": "Flags, see TL conditional fields", + "state": "State", + "street": "Street" + } + }, "GeoPointEmpty": { "desc": "Empty constructor.", "params": {} @@ -2087,11 +2235,14 @@ "desc": "Global privacy settings", "params": { "archive_and_mute_new_noncontact_peers": "Whether to archive and mute new chats from non-contacts", + "disallowed_gifts": "Disallows the reception of specific gift types.", + "display_gifts_button": "Enables or disables our userFull.display_gifts_button flag: if the userFull.display_gifts_button flag of both us and another user is set, a gift button should always be displayed in the text field in private chats with the other user: once clicked, the gift UI should be displayed, offering the user options to gift Telegram Premium \u00bb subscriptions or Telegram Gifts \u00bb.", "flags": "Flags, see TL conditional fields", - "hide_read_marks": "", + "hide_read_marks": "If this flag is set, the inputPrivacyKeyStatusTimestamp key will also apply to the ability to use messages.getOutboxReadDate on messages sent to us. Meaning, users that cannot see our exact last online date due to the current value of the inputPrivacyKeyStatusTimestamp key will receive a 403 USER_PRIVACY_RESTRICTED error when invoking messages.getOutboxReadDate to fetch the exact read date of a message they sent to us. The userFull.read_dates_private flag will be set for users that have this flag enabled.", "keep_archived_folders": "Whether unmuted chats that are always included or pinned in a folder, will be kept in the Archive chat list when they get a new message. Ignored if keep_archived_unmuted is set.", "keep_archived_unmuted": "Whether unmuted chats will be kept in the Archive chat list when they get a new message.", - "new_noncontact_peers_require_premium": "" + "new_noncontact_peers_require_premium": "See here for more info on this flag \u00bb.", + "noncontact_peers_paid_stars": "If configured, specifies the number of stars users must pay us to send us a message, see here \u00bb for more info on paid messages." } }, "GroupCall": { @@ -2100,8 +2251,11 @@ "access_hash": "Group call access hash", "can_change_join_muted": "Whether the current user can change the value of the join_muted flag using phone.toggleGroupCallSettings", "can_start_video": "Whether you can start streaming video into the call", + "conference": "Whether this is an E2E conference call.", + "creator": "Whether we're created this group call.", "flags": "Flags, see TL conditional fields", "id": "Group call ID", + "invite_link": "Invitation link for the conference.", "join_date_asc": "Specifies the ordering to use when locally sorting by date and displaying in the UI group call participants.", "join_muted": "Whether the user should be muted upon joining the call", "listeners_hidden": "Whether the listeners list is hidden and cannot be fetched using phone.getGroupParticipants. The phone.groupParticipants.count and groupCall.participants_count counters will still include listeners.", @@ -2126,6 +2280,14 @@ "id": "Group call ID" } }, + "GroupCallDonor": { + "desc": "", + "params": {} + }, + "GroupCallMessage": { + "desc": "", + "params": {} + }, "GroupCallParticipant": { "desc": "Info about a group call participant", "params": { @@ -2404,64 +2566,64 @@ } }, "InputBusinessAwayMessage": { - "desc": "{schema}", + "desc": "Describes a Telegram Business away message, automatically sent to users writing to us when we're offline, during closing hours, while we're on vacation, or in some other custom time period when we cannot immediately answer to the user.", "params": { "flags": "Flags, see TL conditional fields", - "offline_only": "", - "recipients": "", - "schedule": "", - "shortcut_id": "" + "offline_only": "If set, the messages will not be sent if the account was online in the last 10 minutes.", + "recipients": "Allowed recipients for the away messages.", + "schedule": "Specifies when should the away messages be sent.", + "shortcut_id": "ID of a quick reply shorcut, containing the away messages to send, see here \u00bb for more info." } }, "InputBusinessBotRecipients": { - "desc": "{schema}", + "desc": "Specifies the private chats that a connected business bot \u00bb may interact with.", "params": { - "contacts": "", - "exclude_selected": "", - "exclude_users": "", - "existing_chats": "", + "contacts": "Selects all private chats with contacts.", + "exclude_selected": "If set, then all private chats except the ones selected by existing_chats, new_chats, contacts, non_contacts and users are chosen. Note that if this flag is set, any values passed in exclude_users will be merged and moved into users by the server.", + "exclude_users": "Identifiers of private chats that are always excluded.", + "existing_chats": "Selects all existing private chats.", "flags": "Flags, see TL conditional fields", - "new_chats": "", - "non_contacts": "", - "users": "" + "new_chats": "Selects all new private chats.", + "non_contacts": "Selects all private chats with non-contacts.", + "users": "Explicitly selected private chats." } }, "InputBusinessChatLink": { - "desc": "{schema}", + "desc": "Contains info about a business chat deep link \u00bb to be created by the current account.", "params": { "entities": "Message entities for styled text", "flags": "Flags, see TL conditional fields", - "message": "", - "title": "" + "message": "Message to pre-fill in the message input field.", + "title": "Human-readable name of the link, to simplify management in the UI (only visible to the creator of the link)." } }, "InputBusinessGreetingMessage": { - "desc": "{schema}", + "desc": "Describes a Telegram Business greeting, automatically sent to new users writing to us in private for the first time, or after a certain inactivity period.", "params": { - "no_activity_days": "", - "recipients": "", - "shortcut_id": "" + "no_activity_days": "The number of days after which a private chat will be considered as inactive; currently, must be one of 7, 14, 21, or 28.", + "recipients": "Allowed recipients for the greeting messages.", + "shortcut_id": "ID of a quick reply shorcut, containing the greeting messages to send, see here \u00bb for more info." } }, "InputBusinessIntro": { - "desc": "{schema}", + "desc": "Telegram Business introduction \u00bb.", "params": { - "description": "", + "description": "Profile introduction", "flags": "Flags, see TL conditional fields", - "sticker": "", - "title": "" + "sticker": "Optional introduction sticker.", + "title": "Title of the introduction message" } }, "InputBusinessRecipients": { - "desc": "{schema}", + "desc": "Specifies the chats that can receive Telegram Business away \u00bb and greeting \u00bb messages.", "params": { - "contacts": "", - "exclude_selected": "", - "existing_chats": "", + "contacts": "All private chats with contacts.", + "exclude_selected": "If set, inverts the selection.", + "existing_chats": "All existing private chats.", "flags": "Flags, see TL conditional fields", - "new_chats": "", - "non_contacts": "", - "users": "" + "new_chats": "All new private chats.", + "non_contacts": "All private chats with non-contacts.", + "users": "Only private chats with the specified users." } }, "InputChannel": { @@ -2493,6 +2655,22 @@ "desc": "Empty constructor, remove group photo.", "params": {} }, + "InputChatTheme": { + "desc": "Set an emoji-based chat theme, returned by account.getChatThemes.", + "params": { + "emoticon": "The emoji." + } + }, + "InputChatThemeEmpty": { + "desc": "Remove any currently configured theme.", + "params": {} + }, + "InputChatThemeUniqueGift": { + "desc": "Set a theme based on an owned collectible gift \u00bb, returned by account.getUniqueGiftChatThemes.", + "params": { + "slug": "The slug from starGiftUnique.slug." + } + }, "InputChatUploadedPhoto": { "desc": "New photo to be set as group profile photo.", "params": { @@ -2529,15 +2707,15 @@ } }, "InputCollectiblePhone": { - "desc": "{schema}", + "desc": "Represents a phone number fragment collectible", "params": { - "phone": "" + "phone": "Phone number" } }, "InputCollectibleUsername": { - "desc": "{schema}", + "desc": "Represents a username fragment collectible", "params": { - "username": "" + "username": "Username" } }, "InputDialogPeer": { @@ -2573,6 +2751,14 @@ "thumb_size": "Thumbnail size to download the thumbnail" } }, + "InputEmojiStatusCollectible": { + "desc": "An owned collectible gift \u00bb as emoji status: can only be used in account.updateEmojiStatus, is never returned by the API.", + "params": { + "collectible_id": "ID of the collectible (from starGiftUnique.id).", + "flags": "Flags, see TL conditional fields", + "until": "If set, the emoji status will be active until the specified unixtime." + } + }, "InputEncryptedChat": { "desc": "Creates an encrypted chat.", "params": { @@ -2641,6 +2827,12 @@ "volume_id": "Server volume" } }, + "InputFileStoryDocument": { + "desc": "Used to edit the thumbnail/static preview of a story, see here \u00bb for more info on the full flow.", + "params": { + "id": "The old story video." + } + }, "InputFolderPeer": { "desc": "Peer in a folder", "params": { @@ -2682,6 +2874,18 @@ "id": "Group call ID" } }, + "InputGroupCallInviteMessage": { + "desc": "Join a group call through a messageActionConferenceCall invitation message.", + "params": { + "msg_id": "ID of the messageActionConferenceCall." + } + }, + "InputGroupCallSlug": { + "desc": "Join a conference call through an invitation link \u00bb.", + "params": { + "slug": "Slug from the conference link \u00bb." + } + }, "InputGroupCallStream": { "desc": "Chunk of a livestream", "params": { @@ -2693,43 +2897,119 @@ "video_quality": "Selected video quality (0 = lowest, 1 = medium, 2 = best)" } }, + "InputInvoiceBusinessBotTransferStars": { + "desc": "Transfer stars from the balance of a user account connected to a business bot, to the balance of the business bot, see here \u00bb for more info on the full flow.", + "params": { + "bot": "Always inputUserSelf.", + "stars": "The number of stars to transfer." + } + }, + "InputInvoiceChatInviteSubscription": { + "desc": "Used to pay for a Telegram Star subscription \u00bb.", + "params": { + "hash": "The invitation link of the Telegram Star subscription \u00bb" + } + }, "InputInvoiceMessage": { - "desc": "An invoice contained in a messageMediaInvoice message.", + "desc": "An invoice contained in a messageMediaInvoice message or paid media \u00bb.", "params": { "msg_id": "Message ID", - "peer": "Chat where the invoice was sent" + "peer": "Chat where the invoice/paid media was sent" } }, + "InputInvoicePremiumAuthCode": { + "desc": "", + "params": {} + }, "InputInvoicePremiumGiftCode": { - "desc": "Used if the user wishes to start a channel giveaway or send some giftcodes to members of a channel, in exchange for boosts.", + "desc": "Used if the user wishes to start a channel/supergroup giveaway or send some giftcodes to members of a channel/supergroup, in exchange for boosts.", "params": { "option": "Should be populated with one of the giveaway options returned by payments.getPremiumGiftCodeOptions, see the giveaways \u00bb documentation for more info.", "purpose": "Should be populated with inputStorePaymentPremiumGiveaway for giveaways and inputStorePaymentPremiumGiftCode for gifts." } }, + "InputInvoicePremiumGiftStars": { + "desc": "Used to gift a Telegram Premium subscription to another user, paying with Telegram Stars.", + "params": { + "flags": "Flags, see TL conditional fields", + "message": "Message attached with the gift.", + "months": "Duration of the subscription in months, must be one of the options with currency == \"XTR\" returned by payments.getPremiumGiftCodeOptions.", + "user_id": "Who will receive the gifted subscription." + } + }, "InputInvoiceSlug": { "desc": "An invoice slug taken from an invoice deep link or from the premium_invoice_slug app config parameter \u00bb", "params": { "slug": "The invoice slug" } }, + "InputInvoiceStarGift": { + "desc": "Used to buy a Telegram Star Gift, see here \u00bb for more info.", + "params": { + "flags": "Flags, see TL conditional fields", + "gift_id": "Identifier of the gift, from starGift.id", + "hide_name": "If set, your name will be hidden if the destination user decides to display the gift on their profile (they will still see that you sent the gift)", + "include_upgrade": "Also pay for an eventual upgrade of the gift to a collectible gift \u00bb.", + "message": "Optional message, attached with the gift. The maximum length for this field is specified in the stargifts_message_length_max client configuration value \u00bb.", + "peer": "Receiver of the gift." + } + }, + "InputInvoiceStarGiftAuctionBid": { + "desc": "", + "params": {} + }, + "InputInvoiceStarGiftDropOriginalDetails": { + "desc": "", + "params": {} + }, + "InputInvoiceStarGiftPrepaidUpgrade": { + "desc": "Separately prepay for the upgrade of a gift \u00bb.", + "params": { + "hash": "The upgrade hash from messageActionStarGift.prepaid_upgrade_hash or savedStarGift.prepaid_upgrade_hash.", + "peer": "The peer that owns the gift." + } + }, + "InputInvoiceStarGiftResale": { + "desc": "Used to buy a collectible gift currently up on resale, see here for more info on the full flow.", + "params": { + "flags": "Flags, see TL conditional fields", + "slug": "Slug of the gift to buy.", + "to_id": "The receiver of the gift.", + "ton": "Buy the gift using TON." + } + }, + "InputInvoiceStarGiftTransfer": { + "desc": "Used to pay to transfer a collectible gift to another peer, see the gifts \u00bb documentation for more info.", + "params": { + "stargift": "The identifier of the received gift", + "to_id": "The destination peer" + } + }, + "InputInvoiceStarGiftUpgrade": { + "desc": "Used to pay to upgrade a Gift to a collectible gift, see the collectible gifts \u00bb documentation for more info on the full flow.", + "params": { + "flags": "Flags, see TL conditional fields", + "keep_original_details": "Set this flag to keep the original gift text, sender and receiver in the upgraded gift as a starGiftAttributeOriginalDetails attribute.", + "stargift": "The identifier of the received gift to upgrade." + } + }, "InputInvoiceStars": { - "desc": "{schema}", + "desc": "Used to top up the Telegram Stars balance of the current account or someone else's account, or to start a Telegram Star giveaway \u00bb.", "params": { - "option": "" + "purpose": "An inputStorePaymentStarsGiveaway, inputStorePaymentStarsTopup or inputStorePaymentStarsGift." } }, "InputKeyboardButtonRequestPeer": { - "desc": "{schema}", + "desc": "Prompts the user to select and share one or more peers with the bot using messages.sendBotRequestedPeer.", "params": { - "button_id": "", + "button_id": "Button ID, to be passed to messages.sendBotRequestedPeer.", "flags": "Flags, see TL conditional fields", - "max_quantity": "", - "name_requested": "", - "peer_type": "", - "photo_requested": "", - "text": "", - "username_requested": "" + "max_quantity": "Maximum number of peers that can be chosen.", + "name_requested": "Set this flag to request the peer's name.", + "peer_type": "Filtering criteria to use for the peer selection list shown to the user. The list should display all existing peers of the specified type, and should also offer an option for the user to create and immediately use one or more (up to max_quantity) peers of the specified type, if needed.", + "photo_requested": "Set this flag to request the peer's photo (if any).", + "text": "Button text", + "username_requested": "Set this flag to request the peer's @username (if any)." } }, "InputKeyboardButtonUrlAuth": { @@ -2788,7 +3068,9 @@ "id": "The document to be forwarded.", "query": "Text query or emoji that was used by the user to find this sticker or GIF: used to improve search result relevance.", "spoiler": "Whether this media should be hidden behind a spoiler warning", - "ttl_seconds": "Time to live of self-destructing document" + "ttl_seconds": "Time to live of self-destructing document", + "video_cover": "Custom video cover.", + "video_timestamp": "Start playing the video at the specified timestamp (seconds)." } }, "InputMediaDocumentExternal": { @@ -2797,7 +3079,9 @@ "flags": "Flags, see TL conditional fields", "spoiler": "Whether this media should be hidden behind a spoiler warning", "ttl_seconds": "Self-destruct time to live of document", - "url": "URL of the document" + "url": "URL of the document", + "video_cover": "Custom video cover.", + "video_timestamp": "Start playing the video at the specified timestamp (seconds)." } }, "InputMediaEmpty": { @@ -2831,7 +3115,7 @@ "desc": "Generated invoice of a bot payment", "params": { "description": "Product description, 1-255 characters", - "extended_media": "Extended media", + "extended_media": "Deprecated", "flags": "Flags, see TL conditional fields", "invoice": "The actual invoice", "payload": "Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes.", @@ -2842,6 +3126,15 @@ "title": "Product name, 1-32 characters" } }, + "InputMediaPaidMedia": { + "desc": "Paid media, see here \u00bb for more info.", + "params": { + "extended_media": "Photos or videos.", + "flags": "Flags, see TL conditional fields", + "payload": "Bots only, specifies a custom payload that will then be passed in updateBotPurchasedPaidMedia when a payment is made (this field will not be visible to the user)", + "stars_amount": "The price of the media in Telegram Stars." + } + }, "InputMediaPhoto": { "desc": "Forwarded photo", "params": { @@ -2870,6 +3163,10 @@ "solution_entities": "Message entities for styled text" } }, + "InputMediaStakeDice": { + "desc": "", + "params": {} + }, "InputMediaStory": { "desc": "Forwarded story", "params": { @@ -2877,6 +3174,12 @@ "peer": "Peer where the story was posted" } }, + "InputMediaTodo": { + "desc": "Creates a todo list \u00bb.", + "params": { + "todo": "The todo list." + } + }, "InputMediaUploadedDocument": { "desc": "New document", "params": { @@ -2885,11 +3188,13 @@ "flags": "Flags, see TL conditional fields", "force_file": "Force the media file to be uploaded as document", "mime_type": "MIME type of document", - "nosound_video": "Whether the specified document is a video file with no audio tracks (a GIF animation (even as MPEG4), for example)", + "nosound_video": "Whether to send the file as a video even if it doesn't have an audio track (i.e. if set, the documentAttributeAnimated attribute will not be set even for videos without audio)", "spoiler": "Whether this media should be hidden behind a spoiler warning", "stickers": "Attached stickers", "thumb": "Thumbnail of the document, uploaded as for the file", - "ttl_seconds": "Time to live in seconds of self-destructing document" + "ttl_seconds": "Time to live in seconds of self-destructing document", + "video_cover": "Start playing the video at the specified timestamp (seconds).", + "video_timestamp": "Start playing the video at the specified timestamp (seconds)." } }, "InputMediaUploadedPhoto": { @@ -2997,6 +3302,10 @@ "desc": "Filter for messages containing photos or videos.", "params": {} }, + "InputMessagesFilterPhotoVideoDocuments": { + "desc": "", + "params": {} + }, "InputMessagesFilterPhotos": { "desc": "Filter for messages containing photos.", "params": {} @@ -3050,6 +3359,22 @@ "desc": "Notifications generated by all users.", "params": {} }, + "InputPasskeyCredentialFirebasePNV": { + "desc": "", + "params": {} + }, + "InputPasskeyCredentialPublicKey": { + "desc": "", + "params": {} + }, + "InputPasskeyResponseLogin": { + "desc": "", + "params": {} + }, + "InputPasskeyResponseRegister": { + "desc": "", + "params": {} + }, "InputPaymentCredentials": { "desc": "Payment credentials", "params": { @@ -3098,6 +3423,10 @@ "chat_id": "Chat identifier" } }, + "InputPeerColorCollectible": { + "desc": "", + "params": {} + }, "InputPeerEmpty": { "desc": "An empty constructor, no user or chat is defined.", "params": {} @@ -3200,7 +3529,7 @@ "params": {} }, "InputPrivacyKeyBirthday": { - "desc": "{schema}", + "desc": "Whether the user can see our birthday.", "params": {} }, "InputPrivacyKeyChatInvite": { @@ -3211,6 +3540,10 @@ "desc": "Whether messages forwarded from you will be anonymous", "params": {} }, + "InputPrivacyKeyNoPaidMessages": { + "desc": "Who can send you messages without paying, if paid messages \u00bb are enabled.", + "params": {} + }, "InputPrivacyKeyPhoneCall": { "desc": "Whether you will accept phone calls", "params": {} @@ -3227,22 +3560,34 @@ "desc": "Whether people will be able to see your profile picture", "params": {} }, + "InputPrivacyKeySavedMusic": { + "desc": "", + "params": {} + }, + "InputPrivacyKeyStarGiftsAutoSave": { + "desc": "Whether received gifts will be automatically displayed on our profile", + "params": {} + }, "InputPrivacyKeyStatusTimestamp": { - "desc": "Whether people will be able to see your exact last online timestamp", + "desc": "Whether people will be able to see our exact last online timestamp.", "params": {} }, "InputPrivacyKeyVoiceMessages": { - "desc": "Whether people can send you voice messages", + "desc": "Whether people can send you voice messages or round videos (Premium users only).", "params": {} }, "InputPrivacyValueAllowAll": { "desc": "Allow all users", "params": {} }, + "InputPrivacyValueAllowBots": { + "desc": "Allow bots and mini apps", + "params": {} + }, "InputPrivacyValueAllowChatParticipants": { "desc": "Allow only participants of certain chats", "params": { - "chats": "Allowed chat IDs" + "chats": "Allowed chat IDs (either a chat or a supergroup ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way))." } }, "InputPrivacyValueAllowCloseFriends": { @@ -3254,7 +3599,7 @@ "params": {} }, "InputPrivacyValueAllowPremium": { - "desc": "{schema}", + "desc": "Allow only users with a Premium subscription \u00bb, currently only usable for inputPrivacyKeyChatInvite.", "params": {} }, "InputPrivacyValueAllowUsers": { @@ -3267,10 +3612,14 @@ "desc": "Disallow all", "params": {} }, + "InputPrivacyValueDisallowBots": { + "desc": "Disallow bots and mini apps", + "params": {} + }, "InputPrivacyValueDisallowChatParticipants": { "desc": "Disallow only participants of certain chats", "params": { - "chats": "Disallowed chat IDs" + "chats": "Disallowed chat IDs (either a chat or a supergroup ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way))." } }, "InputPrivacyValueDisallowContacts": { @@ -3284,33 +3633,41 @@ } }, "InputQuickReplyShortcut": { - "desc": "{schema}", + "desc": "Selects a quick reply shortcut by name.", "params": { - "shortcut": "" + "shortcut": "Shortcut name." } }, "InputQuickReplyShortcutId": { - "desc": "{schema}", + "desc": "Selects a quick reply shortcut by its numeric ID.", "params": { - "shortcut_id": "" + "shortcut_id": "Shortcut ID." } }, "InputReplyToMessage": { "desc": "Reply to a message.", "params": { "flags": "Flags, see TL conditional fields", + "monoforum_peer_id": "Must be set to the ID of the topic when replying to a message within a monoforum topic.", "quote_entities": "Message entities for styled text from the quote_text field.", "quote_offset": "Offset of the message quote_text within the original message (in UTF-16 code units).", "quote_text": "Used to quote-reply to only a certain section (specified here) of the original message. The maximum UTF-8 length for quotes is specified in the quote_length_max config key.", "reply_to_msg_id": "The message ID to reply to.", "reply_to_peer_id": "Used to reply to messages sent to another chat (specified here), can only be used for non-protected chats and messages.", + "todo_item_id": "Can be set to reply to the specified item of a todo list \u00bb.", "top_msg_id": "This field must contain the topic ID only when replying to messages in forum topics different from the \"General\" topic (i.e. reply_to_msg_id is set and reply_to_msg_id != topicID and topicID != 1). If the replied-to message is deleted before the method finishes execution, the value in this field will be used to send the message to the correct topic, instead of the \"General\" topic." } }, + "InputReplyToMonoForum": { + "desc": "Used to send messages to a monoforum topic.", + "params": { + "monoforum_peer_id": "The topic ID." + } + }, "InputReplyToStory": { "desc": "Reply to a story.", "params": { - "peer": "", + "peer": "Sender of the story", "story_id": "ID of the story to reply to." } }, @@ -3354,6 +3711,25 @@ "desc": "Report for violence", "params": {} }, + "InputSavedStarGiftChat": { + "desc": "A gift received by a channel we own.", + "params": { + "peer": "The channel.", + "saved_id": "ID of the gift, must be the saved_id of a messageActionStarGift/messageActionStarGiftUnique constructor." + } + }, + "InputSavedStarGiftSlug": { + "desc": "Points to a collectible gift obtained from a collectible gift link \u00bb.", + "params": { + "slug": "Slug from the link." + } + }, + "InputSavedStarGiftUser": { + "desc": "A gift received in a private chat with another user.", + "params": { + "msg_id": "ID of the messageService with the messageActionStarGift with the gift." + } + }, "InputSecureFile": { "desc": "Pre-uploaded passport file, for more info see the passport docs \u00bb", "params": { @@ -3402,6 +3778,22 @@ "random_id": "Unique client media ID required to prevent message resending" } }, + "InputStarGiftAuction": { + "desc": "", + "params": {} + }, + "InputStarGiftAuctionSlug": { + "desc": "", + "params": {} + }, + "InputStarsTransaction": { + "desc": "Used to fetch info about a Telegram Star transaction \u00bb.", + "params": { + "flags": "Flags, see TL conditional fields", + "id": "Transaction ID.", + "refund": "If set, fetches info about the refund transaction for this transaction." + } + }, "InputStickerSetAnimatedEmoji": { "desc": "Animated emojis stickerset", "params": {} @@ -3470,6 +3862,10 @@ "thumb_version": "Thumbnail version" } }, + "InputStickerSetTonGifts": { + "desc": "TON gifts stickerset.", + "params": {} + }, "InputStickeredMediaDocument": { "desc": "A document with stickers attached", "params": { @@ -3482,6 +3878,17 @@ "id": "The photo" } }, + "InputStorePaymentAuthCode": { + "desc": "Indicates payment for a login code.", + "params": { + "amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "phone_code_hash": "phone_code_hash returned by auth.sendCode.", + "phone_number": "Phone number.", + "restore": "Set this flag to restore a previously made purchase." + } + }, "InputStorePaymentGiftPremium": { "desc": "Info about a gifted Telegram Premium purchase", "params": { @@ -3491,12 +3898,13 @@ } }, "InputStorePaymentPremiumGiftCode": { - "desc": "Used to gift Telegram Premium subscriptions only to some specific subscribers of a channel or to some of our contacts, see here \u00bb for more info on giveaways and gifts.", + "desc": "Used to gift Telegram Premium subscriptions only to some specific subscribers of a channel/supergroup or to some of our contacts, see here \u00bb for more info on giveaways and gifts.", "params": { "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", - "boost_peer": "If set, the gifts will be sent on behalf of a channel we are an admin of, which will also assign some boosts to it. Otherwise, the gift will be sent directly from the currently logged in users, and we will gain some extra boost slots. See here \u00bb for more info on giveaways and gifts.", + "boost_peer": "If set, the gifts will be sent on behalf of a channel/supergroup we are an admin of, which will also assign some boosts to it. Otherwise, the gift will be sent directly from the currently logged in user, and we will gain some extra boost slots. See here \u00bb for more info on giveaways and gifts.", "currency": "Three-letter ISO 4217 currency code", "flags": "Flags, see TL conditional fields", + "message": "Message attached with the gift", "users": "The users that will receive the Telegram Premium subscriptions." } }, @@ -3505,7 +3913,7 @@ "params": { "additional_peers": "Additional channels that the user must join to participate to the giveaway can be specified here.", "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", - "boost_peer": "The channel starting the giveaway, that the user must join to participate, that will receive the giveaway boosts; see here \u00bb for more info on giveaways.", + "boost_peer": "The channel/supergroup starting the giveaway, that the user must join to participate, that will receive the giveaway boosts; see here \u00bb for more info on giveaways.", "countries_iso2": "The set of users that can participate to the giveaway can be restricted by passing here an explicit whitelist of up to giveaway_countries_max countries, specified as two-letter ISO 3166-1 alpha-2 country codes.", "currency": "Three-letter ISO 4217 currency code", "flags": "Flags, see TL conditional fields", @@ -3524,31 +3932,59 @@ "upgrade": "Pass true if this is an upgrade from a monthly subscription to a yearly subscription; only for App Store" } }, - "InputStorePaymentStars": { - "desc": "{schema}", - "params": { - "amount": "", - "currency": "", - "flags": "Flags, see TL conditional fields", - "stars": "" - } - }, - "InputTakeoutFileLocation": { - "desc": "Used to download a JSON file that will contain all personal data related to features that do not have a specialized takeout method yet, see here \u00bb for more info on the takeout API.", - "params": {} - }, - "InputTheme": { - "desc": "Theme", + "InputStorePaymentStarsGift": { + "desc": "Used to gift Telegram Stars to a friend.", "params": { - "access_hash": "Access hash", - "id": "ID" + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "stars": "Amount of stars to gift", + "user_id": "The user to which the stars should be gifted." } }, - "InputThemeSettings": { - "desc": "Theme settings", + "InputStorePaymentStarsGiveaway": { + "desc": "Used to pay for a star giveaway, see here \u00bb for more info.", "params": { - "accent_color": "Accent color, ARGB format", - "base_theme": "Default theme on which this theme is based", + "additional_peers": "Additional channels that the user must join to participate to the giveaway can be specified here.", + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "boost_peer": "The channel/supergroup starting the giveaway, that the user must join to participate, that will receive the giveaway boosts; see here \u00bb for more info on giveaways.", + "countries_iso2": "The set of users that can participate to the giveaway can be restricted by passing here an explicit whitelist of up to giveaway_countries_max countries, specified as two-letter ISO 3166-1 alpha-2 country codes.", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "only_new_subscribers": "If set, only new subscribers starting from the giveaway creation date will be able to participate to the giveaway.", + "prize_description": "Can contain a textual description of additional giveaway prizes.", + "random_id": "Random ID to avoid resending the giveaway", + "stars": "Total number of Telegram Stars being given away (each user will receive stars/users stars).", + "until_date": "The end date of the giveaway, must be at most giveaway_period_max seconds in the future; see here \u00bb for more info on giveaways.", + "users": "Number of winners.", + "winners_are_visible": "If set, giveaway winners are public and will be listed in a messageMediaGiveawayResults message that will be automatically sent to the channel once the giveaway ends." + } + }, + "InputStorePaymentStarsTopup": { + "desc": "Used to top up the Telegram Stars balance of the current account.", + "params": { + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "spend_purpose_peer": "Should be populated with the peer where the topup process was initiated due to low funds (i.e. a bot for bot payments, a channel for paid media/reactions, etc); leave this flag unpopulated if the topup flow was not initated when attempting to spend more Stars than currently available on the account's balance.", + "stars": "Amount of stars to topup" + } + }, + "InputTakeoutFileLocation": { + "desc": "Used to download a JSON file that will contain all personal data related to features that do not have a specialized takeout method yet, see here \u00bb for more info on the takeout API.", + "params": {} + }, + "InputTheme": { + "desc": "Theme", + "params": { + "access_hash": "Access hash", + "id": "ID" + } + }, + "InputThemeSettings": { + "desc": "Theme settings", + "params": { + "accent_color": "Accent color, ARGB format", + "base_theme": "Default theme on which this theme is based", "flags": "Flags, see TL conditional fields", "message_colors": "The fill to be used as a background for outgoing messages, in RGB24 format. If just one or two equal colors are provided, describes a solid fill of a background. If two different colors are provided, describes the top and bottom colors of a 0-degree gradient.If three or four colors are provided, describes a freeform gradient fill of a background.", "message_colors_animated": "If set, the freeform gradient fill needs to be animated on every sent message", @@ -3645,7 +4081,7 @@ "Invoice": { "desc": "Invoice", "params": { - "currency": "Three-letter ISO 4217 currency code", + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", "email_requested": "Set this flag if you require the user's email address to complete the order", "email_to_provider": "Set this flag if user's email address should be sent to provider", "flags": "Flags, see TL conditional fields", @@ -3657,6 +4093,7 @@ "prices": "Price breakdown, a list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.)", "recurring": "Whether this is a recurring payment", "shipping_address_requested": "Set this flag if you require the user's shipping address to complete the order", + "subscription_period": "The number of seconds between consecutive Telegram Star debiting for bot subscription invoices", "suggested_tip_amounts": "A vector of suggested amounts of tips in the smallest units of the currency (integer, not float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed max_tip_amount.", "terms_url": "Terms of service URL", "test": "Test invoice" @@ -3724,6 +4161,13 @@ "text": "Button text" } }, + "KeyboardButtonCopy": { + "desc": "Clipboard button: when clicked, the attached text must be copied to the clipboard.", + "params": { + "copy_text": "The text that will be copied to the clipboard", + "text": "Title of the button" + } + }, "KeyboardButtonGame": { "desc": "Button to start a game", "params": { @@ -3740,7 +4184,7 @@ "desc": "Prompts the user to select and share one or more peers with the bot using messages.sendBotRequestedPeer", "params": { "button_id": "Button ID, to be passed to messages.sendBotRequestedPeer.", - "max_quantity": "Maximum number of peers that can be chosne.", + "max_quantity": "Maximum number of peers that can be chosen.", "peer_type": "Filtering criteria to use for the peer selection list shown to the user. The list should display all existing peers of the specified type, and should also offer an option for the user to create and immediately use one or more (up to max_quantity) peers of the specified type, if needed.", "text": "Button text" } @@ -3772,6 +4216,10 @@ "url": "Web app URL" } }, + "KeyboardButtonStyle": { + "desc": "", + "params": {} + }, "KeyboardButtonSwitchInline": { "desc": "Button to force a user to switch to inline mode: pressing the button will prompt the user to select one of their chats, open that chat and insert the bot's username and the specified inline query in the input field.", "params": { @@ -3890,9 +4338,11 @@ } }, "MediaAreaCoordinates": { - "desc": "Coordinates and size of a clicable rectangular area on top of a story.", + "desc": "Coordinates and size of a clickable rectangular area on top of a story.", "params": { + "flags": "Flags, see TL conditional fields", "h": "The height of the rectangle, as a percentage of the media height (0-100).", + "radius": "The radius of the rectangle corner rounding, as a percentage of the media width.", "rotation": "Clockwise rotation angle of the rectangle, in degrees (0-360).", "w": "The width of the rectangle, as a percentage of the media width (0-100).", "x": "The abscissa of the rectangle's center, as a percentage of the media width (0-100).", @@ -3902,10 +4352,19 @@ "MediaAreaGeoPoint": { "desc": "Represents a geolocation tag attached to a story.", "params": { + "address": "Optional textual representation of the address.", "coordinates": "The size and position of the media area corresponding to the location sticker on top of the story media.", + "flags": "Flags, see TL conditional fields", "geo": "Coordinates of the geolocation tag." } }, + "MediaAreaStarGift": { + "desc": "Represents a collectible gift \u00bb.", + "params": { + "coordinates": "Coordinates of the media area.", + "slug": "slug from starGiftUnique.slug, that can be resolved as specified here \u00bb." + } + }, "MediaAreaSuggestedReaction": { "desc": "Represents a reaction bubble.", "params": { @@ -3916,6 +4375,13 @@ "reaction": "The reaction that should be sent when this area is clicked." } }, + "MediaAreaUrl": { + "desc": "Represents a URL media area.", + "params": { + "coordinates": "The size and location of the media area corresponding to the URL button on top of the story media.", + "url": "URL to open when clicked." + } + }, "MediaAreaVenue": { "desc": "Represents a location tag attached to a story, with additional venue information.", "params": { @@ -3928,19 +4394,28 @@ "venue_type": "Venue type in the provider's database" } }, + "MediaAreaWeather": { + "desc": "Represents a weather widget \u00bb.", + "params": { + "color": "ARGB background color.", + "coordinates": "The size and location of the media area corresponding to the widget on top of the story media.", + "emoji": "Weather emoji, should be rendered as an animated emoji.", + "temperature_c": "Temperature in degrees Celsius." + } + }, "Message": { "desc": "A message", "params": { "date": "Date of the message", "edit_date": "Last edit date of this message", "edit_hide": "Whether the message should be shown as not modified to the user, even if an edit date is present", - "effect": "", + "effect": "A message effect that should be played as specified here \u00bb.", "entities": "Message entities for styled text", - "factcheck": "", + "factcheck": "Represents a fact-check \u00bb.", "flags": "Flags, see TL conditional fields", - "flags2": "", + "flags2": "Flags, see TL conditional fields", "forwards": "Forward counter", - "from_boosts_applied": "", + "from_boosts_applied": "Supergroups only, contains the number of boosts this user has given the current supergroup, and should be shown in the UI in the header of the message. Only present for incoming messages from non-anonymous supergroup members that have boosted the supergroup. Note that this counter should be locally overridden for non-anonymous outgoing messages, according to the current value of channelFull.boosts_applied, to ensure the value is correct even for messages sent by the current user before a supergroup was boosted (or after a boost has expired or the number of boosts has changed); do not update this value for incoming messages from other users, even if their boosts have changed.", "from_id": "ID of the sender of the message", "from_scheduled": "Whether this is a scheduled message", "fwd_from": "Info about forwarded messages", @@ -3953,30 +4428,36 @@ "mentioned": "Whether we were mentioned in this message", "message": "The message", "noforwards": "Whether this message is protected and thus cannot be forwarded; clients should also prevent users from saving attached media (i.e. videos should only be streamed, photos should be kept in RAM, et cetera).", - "offline": "", + "offline": "If set, the message was sent because of a scheduled action by the message sender, for example, as away, or a greeting service message.", "out": "Is this an outgoing message", + "paid_message_stars": "The amount of stars the sender has paid to send the message, see here \u00bb for more info.", + "paid_suggested_post_stars": "Set if this is a suggested channel post \u00bb that was paid using Telegram Stars.", + "paid_suggested_post_ton": "Set if this is a suggested channel post \u00bb that was paid using Toncoins.", "peer_id": "Peer ID, the chat where this message was sent", "pinned": "Whether this message is pinned", "post": "Whether this is a channel post", "post_author": "Name of the author of this message for channel posts (with signatures enabled)", - "quick_reply_shortcut_id": "", + "quick_reply_shortcut_id": "If set, this message is a quick reply shortcut message \u00bb (note that quick reply shortcut messages sent to a private chat will not have this field set).", "reactions": "Reactions to this message", "replies": "Info about post comments (for channels) or message replies (for groups)", "reply_markup": "Reply markup (bot/inline keyboards)", "reply_to": "Reply information", + "report_delivery_until_date": "Used for Telegram Gateway verification messages: if set and the current unixtime is bigger than the specified unixtime, invoke messages.reportMessagesDelivery passing the ID and the peer of this message as soon as it is received by the client (optionally batching requests for the same peer).", "restriction_reason": "Contains the reason why access to this message must be restricted.", - "saved_peer_id": "Messages fetched from a saved messages dialog \u00bb will have peer=inputPeerSelf and the saved_peer_id flag set to the ID of the saved dialog.", + "saved_peer_id": "Messages from a saved messages dialog \u00bb will have peer=inputPeerSelf and the saved_peer_id flag set to the ID of the saved dialog.Messages from a monoforum \u00bb will have peer=ID of the monoforum and the saved_peer_id flag set to the ID of a topic.", "silent": "Whether this is a silent message (no notification triggered)", + "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow.", "ttl_period": "Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well.", "via_bot_id": "ID of the inline bot that generated the message", - "via_business_bot_id": "", + "via_business_bot_id": "Whether the message was sent by the business bot specified in via_bot_id on behalf of the user.", + "video_processing_pending": "The video contained in the message is currently being processed by the server (i.e. to generate alternative qualities, that will be contained in the final messageMediaDocument.alt_document), and will be sent once the video is processed, which will happen approximately at the specified date (i.e. messages with this flag set should be treated similarly to scheduled messages, but instead of the scheduled date, date contains the estimated conversion date). See here \u00bb for more info.", "views": "View count for channel posts" } }, "MessageActionBoostApply": { - "desc": "{schema}", + "desc": "Some boosts \u00bb were applied to the channel or supergroup.", "params": { - "boosts": "" + "boosts": "Number of applied boosts." } }, "MessageActionBotAllowed": { @@ -3989,6 +4470,10 @@ "from_request": "We have allowed the bot to send us messages using bots.allowSendMessage \u00bb." } }, + "MessageActionChangeCreator": { + "desc": "", + "params": {} + }, "MessageActionChannelCreate": { "desc": "The channel was created", "params": { @@ -4053,10 +4538,26 @@ "channel_id": "The supergroup it was migrated to" } }, + "MessageActionConferenceCall": { + "desc": "Represents a conference call (or an invitation to a conference call, if neither the missed nor active flags are set).", + "params": { + "active": "Whether the user is currently in the conference call.", + "call_id": "Call ID.", + "duration": "Call duration, for left calls only.", + "flags": "Flags, see TL conditional fields", + "missed": "Whether the conference call has ended and the user hasn't joined.", + "other_participants": "Identifiers of some other call participants.", + "video": "Whether this is a video conference call." + } + }, "MessageActionContactSignUp": { "desc": "A contact just signed up to telegram", "params": {} }, + "MessageActionCreatedBroadcastList": { + "desc": "", + "params": {} + }, "MessageActionCustomAction": { "desc": "Custom action (most likely not supported by the current layer, an upgrade might be needed)", "params": { @@ -4086,15 +4587,16 @@ "desc": "Contains a Telegram Premium giftcode link.", "params": { "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", - "boost_peer": "Identifier of the channel that created the gift code either directly or through a giveaway: if we import this giftcode link, we will also automatically boost this channel.", + "boost_peer": "Identifier of the channel/supergroup that created the gift code either directly or through a giveaway: if we import this giftcode link, we will also automatically boost this channel/supergroup.", "crypto_amount": "If crypto_currency is set, contains the paid amount, in the smallest units of the cryptocurrency.", "crypto_currency": "If set, the gift was made using the specified cryptocurrency.", "currency": "Three-letter ISO 4217 currency code", "flags": "Flags, see TL conditional fields", + "message": "Message attached with the gift", "months": "Duration in months of the gifted Telegram Premium subscription.", "slug": "Slug of the Telegram Premium giftcode link", "unclaimed": "If set, the link was not redeemed yet.", - "via_giveaway": "If set, this gift code was received from a giveaway \u00bb started by a channel we're subscribed to." + "via_giveaway": "If set, this gift code was received from a giveaway \u00bb started by a channel/supergroup we're subscribed to." } }, "MessageActionGiftPremium": { @@ -4105,16 +4607,45 @@ "crypto_currency": "If the gift was bought using a cryptocurrency, the cryptocurrency name.", "currency": "Three-letter ISO 4217 currency code", "flags": "Flags, see TL conditional fields", - "months": "Duration of the gifted Telegram Premium subscription" + "message": "Message attached with the gift", + "months": "Duration of the gifted Telegram Premium subscription." + } + }, + "MessageActionGiftStars": { + "desc": "You gifted or were gifted some Telegram Stars.", + "params": { + "amount": "Price of the gift in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "crypto_amount": "If the gift was bought using a cryptocurrency, price of the gift in the smallest units of a cryptocurrency.", + "crypto_currency": "If the gift was bought using a cryptocurrency, the cryptocurrency name.", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "stars": "Amount of gifted stars", + "transaction_id": "Identifier of the transaction, only visible to the receiver of the gift." + } + }, + "MessageActionGiftTon": { + "desc": "You were gifted some toncoins.", + "params": { + "amount": "FIAT currency equivalent (in the currency specified in currency) of the amount specified in crypto_amount.", + "crypto_amount": "Amount in the smallest unit of the cryptocurrency (for TONs, one billionth of a ton, AKA a nanoton).", + "crypto_currency": "Name of the cryptocurrency.", + "currency": "Name of a localized FIAT currency.", + "flags": "Flags, see TL conditional fields", + "transaction_id": "Transaction ID." } }, "MessageActionGiveawayLaunch": { "desc": "A giveaway was started.", - "params": {} + "params": { + "flags": "Flags, see TL conditional fields", + "stars": "For Telegram Star giveaways, the total number of Telegram Stars being given away." + } }, "MessageActionGiveawayResults": { "desc": "A giveaway has ended.", "params": { + "flags": "Flags, see TL conditional fields", + "stars": "If set, this is a Telegram Star giveaway", "unclaimed_count": "Number of undistributed prizes", "winners_count": "Number of winners in the giveaway" } @@ -4145,14 +4676,49 @@ "users": "The invited users" } }, + "MessageActionLoginUnknownLocation": { + "desc": "", + "params": {} + }, + "MessageActionNewCreatorPending": { + "desc": "", + "params": {} + }, + "MessageActionPaidMessagesPrice": { + "desc": "The price of paid messages \u00bb in this chat was changed.", + "params": { + "broadcast_messages_allowed": "Can only be set for channels, if set indicates that direct messages were enabled \u00bb, otherwise indicates that direct messages were disabled; the price of paid messages is related to the price of direct messages (aka those sent to the associated monoforum).", + "flags": "Flags, see TL conditional fields", + "stars": "The new price in Telegram Stars, can be 0 if messages are now free." + } + }, + "MessageActionPaidMessagesRefunded": { + "desc": "Sent from peer A to B, indicates that A refunded all stars B previously paid to send messages to A, see here \u00bb for more info on paid messages.", + "params": { + "count": "Number of paid messages affected by the refund.", + "stars": "Number of refunded stars." + } + }, + "MessageActionPaymentRefunded": { + "desc": "Describes a payment refund (service message received by both users and bots).", + "params": { + "charge": "Provider payment identifier", + "currency": "Currency, XTR for Telegram Stars.", + "flags": "Flags, see TL conditional fields", + "payload": "Bot specified invoice payload (only received by bots).", + "peer": "Identifier of the peer that returned the funds.", + "total_amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." + } + }, "MessageActionPaymentSent": { "desc": "A payment was sent", "params": { - "currency": "Three-letter ISO 4217 currency code", + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", "flags": "Flags, see TL conditional fields", "invoice_slug": "An invoice slug taken from an invoice deep link or from the premium_invoice_slug app config parameter \u00bb", "recurring_init": "Whether this is the first payment of a recurring payment we just subscribed to", "recurring_used": "Whether this payment is part of a recurring payment", + "subscription_until_date": "Expiration date of the Telegram Star subscription \u00bb.", "total_amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." } }, @@ -4160,13 +4726,14 @@ "desc": "A user just sent a payment to me (a bot)", "params": { "charge": "Provider payment identifier", - "currency": "Three-letter ISO 4217 currency code", + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", "flags": "Flags, see TL conditional fields", "info": "Order info provided by the user", "payload": "Bot specified invoice payload", "recurring_init": "Whether this is the first payment of a recurring payment we just subscribed to", "recurring_used": "Whether this payment is part of a recurring payment", "shipping_option_id": "Identifier of the shipping option chosen by the user", + "subscription_until_date": "Expiration date of the Telegram Star subscription \u00bb.", "total_amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." } }, @@ -4180,22 +4747,37 @@ "video": "Is this a video call?" } }, + "MessageActionPhoneNumberRequest": { + "desc": "", + "params": {} + }, "MessageActionPinMessage": { "desc": "A message was pinned", "params": {} }, + "MessageActionPrizeStars": { + "desc": "You won some Telegram Stars in a Telegram Star giveaway \u00bb.", + "params": { + "boost_peer": "Identifier of the peer that was automatically boosted by the winners of the giveaway.", + "flags": "Flags, see TL conditional fields", + "giveaway_msg_id": "ID of the message containing the messageMediaGiveaway", + "stars": "The number of Telegram Stars you won", + "transaction_id": "ID of the telegram star transaction.", + "unclaimed": "If set, this indicates the reverse transaction that refunds the remaining stars to the creator of a giveaway if, when the giveaway ends, the number of members in the channel is smaller than the number of winners in the giveaway." + } + }, "MessageActionRequestedPeer": { - "desc": "Contains info about one or more peers that the user shared with the bot after clicking on a keyboardButtonRequestPeer button.", + "desc": "Contains info about one or more peers that the we (the user) shared with the bot after clicking on a keyboardButtonRequestPeer button (service message sent by the user).", "params": { "button_id": "button_id contained in the keyboardButtonRequestPeer", "peers": "The shared peers" } }, "MessageActionRequestedPeerSentMe": { - "desc": "{schema}", + "desc": "Contains info about one or more peers that the a user shared with the me (the bot) after clicking on a keyboardButtonRequestPeer button (service message received by the bot).", "params": { - "button_id": "", - "peers": "" + "button_id": "button_id contained in the keyboardButtonRequestPeer", + "peers": "Info about the shared peers." } }, "MessageActionScreenshotTaken": { @@ -4218,7 +4800,7 @@ "MessageActionSetChatTheme": { "desc": "The chat theme was changed", "params": { - "emoticon": "The emoji that identifies a chat theme" + "theme": "The new chat theme." } }, "MessageActionSetChatWallPaper": { @@ -4238,12 +4820,109 @@ "period": "New Time-To-Live of all messages sent in this chat; if 0, autodeletion was disabled." } }, + "MessageActionStarGift": { + "desc": "You received a gift, see here \u00bb for more info.", + "params": { + "can_upgrade": "If set, this gift can be upgraded to a collectible gift; can only be set for the receiver of a gift.", + "convert_stars": "The receiver of this gift may convert it to this many Telegram Stars, instead of displaying it on their profile page.convert_stars will be equal to stars only if the gift was bought using recently bought Telegram Stars, otherwise it will be less than stars.", + "converted": "Whether this gift was converted to Telegram Stars and cannot be displayed on the profile anymore.", + "flags": "Flags, see TL conditional fields", + "from_id": "Sender of the gift (unset for anonymous gifts).", + "gift": "Info about the gift", + "gift_msg_id": "For separate upgrades, the identifier of the message with the gift whose upgrade was prepaid (only valid for the receiver of the service message).", + "message": "Additional message from the sender of the gift", + "name_hidden": "If set, the name of the sender of the gift will be hidden if the destination user decides to display the gift on their profile", + "peer": "Receiver of the gift.", + "prepaid_upgrade": "The sender has already pre-paid for the upgrade of this gift to a collectible gift.", + "prepaid_upgrade_hash": "Hash to prepay for a gift upgrade separately \u00bb.", + "refunded": "This gift is not available anymore because a request to refund the payment related to this gift was made, and the money was returned.", + "saved": "Whether this gift was added to the destination user's profile (may be toggled using payments.saveStarGift and fetched using payments.getSavedStarGifts)", + "saved_id": "For channel gifts, ID to use in inputSavedStarGiftChat constructors.", + "upgrade_msg_id": "If set, this gift was upgraded to a collectible gift, and the corresponding messageActionStarGiftUnique is available at the specified message ID.", + "upgrade_separate": "This service message is the notification of a separate pre-payment for the upgrade of a gift we own.", + "upgrade_stars": "The number of Telegram Stars the user can pay to convert the gift into a collectible gift \u00bb.", + "upgraded": "This gift was upgraded to a collectible gift \u00bb." + } + }, + "MessageActionStarGiftPurchaseOffer": { + "desc": "", + "params": {} + }, + "MessageActionStarGiftPurchaseOfferDeclined": { + "desc": "", + "params": {} + }, + "MessageActionStarGiftUnique": { + "desc": "A gift \u00bb was upgraded to a collectible gift \u00bb.", + "params": { + "can_export_at": "If set, indicates that the current gift can't be exported to the TON blockchain \u00bb yet: the owner will be able to export it at the specified unixtime.", + "can_resell_at": "If set, indicates that the current gift can't be resold \u00bb yet: the owner will be able to put it up for sale at the specified unixtime.", + "can_transfer_at": "If set, indicates that the current gift can't be transferred \u00bb yet: the owner will be able to transfer it at the specified unixtime.", + "flags": "Flags, see TL conditional fields", + "from_id": "Sender of the gift (unset for anonymous gifts).", + "gift": "The collectible gift.", + "peer": "Receiver of the gift.", + "prepaid_upgrade": "The sender has pre-paid for the upgrade of this gift to a collectible gift.", + "refunded": "This gift was upgraded to a collectible gift \u00bb and then re-downgraded to a regular gift because a request to refund the payment related to the upgrade was made, and the money was returned.", + "resale_amount": "Resale price of the gift.", + "saved": "If set, this gift is visible on the user or channel's profile page; can only be set for the receiver of a gift.", + "saved_id": "For channel gifts, ID to use in inputSavedStarGiftChat constructors.", + "transfer_stars": "If set, indicates that the gift can be transferred \u00bb to another user by paying the specified amount of stars.", + "transferred": "If set, this collectible was transferred (either to the current user or by the current user to the other user in the private chat, depending on the out flag of the containing messageService).", + "upgrade": "If set, this collectible was upgraded \u00bb to a collectible gift from a previously received or sent (depending on the out flag of the containing messageService) non-collectible gift." + } + }, + "MessageActionSuggestBirthday": { + "desc": "", + "params": {} + }, "MessageActionSuggestProfilePhoto": { "desc": "A new profile picture was suggested using photos.uploadContactProfilePhoto.", "params": { "photo": "The photo that the user suggested we set as profile picture." } }, + "MessageActionSuggestedPostApproval": { + "desc": "A suggested post \u00bb was approved or rejected.", + "params": { + "balance_too_low": "If set, the post was approved but the user's balance is too low to pay for the suggested post.", + "flags": "Flags, see TL conditional fields", + "price": "Price for the suggested post.", + "reject_comment": "If the suggested post was rejected, can optionally contain a rejection comment.", + "rejected": "Whether the suggested post was rejected.", + "schedule_date": "Scheduling date." + } + }, + "MessageActionSuggestedPostRefund": { + "desc": "A suggested post \u00bb was accepted and posted or scheduled, but either the channel deleted the posted/scheduled post before stars_suggested_post_age_min seconds have elapsed, or the user refunded the payment for the stars used to pay for the suggested post.", + "params": { + "flags": "Flags, see TL conditional fields", + "payer_initiated": "If set, the user refunded the payment for the stars used to pay for the suggested post." + } + }, + "MessageActionSuggestedPostSuccess": { + "desc": "A suggested post \u00bb was successfully posted, and payment for it was successfully received.", + "params": { + "price": "The price." + } + }, + "MessageActionTTLChange": { + "desc": "", + "params": {} + }, + "MessageActionTodoAppendTasks": { + "desc": "Items were appended to the todo list \u00bb.", + "params": { + "list": "Appended items." + } + }, + "MessageActionTodoCompletions": { + "desc": "Items were marked as completed or not completed in a todo list \u00bb.", + "params": { + "completed": "Items marked as completed.", + "incompleted": "Items marked as not completed." + } + }, "MessageActionTopicCreate": { "desc": "A forum topic was created.", "params": { @@ -4263,6 +4942,14 @@ "title": "New topic title." } }, + "MessageActionUserJoined": { + "desc": "", + "params": {} + }, + "MessageActionUserUpdatedPhoto": { + "desc": "", + "params": {} + }, "MessageActionWebViewDataSent": { "desc": "Data from an opened reply keyboard bot mini app was relayed to the bot that owns it (user side service message).", "params": { @@ -4294,7 +4981,7 @@ "MessageEntityBlockquote": { "desc": "Message entity representing a block quote.", "params": { - "collapsed": "", + "collapsed": "Whether the quote is collapsed by default.", "flags": "Flags, see TL conditional fields", "length": "Length of message entity within message (in UTF-16 code units)", "offset": "Offset of message entity within message (in UTF-16 code units)" @@ -4431,18 +5118,18 @@ } }, "MessageExtendedMedia": { - "desc": "Extended media", + "desc": "Already purchased paid media, see here \u00bb for more info.", "params": { - "media": "Media" + "media": "The media we purchased." } }, "MessageExtendedMediaPreview": { - "desc": "Extended media preview", + "desc": "Paid media preview for not yet purchased paid media, see here \u00bb for more info.", "params": { "flags": "Flags, see TL conditional fields", "h": "Height", - "thumb": "Thumbnail", - "video_duration": "Video duration", + "thumb": "Extremely low resolution thumbnail.", + "video_duration": "Video duration for videos.", "w": "Width" } }, @@ -4485,7 +5172,7 @@ "MessageMediaDocument": { "desc": "Document (video, audio, voice, sticker, any media type except photo)", "params": { - "alt_document": "Currently only used for story videos, may contain an alternative version of the story video, explicitly encoded using H.264 (in MPEG4 transport) at a lower resolution than document.", + "alt_documents": "Videos only, contains alternative qualities of the video.", "document": "Attached document", "flags": "Flags, see TL conditional fields", "nopremium": "Whether this is a normal sticker, if not set this is a premium sticker and a premium sticker animation must be played.", @@ -4493,6 +5180,8 @@ "spoiler": "Whether this media should be hidden behind a spoiler warning", "ttl_seconds": "Time to live of self-destructing document", "video": "Whether this is a video.", + "video_cover": "Custom video cover.", + "video_timestamp": "Start playing the video at the specified timestamp (seconds).", "voice": "Whether this is a voice message." } }, @@ -4532,6 +5221,7 @@ "only_new_subscribers": "If set, only new subscribers starting from the giveaway creation date will be able to participate to the giveaway.", "prize_description": "Can contain a textual description of additional giveaway prizes.", "quantity": "Number of Telegram Premium subscriptions given away.", + "stars": "For Telegram Star giveaways, the total number of Telegram Stars being given away.", "until_date": "The end date of the giveaway.", "winners_are_visible": "If set, giveaway winners are public and will be listed in a messageMediaGiveawayResults message that will be automatically sent to the channel once the giveaway ends." } @@ -4540,13 +5230,14 @@ "desc": "A giveaway with public winners has finished, this constructor contains info about the winners.", "params": { "additional_peers_count": "Number of other channels that participated in the giveaway.", - "channel_id": "ID of the channel that was automatically boosted by the winners of the giveaway for duration of the Premium subscription.", + "channel_id": "ID of the channel/supergroup that was automatically boosted by the winners of the giveaway for duration of the Premium subscription.", "flags": "Flags, see TL conditional fields", "launch_msg_id": "Identifier of the message with the giveaway in channel_id.", "months": "Duration in months of each Telegram Premium subscription in the giveaway.", "only_new_subscribers": "If set, only new subscribers starting from the giveaway creation date participated in the giveaway.", "prize_description": "Can contain a textual description of additional giveaway prizes.", "refunded": "If set, the giveaway was canceled and was fully refunded.", + "stars": "For Telegram Star giveaways, the total number of Telegram Stars being given away.", "unclaimed_count": "Number of not-yet-claimed prizes.", "until_date": "Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in initial parameters of the giveaway.", "winners": "Up to 100 user identifiers of the winners of the giveaway.", @@ -4556,9 +5247,9 @@ "MessageMediaInvoice": { "desc": "Invoice", "params": { - "currency": "Three-letter ISO 4217 currency code", + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", "description": "Product description, 1-255 characters", - "extended_media": "Extended media", + "extended_media": "Deprecated", "flags": "Flags, see TL conditional fields", "photo": "URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.", "receipt_msg_id": "Message ID of receipt: if set, clients should change the text of the first keyboardButtonBuy button always attached to the message to a localized version of the word Receipt", @@ -4569,6 +5260,13 @@ "total_amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." } }, + "MessageMediaPaidMedia": { + "desc": "Paid media, see here \u00bb for more info.", + "params": { + "extended_media": "Either the paid-for media, or super low resolution media previews if the media wasn't purchased yet, see here \u00bb for more info.", + "stars_amount": "The price of the media in Telegram Stars." + } + }, "MessageMediaPhoto": { "desc": "Attached photo.", "params": { @@ -4595,6 +5293,14 @@ "via_mention": "If set, indicates that this someone has mentioned us in this story (i.e. by tagging us in the description) or vice versa, we have mentioned the other peer (if the message is outgoing)." } }, + "MessageMediaToDo": { + "desc": "Represents a todo list \u00bb.", + "params": { + "completions": "Completed items.", + "flags": "Flags, see TL conditional fields", + "todo": "The todo list." + } + }, "MessageMediaUnsupported": { "desc": "Current version of the client does not support this media type.", "params": {} @@ -4610,6 +5316,10 @@ "venue_type": "Venue type in the provider's database" } }, + "MessageMediaVideoStream": { + "desc": "", + "params": {} + }, "MessageMediaWebPage": { "desc": "Preview of webpage", "params": { @@ -4669,13 +5379,25 @@ "can_see_list": "Whether messages.getMessageReactionsList can be used to see how each specific peer reacted to the message", "flags": "Flags, see TL conditional fields", "min": "Similar to min objects, used for message reaction \u00bb constructors that are the same for all users so they don't have the reactions sent by the current user (you can use messages.getMessagesReactions to get the full reaction info).", - "reactions_as_tags": "", + "reactions_as_tags": "If set or if there are no reactions, all present and future reactions should be treated as message tags, see here \u00bb for more info.", "recent_reactions": "List of recent peers and their reactions", - "results": "Reactions" + "results": "Reactions", + "top_reactors": "Paid Telegram Star reactions leaderboard \u00bb for this message." + } + }, + "MessageReactor": { + "desc": "Info about a user in the paid Star reactions leaderboard for a message.", + "params": { + "anonymous": "If set, the reactor is anonymous.", + "count": "The number of sent Telegram Stars.", + "flags": "Flags, see TL conditional fields", + "my": "If set, this reactor is the current user.", + "peer_id": "Identifier of the peer that reacted: may be unset for anonymous reactors different from the current user (i.e. if the current user sent an anonymous reaction anonymous will be set but this field will also be set).", + "top": "If set, the reactor is one of the most active reactors; may be unset if the reactor is the current user." } }, "MessageReplies": { - "desc": "Info about the comment section of a channel post, or a simple message thread", + "desc": "Info about the comment section of a channel post, a simple message thread, a forum topic, or a direct messages topic (all features ultimately based on message threads).", "params": { "channel_id": "For channel post comments, contains the ID of the associated discussion supergroup", "comments": "Whether this constructor contains information about the comment section of a channel post, or a simple message thread", @@ -4701,16 +5423,24 @@ "reply_to_msg_id": "ID of message to which this message is replying", "reply_to_peer_id": "For replies sent in channel discussion threads of which the current user is not a member, the discussion group ID", "reply_to_scheduled": "This is a reply to a scheduled message.", - "reply_to_top_id": "ID of the message that started this message thread" + "reply_to_top_id": "ID of the message that started this message thread", + "todo_item_id": "Can be set to reply to the specified item of a todo list \u00bb." } }, "MessageReplyStoryHeader": { "desc": "Represents a reply to a story", "params": { - "peer": "", + "peer": "Sender of the story.", "story_id": "Story ID" } }, + "MessageReportOption": { + "desc": "Report menu option", + "params": { + "option": "Option identifier: if the user selects this option, re-invoke messages.report, passing this option to option", + "text": "Option title" + } + }, "MessageService": { "desc": "Indicates a service message", "params": { @@ -4725,7 +5455,10 @@ "out": "Whether the message is outgoing", "peer_id": "Sender of service message", "post": "Whether it's a channel post", + "reactions": "Reactions \u00bb.", + "reactions_are_possible": "Whether you can react to this message \u00bb.", "reply_to": "Reply (thread) information", + "saved_peer_id": "Will only be set for service messages within a monoforum topic \u00bb: peer will be equal to the ID of the monoforum and the saved_peer_id flag will be set to the ID of a topic.", "silent": "Whether the message is silent", "ttl_period": "Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well." } @@ -4740,12 +5473,27 @@ } }, "MissingInvitee": { - "desc": "{schema}", + "desc": "Info about why a specific user could not be invited \u00bb.", "params": { "flags": "Flags, see TL conditional fields", - "premium_required_for_pm": "", - "premium_would_allow_invite": "", - "user_id": "" + "premium_required_for_pm": "If set, we could not add the user because of their privacy settings, and additionally, the current account needs to purchase a Telegram Premium subscription to directly share an invite link with the user via a private message.", + "premium_would_allow_invite": "If set, we could not add the user only because the current account needs to purchase a Telegram Premium subscription to complete the operation.", + "user_id": "ID of the user. If neither of the flags below are set, we could not add the user because of their privacy settings, and we can create and directly share an invite link with them using a normal message, instead." + } + }, + "MonoForumDialog": { + "desc": "Represents a monoforum topic \u00bb.", + "params": { + "draft": "A pending message draft.", + "flags": "Flags, see TL conditional fields", + "nopaid_messages_exception": "If set, an admin has exempted this peer from payment to send messages using account.toggleNoPaidMessagesException.", + "peer": "The peer associated to the topic, AKA the topic ID.", + "read_inbox_max_id": "Position up to which all incoming messages are read.", + "read_outbox_max_id": "Position up to which all outgoing messages are read.", + "top_message": "The latest message ID", + "unread_count": "Number of unread messages.", + "unread_mark": "Whether this topic has a manually set (with messages.markDialogUnread) unread mark.", + "unread_reactions_count": "Number of unread reactions." } }, "MyBoost": { @@ -4814,9 +5562,9 @@ "params": {} }, "OutboxReadDate": { - "desc": "{schema}", + "desc": "Exact read date of a private message we sent to another user.", "params": { - "date": "" + "date": "UNIX timestamp with the read date." } }, "Page": { @@ -5110,6 +5858,24 @@ "cells": "Table cells" } }, + "PaidReactionPrivacyAnonymous": { + "desc": "Send paid reactions anonymously.", + "params": {} + }, + "PaidReactionPrivacyDefault": { + "desc": "Uses the default reaction privacy, set using messages.togglePaidReactionPrivacy.", + "params": {} + }, + "PaidReactionPrivacyPeer": { + "desc": "Send paid reactions as the specified peer, fetched using channels.getSendAs.", + "params": { + "peer": "The peer to send reactions as." + } + }, + "Passkey": { + "desc": "", + "params": {} + }, "PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow": { "desc": "This key derivation algorithm defines that SRP 2FA login must be used", "params": { @@ -5181,6 +5947,10 @@ "flags": "Flags, see TL conditional fields" } }, + "PeerColorCollectible": { + "desc": "", + "params": {} + }, "PeerLocated": { "desc": "Peer geolocated nearby", "params": { @@ -5218,14 +5988,19 @@ "add_contact": "Whether we can add the user as contact", "autoarchived": "Whether this peer was automatically archived according to privacy settings and can be unarchived", "block_contact": "Whether we can block the user", - "business_bot_can_reply": "", - "business_bot_id": "", - "business_bot_manage_url": "", - "business_bot_paused": "", + "business_bot_can_reply": "This flag is set if both business_bot_id and business_bot_manage_url are set and connected business bots \u00bb can reply to messages in this chat, as specified by the settings during initial configuration.", + "business_bot_id": "Contains the ID of the business bot \u00bb managing this chat, used to display info about the bot in the action bar.", + "business_bot_manage_url": "Contains a deep link \u00bb, used to open a management menu in the business bot. This flag is set if and only if business_bot_id is set.", + "business_bot_paused": "This flag is set if both business_bot_id and business_bot_manage_url are set and all connected business bots \u00bb were paused in this chat using account.toggleConnectedBotPaused \u00bb.", + "charge_paid_message_stars": "All users that must pay us \u00bb to send us private messages will have this flag set only for us, containing the amount of required stars, see here \u00bb for more info on paid messages.", "flags": "Flags, see TL conditional fields", "geo_distance": "Distance in meters between us and this peer", "invite_members": "If set, this is a recently created group chat to which new members can be invited", + "name_change_date": "When was the user's name last changed.", "need_contacts_exception": "Whether a special exception for contacts is needed", + "phone_country": "The country code of the user's phone number.", + "photo_change_date": "When was the user's photo last changed.", + "registration_month": "Used to display the user's registration year and month, the string is in MM.YYYY format, where MM is the registration month (1-12), and YYYY is the registration year.", "report_geo": "Whether we can report a geogroup as irrelevant for this location", "report_spam": "Whether we can still report the user for spam", "request_chat_broadcast": "This flag is set if request_chat_title and request_chat_date fields are set and the join request \u00bb is related to a channel (otherwise if only the request fields are set, the join request \u00bb is related to a chat).", @@ -5249,13 +6024,23 @@ "user_id": "User identifier" } }, + "PendingSuggestion": { + "desc": "Represents a custom pending suggestion \u00bb.", + "params": { + "description": "Body of the suggestion.", + "suggestion": "The suggestion ID, can be passed to help.dismissSuggestion.", + "title": "Title of the suggestion.", + "url": "URL to open when the user clicks on the suggestion." + } + }, "PhoneCall": { "desc": "Phone call", "params": { "access_hash": "Access hash", "admin_id": "User ID of the creator of the call", - "connections": "List of endpoints the user can connect to to exchange call data", - "custom_parameters": "", + "conference_supported": "If set, the other party supports upgrading of the call to a conference call.", + "connections": "List of endpoints the user can connect to exchange call data", + "custom_parameters": "Custom JSON-encoded call parameters to be passed to tgcalls.", "date": "Date of creation of the call", "flags": "Flags, see TL conditional fields", "g_a_or_b": "Parameter for key exchange", @@ -5294,6 +6079,12 @@ "desc": "The phone call was ended normally", "params": {} }, + "PhoneCallDiscardReasonMigrateConferenceCall": { + "desc": "This phone call was migrated to a conference call.", + "params": { + "slug": "Conference link \u00bb slug." + } + }, "PhoneCallDiscardReasonMissed": { "desc": "The phone call was missed", "params": {} @@ -5451,7 +6242,7 @@ "Poll": { "desc": "Poll", "params": { - "answers": "The possible answers, vote using messages.sendVote.", + "answers": "The possible answers (2-poll_answers_max), vote using messages.sendVote.", "close_date": "Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 600 seconds in the future; can't be used together with close_period.", "close_period": "Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with close_date.", "closed": "Whether the poll is closed and doesn't accept any more answers", @@ -5459,7 +6250,7 @@ "id": "ID of the poll", "multiple_choice": "Whether multiple options can be chosen as answer", "public_voters": "Whether cast votes are publicly visible to all users (non-anonymous poll)", - "question": "The question of the poll", + "question": "The question of the poll (only Premium users can use custom emoji entities here).", "quiz": "Whether this is a quiz (with wrong and correct answers, results shown in the return type)" } }, @@ -5467,7 +6258,7 @@ "desc": "A possible answer of a poll", "params": { "option": "The param that has to be passed to messages.sendVote.", - "text": "Textual representation of the answer" + "text": "Textual representation of the answer (only Premium users can use custom emoji entities here)." } }, "PollAnswerVoters": { @@ -5542,14 +6333,7 @@ }, "PremiumGiftOption": { "desc": "Telegram Premium gift option", - "params": { - "amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", - "bot_url": "An invoice deep link \u00bb to an invoice for in-app payment, using the official Premium bot; may be empty if direct payment isn't available.", - "currency": "Three-letter ISO 4217 currency code", - "flags": "Flags, see TL conditional fields", - "months": "Duration of gifted Telegram Premium subscription", - "store_product": "An identifier for the App Store/Play Store product associated with the Premium gift." - } + "params": {} }, "PremiumSubscriptionOption": { "desc": "Describes a Telegram Premium subscription option", @@ -5574,6 +6358,16 @@ "quantity": "Number of given away Telegram Premium subscriptions." } }, + "PrepaidStarsGiveaway": { + "desc": "Contains info about a prepaid Telegram Star giveaway \u00bb.", + "params": { + "boosts": "Number of boosts the channel will gain by launching the giveaway.", + "date": "When was the giveaway paid for", + "id": "Prepaid giveaway ID.", + "quantity": "Number of giveaway winners", + "stars": "Number of given away Telegram Stars \u00bb" + } + }, "PrivacyKeyAbout": { "desc": "Whether people can see your bio", "params": {} @@ -5583,7 +6377,7 @@ "params": {} }, "PrivacyKeyBirthday": { - "desc": "{schema}", + "desc": "Whether the user can see our birthday.", "params": {} }, "PrivacyKeyChatInvite": { @@ -5594,6 +6388,10 @@ "desc": "Whether messages forwarded from the user will be anonymously forwarded", "params": {} }, + "PrivacyKeyNoPaidMessages": { + "desc": "Who can send you messages without paying, if paid messages \u00bb are enabled.", + "params": {} + }, "PrivacyKeyPhoneCall": { "desc": "Whether the user accepts phone calls", "params": {} @@ -5610,8 +6408,16 @@ "desc": "Whether the profile picture of the user is visible", "params": {} }, + "PrivacyKeySavedMusic": { + "desc": "", + "params": {} + }, + "PrivacyKeyStarGiftsAutoSave": { + "desc": "Whether received gifts will be automatically displayed on our profile", + "params": {} + }, "PrivacyKeyStatusTimestamp": { - "desc": "Whether we can see the last online timestamp of this user", + "desc": "Whether we can see the last online timestamp of this user.", "params": {} }, "PrivacyKeyVoiceMessages": { @@ -5622,10 +6428,14 @@ "desc": "Allow all users", "params": {} }, + "PrivacyValueAllowBots": { + "desc": "Allow bots and mini apps", + "params": {} + }, "PrivacyValueAllowChatParticipants": { "desc": "Allow all participants of certain chats", "params": { - "chats": "Allowed chats" + "chats": "Allowed chat IDs (either a chat or a supergroup ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way))." } }, "PrivacyValueAllowCloseFriends": { @@ -5637,7 +6447,7 @@ "params": {} }, "PrivacyValueAllowPremium": { - "desc": "{schema}", + "desc": "Allow only users with a Premium subscription \u00bb, currently only usable for inputPrivacyKeyChatInvite.", "params": {} }, "PrivacyValueAllowUsers": { @@ -5650,10 +6460,14 @@ "desc": "Disallow all users", "params": {} }, + "PrivacyValueDisallowBots": { + "desc": "Disallow bots and mini apps", + "params": {} + }, "PrivacyValueDisallowChatParticipants": { "desc": "Disallow only participants of certain chats", "params": { - "chats": "Disallowed chats" + "chats": "Disallowed chats IDs (either a chat or a supergroup ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way))." } }, "PrivacyValueDisallowContacts": { @@ -5666,6 +6480,38 @@ "users": "Disallowed users" } }, + "ProfileTabFiles": { + "desc": "Represents the shared files tab of a profile.", + "params": {} + }, + "ProfileTabGifs": { + "desc": "Represents the gifs tab of a profile page.", + "params": {} + }, + "ProfileTabGifts": { + "desc": "Represents the gifts tab of a profile page.", + "params": {} + }, + "ProfileTabLinks": { + "desc": "Represents the shared links tab of a profile page.", + "params": {} + }, + "ProfileTabMedia": { + "desc": "Represents the media tab of a profile page.", + "params": {} + }, + "ProfileTabMusic": { + "desc": "Represents the music tab of a profile page.", + "params": {} + }, + "ProfileTabPosts": { + "desc": "Represents the stories tab of a profile page.", + "params": {} + }, + "ProfileTabVoice": { + "desc": "Represents the voice messages tab of a profile page.", + "params": {} + }, "PublicForwardMessage": { "desc": "Contains info about a forward of a story as a message.", "params": { @@ -5680,12 +6526,12 @@ } }, "QuickReply": { - "desc": "{schema}", + "desc": "A quick reply shortcut.", "params": { - "count": "", - "shortcut": "", - "shortcut_id": "", - "top_message": "" + "count": "Total number of messages in the shortcut.", + "shortcut": "Shortcut name.", + "shortcut_id": "Unique shortcut ID.", + "top_message": "ID of the last message in the shortcut." } }, "ReactionCount": { @@ -5714,21 +6560,25 @@ "params": {} }, "ReactionNotificationsFromAll": { - "desc": "{schema}", + "desc": "Receive notifications about reactions made by any user.", "params": {} }, "ReactionNotificationsFromContacts": { - "desc": "{schema}", + "desc": "Receive notifications about reactions made only by our contacts.", + "params": {} + }, + "ReactionPaid": { + "desc": "Represents a paid Telegram Star reaction \u00bb.", "params": {} }, "ReactionsNotifySettings": { - "desc": "{schema}", + "desc": "Reaction notification settings, see here \u00bb for more info.", "params": { "flags": "Flags, see TL conditional fields", - "messages_notify_from": "", - "show_previews": "", - "sound": "", - "stories_notify_from": "" + "messages_notify_from": "Message reaction notification settings, if not set completely disables notifications/updates about message reactions.", + "show_previews": "If false, push notifications \u00bb about message/story reactions will only be of type REACT_HIDDEN/REACT_STORY_HIDDEN, without any information about the reacted-to story or the reaction itself.", + "sound": "Notification sound for reactions \u00bb", + "stories_notify_from": "Story reaction notification settings, if not set completely disables notifications/updates about reactions to stories." } }, "ReadParticipantDate": { @@ -5779,6 +6629,10 @@ "user_id": "User ID" } }, + "RecentStory": { + "desc": "", + "params": {} + }, "ReplyInlineMarkup": { "desc": "Bot or inline keyboard", "params": { @@ -5813,6 +6667,25 @@ "single_use": "Requests clients to hide the keyboard as soon as it's been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat \u2013 the user can press a special button in the input field to see the custom keyboard again." } }, + "ReportResultAddComment": { + "desc": "The user should enter an additional comment for the moderators, and then messages.report must be re-invoked, passing the comment to messages.report.message.", + "params": { + "flags": "Flags, see TL conditional fields", + "option": "The messages.report method must be re-invoked, passing this option to option", + "optional": "Whether this step can be skipped by the user, passing an empty message to messages.report, or if a non-empty message is mandatory." + } + }, + "ReportResultChooseOption": { + "desc": "The user must choose one of the following options, and then messages.report must be re-invoked, passing the option's option identifier to messages.report.option.", + "params": { + "options": "Available options, rendered as menu entries.", + "title": "Title of the option popup" + } + }, + "ReportResultReported": { + "desc": "The report was sent successfully, no further actions are required.", + "params": {} + }, "RequestPeerTypeBroadcast": { "desc": "Choose a channel", "params": { @@ -5844,40 +6717,54 @@ } }, "RequestedPeerChannel": { - "desc": "{schema}", + "desc": "Info about a channel/supergroup, shared by a user with the currently logged in bot using messages.sendBotRequestedPeer.", "params": { - "channel_id": "", + "channel_id": "Channel/supergroup ID.", "flags": "Flags, see TL conditional fields", - "photo": "", - "title": "", - "username": "" + "photo": "Channel/supergroup photo.", + "title": "Channel/supergroup title.", + "username": "Channel/supergroup username." } }, "RequestedPeerChat": { - "desc": "{schema}", + "desc": "Info about a chat, shared by a user with the currently logged in bot using messages.sendBotRequestedPeer.", "params": { - "chat_id": "", + "chat_id": "Chat ID.", "flags": "Flags, see TL conditional fields", - "photo": "", - "title": "" + "photo": "Chat photo.", + "title": "Chat title." } }, "RequestedPeerUser": { - "desc": "{schema}", + "desc": "Info about a user, shared by a user with the currently logged in bot using messages.sendBotRequestedPeer.", "params": { - "first_name": "", + "first_name": "First name.", "flags": "Flags, see TL conditional fields", - "last_name": "", - "photo": "", - "user_id": "", - "username": "" + "last_name": "Last name.", + "photo": "Profile photo.", + "user_id": "User ID.", + "username": "Username." + } + }, + "RequirementToContactEmpty": { + "desc": "This user can be freely contacted.", + "params": {} + }, + "RequirementToContactPaidMessages": { + "desc": "This user requires us to pay the specified amount of Telegram Stars to send them a message, see here \u00bb for the full flow.", + "params": { + "stars_amount": "The required amount of Telegram Stars." } }, + "RequirementToContactPremium": { + "desc": "This user requires us to buy a Premium subscription in order to contact them.", + "params": {} + }, "RestrictionReason": { "desc": "Restriction reason.", "params": { "platform": "Platform identifier (ios, android, wp, all, etc.), can be concatenated with a dash as separator (android-ios, ios-wp, etc)", - "reason": "Restriction reason (porno, terms, etc.)", + "reason": "Restriction reason (porno, terms, etc.). Ignore this restriction reason if it is contained in the ignore_restriction_reasons \u00bb client configuration parameter.", "text": "Error message to be shown to the user" } }, @@ -5900,18 +6787,55 @@ } }, "SavedReactionTag": { - "desc": "{schema}", + "desc": "Info about a saved message reaction tag \u00bb.", "params": { - "count": "", + "count": "Number of messages tagged with this tag.", "flags": "Flags, see TL conditional fields", - "reaction": "", - "title": "" + "reaction": "Reaction associated to the tag.", + "title": "Custom tag name assigned by the user (max 12 UTF-8 chars)." } }, - "SearchResultPosition": { - "desc": "Information about a message in a specific position", + "SavedStarGift": { + "desc": "Represents a gift owned by a peer.", "params": { - "date": "When was the message sent", + "can_export_at": "If set, indicates that the current gift can't be exported to the TON blockchain \u00bb yet: the owner will be able to export it at the specified unixtime.", + "can_resell_at": "If set, indicates that the current gift can't be resold \u00bb yet: the owner will be able to put it up for sale at the specified unixtime.", + "can_transfer_at": "If set, indicates that the current gift can't be transferred \u00bb yet: the owner will be able to transfer it at the specified unixtime.", + "can_upgrade": "Only set for non-collectible gifts, if they can be upgraded to a collectible gift \u00bb.", + "collection_id": "IDs of the collections \u00bb that this gift is a part of.", + "convert_stars": "For non-collectible gifts, the receiver of this gift may convert it to this many Telegram Stars, instead of displaying it on their profile page.", + "date": "Reception date of the gift.", + "flags": "Flags, see TL conditional fields", + "from_id": "Sender of the gift (unset for anonymous gifts).", + "gift": "The collectible gift.", + "message": "Message attached to the gift.", + "msg_id": "For gifts received by users, ID to use in inputSavedStarGiftUser constructors.", + "name_hidden": "If set, the gift sender in from_id and the message are set only for the receiver of the gift.", + "pinned_to_top": "Whether this gift is pinned on top of the user's profile page.", + "prepaid_upgrade_hash": "Hash to prepay for a gift upgrade separately \u00bb.", + "refunded": "This gift was upgraded to a collectible gift \u00bb and then re-downgraded to a regular gift because a request to refund the payment related to the upgrade was made, and the money was returned.", + "saved_id": "For gifts received by channels, ID to use in inputSavedStarGiftChat constructors.", + "transfer_stars": "If set, indicates that the gift can be transferred \u00bb to another user by paying the specified amount of stars.", + "unsaved": "If set, the gift is not pinned on the user's profile.", + "upgrade_separate": "If set, someone already separately pre-paid for the upgrade of this gift.", + "upgrade_stars": "Only for pre-paid non-collectible gifts, the number of Telegram Stars the sender has already paid to convert the gift into a collectible gift \u00bb (this is different from the meaning of the flag in messageActionStarGift, where it signals the upgrade price for not yet upgraded gifts)." + } + }, + "SearchPostsFlood": { + "desc": "Indicates if the specified global post search \u00bb requires payment.", + "params": { + "flags": "Flags, see TL conditional fields", + "query_is_free": "The specified query is free (and it will not use up free search slots).", + "remains": "Remaining number of free search slots.", + "stars_amount": "The number of Telegram Stars to pay for each non-free search.", + "total_daily": "Total number of daily free search slots.", + "wait_till": "If there are no more search slots, specifies the unixtime when more search slots will be available." + } + }, + "SearchResultPosition": { + "desc": "Information about a message in a specific position", + "params": { + "date": "When was the message sent", "msg_id": "Message ID", "offset": "0-based message position in the full list of suitable messages" } @@ -6216,6 +7140,10 @@ "desc": "User is recording a video.", "params": {} }, + "SendMessageTextDraftAction": { + "desc": "", + "params": {} + }, "SendMessageTypingAction": { "desc": "User is typing.", "params": {} @@ -6258,18 +7186,12 @@ "title": "Title" } }, - "SimpleWebViewResultUrl": { - "desc": "Contains the webview URL with appropriate theme parameters added", - "params": { - "url": "URL" - } - }, "SmsJob": { - "desc": "{schema}", + "desc": "Info about an SMS job.", "params": { - "job_id": "", - "phone_number": "", - "text": "" + "job_id": "Job ID", + "phone_number": "Destination phone number", + "text": "Text" } }, "SpeakingInGroupCallAction": { @@ -6280,76 +7202,413 @@ "desc": "A sponsored message.", "params": { "additional_info": "If set, contains additional information about the sponsored message to be shown along with the message.", - "button_text": "Text of the sponsored message button.", - "can_report": "", - "color": "", - "entities": "Message entities for styled text", + "button_text": "Label of the sponsored message button.", + "can_report": "Whether this message can be reported as specified here \u00bb.", + "color": "If set, the sponsored message should use the message accent color \u00bb specified in color.", + "entities": "Message entities for styled text in message.", "flags": "Flags, see TL conditional fields", + "max_display_duration": "For sponsored messages to show on channel videos \u00bb, autohide the ad after after the specified amount of seconds.", + "media": "If set, contains some media.", "message": "Sponsored message", - "photo": "", + "min_display_duration": "For sponsored messages to show on channel videos \u00bb, allow the user to hide the ad only after the specified amount of seconds.", + "photo": "If set, contains a custom profile photo bubble that should be displayed for the sponsored message, like for messages sent in groups.", "random_id": "Message ID", "recommended": "Whether the message needs to be labeled as \"recommended\" instead of \"sponsored\"", "sponsor_info": "If set, contains additional information about the sponsor to be shown along with the message.", - "title": "", - "url": "" + "title": "Contains the title of the sponsored message.", + "url": "Contains the URL to open when the user clicks on the sponsored message." } }, "SponsoredMessageReportOption": { - "desc": "{schema}", + "desc": "A report option for a sponsored message \u00bb.", "params": { - "option": "", - "text": "" + "option": "Option identifier to pass to channels.reportSponsoredMessage.", + "text": "Localized description of the option." } }, - "StarsTopupOption": { - "desc": "{schema}", + "SponsoredPeer": { + "desc": "A sponsored peer.", "params": { - "amount": "", - "currency": "", - "extended": "", + "additional_info": "If set, contains additional information about the sponsored message to be shown along with the peer.", "flags": "Flags, see TL conditional fields", - "stars": "", - "store_product": "" + "peer": "The sponsored peer.", + "random_id": "ID of the sponsored peer, to be passed to messages.viewSponsoredMessage, messages.clickSponsoredMessage or messages.reportSponsoredMessage (the same methods used for sponsored messages »).", + "sponsor_info": "If set, contains additional information about the sponsor to be shown along with the peer." } }, - "StarsTransaction": { - "desc": "{schema}", + "StarGift": { + "desc": "Represents a star gift, see here \u00bb for more info.", + "params": { + "availability_remains": "For limited-supply gifts: the remaining number of gifts that may be bought.", + "availability_resale": "The total number of (upgraded to collectibles) gifts of this type currently on resale", + "availability_total": "For limited-supply gifts: the total number of gifts that was available in the initial supply.", + "birthday": "Whether this is a birthday-themed gift", + "convert_stars": "The receiver of this gift may convert it to this many Telegram Stars, instead of displaying it on their profile page.convert_stars will be equal to stars only if the gift was bought using recently bought Telegram Stars, otherwise it will be less than stars.", + "first_sale_date": "For sold out gifts only: when was the gift first bought.", + "flags": "Flags, see TL conditional fields", + "id": "Identifier of the gift", + "last_sale_date": "For sold out gifts only: when was the gift last bought.", + "limited": "Whether this is a limited-supply gift.", + "limited_per_user": "If set, the maximum number of gifts of this type that can be owned by a single user is limited and specified in per_user_total, and the remaining slots for the current user in per_user_remains.", + "locked_until_date": "If set, the specified gift possibly cannot be sent until the specified date, see here \u00bb for the full flow.", + "per_user_remains": "Remaining number of gifts of this type that can be owned by the current user.", + "per_user_total": "Maximum number of gifts of this type that can be owned by any user.", + "released_by": "This gift was released by the specified peer.", + "require_premium": "This gift can only be bought by users with a Premium subscription.", + "resell_min_stars": "The minimum price in Stars for gifts of this type currently on resale.", + "sold_out": "Whether this gift sold out and cannot be bought anymore.", + "stars": "Price of the gift in Telegram Stars.", + "sticker": "Sticker that represents the gift.", + "title": "Title of the gift", + "upgrade_stars": "The number of Telegram Stars the user can pay to convert the gift into a collectible gift \u00bb." + } + }, + "StarGiftActiveAuctionState": { + "desc": "", + "params": {} + }, + "StarGiftAttributeBackdrop": { + "desc": "The backdrop of a collectible gift \u00bb.", + "params": { + "backdrop_id": "Unique ID of the backdrop", + "center_color": "Color of the center of the backdrop in RGB24 format.", + "edge_color": "Color of the edges of the backdrop in RGB24 format.", + "name": "Name of the backdrop", + "pattern_color": "Color of the starGiftAttributePattern applied on the backdrop in RGB24 format.", + "rarity_permille": "The number of upgraded gifts that receive this backdrop for each 1000 gifts upgraded.", + "text_color": "Color of the text on the backdrop in RGB24 format." + } + }, + "StarGiftAttributeCounter": { + "desc": "Indicates the total number of gifts that have the specified attribute.", + "params": { + "attribute": "The attribute (just the ID, without the attribute itself).", + "count": "Total number of gifts with this attribute." + } + }, + "StarGiftAttributeIdBackdrop": { + "desc": "The ID of a backdrop of a collectible gift \u00bb.", + "params": { + "backdrop_id": "Unique ID of the backdrop." + } + }, + "StarGiftAttributeIdModel": { + "desc": "The ID of a model of a collectible gift \u00bb.", + "params": { + "document_id": "The sticker representing the upgraded gift" + } + }, + "StarGiftAttributeIdPattern": { + "desc": "The ID of a pattern of a collectible gift \u00bb.", + "params": { + "document_id": "The sticker representing the symbol" + } + }, + "StarGiftAttributeModel": { + "desc": "The model of a collectible gift \u00bb.", + "params": { + "document": "The sticker representing the upgraded gift", + "name": "Name of the model", + "rarity_permille": "The number of upgraded gifts that receive this backdrop for each 1000 gifts upgraded." + } + }, + "StarGiftAttributeOriginalDetails": { + "desc": "Info about the sender, receiver and message attached to the original gift \u00bb, before it was upgraded to a collectible gift \u00bb.", + "params": { + "date": "When was the gift sent.", + "flags": "Flags, see TL conditional fields", + "message": "Original message attached to the gift, if present.", + "recipient_id": "Original receiver of the gift.", + "sender_id": "Original sender of the gift, absent if the gift was private." + } + }, + "StarGiftAttributePattern": { + "desc": "A sticker applied on the backdrop of a collectible gift \u00bb using a repeating pattern.", + "params": { + "document": "The symbol", + "name": "Name of the symbol", + "rarity_permille": "The number of upgraded gifts that receive this backdrop for each 1000 gifts upgraded." + } + }, + "StarGiftAttributeRarity": { + "desc": "", + "params": {} + }, + "StarGiftAttributeRarityEpic": { + "desc": "", + "params": {} + }, + "StarGiftAttributeRarityLegendary": { + "desc": "", + "params": {} + }, + "StarGiftAttributeRarityRare": { + "desc": "", + "params": {} + }, + "StarGiftAttributeRarityUncommon": { + "desc": "", + "params": {} + }, + "StarGiftAuctionAcquiredGift": { + "desc": "", + "params": {} + }, + "StarGiftAuctionRound": { + "desc": "", + "params": {} + }, + "StarGiftAuctionRoundExtendable": { + "desc": "", + "params": {} + }, + "StarGiftAuctionState": { + "desc": "", + "params": {} + }, + "StarGiftAuctionStateFinished": { + "desc": "", + "params": {} + }, + "StarGiftAuctionStateNotModified": { + "desc": "", + "params": {} + }, + "StarGiftAuctionUserState": { + "desc": "", + "params": {} + }, + "StarGiftBackground": { + "desc": "", + "params": {} + }, + "StarGiftCollection": { + "desc": "Represents a star gift collection \u00bb.", + "params": { + "collection_id": "The ID of the collection.", + "flags": "Flags, see TL conditional fields", + "gifts_count": "Number of gifts in the collection.", + "hash": "Field to use instead of collection_id when generating the hash to pass to payments.getStarGiftCollections.", + "icon": "Optional icon for the collection, taken from the first gift in the collection.", + "title": "Title of the collection." + } + }, + "StarGiftUnique": { + "desc": "Represents a collectible star gift, see here \u00bb for more info.", + "params": { + "attributes": "Collectible attributes", + "availability_issued": "Total number of gifts of the same type that were upgraded to a collectible gift.", + "availability_total": "Total number of gifts of the same type that can be upgraded or were already upgraded to a collectible gift.", + "flags": "Flags, see TL conditional fields", + "gift_address": "For NFTs on the TON blockchain, contains the address of the NFT (append it to the ton_blockchain_explorer_url client configuration value \u00bb to obtain a link with information about the address).", + "gift_id": "Unique ID of the gift.", + "id": "Identifier of the collectible gift.", + "num": "Unique identifier of this collectible gift among all (already upgraded) collectible gifts of the same type.", + "owner_address": "For NFTs on the TON blockchain, contains the address of the owner (append it to the ton_blockchain_explorer_url client configuration value \u00bb to obtain a link with information about the address).", + "owner_id": "The owner of the gift.", + "owner_name": "The name of the owner if neither owner_id nor owner_address are set.", + "released_by": "This gift was released by the specified peer.", + "require_premium": "This gift can only be bought by users with a Premium subscription.", + "resale_ton_only": "Whether the gift can be bought only using Toncoins.", + "resell_amount": "Resale price of the gift.", + "slug": "Slug that can be used to create a collectible gift deep link \u00bb, or elsewhere in the API where a collectible slug is accepted.", + "theme_available": "A chat theme associated to this gift is available, see here \u00bb for more info on how to use it.", + "theme_peer": "The current chat where the associated chat theme is installed, if any (gift-based themes can only be installed in one chat at a time).", + "title": "Collectible title.", + "value_amount": "Price of the gift.", + "value_currency": "Currency for the gift's price." + } + }, + "StarGiftUpgradePrice": { + "desc": "", + "params": {} + }, + "StarRefProgram": { + "desc": "Indo about an affiliate program offered by a bot", + "params": { + "bot_id": "ID of the bot that offers the program", + "commission_permille": "An affiliate gets a commission of starRefProgram.commission_permille\u2030 Telegram Stars for every mini app transaction made by users they refer", + "daily_revenue_per_user": "The amount of daily revenue per user in Telegram Stars of the bot that created the affiliate program. To obtain the approximated revenue per referred user, multiply this value by commission_permille and divide by 1000.", + "duration_months": "An affiliate gets a commission for every mini app transaction made by users they refer, for duration_months months after a referral link is imported, starting the bot for the first time", + "end_date": "Point in time (Unix timestamp) when the affiliate program will be closed (optional, if not set the affiliate program isn't scheduled to be closed)", + "flags": "Flags, see TL conditional fields" + } + }, + "StarsAmount": { + "desc": "Describes a real (i.e. possibly decimal) amount of Telegram Stars.", + "params": { + "amount": "The integer amount of Telegram Stars.", + "nanos": "The decimal amount of Telegram Stars, expressed as nanostars (i.e. 1 nanostar is equal to 1/1'000'000'000th (one billionth) of a Telegram Star). This field may also be negative (the allowed range is -999999999 to 999999999)." + } + }, + "StarsGiftOption": { + "desc": "Telegram Stars gift option.", + "params": { + "amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "extended": "If set, the option must only be shown in the full list of topup options.", + "flags": "Flags, see TL conditional fields", + "stars": "Amount of Telegram stars.", + "store_product": "Identifier of the store product associated with the option, official apps only." + } + }, + "StarsGiveawayOption": { + "desc": "Contains info about a Telegram Star giveaway option.", + "params": { + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "default": "If set, this option must be pre-selected by default in the option list.", + "extended": "If set, this option must only be shown in the full list of giveaway options (i.e. they must be added to the list only when the user clicks on the expand button).", + "flags": "Flags, see TL conditional fields", + "stars": "The number of Telegram Stars that will be distributed among winners", + "store_product": "Identifier of the store product associated with the option, official apps only.", + "winners": "Allowed options for the number of giveaway winners.", + "yearly_boosts": "Number of times the chat will be boosted for one year if the inputStorePaymentStarsGiveaway.boost_peer flag is populated" + } + }, + "StarsGiveawayWinnersOption": { + "desc": "Allowed options for the number of giveaway winners.", + "params": { + "default": "If set, this option must be pre-selected by default in the option list.", + "flags": "Flags, see TL conditional fields", + "per_user_stars": "The number of Telegram Stars each winner will receive.", + "users": "The number of users that will be randomly chosen as winners." + } + }, + "StarsRating": { + "desc": "Represents the profile's star rating, see here \u00bb for more info.", + "params": { + "current_level_stars": "The numerical value of the rating required for the current level.", + "flags": "Flags, see TL conditional fields", + "level": "The current level, may be negative.", + "next_level_stars": "The numerical value of the rating required for the next level.", + "stars": "Numerical value of the current rating." + } + }, + "StarsRevenueStatus": { + "desc": "Describes Telegram Star revenue balances \u00bb.", + "params": { + "available_balance": "Amount of withdrawable Telegram Stars.", + "current_balance": "Amount of not-yet-withdrawn Telegram Stars.", + "flags": "Flags, see TL conditional fields", + "next_withdrawal_at": "Unixtime indicating when will withdrawal be available to the user. If not set, withdrawal can be started now.", + "overall_revenue": "Total amount of earned Telegram Stars.", + "withdrawal_enabled": "If set, the user may withdraw up to available_balance stars." + } + }, + "StarsSubscription": { + "desc": "Represents a Telegram Star subscription \u00bb.", + "params": { + "bot_canceled": "Set if this bot subscription was cancelled by the bot", + "can_refulfill": "Whether we left the associated private channel, but we can still rejoin it using payments.fulfillStarsSubscription because the current subscription period hasn't expired yet.", + "canceled": "Whether this subscription was cancelled.", + "chat_invite_hash": "Invitation link, used to renew the subscription after cancellation or expiration.", + "flags": "Flags, see TL conditional fields", + "id": "Subscription ID.", + "invoice_slug": "For bot subscriptions, the identifier of the subscription invoice", + "missing_balance": "Whether this subscription has expired because there are not enough stars on the user's balance to extend it.", + "peer": "Identifier of the associated private chat.", + "photo": "For bot subscriptions, the photo from the subscription invoice", + "pricing": "Pricing of the subscription in Telegram Stars.", + "title": "For bot subscriptions, the title of the subscription invoice", + "until_date": "Expiration date of the current subscription period." + } + }, + "StarsSubscriptionPricing": { + "desc": "Pricing of a Telegram Star subscription \u00bb.", "params": { - "date": "", - "description": "", + "amount": "Price of the subscription in Telegram Stars.", + "period": "The user should pay amount stars every period seconds to gain and maintain access to the channel. Currently the only allowed subscription period is 30*24*60*60, i.e. the user will be debited amount stars every month." + } + }, + "StarsTonAmount": { + "desc": "Describes an amount of toncoin in nanotons (i.e. 1/1_000_000_000 of a toncoin).", + "params": { + "amount": "The amount in nanotons." + } + }, + "StarsTopupOption": { + "desc": "Telegram Stars topup option.", + "params": { + "amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "extended": "If set, the option must only be shown in the full list of topup options.", "flags": "Flags, see TL conditional fields", - "id": "", - "peer": "", - "photo": "", - "refund": "", - "stars": "", - "title": "" + "stars": "Amount of Telegram stars.", + "store_product": "Identifier of the store product associated with the option, official apps only." + } + }, + "StarsTransaction": { + "desc": "Represents a Telegram Stars or TON transaction \u00bb.", + "params": { + "ads_proceeds_from_date": "Indicates that this is payment for ad revenue from the specified unixtime (always set together with ads_proceeds_to_date).", + "ads_proceeds_to_date": "Indicates that this is payment for ad revenue to the specified unixtime.", + "amount": "Amount of Telegram Stars or TON.", + "bot_payload": "Bot specified invoice payload (i.e. the payload passed to inputMediaInvoice when creating the invoice).", + "business_transfer": "This transaction transfers stars from the balance of a user account connected to a business bot, to the balance of the business bot, see here \u00bb for more info.", + "date": "Date of the transaction (unixtime).", + "description": "For transactions with bots, description of the bought product.", + "extended_media": "The purchased paid media \u00bb.", + "failed": "This transaction has failed.", + "flags": "Flags, see TL conditional fields", + "floodskip_number": "This transaction is payment for paid bot broadcasts. Paid broadcasts are only allowed if the allow_paid_floodskip parameter of messages.sendMessage and other message sending methods is set while trying to broadcast more than 30 messages per second to bot users. The integer value returned by this flag indicates the number of billed API calls.", + "gift": "This transaction was a gift from the user in peer.peer.", + "giveaway_post_id": "ID of the message containing the messageMediaGiveaway, for incoming star giveaway prizes.", + "id": "Transaction ID.", + "msg_id": "For paid media transactions \u00bb, message ID of the paid media posted to peer.peer (can point to a deleted message; either way, extended_media will always contain the bought media).", + "paid_messages": "This transaction is related to the reception or transmission of a paid message \u00bb.", + "peer": "Source of the incoming transaction, or its recipient for outgoing transactions.", + "pending": "The transaction is currently pending.", + "photo": "For transactions with bots, photo of the bought product.", + "posts_search": "Represents payment for a paid global post search \u00bb.", + "premium_gift_months": "This transaction indicates the payment for a gifted Telegram Premium subscription \u00bb.", + "reaction": "This transaction is a paid reaction \u00bb.", + "refund": "Whether this transaction is a refund.", + "stargift": "This transaction indicates a purchase or a sale (conversion back to Stars) of a gift \u00bb.", + "stargift_prepaid_upgrade": "Represents payment for a separate prepaid upgrade of a gift.", + "stargift_resale": "This transaction is related to the resale of a collectible gift \u00bb.", + "stargift_upgrade": "This transaction pays for the upgrade of a gift to a collectible gift \u00bb.", + "starref_amount": "For transactions made by referred users, the amount of Telegram Stars received by the affiliate, can be negative for refunds.", + "starref_commission_permille": "This transaction is the receival (or refund) of an affiliate commission (i.e. this is the transaction received by the peer that created the referral link, flag 17 is for transactions made by users that imported the referral link).", + "starref_peer": "For transactions made by referred users, the peer that received the affiliate commission.", + "subscription_period": "The number of seconds between consecutive Telegram Star debiting for Telegram Star subscriptions \u00bb.", + "title": "For transactions with bots, title of the bought product.", + "transaction_date": "If neither pending nor failed are set, the transaction was completed successfully, and this field will contain the point in time (Unix timestamp) when the withdrawal was completed successfully.", + "transaction_url": "If neither pending nor failed are set, the transaction was completed successfully, and this field will contain a URL where the withdrawal transaction can be viewed." } }, "StarsTransactionPeer": { - "desc": "{schema}", + "desc": "Describes a Telegram Star transaction with another peer.", "params": { - "peer": "" + "peer": "The peer." } }, + "StarsTransactionPeerAPI": { + "desc": "Describes a Telegram Star transaction used to pay for paid API usage, such as paid bot broadcasts.", + "params": {} + }, + "StarsTransactionPeerAds": { + "desc": "Describes a Telegram Star transaction used to pay for Telegram ads as specified here \u00bb.", + "params": {} + }, "StarsTransactionPeerAppStore": { - "desc": "{schema}", + "desc": "Describes a Telegram Star transaction with the App Store, used when purchasing Telegram Stars through the App Store.", "params": {} }, "StarsTransactionPeerFragment": { - "desc": "{schema}", + "desc": "Describes a Telegram Star transaction with Fragment, used when purchasing Telegram Stars through Fragment.", "params": {} }, "StarsTransactionPeerPlayMarket": { - "desc": "{schema}", + "desc": "Describes a Telegram Star transaction with the Play Store, used when purchasing Telegram Stars through the Play Store.", "params": {} }, "StarsTransactionPeerPremiumBot": { - "desc": "{schema}", + "desc": "Describes a Telegram Star transaction made using @PremiumBot (i.e. using the inputInvoiceStars flow described here \u00bb).", "params": {} }, "StarsTransactionPeerUnsupported": { - "desc": "{schema}", + "desc": "Describes a Telegram Star transaction that cannot be described using the current layer.", "params": {} }, "StatsAbsValueAndPrev": { @@ -6442,9 +7701,9 @@ "params": { "access_hash": "Access hash of stickerset", "archived": "Whether this stickerset was archived (due to too many saved stickers in the current account)", - "channel_emoji_status": "If set, this custom emoji stickerset can be used in channel emoji statuses.", + "channel_emoji_status": "If set, this custom emoji stickerset can be used in channel/supergroup emoji statuses.", "count": "Number of stickers in pack", - "creator": "", + "creator": "Whether we created this stickerset", "emojis": "This is a custom emoji stickerset", "flags": "Flags, see TL conditional fields", "hash": "Hash", @@ -6498,6 +7757,16 @@ "flags": "Flags, see TL conditional fields" } }, + "StoryAlbum": { + "desc": "Represents a story album \u00bb.", + "params": { + "album_id": "ID of the album.", + "flags": "Flags, see TL conditional fields", + "icon_photo": "Photo from the first story of the album, if it's a photo.", + "icon_video": "Video from the first story of the album, if it's a video.", + "title": "Name of the album." + } + }, "StoryFwdHeader": { "desc": "Contains info about the original poster of a reposted story.", "params": { @@ -6511,6 +7780,7 @@ "StoryItem": { "desc": "Represents a story.", "params": { + "albums": "Albums this story is part of.", "caption": "Story caption.", "close_friends": "Whether this story can only be viewed by our close friends, see here \u00bb for more info", "contacts": "Whether this story can only be viewed by our contacts", @@ -6519,7 +7789,7 @@ "entities": "Message entities for styled text", "expire_date": "When does the story expire.", "flags": "Flags, see TL conditional fields", - "from_id": "", + "from_id": "Sender of the story.", "fwd_from": "For reposted stories \u00bb, contains info about the original story.", "id": "ID of the story.", "media": "Story media.", @@ -6614,6 +7884,16 @@ "views_count": "View counter of the story" } }, + "SuggestedPost": { + "desc": "Contains info about a suggested post \u00bb.", + "params": { + "accepted": "Whether the suggested post was accepted.", + "flags": "Flags, see TL conditional fields", + "price": "Price of the suggested post.", + "rejected": "Whether the suggested post was rejected.", + "schedule_date": "Scheduling date." + } + }, "TextAnchor": { "desc": "Text linking to another section of the page", "params": { @@ -6752,11 +8032,36 @@ } }, "Timezone": { - "desc": "{schema}", + "desc": "Timezone information.", "params": { - "id": "", - "name": "", - "utc_offset": "" + "id": "Unique timezone ID.", + "name": "Human-readable and localized timezone name.", + "utc_offset": "UTC offset in seconds, which may be displayed in hh:mm format by the client together with the human-readable name (i.e. $name UTC -01:00)." + } + }, + "TodoCompletion": { + "desc": "A completed todo list \u00bb item.", + "params": { + "completed_by": "ID of the user that completed the item.", + "date": "When was the item completed.", + "id": "The ID of the completed item." + } + }, + "TodoItem": { + "desc": "An item of a todo list \u00bb.", + "params": { + "id": "ID of the item, a positive (non-zero) integer unique within the current list.", + "title": "Text of the item, maximum length equal to todo_item_length_max \u00bb." + } + }, + "TodoList": { + "desc": "Represents a todo list \u00bb.", + "params": { + "flags": "Flags, see TL conditional fields", + "list": "Items of the list.", + "others_can_append": "If set, users different from the creator of the list can append items to the list.", + "others_can_complete": "If set, users different from the creator of the list can complete items in the list.", + "title": "Title of the todo list, maximum length equal to todo_title_length_max \u00bb." } }, "TopPeer": { @@ -6766,6 +8071,10 @@ "rating": "Rating as computed in top peer rating \u00bb" } }, + "TopPeerCategoryBotsApp": { + "desc": "Most frequently used Main Mini Bot Apps.", + "params": {} + }, "TopPeerCategoryBotsInline": { "desc": "Most used inline bots", "params": {} @@ -6815,10 +8124,10 @@ "params": {} }, "UpdateBotBusinessConnect": { - "desc": "{schema}", + "desc": "Connecting or disconnecting a business bot or changing the connection settings will emit an updateBotBusinessConnect update to the bot, with the new settings and a connection_id that will be used by the bot to handle updates from and send messages as the user.", "params": { - "connection": "", - "qts": "" + "connection": "Business connection settings", + "qts": "New qts value, see updates \u00bb for more info." } }, "UpdateBotCallbackQuery": { @@ -6835,7 +8144,7 @@ } }, "UpdateBotChatBoost": { - "desc": "A channel boost has changed (bots only)", + "desc": "A channel/supergroup boost has changed (bots only)", "params": { "boost": "New boost information", "peer": "Channel", @@ -6862,22 +8171,22 @@ } }, "UpdateBotDeleteBusinessMessage": { - "desc": "{schema}", + "desc": "A message was deleted in a connected business chat \u00bb.", "params": { - "connection_id": "", - "messages": "", - "peer": "", - "qts": "" + "connection_id": "Business connection ID.", + "messages": "IDs of the messages that were deleted.", + "peer": "Peer where the messages were deleted.", + "qts": "New qts value, see updates \u00bb for more info." } }, "UpdateBotEditBusinessMessage": { - "desc": "{schema}", + "desc": "A message was edited in a connected business chat \u00bb.", "params": { - "connection_id": "", + "connection_id": "Business connection ID", "flags": "Flags, see TL conditional fields", - "message": "", - "qts": "", - "reply_to_message": "" + "message": "New message.", + "qts": "New qts value, see updates \u00bb for more info.", + "reply_to_message": "The message that message is replying to." } }, "UpdateBotInlineQuery": { @@ -6933,19 +8242,19 @@ } }, "UpdateBotNewBusinessMessage": { - "desc": "{schema}", + "desc": "A message was received via a connected business chat \u00bb.", "params": { - "connection_id": "", + "connection_id": "Connection ID.", "flags": "Flags, see TL conditional fields", - "message": "", - "qts": "", - "reply_to_message": "" + "message": "New message.", + "qts": "New qts value, see updates \u00bb for more info.", + "reply_to_message": "The message that message is replying to." } }, "UpdateBotPrecheckoutQuery": { "desc": "This object contains information about an incoming pre-checkout query.", "params": { - "currency": "Three-letter ISO 4217 currency code", + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", "flags": "Flags, see TL conditional fields", "info": "Order info provided by the user", "payload": "Bot specified invoice payload", @@ -6955,6 +8264,14 @@ "user_id": "User who sent the query" } }, + "UpdateBotPurchasedPaidMedia": { + "desc": "Bots only: a user has purchased a paid media.", + "params": { + "payload": "Payload passed by the bot in inputMediaPaidMedia.payload", + "qts": "New qts value, see updates \u00bb for more info.", + "user_id": "The user that bought the media" + } + }, "UpdateBotShippingQuery": { "desc": "This object contains information about an incoming shipping query.", "params": { @@ -6973,6 +8290,10 @@ "user_id": "The user ID" } }, + "UpdateBotSubscriptionExpire": { + "desc": "", + "params": {} + }, "UpdateBotWebhookJSON": { "desc": "A new incoming event; for bots only", "params": { @@ -6987,15 +8308,21 @@ "timeout": "Query timeout" } }, - "UpdateBroadcastRevenueTransactions": { - "desc": "{schema}", + "UpdateBusinessBotCallbackQuery": { + "desc": "A callback button sent via a business connection was pressed, and the button data was sent to the bot that created the button.", "params": { - "balances": "", - "peer": "" + "chat_instance": "Global identifier, uniquely corresponding to the chat to which the message with the callback button was sent. Useful for high scores in games.", + "connection_id": "Business connection ID", + "data": "Callback data", + "flags": "Flags, see TL conditional fields", + "message": "Message that contains the keyboard (also contains info about the chat where the message was sent).", + "query_id": "Query ID", + "reply_to_message": "The message that message is replying to.", + "user_id": "ID of the user that pressed the button" } }, "UpdateChannel": { - "desc": "A new channel or supergroup is available, or info about an existing channel has changed and must be refeteched.", + "desc": "Channel/supergroup (channel and/or channelFull) information was updated.", "params": { "channel_id": "Channel ID" } @@ -7038,29 +8365,13 @@ "via_chatlist": "Whether the participant joined using a chat folder deep link \u00bb." } }, - "UpdateChannelPinnedTopic": { - "desc": "A forum topic \u00bb was pinned or unpinned.", - "params": { - "channel_id": "The forum ID", - "flags": "Flags, see TL conditional fields", - "pinned": "Whether the topic was pinned or unpinned", - "topic_id": "The topic ID" - } - }, - "UpdateChannelPinnedTopics": { - "desc": "The pinned topics of a forum have changed.", - "params": { - "channel_id": "Forum ID.", - "flags": "Flags, see TL conditional fields", - "order": "Ordered list containing the IDs of all pinned topics." - } - }, "UpdateChannelReadMessagesContents": { - "desc": "The specified channel/supergroup messages were read", + "desc": "The specified channel/supergroup messages were read (emitted specifically for messages like voice messages or video, only once the media is watched and marked as read using channels.readMessageContents)", "params": { "channel_id": "Channel/supergroup ID", "flags": "Flags, see TL conditional fields", "messages": "IDs of messages that were read", + "saved_peer_id": "If set, the messages were read within the specified monoforum topic \u00bb.", "top_msg_id": "Forum topic ID." } }, @@ -7099,7 +8410,7 @@ } }, "UpdateChat": { - "desc": "A new chat is available", + "desc": "Chat (chat and/or chatFull) information was updated.", "params": { "chat_id": "Chat ID" } @@ -7168,7 +8479,7 @@ } }, "UpdateConfig": { - "desc": "The server-side configuration has changed; the client should re-fetch the config using help.getConfig", + "desc": "The server-side configuration has changed; the client should re-fetch the config using help.getConfig and help.getAppConfig.", "params": {} }, "UpdateContactsReset": { @@ -7190,6 +8501,10 @@ "pts_count": "Number of events that were generated" } }, + "UpdateDeleteGroupCallMessages": { + "desc": "", + "params": {} + }, "UpdateDeleteMessages": { "desc": "Messages were deleted.", "params": { @@ -7199,23 +8514,25 @@ } }, "UpdateDeleteQuickReply": { - "desc": "{schema}", + "desc": "A quick reply shortcut \u00bb was deleted. This will not emit updateDeleteQuickReplyMessages updates, even if all the messages in the shortcut are also deleted by this update.", "params": { - "shortcut_id": "" + "shortcut_id": "ID of the quick reply shortcut that was deleted." } }, "UpdateDeleteQuickReplyMessages": { - "desc": "{schema}", + "desc": "One or more messages in a quick reply shortcut \u00bb were deleted.", "params": { - "messages": "", - "shortcut_id": "" + "messages": "IDs of the deleted messages.", + "shortcut_id": "Quick reply shortcut ID." } }, "UpdateDeleteScheduledMessages": { - "desc": "Some scheduled messages were deleted from the schedule queue of a chat", + "desc": "Some scheduled messages were deleted (or sent) from the schedule queue of a chat", "params": { + "flags": "Flags, see TL conditional fields", "messages": "Deleted scheduled messages", - "peer": "Peer" + "peer": "Peer", + "sent_messages": "If set, this update indicates that some scheduled messages were sent (not simply deleted from the schedule queue). In this case, the messages field will contain the scheduled message IDs for the sent messages (initially returned in updateNewScheduledMessage), and sent_messages will contain the real message IDs for the sent messages." } }, "UpdateDialogFilter": { @@ -7250,6 +8567,7 @@ "params": { "flags": "Flags, see TL conditional fields", "peer": "The dialog", + "saved_peer_id": "If set, the mark is related to the specified monoforum topic ID \u00bb.", "unread": "Was the chat marked or unmarked as read" } }, @@ -7259,6 +8577,7 @@ "draft": "The draft", "flags": "Flags, see TL conditional fields", "peer": "The peer to which the draft is associated", + "saved_peer_id": "If set, the draft is related to the specified monoforum topic ID \u00bb.", "top_msg_id": "ID of the forum topic to which the draft is associated" } }, @@ -7278,6 +8597,10 @@ "pts_count": "PTS count" } }, + "UpdateEmojiGameInfo": { + "desc": "", + "params": {} + }, "UpdateEncryptedChatTyping": { "desc": "Interlocutor is typing a message in an encrypted chat. Update period is 6 second. If upon this time there is no repeated update, it shall be considered that the interlocutor stopped typing.", "params": { @@ -7322,7 +8645,17 @@ "desc": "A new groupcall was started", "params": { "call": "Info about the group call or livestream", - "chat_id": "The channel/supergroup where this group call or livestream takes place" + "chat_id": "The channel/supergroup where this group call or livestream takes place", + "flags": "Flags, see TL conditional fields" + } + }, + "UpdateGroupCallChainBlocks": { + "desc": "Contains updates to the blockchain of a conference call, see here \u00bb for more info.", + "params": { + "blocks": "Blocks.", + "call": "The conference call.", + "next_offset": "Offset of the next block.", + "sub_chain_id": "Subchain ID." } }, "UpdateGroupCallConnection": { @@ -7333,6 +8666,14 @@ "presentation": "Are these parameters related to the screen capture session currently in progress?" } }, + "UpdateGroupCallEncryptedMessage": { + "desc": "", + "params": {} + }, + "UpdateGroupCallMessage": { + "desc": "", + "params": {} + }, "UpdateGroupCallParticipants": { "desc": "The participant list of a certain group call has changed", "params": { @@ -7370,11 +8711,11 @@ "params": {} }, "UpdateMessageExtendedMedia": { - "desc": "Extended media update", + "desc": "You bought a paid media \u00bb: this update contains the revealed media.", "params": { - "extended_media": "Extended media", - "msg_id": "Message ID", - "peer": "Peer" + "extended_media": "Revealed media, contains only messageExtendedMedia constructors.", + "msg_id": "ID of the message containing the paid media", + "peer": "Peer where the paid media was posted" } }, "UpdateMessageID": { @@ -7409,9 +8750,19 @@ "msg_id": "Message ID", "peer": "Peer", "reactions": "Reactions", + "saved_peer_id": "If set, the reactions are in the specified monoforum topic \u00bb.", "top_msg_id": "Forum topic ID" } }, + "UpdateMonoForumNoPaidException": { + "desc": "An admin has (un)exempted this monoforum topic \u00bb from payment to send messages using account.toggleNoPaidMessagesException.", + "params": { + "channel_id": "The monoforum ID.", + "exception": "If set, an admin has exempted this peer, otherwise the peer was unexempted.", + "flags": "Flags, see TL conditional fields", + "saved_peer_id": "The peer/topic ID." + } + }, "UpdateMoveStickerSetToTop": { "desc": "A stickerset was just moved to top, see here for more info \u00bb", "params": { @@ -7427,7 +8778,7 @@ "date": "Authorization date", "device": "Name of device, for example Android", "flags": "Flags, see TL conditional fields", - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "location": "Location, for example USA, NY (IP=1.2.3.4)", "unconfirmed": "Whether the session is unconfirmed, see here \u00bb for more info." } @@ -7456,9 +8807,9 @@ } }, "UpdateNewQuickReply": { - "desc": "{schema}", + "desc": "A new quick reply shortcut \u00bb was created.", "params": { - "quick_reply": "" + "quick_reply": "Quick reply shortcut." } }, "UpdateNewScheduledMessage": { @@ -7474,11 +8825,11 @@ } }, "UpdateNewStoryReaction": { - "desc": "{schema}", + "desc": "Represents a new reaction to a story.", "params": { - "peer": "", - "reaction": "", - "story_id": "" + "peer": "The peer where the story was posted.", + "reaction": "The reaction.", + "story_id": "Story ID." } }, "UpdateNotifySettings": { @@ -7488,6 +8839,12 @@ "peer": "Notification source" } }, + "UpdatePaidReactionPrivacy": { + "desc": "Contains the current default paid reaction privacy, see here \u00bb for more info.", + "params": { + "private": "Paid reaction privacy settings." + } + }, "UpdatePeerBlocked": { "desc": "We blocked a peer, see here \u00bb for more info on blocklists.", "params": { @@ -7567,6 +8924,14 @@ "order": "New order of pinned dialogs" } }, + "UpdatePinnedForumTopic": { + "desc": "", + "params": {} + }, + "UpdatePinnedForumTopics": { + "desc": "", + "params": {} + }, "UpdatePinnedMessages": { "desc": "Some messages were pinned in a chat", "params": { @@ -7597,15 +8962,15 @@ "params": {} }, "UpdateQuickReplies": { - "desc": "{schema}", + "desc": "Info about or the order of quick reply shortcuts \u00bb was changed.", "params": { - "quick_replies": "" + "quick_replies": "New quick reply shortcut order and information." } }, "UpdateQuickReplyMessage": { - "desc": "{schema}", + "desc": "A new message was added to a quick reply shortcut \u00bb.", "params": { - "message": "" + "message": "The message that was added (the message.quick_reply_shortcut_id field will contain the shortcut ID)." } }, "UpdateReadChannelDiscussionInbox": { @@ -7675,7 +9040,7 @@ } }, "UpdateReadMessagesContents": { - "desc": "Contents of messages in the common message box were read", + "desc": "Contents of messages in the common message box were read (emitted specifically for messages like voice messages or video, only once the media is watched and marked as read using messages.readMessageContents).", "params": { "date": "When was the last message in messages marked as read.", "flags": "Flags, see TL conditional fields", @@ -7684,6 +9049,22 @@ "pts_count": "Number of events that were generated" } }, + "UpdateReadMonoForumInbox": { + "desc": "Incoming messages in a monoforum topic were read", + "params": { + "channel_id": "ID of the monoforum.", + "read_max_id": "Position up to which all incoming messages are read.", + "saved_peer_id": "Topic ID." + } + }, + "UpdateReadMonoForumOutbox": { + "desc": "Outgoing messages in a monoforum were read.", + "params": { + "channel_id": "ID of the monoforum.", + "read_max_id": "Position up to which all outgoing messages are read.", + "saved_peer_id": "Topic ID." + } + }, "UpdateReadStories": { "desc": "Stories of a specific peer were marked as read.", "params": { @@ -7716,13 +9097,19 @@ "params": {} }, "UpdateSavedReactionTags": { - "desc": "{schema}", + "desc": "The list of reaction tag \u00bb names assigned by the user has changed and should be refetched using messages.getSavedReactionTags \u00bb.", "params": {} }, "UpdateSavedRingtones": { "desc": "The list of saved notification sounds has changed, use account.getSavedRingtones to fetch the new list.", "params": {} }, + "UpdateSentPhoneCode": { + "desc": "A paid login SMS code was successfully sent.", + "params": { + "sent_code": "Info about the sent code." + } + }, "UpdateSentStoryReaction": { "desc": "Indicates we reacted to a story \u00bb.", "params": { @@ -7809,19 +9196,38 @@ } }, "UpdateSmsJob": { - "desc": "{schema}", + "desc": "A new SMS job was received", "params": { - "job_id": "" + "job_id": "SMS job ID" } }, + "UpdateStarGiftAuctionState": { + "desc": "", + "params": {} + }, + "UpdateStarGiftAuctionUserState": { + "desc": "", + "params": {} + }, + "UpdateStarGiftCraftFail": { + "desc": "", + "params": {} + }, "UpdateStarsBalance": { - "desc": "{schema}", + "desc": "The current account's Telegram Stars balance \u00bb has changed.", "params": { - "balance": "" + "balance": "New balance." } }, - "UpdateStickerSets": { - "desc": "Installed stickersets have changed, the client should refetch them as described in the docs.", + "UpdateStarsRevenueStatus": { + "desc": "The Telegram Star balance of a channel/bot we own has changed \u00bb.", + "params": { + "peer": "Channel/bot", + "status": "New Telegram Star balance." + } + }, + "UpdateStickerSets": { + "desc": "Installed stickersets have changed, the client should refetch them as described in the docs.", "params": { "emojis": "Whether the list of installed custom emoji stickersets has changed", "flags": "Flags, see TL conditional fields", @@ -7863,6 +9269,10 @@ "theme": "Theme" } }, + "UpdateTranscribeAudio": { + "desc": "", + "params": {} + }, "UpdateTranscribedAudio": { "desc": "A pending voice message transcription \u00bb initiated with messages.transcribeAudio was updated.", "params": { @@ -7875,7 +9285,7 @@ } }, "UpdateUser": { - "desc": "User information was updated, it must be refetched using users.getFullUser.", + "desc": "User (user and/or userFull) information was updated.", "params": { "user_id": "User ID" } @@ -7976,50 +9386,54 @@ } }, "User": { - "desc": "Indicates info about a certain user", + "desc": "Indicates info about a certain user.", "params": { - "access_hash": "Access hash of the user", - "apply_min_photo": "If set, the profile picture for this user should be refetched", - "attach_menu_enabled": "Whether we installed the attachment menu web app offered by this bot", - "bot": "Is this user a bot?", + "access_hash": "Access hash of the user, see here \u00bb for more info. If this flag is set, when updating the local peer database, generate a virtual flag called min_access_hash, which is: - Set to true if min is set AND -- The phone flag is not set OR -- The phone flag is set and the associated phone number string is non-empty - Set to false otherwise. Then, apply both access_hash and min_access_hash to the local database if: - min_access_hash is false OR - min_access_hash is true AND -- There is no locally cached object for this user OR -- There is no access_hash in the local cache OR -- The cached object's min_access_hash is also true If the final merged object stored to the database has the min_access_hash field set to true, the related access_hash is only suitable to use in inputPeerPhotoFileLocation \u00bb, to directly download the profile pictures of users, everywhere else a inputPeer*FromMessage constructor will have to be generated as specified here \u00bb. Bots can also use min access hashes in some conditions, by passing 0 instead of the min access hash.", + "apply_min_photo": "If set and min is set, the value of photo can be used to update the local database, see the documentation of that flag for more info.", + "attach_menu_enabled": "Whether we installed the attachment menu web app offered by this bot. When updating the local peer database, do not apply changes to this field if the min flag is set.", + "bot": "Is this user a bot? Changes to this flag should invalidate the local userFull cache for this user ID, see here \u00bb for more info.", + "bot_active_users": "Monthly Active Users (MAU) of this bot (may be absent for small bots).", "bot_attach_menu": "Whether this bot offers an attachment menu web app", - "bot_business": "", - "bot_can_edit": "Whether we can edit the profile picture, name, about text and description of this bot because we own it.", + "bot_business": "Whether this bot can be connected to a user as specified here \u00bb.", + "bot_can_edit": "Whether we can edit the profile picture, name, about text and description of this bot because we own it. When updating the local peer database, do not apply changes to this field if the min flag is set. Changes to this flag (if min is not set) should invalidate the local userFull cache for this user ID.", "bot_chat_history": "Can the bot see all messages in groups?", - "bot_info_version": "Version of the bot_info field in userFull, incremented every time it changes", + "bot_has_main_app": "If set, this bot has configured a Main Mini App \u00bb.", + "bot_info_version": "Version of the bot_info field in userFull, incremented every time it changes. Changes to this flag should invalidate the local userFull cache for this user ID, see here \u00bb for more info.", "bot_inline_geo": "Whether the bot can request our geolocation in inline mode", "bot_inline_placeholder": "Inline placeholder for this inline bot", "bot_nochats": "Can the bot be added to groups?", - "close_friend": "Whether we marked this user as a close friend, see here \u00bb for more info", + "bot_verification_icon": "Describes a bot verification icon \u00bb.", + "close_friend": "Whether we marked this user as a close friend, see here \u00bb for more info. When updating the local peer database, do not apply changes to this field if the min flag is set.", "color": "The user's accent color.", - "contact": "Whether this user is a contact", - "contact_require_premium": "", - "deleted": "Whether the account of this user was deleted", + "contact": "Whether this user is a contact When updating the local peer database, do not apply changes to this field if the min flag is set.", + "contact_require_premium": "See here for more info on this flag \u00bb.", + "deleted": "Whether the account of this user was deleted. Changes to this flag should invalidate the local userFull cache for this user ID, see here \u00bb for more info.", "emoji_status": "Emoji status", "fake": "If set, this user was reported by many users as a fake or scam user: be careful when interacting with them.", - "first_name": "First name", + "first_name": "First name. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set.", "flags": "Flags, see TL conditional fields", "flags2": "Flags, see TL conditional fields", - "id": "ID of the user", + "id": "ID of the user, see here \u00bb for more info and the available ID range.", "lang_code": "Language code of the user", - "last_name": "Last name", + "last_name": "Last name. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set.", "min": "See min", - "mutual_contact": "Whether this user is a mutual contact", - "phone": "Phone number", - "photo": "Profile picture of user", - "premium": "Whether this user is a Telegram Premium user", + "mutual_contact": "Whether this user is a mutual contact. When updating the local peer database, do not apply changes to this field if the min flag is set.", + "phone": "Phone number. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set.", + "photo": "Profile picture of user. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The apply_min_photo flag is set OR -- The min flag of the locally cached user entry is set.", + "premium": "Whether this user is a Telegram Premium user Changes to this flag should invalidate the local userFull cache for this user ID, see here \u00bb for more info. Changes to this flag if the self flag is set should also trigger the following calls, to refresh the respective caches: - The help.getConfig cache - The messages.getTopReactions cache if the bot flag is not set", "profile_color": "The user's profile color.", "restricted": "Access to this user must be restricted for the reason specified in restriction_reason", "restriction_reason": "Contains the reason why access to this user must be restricted.", "scam": "This may be a scam user", "self": "Whether this user indicates the currently logged in user", - "status": "Online status of user", - "stories_hidden": "Whether we have hidden \u00bb all active stories of this user.", - "stories_max_id": "ID of the maximum read story.", + "send_paid_messages_stars": "If set, the user has enabled paid messages \u00bb, we might need to pay the specified amount of Stars to send them messages, depending on the configured exceptions: check userFull.send_paid_messages_stars or users.getRequirementsToContact to see if the currently logged in user actually has to pay or not, see here \u00bb for the full flow.", + "status": "Online status of user. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set OR -- The locally cached user entry is equal to userStatusEmpty.", + "stories_hidden": "Whether we have hidden \u00bb all active stories of this user. When updating the local peer database, do not apply changes to this field if the min flag is set.", + "stories_max_id": "ID of the maximum read story. When updating the local peer database, do not apply changes to this field if the min flag of the incoming constructor is set.", "stories_unavailable": "No stories from this user are visible.", "support": "Whether this is an official support user", - "username": "Username", - "usernames": "Additional usernames", + "username": "Main active username. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set. Changes to this flag should invalidate the local userFull cache for this user ID if the above conditions are respected and the bot_can_edit flag is also set.", + "usernames": "Additional usernames. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set. Changes to this flag (if the above conditions are respected) should invalidate the local userFull cache for this user ID.", "verified": "Whether this user is verified" } }, @@ -8033,42 +9447,54 @@ "desc": "Extended user info", "params": { "about": "Bio of the user", - "birthday": "", + "birthday": "Contains info about the user's birthday \u00bb.", "blocked": "Whether you have blocked this user", "blocked_my_stories_from": "Whether we've blocked this user, preventing them from seeing our stories \u00bb.", "bot_broadcast_admin_rights": "A suggested set of administrator rights for the bot, to be shown when adding the bot as admin to a channel, see here for more info on how to handle them \u00bb.", + "bot_can_manage_emoji_status": "If set, this is a bot that can change our emoji status \u00bb", "bot_group_admin_rights": "A suggested set of administrator rights for the bot, to be shown when adding the bot as admin to a group, see here for more info on how to handle them \u00bb.", "bot_info": "For bots, info about the bot (bot commands, etc)", - "business_away_message": "", - "business_greeting_message": "", - "business_intro": "", - "business_location": "", - "business_work_hours": "", + "bot_verification": "Describes a bot verification icon \u00bb.", + "business_away_message": "Telegram Business away message \u00bb.", + "business_greeting_message": "Telegram Business greeting message \u00bb.", + "business_intro": "Specifies a custom Telegram Business profile introduction \u00bb.", + "business_location": "Telegram Business location \u00bb.", + "business_work_hours": "Telegram Business working hours \u00bb.", "can_pin_message": "Whether you can pin messages in the chat with this user, you can do this only for a chat with yourself", + "can_view_revenue": "If set, this user can view ad revenue statistics \u00bb for this bot.", "common_chats_count": "Chats in common with this user", - "contact_require_premium": "", + "contact_require_premium": "If set, we cannot write to this user: subscribe to Telegram Premium to get permission to write to this user. To set this flag for ourselves invoke account.setGlobalPrivacySettings, setting the settings.new_noncontact_peers_require_premium flag, see here \u00bb for more info.", + "disallowed_gifts": "Disallows the reception of specific gift types.", + "display_gifts_button": "If this flag is set for both us and another user (changed through globalPrivacySettings), a gift button should always be displayed in the text field in private chats with the other user: once clicked, the gift UI should be displayed, offering the user options to gift Telegram Premium \u00bb subscriptions or Telegram Gifts \u00bb.", "fallback_photo": "Fallback profile photo, displayed if no photo is present in profile_photo or personal_photo, due to privacy settings.", "flags": "Flags, see TL conditional fields", - "flags2": "", + "flags2": "Flags, see TL conditional fields", "folder_id": "Peer folder ID, for more info click here", "has_scheduled": "Whether scheduled messages are available", "id": "User ID", + "main_tab": "The main tab for the user's profile, see here \u00bb for more info.", "notify_settings": "Notification settings", - "personal_channel_id": "", - "personal_channel_message": "", + "personal_channel_id": "ID of the associated personal channel \u00bb, that should be shown in the profile page.", + "personal_channel_message": "ID of the latest message of the associated personal channel \u00bb, that should be previewed in the profile page.", "personal_photo": "Personal profile photo, to be shown instead of profile_photo.", "phone_calls_available": "Whether this user can make VoIP calls", "phone_calls_private": "Whether this user's privacy settings allow you to call them", "pinned_msg_id": "Message ID of the last pinned message", - "premium_gifts": "Telegram Premium subscriptions gift options", "private_forward_name": "Anonymized text to be shown instead of the user's name on forwarded messages", "profile_photo": "Profile photo", - "read_dates_private": "", + "read_dates_private": "If set, we cannot fetch the exact read date of messages we send to this user using messages.getOutboxReadDate. The exact read date of messages might still be unavailable for other reasons, see here \u00bb for more info. To set this flag for ourselves invoke account.setGlobalPrivacySettings, setting the settings.hide_read_marks flag.", + "saved_music": "The first song on the music tab of the profile, see here \u00bb for more info on the music profile tab.", + "send_paid_messages_stars": "If set and bigger than 0, this user has enabled paid messages \u00bb and we must pay the specified amount of Stars to send messages to them, see here \u00bb for the full flow. If set and equal to 0, the user requires payment in general but we were exempted from paying for any of the reasons specified in the docs \u00bb.", "settings": "Peer settings", - "sponsored_enabled": "", + "sponsored_enabled": "Whether ads were re-enabled for the current account (only accessible to the currently logged-in user), see here \u00bb for more info.", + "stargifts_count": "Number of gifts the user has chosen to display on their profile", + "starref_program": "This bot has an active referral program \u00bb", + "stars_my_pending_rating": "Our pending star rating, only visible for ourselves.", + "stars_my_pending_rating_date": "When the pending star rating will be applied, only visible for ourselves.", + "stars_rating": "The user's star rating.", "stories": "Active stories \u00bb", "stories_pinned_available": "Whether this user has some pinned stories.", - "theme_emoticon": "Emoji associated with chat theme", + "theme": "The chat theme associated with this user \u00bb.", "translations_disabled": "Whether the real-time chat translation popup should be hidden.", "ttl_period": "Time To Live of all messages in this chat; once a message is this many seconds old, it must be deleted.", "video_calls_available": "Whether the user can receive video calls", @@ -8096,17 +9522,21 @@ "desc": "User status has not been set yet.", "params": {} }, + "UserStatusHidden": { + "desc": "", + "params": {} + }, "UserStatusLastMonth": { "desc": "Online status: last seen last month", "params": { - "by_me": "", + "by_me": "If set, the exact user status of this user is actually available to us, but to view it we must first purchase a Premium subscription, or allow this user to see our exact last online status. See here \u00bb for more info.", "flags": "Flags, see TL conditional fields" } }, "UserStatusLastWeek": { "desc": "Online status: last seen last week", "params": { - "by_me": "", + "by_me": "If set, the exact user status of this user is actually available to us, but to view it we must first purchase a Premium subscription, or allow this user to see our exact last online status. See here \u00bb for more info.", "flags": "Flags, see TL conditional fields" } }, @@ -8125,7 +9555,7 @@ "UserStatusRecently": { "desc": "Online status: last seen recently", "params": { - "by_me": "", + "by_me": "If set, the exact user status of this user is actually available to us, but to view it we must first purchase a Premium subscription, or allow this user to see our exact last online status. See here \u00bb for more info.", "flags": "Flags, see TL conditional fields" } }, @@ -8253,22 +9683,33 @@ "embed_width": "Width of the embedded preview", "flags": "Flags, see TL conditional fields", "has_large_media": "Whether the size of the media in the preview can be changed.", - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "id": "Preview ID", "photo": "Image representing the content", "site_name": "Short name of the site (e.g., Google Docs, App Store)", "title": "Title of the content", - "type": "Type of the web page. Can be: article, photo, audio, video, document, profile, app, or something else", - "url": "URL of previewed webpage" + "type": "Type of the web page. One of the following: - app- article- document- gif- photo- profile- telegram_album- telegram_background- telegram_bot- telegram_botapp- telegram_call- telegram_channel- telegram_channel_boost- telegram_channel_direct- telegram_channel_request- telegram_chat- telegram_chat_request- telegram_chatlist- telegram_collection- telegram_community- telegram_giftcode- telegram_group_boost- telegram_livestream- telegram_megagroup- telegram_megagroup_request- telegram_message- telegram_nft- telegram_stickerset- telegram_story- telegram_story_album- telegram_theme- telegram_user- telegram_videochat- telegram_voicechat- video", + "url": "URL of previewed webpage", + "video_cover_photo": "Represents a custom video cover." + } + }, + "WebPageAttributeStarGiftAuction": { + "desc": "", + "params": {} + }, + "WebPageAttributeStarGiftCollection": { + "desc": "Contains info about a gift collection \u00bb for a webPage preview of a gift collection \u00bb (the webPage will have a type of telegram_collection).", + "params": { + "icons": "Gifts in the collection." } }, "WebPageAttributeStickerSet": { - "desc": "{schema}", + "desc": "Contains info about a stickerset \u00bb, for a webPage preview of a stickerset deep link \u00bb (the webPage will have a type of telegram_stickerset).", "params": { - "emojis": "", + "emojis": "Whether this i s a custom emoji stickerset.", "flags": "Flags, see TL conditional fields", - "stickers": "", - "text_color": "" + "stickers": "A subset of the stickerset in the stickerset.", + "text_color": "Whether the color of this TGS custom emoji stickerset should be changed to the text color when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context." } }, "WebPageAttributeStory": { @@ -8288,6 +9729,12 @@ "settings": "Theme settings" } }, + "WebPageAttributeUniqueStarGift": { + "desc": "Contains info about collectible gift \u00bb for a webPage preview of a collectible gift \u00bb (the webPage will have a type of telegram_nft).", + "params": { + "gift": "The starGiftUnique constructor." + } + }, "WebPageEmpty": { "desc": "No preview is available for the webpage", "params": { @@ -8312,6 +9759,10 @@ "url": "URL of the webpage" } }, + "WebPageUrlPending": { + "desc": "", + "params": {} + }, "WebViewMessageSent": { "desc": "Info about a sent inline webview message", "params": { @@ -8322,7 +9773,10 @@ "WebViewResultUrl": { "desc": "Contains the webview URL with appropriate theme and user info parameters added", "params": { - "query_id": "Webview session ID", + "flags": "Flags, see TL conditional fields", + "fullscreen": "If set, the app must be opened in fullscreen", + "fullsize": "If set, the app must be opened in fullsize mode instead of compact mode.", + "query_id": "Webview session ID (only returned by inline button mini apps, menu button mini apps, attachment menu mini apps).", "url": "Webview URL to open" } }, @@ -8364,18 +9818,33 @@ } }, "account.BusinessChatLinks": { - "desc": "{schema}", + "desc": "Contains info about business chat deep links \u00bb created by the current account.", + "params": { + "chats": "Mentioned chats", + "links": "Links", + "users": "Mentioned users" + } + }, + "account.ChatThemes": { + "desc": "Available chat themes", "params": { - "chats": "", - "links": "", - "users": "" + "chats": "Chats mentioned in the themes field.", + "flags": "Flags, see TL conditional fields", + "hash": "Hash to pass to the method that returned this constructor, to avoid refetching the result if it hasn't changed.", + "next_offset": "Next offset for pagination.", + "themes": "Themes.", + "users": "Users mentioned in the themes field." } }, + "account.ChatThemesNotModified": { + "desc": "The available chat themes were not modified", + "params": {} + }, "account.ConnectedBots": { - "desc": "{schema}", + "desc": "Info about currently connected business bots.", "params": { - "connected_bots": "", - "users": "" + "connected_bots": "Info about the connected bots", + "users": "Bot information" } }, "account.ContentSettings": { @@ -8402,7 +9871,7 @@ "account.EmojiStatuses": { "desc": "A list of emoji statuses", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "statuses": "Emoji statuses" } }, @@ -8410,6 +9879,20 @@ "desc": "The server-side list of emoji statuses hasn't changed", "params": {} }, + "account.PaidMessagesRevenue": { + "desc": "Total number of non-refunded Telegram Stars a user has spent on sending us messages either directly or through a channel, see here \u00bb for more info on paid messages.", + "params": { + "stars_amount": "Amount in Stars." + } + }, + "account.PasskeyRegistrationOptions": { + "desc": "", + "params": {} + }, + "account.Passkeys": { + "desc": "", + "params": {} + }, "account.Password": { "desc": "Configuration for two-factor authorization", "params": { @@ -8473,16 +9956,26 @@ } }, "account.ResolvedBusinessChatLinks": { - "desc": "{schema}", + "desc": "Contains info about a single resolved business chat deep link \u00bb.", "params": { - "chats": "", + "chats": "Mentioned chats", "entities": "Message entities for styled text", "flags": "Flags, see TL conditional fields", - "message": "", - "peer": "", - "users": "" + "message": "Message to pre-fill in the message input field.", + "peer": "Destination peer", + "users": "Mentioned users" + } + }, + "account.SavedMusicIds": { + "desc": "List of IDs of songs (document.ids) currently pinned on our profile, see here \u00bb for more info.", + "params": { + "ids": "Full list of document.ids" } }, + "account.SavedMusicIdsNotModified": { + "desc": "The list of IDs of songs (document.ids) currently pinned on our profile hasn't changed.", + "params": {} + }, "account.SavedRingtone": { "desc": "The notification sound was already in MP3 format and was saved without any modification", "params": {} @@ -8496,7 +9989,7 @@ "account.SavedRingtones": { "desc": "A list of saved notification sounds", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "ringtones": "Saved notification sounds" } }, @@ -8520,7 +10013,7 @@ "account.Themes": { "desc": "Installed themes", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "themes": "Themes" } }, @@ -8538,7 +10031,7 @@ "account.WallPapers": { "desc": "Installed wallpapers", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "wallpapers": "Wallpapers" } }, @@ -8558,7 +10051,7 @@ "params": { "flags": "Flags, see TL conditional fields", "future_auth_token": "A future auth token", - "otherwise_relogin_days": "Iff setup_password_required is set and the user declines to set a 2-step verification password, they will be able to log into their account via SMS again only after this many days pass.", + "otherwise_relogin_days": "If and only if setup_password_required is set and the user declines to set a 2-step verification password, they will be able to log into their account via SMS again only after this many days pass.", "setup_password_required": "Suggests the user to set up a 2-step verification password to be able to log in again", "tmp_sessions": "Temporary passport sessions", "user": "Info on authorized user" @@ -8625,6 +10118,10 @@ "authorization": "Authorization info" } }, + "auth.PasskeyLoginOptions": { + "desc": "", + "params": {} + }, "auth.PasswordRecovery": { "desc": "Recovery info of a 2FA password, only for accounts with a recovery email configured.", "params": { @@ -8641,6 +10138,15 @@ "type": "Phone code type" } }, + "auth.SentCodePaymentRequired": { + "desc": "Official apps may receive this constructor, indicating that due to the high cost of SMS verification codes for the user's country/provider, the user must purchase a Telegram Premium subscription in order to proceed with the login/signup.", + "params": { + "phone_code_hash": "Phone code hash, to be stored and later re-used with auth.signIn", + "store_product": "Store identifier of the Telegram Premium subscription.", + "support_email_address": "An email address that can be contacted for more information about this request.", + "support_email_subject": "The mandatory subject for the email." + } + }, "auth.SentCodeSuccess": { "desc": "The user successfully authorized using future auth tokens", "params": { @@ -8677,7 +10183,8 @@ "flags": "Flags, see TL conditional fields", "length": "Length of the code that will be delivered.", "nonce": "On Android, the nonce to be used as described in the auth documentation \u00bb", - "play_integrity_nonce": "", + "play_integrity_nonce": "Play Integrity API nonce", + "play_integrity_project_id": "Google Play Integrity project ID", "push_timeout": "On iOS: if a push notification with the ios_push_secret isn't received within push_timeout seconds, the next_type authentication method must be used, with auth.resendCode.", "receipt": "On iOS, must be compared with the receipt extracted from the received push notification." } @@ -8717,16 +10224,16 @@ } }, "auth.SentCodeTypeSmsPhrase": { - "desc": "{schema}", + "desc": "The code was sent via SMS as a secret phrase starting with the word specified in beginning", "params": { - "beginning": "", + "beginning": "If set, the secret phrase (and the SMS) starts with this word.", "flags": "Flags, see TL conditional fields" } }, "auth.SentCodeTypeSmsWord": { - "desc": "{schema}", + "desc": "The code was sent via SMS as a secret word, starting with the letter specified in beginning", "params": { - "beginning": "", + "beginning": "If set, the secret word in the sent SMS (which may contain multiple words) starts with this letter.", "flags": "Flags, see TL conditional fields" } }, @@ -8738,6 +10245,21 @@ "name": "Bot name" } }, + "bots.PopularAppBots": { + "desc": "Popular Main Mini Apps, to be used in the apps tab of global search \u00bb.", + "params": { + "flags": "Flags, see TL conditional fields", + "next_offset": "Offset for pagination.", + "users": "The bots associated to each Main Mini App, see here \u00bb for more info." + } + }, + "bots.PreviewInfo": { + "desc": "Contains info about Main Mini App previews, see here \u00bb for more info.", + "params": { + "lang_codes": "All available language codes for which preview medias were uploaded (regardless of the language code passed to bots.getPreviewInfo).", + "media": "All preview medias for the language code passed to bots.getPreviewInfo." + } + }, "channels.AdminLogResults": { "desc": "Admin log events", "params": { @@ -8776,18 +10298,18 @@ } }, "channels.SponsoredMessageReportResultAdsHidden": { - "desc": "{schema}", + "desc": "Sponsored messages were hidden for the user in all chats.", "params": {} }, "channels.SponsoredMessageReportResultChooseOption": { - "desc": "{schema}", + "desc": "The user must choose a report option from the localized options available in options, and after selection, channels.reportSponsoredMessage must be invoked again, passing the option's option field to the option param of the method.", "params": { - "options": "", - "title": "" + "options": "Localized list of options.", + "title": "Title of the option selection popup." } }, "channels.SponsoredMessageReportResultReported": { - "desc": "{schema}", + "desc": "The sponsored message was reported successfully.", "params": {} }, "chatlists.ChatlistInvite": { @@ -8798,6 +10320,7 @@ "flags": "Flags, see TL conditional fields", "peers": "Supergroups and channels to join", "title": "Name of the link", + "title_noanimate": "If set, any animated emojis present in title should not be animated and should be instead frozen on the first frame.", "users": "Related user information" } }, @@ -8852,10 +10375,10 @@ } }, "contacts.ContactBirthdays": { - "desc": "{schema}", + "desc": "Birthday information of our contacts.", "params": { - "contacts": "", - "users": "" + "contacts": "Birthday info", + "users": "User information" } }, "contacts.Contacts": { @@ -8896,6 +10419,18 @@ "users": "Users" } }, + "contacts.SponsoredPeers": { + "desc": "Sponsored peers.", + "params": { + "chats": "Info about sponsored chats and channels", + "peers": "Sponsored peers.", + "users": "Info about sponsored users" + } + }, + "contacts.SponsoredPeersEmpty": { + "desc": "There are no sponsored peers for this query.", + "params": {} + }, "contacts.TopPeers": { "desc": "Top peers", "params": { @@ -8913,21 +10448,21 @@ "params": {} }, "fragment.CollectibleInfo": { - "desc": "{schema}", + "desc": "Info about a fragment collectible.", "params": { - "amount": "", - "crypto_amount": "", - "crypto_currency": "", - "currency": "", - "purchase_date": "", - "url": "" + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "crypto_amount": "Price, in the smallest units of the cryptocurrency.", + "crypto_currency": "Cryptocurrency name.", + "currency": "Three-letter ISO 4217 currency code for amount", + "purchase_date": "Purchase date (unixtime)", + "url": "Fragment URL with more info about the collectible" } }, "help.AppConfig": { "desc": "Contains various client configuration parameters", "params": { "config": "Client configuration parameters", - "hash": "Hash for pagination, for more info click here" + "hash": "Hash used for caching, for more info click here" } }, "help.AppConfigNotModified": { @@ -8952,7 +10487,7 @@ "desc": "Name, ISO code, localized name and phone codes/patterns of all available countries", "params": { "countries": "Name, ISO code, localized name and phone codes/patterns of all available countries", - "hash": "Hash for pagination, for more info click here" + "hash": "Hash used for caching, for more info click here" } }, "help.CountriesListNotModified": { @@ -9006,7 +10541,7 @@ "desc": "Telegram passport configuration", "params": { "countries_langs": "Localization", - "hash": "Hash for pagination, for more info click here" + "hash": "Hash used for caching, for more info click here" } }, "help.PassportConfigNotModified": { @@ -9018,10 +10553,10 @@ "params": { "channel_min_level": "Channels can use this palette only after reaching at least the boost level specified in this field.", "color_id": "Palette ID.", - "colors": "Light mode palette. Will be empty for IDs 0 to 6 inclusive, in which case a palette containing a single color from the following colors should be used: red, orange, violet, green, cyan, blue, pink for indexes 0 to 6.", + "colors": "Light mode palette. Will be empty for IDs 0 to 6 inclusive, in which case a palette containing a single color from the following colors should be used: red, orange, violet, green, cyan, blue, pink for indexes 0 to 6 (i.e. the same colors used for randomized fallback message accent colors).", "dark_colors": "Dark mode palette. Optional, defaults to the palette in colors (or the autogenerated palette for IDs 0 to 6) if absent.", "flags": "Flags, see TL conditional fields", - "group_min_level": "", + "group_min_level": "Supergroups can use this palette only after reaching at least the boost level specified in this field.", "hidden": "Whether this palette should not be displayed as an option to the user when choosing a palette to apply to profile pages or message accents." } }, @@ -9043,7 +10578,7 @@ "desc": "Contains info about multiple color palettes \u00bb.", "params": { "colors": "Usable color palettes.", - "hash": "Hash for pagination, for more info click here" + "hash": "Hash used for caching, for more info click here" } }, "help.PeerColorsNotModified": { @@ -9062,15 +10597,18 @@ } }, "help.PromoData": { - "desc": "MTProxy/Public Service Announcement information", + "desc": "A set of useful suggestions and a PSA/MTProxy sponsored peer, see here \u00bb for more info.", "params": { "chats": "Chat info", - "expires": "Expiry of PSA/MTProxy info", + "custom_pending_suggestion": "Contains a list of custom pending suggestions \u00bb.", + "dismissed_suggestions": "Contains a list of inverted suggestions \u00bb.", + "expires": "Unixtime when to re-invoke help.getPromoData.", "flags": "Flags, see TL conditional fields", "peer": "MTProxy/PSA peer", - "proxy": "MTProxy-related channel", - "psa_message": "PSA message", - "psa_type": "PSA type", + "pending_suggestions": "Contains a list of pending suggestions \u00bb.", + "proxy": "Set when connecting using an MTProxy that has configured an associated peer (that will be passed in peer, i.e. the channel that sponsored the MTProxy) that should be pinned on top of the chat list.", + "psa_message": "For Public Service Announcement peers, contains the PSA itself.", + "psa_type": "For Public Service Announcement peers, indicates the type of the PSA.", "users": "User info" } }, @@ -9126,14 +10664,14 @@ } }, "help.TimezonesList": { - "desc": "{schema}", + "desc": "Timezone information that may be used elsewhere in the API, such as to set Telegram Business opening hours \u00bb.", "params": { - "hash": "Hash for pagination, for more info click here", - "timezones": "" + "hash": "Hash used for caching, for more info click here", + "timezones": "Timezones" } }, "help.TimezonesListNotModified": { - "desc": "{schema}", + "desc": "The timezone list has not changed.", "params": {} }, "help.UserInfo": { @@ -9176,7 +10714,7 @@ "messages.AllStickers": { "desc": "Info about all installed stickers", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "sets": "All stickersets" } }, @@ -9192,21 +10730,21 @@ } }, "messages.AvailableEffects": { - "desc": "{schema}", + "desc": "The full list of usable animated message effects \u00bb.", "params": { - "documents": "", - "effects": "", - "hash": "Hash for pagination, for more info click here" + "documents": "Documents specified in the effects constructors.", + "effects": "Message effects", + "hash": "Hash used for caching, for more info click here" } }, "messages.AvailableEffectsNotModified": { - "desc": "{schema}", + "desc": "The full list of usable animated message effects \u00bb hasn't changed.", "params": {} }, "messages.AvailableReactions": { "desc": "Animations and metadata associated with message reactions \u00bb", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "reactions": "Animations and metadata associated with message reactions \u00bb" } }, @@ -9236,6 +10774,13 @@ "url": "URL to open" } }, + "messages.BotPreparedInlineMessage": { + "desc": "Represents a prepared inline message saved by a bot, to be sent to the user via a web app \u00bb", + "params": { + "expire_date": "Expiration date of the message", + "id": "The ID of the saved message, to be passed to the id field of the web_app_send_prepared_message event \u00bb" + } + }, "messages.BotResults": { "desc": "Result of a query to an inline bot", "params": { @@ -9322,11 +10867,11 @@ } }, "messages.DialogFilters": { - "desc": "{schema}", + "desc": "Folder and folder tags information", "params": { - "filters": "", + "filters": "Folders.", "flags": "Flags, see TL conditional fields", - "tags_enabled": "" + "tags_enabled": "Whether folder tags are enabled." } }, "messages.Dialogs": { @@ -9367,11 +10912,23 @@ "users": "Users mentioned in constructor" } }, + "messages.EmojiGameDiceInfo": { + "desc": "", + "params": {} + }, + "messages.EmojiGameOutcome": { + "desc": "", + "params": {} + }, + "messages.EmojiGameUnavailable": { + "desc": "", + "params": {} + }, "messages.EmojiGroups": { "desc": "Represents a list of emoji categories.", "params": { "groups": "A list of emoji categories.", - "hash": "Hash for pagination, for more info click here" + "hash": "Hash used for caching, for more info click here" } }, "messages.EmojiGroupsNotModified": { @@ -9404,7 +10961,7 @@ "messages.FavedStickers": { "desc": "Favorited stickers", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "packs": "Emojis associated to stickers", "stickers": "Favorited stickers" } @@ -9418,7 +10975,7 @@ "params": { "count": "Total number of featured stickers", "flags": "Flags, see TL conditional fields", - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "premium": "Whether this is a premium stickerset", "sets": "Featured stickersets", "unread": "IDs of new featured stickersets" @@ -9446,7 +11003,7 @@ "messages.FoundStickerSets": { "desc": "Found stickersets", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "sets": "Found stickersets" } }, @@ -9454,6 +11011,22 @@ "desc": "No further results were found", "params": {} }, + "messages.FoundStickers": { + "desc": "Found stickers", + "params": { + "flags": "Flags, see TL conditional fields", + "hash": "Hash used for caching, for more info click here", + "next_offset": "Offset for pagination", + "stickers": "Found stickers" + } + }, + "messages.FoundStickersNotModified": { + "desc": "No new stickers were found for the specified query", + "params": { + "flags": "Flags, see TL conditional fields", + "next_offset": "Offset for pagination" + } + }, "messages.HighScores": { "desc": "Highscores in a game", "params": { @@ -9485,10 +11058,10 @@ } }, "messages.InvitedUsers": { - "desc": "{schema}", + "desc": "Contains info about successfully or unsuccessfully invited \u00bb users.", "params": { - "missing_invitees": "", - "updates": "" + "missing_invitees": "A list of users that could not be invited, along with the reason why they couldn't be invited.", + "updates": "List of updates about successfully invited users (and eventually info about the created group)" } }, "messages.MessageEditData": { @@ -9498,6 +11071,10 @@ "flags": "Flags, see TL conditional fields" } }, + "messages.MessageEmpty": { + "desc": "Empty constructor. Can be used, for example, in case when an action did not require to create a service message.", + "params": {} + }, "messages.MessageReactionsList": { "desc": "List of peers that reacted to a specific message", "params": { @@ -9540,15 +11117,16 @@ "inexact": "If set, indicates that the results may be inexact", "messages": "List of messages", "next_rate": "Rate to use in the offset_rate parameter in the next call to messages.searchGlobal", - "offset_id_offset": "Indicates the absolute position of messages[0] within the total result set with count count. This is useful, for example, if the result was fetched using offset_id, and we need to display a progress/total counter (like photo 134 of 200, for all media in a chat, we could simply use photo ${offset_id_offset} of ${count}.", + "offset_id_offset": "Indicates the absolute position of messages[0] within the total result set with count count. This is useful, for example, if the result was fetched using offset_id, and we need to display a progress/total counter (like photo 134 of 200, for all media in a chat, we could simply use photo ${offset_id_offset} of ${count}).", + "search_flood": "For global post searches \u00bb, the remaining amount of free searches, here query_is_free is related to the current call only, not to the next paginated call, and all subsequent pagination calls will always be free.", "users": "List of users mentioned in messages and chats" } }, "messages.MyStickers": { - "desc": "{schema}", + "desc": "The list of stickersets owned by the current account \u00bb.", "params": { - "count": "", - "sets": "" + "count": "Total number of owned stickersets.", + "sets": "Stickersets" } }, "messages.PeerDialogs": { @@ -9569,23 +11147,33 @@ "users": "Mentioned users" } }, + "messages.PreparedInlineMessage": { + "desc": "Represents a prepared inline message received via a bot's mini app, that can be sent to some chats \u00bb", + "params": { + "cache_time": "Caching validity of the results", + "peer_types": "Types of chats where this message can be sent", + "query_id": "The query_id to pass to messages.sendInlineBotResult", + "result": "The contents of the message, to be shown in a preview", + "users": "Users mentioned in the results" + } + }, "messages.QuickReplies": { - "desc": "{schema}", + "desc": "Info about quick reply shortcuts \u00bb.", "params": { - "chats": "", - "messages": "", - "quick_replies": "", - "users": "" + "chats": "Mentioned chats", + "messages": "Messages mentioned in quick_replies.", + "quick_replies": "Quick reply shortcuts.", + "users": "Mentioned users" } }, "messages.QuickRepliesNotModified": { - "desc": "{schema}", + "desc": "Info about quick reply shortcuts \u00bb hasn't changed.", "params": {} }, "messages.Reactions": { "desc": "List of message reactions", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, can also be locally regenerated using the algorithm specified here \u00bb.", "reactions": "Reactions" } }, @@ -9597,7 +11185,7 @@ "desc": "Recently used stickers", "params": { "dates": "When was each sticker last used", - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "packs": "Emojis associated to stickers", "stickers": "Recent stickers" } @@ -9635,7 +11223,7 @@ "desc": "Saved gifs", "params": { "gifs": "List of saved gifs", - "hash": "Hash for pagination, for more info click here" + "hash": "Hash used for caching, for more info click here" } }, "messages.SavedGifsNotModified": { @@ -9643,14 +11231,14 @@ "params": {} }, "messages.SavedReactionTags": { - "desc": "{schema}", + "desc": "List of reaction tag \u00bb names assigned by the user.", "params": { - "hash": "Hash for pagination, for more info click here", - "tags": "" + "hash": "Hash used for caching, for more info click here. Can also be manually regenerated, if needed, using the custom algorithm specified here \u00bb.", + "tags": "Saved reaction tags." } }, "messages.SavedReactionTagsNotModified": { - "desc": "{schema}", + "desc": "The list of reaction tag \u00bb names assigned by the user hasn't changed.", "params": {} }, "messages.SearchCounter": { @@ -9700,10 +11288,12 @@ "messages.SponsoredMessages": { "desc": "A set of sponsored messages associated to a channel", "params": { + "between_delay": "For sponsored messages to show on channel videos \u00bb, the number of seconds to wait after the previous ad is hidden, before showing the next ad.", "chats": "Chats mentioned in the sponsored messages", "flags": "Flags, see TL conditional fields", "messages": "Sponsored messages", "posts_between": "If set, specifies the minimum number of messages between shown sponsored messages; otherwise, only one sponsored message must be shown after all ordinary messages.", + "start_delay": "For sponsored messages to show on channel videos \u00bb, the number of seconds to wait before showing the first ad.", "users": "Users mentioned in the sponsored messages" } }, @@ -9737,7 +11327,7 @@ "messages.Stickers": { "desc": "Found stickers", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "stickers": "Stickers" } }, @@ -9781,6 +11371,18 @@ "webpage": "The instant view webpage." } }, + "messages.WebPagePreview": { + "desc": "Represents a webpage preview.", + "params": { + "chats": "Chats mentioned in the gift field.", + "media": "The messageMediaWebPage or a messageMediaEmpty if there is no preview.", + "users": "Users mentioned within the media object." + } + }, + "messages.WebViewResult": { + "desc": "", + "params": {} + }, "payments.BankCardData": { "desc": "Credit card info, provided by the card's bank(s)", "params": { @@ -9788,6 +11390,16 @@ "title": "Credit card title" } }, + "payments.CheckCanSendGiftResultFail": { + "desc": "The specified gift cannot be sent yet for the specified reason.", + "params": { + "reason": "The reason why it can't be sent yet." + } + }, + "payments.CheckCanSendGiftResultOk": { + "desc": "The specified gift can be sent.", + "params": {} + }, "payments.CheckedGiftCode": { "desc": "Contains info about a Telegram Premium giftcode link.", "params": { @@ -9803,6 +11415,14 @@ "via_giveaway": "Whether this giftcode was created by a giveaway." } }, + "payments.ConnectedStarRefBots": { + "desc": "Active affiliations", + "params": { + "connected_bots": "The affiliations", + "count": "Total number of active affiliations", + "users": "Peers mentioned in connected_bots" + } + }, "payments.ExportedInvoice": { "desc": "Exported invoice deep link", "params": { @@ -9829,6 +11449,7 @@ "flags": "Flags, see TL conditional fields", "gift_code_slug": "If we're one of the winners of this giveaway, contains the Premium gift code, see here \u00bb for more info on the full giveaway flow.", "refunded": "Whether the giveaway was canceled and was fully refunded.", + "stars_prize": "If we're one of the winners of this Telegram Star giveaway, the number Telegram Stars we won.", "start_date": "Start date of the giveaway", "winner": "Whether we're one of the winners of this giveaway.", "winners_count": "Number of winners in the giveaway" @@ -9856,17 +11477,24 @@ "users": "Users" } }, + "payments.PaymentFormStarGift": { + "desc": "Represents a payment form for a gift, see here \u00bb for more info.", + "params": { + "form_id": "Form ID.", + "invoice": "Invoice" + } + }, "payments.PaymentFormStars": { - "desc": "{schema}", + "desc": "Represents a payment form, for payments to be using Telegram Stars, see here \u00bb for more info.", "params": { - "bot_id": "", - "description": "", + "bot_id": "Bot ID.", + "description": "Description", "flags": "Flags, see TL conditional fields", - "form_id": "", - "invoice": "", - "photo": "", - "title": "", - "users": "" + "form_id": "Form ID.", + "invoice": "Invoice", + "photo": "Product photo", + "title": "Form title", + "users": "Info about users mentioned in the other fields." } }, "payments.PaymentReceipt": { @@ -9890,19 +11518,19 @@ } }, "payments.PaymentReceiptStars": { - "desc": "{schema}", + "desc": "Receipt for payment made using Telegram Stars.", "params": { - "bot_id": "", - "currency": "", - "date": "", - "description": "", + "bot_id": "Bot ID", + "currency": "Currency, always XTR.", + "date": "Date of generation", + "description": "Description", "flags": "Flags, see TL conditional fields", - "invoice": "", - "photo": "", - "title": "", - "total_amount": "", - "transaction_id": "", - "users": "" + "invoice": "Invoice", + "photo": "Product photo", + "title": "Title", + "total_amount": "Amount of Telegram Stars.", + "transaction_id": "Transaction ID", + "users": "Info about users mentioned in the other fields." } }, "payments.PaymentResult": { @@ -9917,6 +11545,20 @@ "url": "URL for additional payment credentials verification" } }, + "payments.ResaleStarGifts": { + "desc": "List of gifts currently on resale \u00bb.", + "params": { + "attributes": "Possible gift attributes, only set if payments.getResaleStarGifts.attributes_hash is set (on the first call, it must be equal to 0).", + "attributes_hash": "Hash of the attributes field, pass this to payments.getResaleStarGifts.attributes_hash to avoid returning any attributes (flag not set) if they haven't changed.", + "chats": "Chats mentioned in the attributes.", + "count": "Total number of results.", + "counters": "Indicates the total number of gifts that have a specific attribute, only set if payments.getResaleStarGifts.offset is empty (since this field is not related to the current result page but to all of them, it's only returned on the first page).", + "flags": "Flags, see TL conditional fields", + "gifts": "Collectible gifts on resale (may be less than count, in which case next_offset will be set).", + "next_offset": "Offset for pagination, pass this to payments.getResaleStarGifts.offset to fetch the next results.", + "users": "Users mentioned in the attributes." + } + }, "payments.SavedInfo": { "desc": "Saved server-side order information", "params": { @@ -9925,15 +11567,145 @@ "saved_info": "Saved server-side order information" } }, + "payments.SavedStarGifts": { + "desc": "Represents a list of gifts.", + "params": { + "chat_notifications_enabled": "Ternary value: can be not set, set&true, set&false. Can only be set for channels we own: the value indicates whether we enabled gift notifications for this channel.", + "chats": "Channels mentioned in gifts", + "count": "Total number of results (can be less than the returned gifts, in which case next_offset will be set).", + "flags": "Flags, see TL conditional fields", + "gifts": "Gifts", + "next_offset": "Offset to pass to payments.getSavedStarGifts to fetch the next page of results.", + "users": "Users mentioned in gifts" + } + }, + "payments.StarGiftActiveAuctions": { + "desc": "", + "params": {} + }, + "payments.StarGiftActiveAuctionsNotModified": { + "desc": "", + "params": {} + }, + "payments.StarGiftAuctionAcquiredGifts": { + "desc": "", + "params": {} + }, + "payments.StarGiftAuctionState": { + "desc": "", + "params": {} + }, + "payments.StarGiftCollections": { + "desc": "Represents a list of star gift collections \u00bb.", + "params": { + "collections": "Star gift collections." + } + }, + "payments.StarGiftCollectionsNotModified": { + "desc": "The list of star gift collections \u00bb hasn't changed.", + "params": {} + }, + "payments.StarGiftUpgradeAttributes": { + "desc": "", + "params": {} + }, + "payments.StarGiftUpgradePreview": { + "desc": "A preview of the possible attributes (chosen randomly) a gift \u00bb can receive after upgrading it to a collectible gift \u00bb, see here \u00bb for more info.", + "params": { + "sample_attributes": "Possible gift attributes" + } + }, + "payments.StarGiftWithdrawalUrl": { + "desc": "A URL that can be used to import the exported NFT on Fragment.", + "params": { + "url": "The URL to open." + } + }, + "payments.StarGifts": { + "desc": "Available gifts \u00bb.", + "params": { + "chats": "Chats mentioned in the gifts field.", + "gifts": "List of available gifts.", + "hash": "Hash used for caching, for more info click here", + "users": "Users mentioned in the gifts field." + } + }, + "payments.StarGiftsNotModified": { + "desc": "The list of available gifts \u00bb hasn't changed.", + "params": {} + }, + "payments.StarsRevenueAdsAccountUrl": { + "desc": "Contains a URL leading to a page where the user will be able to place ads for the channel/bot, paying using Telegram Stars.", + "params": { + "url": "URL to open." + } + }, + "payments.StarsRevenueStats": { + "desc": "Star revenue statistics, see here \u00bb for more info.", + "params": { + "flags": "Flags, see TL conditional fields", + "revenue_graph": "Star revenue graph (number of earned stars)", + "status": "Current balance, current withdrawable balance and overall earned Telegram Stars", + "top_hours_graph": "For ad revenue statistics, ad impressions graph", + "usd_rate": "Current conversion rate of Telegram Stars to USD" + } + }, + "payments.StarsRevenueWithdrawalUrl": { + "desc": "Contains the URL to use to withdraw Telegram Star revenue.", + "params": { + "url": "Contains the URL to use to withdraw Telegram Star revenue." + } + }, "payments.StarsStatus": { - "desc": "{schema}", + "desc": "Info about the current Telegram Star subscriptions, balance and transaction history \u00bb.", "params": { - "balance": "", - "chats": "", + "balance": "Current Telegram Star balance.", + "chats": "Chats mentioned in history.", "flags": "Flags, see TL conditional fields", - "history": "", - "next_offset": "", - "users": "" + "history": "List of Telegram Star transactions (partial if next_offset is set).", + "next_offset": "Offset to use to fetch more transactions from the transaction history using payments.getStarsTransactions.", + "subscriptions": "Info about current Telegram Star subscriptions, only returned when invoking payments.getStarsTransactions and payments.getStarsSubscriptions.", + "subscriptions_missing_balance": "The number of Telegram Stars the user should buy to be able to extend expired subscriptions soon (i.e. the current balance is not enough to extend all expired subscriptions).", + "subscriptions_next_offset": "Offset for pagination of subscriptions: only usable and returned when invoking payments.getStarsSubscriptions.", + "users": "Users mentioned in history." + } + }, + "payments.SuggestedStarRefBots": { + "desc": "A list of suggested mini apps with available affiliate programs", + "params": { + "count": "Total number of results (for pagination)", + "flags": "Flags, see TL conditional fields", + "next_offset": "Next offset for pagination", + "suggested_bots": "Suggested affiliate programs (full or partial list to be fetched using pagination)", + "users": "Peers mentioned in suggested_bots" + } + }, + "payments.UniqueStarGift": { + "desc": "Represents a collectible gift \u00bb.", + "params": { + "chats": "Chats mentioned in the gift field.", + "gift": "The starGiftUnique constructor.", + "users": "Users mentioned in the gift field." + } + }, + "payments.UniqueStarGiftValueInfo": { + "desc": "Information about the value of a collectible gift \u00bb.", + "params": { + "average_price": "The current average sale price of collectible gifts of the same type, in the smallest unit of the currency specified in currency.", + "currency": "Three-letter ISO 4217 currency code (a localized fiat currency used to represent prices and price estimations in this constructor).", + "flags": "Flags, see TL conditional fields", + "floor_price": "The current minimum price of collectible gifts of the same type, in the smallest unit of the currency specified in currency.", + "fragment_listed_count": "Number of gifts of the same type currently being resold on fragment.", + "fragment_listed_url": "Fragment link to the listing of gifts of the same type currently being resold on fragment.", + "initial_sale_date": "Initial purchase date of the gift.", + "initial_sale_price": "Initial purchase price in the smallest unit of the currency specified in currency (automatically converted from initial_sale_stars).", + "initial_sale_stars": "Initial purchase price in Stars.", + "last_sale_date": "Last resale date of the gift.", + "last_sale_on_fragment": "If set, the last sale was completed on Fragment.", + "last_sale_price": "Last resale price, in the smallest unit of the currency specified in currency.", + "listed_count": "Number of gifts of the same type currently being resold on Telegram.", + "value": "Estimated value of the gift, in the smallest unit of the currency specified in currency.", + "value_is_average": "If set, the value is calculated from the average value of sold gifts of the same type. Otherwise, it is based on the sale price of the gift." } }, "payments.ValidatedRequestedInfo": { @@ -9960,6 +11732,10 @@ "users": "Users mentioned in the participants vector" } }, + "phone.GroupCallStars": { + "desc": "", + "params": {} + }, "phone.GroupCallStreamChannels": { "desc": "Info about RTMP streams in a group call or livestream", "params": { @@ -10038,13 +11814,13 @@ "boosts": "Total number of boosts acquired so far.", "current_level_boosts": "The number of boosts acquired so far in the current level.", "flags": "Flags, see TL conditional fields", - "gift_boosts": "The number of boosts acquired from created Telegram Premium gift codes and giveaways; only returned to channel admins.", - "level": "The current boost level of the channel.", - "my_boost": "Whether we're currently boosting this channel, my_boost_slots will also be set.", + "gift_boosts": "The number of boosts acquired from created Telegram Premium gift codes and giveaways; only returned to channel/supergroup admins.", + "level": "The current boost level of the channel/supergroup.", + "my_boost": "Whether we're currently boosting this channel/supergroup, my_boost_slots will also be set.", "my_boost_slots": "Indicates which of our boost slots we've assigned to this peer (populated if my_boost is set).", "next_level_boosts": "Total number of boosts needed to reach the next level; if absent, the next level isn't available.", - "premium_audience": "Only returned to channel admins: contains the approximated number of Premium users subscribed to the channel, related to the total number of subscribers.", - "prepaid_giveaways": "A list of prepaid giveaways available for the chat; only returned to channel admins." + "premium_audience": "Only returned to channel/supergroup admins: contains the approximated number of Premium users subscribed to the channel/supergroup, related to the total number of subscribers.", + "prepaid_giveaways": "A list of prepaid giveaways available for the chat; only returned to channel/supergroup admins." } }, "premium.MyBoosts": { @@ -10056,46 +11832,24 @@ } }, "smsjobs.EligibleToJoin": { - "desc": "{schema}", + "desc": "SMS jobs eligibility", "params": { - "monthly_sent_sms": "", - "terms_url": "" + "monthly_sent_sms": "Monthly sent SMSes", + "terms_url": "Terms of service URL" } }, "smsjobs.Status": { - "desc": "{schema}", + "desc": "Status", "params": { - "allow_international": "", + "allow_international": "Allow international numbers", "flags": "Flags, see TL conditional fields", - "last_gift_slug": "", - "recent_remains": "", - "recent_sent": "", - "recent_since": "", - "terms_url": "", - "total_sent": "", - "total_since": "" - } - }, - "stats.BroadcastRevenueStats": { - "desc": "{schema}", - "params": { - "balances": "", - "revenue_graph": "", - "top_hours_graph": "", - "usd_rate": "" - } - }, - "stats.BroadcastRevenueTransactions": { - "desc": "{schema}", - "params": { - "count": "", - "transactions": "" - } - }, - "stats.BroadcastRevenueWithdrawalUrl": { - "desc": "{schema}", - "params": { - "url": "" + "last_gift_slug": "Last gift deep link", + "recent_remains": "Remaining", + "recent_sent": "Recently sent", + "recent_since": "Since", + "terms_url": "Terms of service URL", + "total_sent": "Total sent", + "total_since": "Total since" } }, "stats.BroadcastStats": { @@ -10218,6 +11972,17 @@ "desc": "WEBP image. MIME type: image/webp.", "params": {} }, + "stories.Albums": { + "desc": "Story albums \u00bb.", + "params": { + "albums": "The albums.", + "hash": "Hash to pass to stories.getAlbums to avoid returning any results if they haven't changed." + } + }, + "stories.AlbumsNotModified": { + "desc": "The story album list \u00bb hasn't changed.", + "params": {} + }, "stories.AllStories": { "desc": "Full list of active (or active and hidden) stories.", "params": { @@ -10239,6 +12004,23 @@ "stealth_mode": "Current stealth mode information" } }, + "stories.CanSendStoryCount": { + "desc": "Contains the number of available active story slots (equal to the value of the story_expiring_limit_* client configuration parameter minus the number of currently active stories).", + "params": { + "count_remains": "Remaining active story slots." + } + }, + "stories.FoundStories": { + "desc": "Stories found using global story search \u00bb.", + "params": { + "chats": "Mentioned chats", + "count": "Total number of results found for the query.", + "flags": "Flags, see TL conditional fields", + "next_offset": "Offset used to fetch the next page, if not set this is the final page.", + "stories": "Matching stories.", + "users": "Mentioned users" + } + }, "stories.PeerStories": { "desc": "Active story list of a specific peer.", "params": { @@ -10253,7 +12035,7 @@ "chats": "Mentioned chats", "count": "Total number of stories that can be fetched", "flags": "Flags, see TL conditional fields", - "pinned_to_top": "", + "pinned_to_top": "IDs of pinned stories.", "stories": "Stories", "users": "Mentioned users" } @@ -10299,7 +12081,7 @@ "new_messages": "New messages", "other_updates": "Other updates", "pts": "The PTS from which to start getting updates the next time", - "timeout": "Clients are supposed to refetch the channel difference after timeout seconds have elapsed", + "timeout": "Clients are supposed to refetch the channel difference after timeout seconds have elapsed, if the user is currently viewing the chat, see here \u00bb for more info.", "users": "Users" } }, @@ -10309,7 +12091,7 @@ "final": "Whether there are more updates that must be fetched (always false)", "flags": "Flags, see TL conditional fields", "pts": "The latest PTS", - "timeout": "Clients are supposed to refetch the channel difference after timeout seconds have elapsed" + "timeout": "Clients are supposed to refetch the channel difference after timeout seconds have elapsed, if the user is currently viewing the chat, see here \u00bb for more info." } }, "updates.ChannelDifferenceTooLong": { @@ -10409,6 +12191,19 @@ "size": "File size" } }, + "users.SavedMusic": { + "desc": "List of songs currently pinned on a user's profile, see here \u00bb for more info.", + "params": { + "count": "Total number of songs (can be bigger than documents depending on the passed limit, and the default maximum limit in which case pagination is required).", + "documents": "Songs." + } + }, + "users.SavedMusicNotModified": { + "desc": "This subset of the songs currently pinned on a user's profile hasn't changed, see here \u00bb for more info.", + "params": { + "count": "Total number of songs on the user's profile." + } + }, "users.UserFull": { "desc": "Full user information", "params": { @@ -10416,6 +12211,19 @@ "full_user": "Full user information", "users": "Mentioned users" } + }, + "users.Users": { + "desc": "Describes a list of users (or bots).", + "params": { + "users": "Users" + } + }, + "users.UsersSlice": { + "desc": "Describes a partial list of users.", + "params": { + "count": "Total number of users (bigger than the users specified in users)", + "users": "Subset of users." + } } }, "method": { @@ -10426,9 +12234,9 @@ "app_version": "Application version", "device_model": "Device model", "flags": "Flags, see TL conditional fields", - "lang_code": "Code for the language used on the client, ISO 639-1 standard", - "lang_pack": "Language pack to use", - "params": "Additional initConnection parameters. For now, only the tz_offset field is supported, for specifying timezone offset in seconds.", + "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.", + "lang_pack": "Platform identifier (i.e. android, tdesktop, etc).", + "params": "Additional initConnection parameters. For now, only the tz_offset field is supported, for specifying the timezone offset in seconds.", "proxy": "Info about an MTProto proxy", "query": "The query itself", "system_lang_code": "Code for the language used on the device's OS, ISO 639-1 standard", @@ -10450,26 +12258,26 @@ } }, "InvokeWithApnsSecret": { - "desc": "{schema}", + "desc": "Official clients only, invoke with Apple push verification.", "params": { - "nonce": "", - "query": "", - "secret": "" + "nonce": "Nonce.", + "query": "Query.", + "secret": "Secret." } }, "InvokeWithBusinessConnection": { - "desc": "{schema}", + "desc": "Invoke a method using a Telegram Business Bot connection, see here \u00bb for more info, including a list of the methods that can be wrapped in this constructor.", "params": { - "connection_id": "", - "query": "" + "connection_id": "Business connection ID.", + "query": "The actual query." } }, "InvokeWithGooglePlayIntegrity": { - "desc": "{schema}", + "desc": "Official clients only, invoke with Google Play Integrity token.", "params": { - "nonce": "", - "query": "", - "token": "" + "nonce": "Nonce.", + "query": "Query.", + "token": "Token." } }, "InvokeWithLayer": { @@ -10486,6 +12294,13 @@ "range": "Message range" } }, + "InvokeWithReCaptcha": { + "desc": "Official clients only: re-execute a method call that required reCAPTCHA verification via a RECAPTCHA_CHECK_%s__%s, where the first placeholder is the action, and the second one is the reCAPTCHA key ID.", + "params": { + "query": "The original method call.", + "token": "reCAPTCHA token received after verification." + } + }, "InvokeWithTakeout": { "desc": "Invoke a method within a takeout session, see here \u00bb for more info.", "params": { @@ -10555,9 +12370,9 @@ } }, "account.CreateBusinessChatLink": { - "desc": "{schema}", + "desc": "Create a business chat deep link \u00bb.", "params": { - "link": "" + "link": "Info about the link to create." } }, "account.CreateTheme": { @@ -10587,11 +12402,15 @@ "params": {} }, "account.DeleteBusinessChatLink": { - "desc": "{schema}", + "desc": "Delete a business chat deep link \u00bb.", "params": { - "slug": "" + "slug": "Slug of the link, obtained as specified here \u00bb." } }, + "account.DeletePasskey": { + "desc": "", + "params": {} + }, "account.DeleteSecureValue": { "desc": "Delete stored Telegram Passport documents, for more info see the passport docs \u00bb", "params": { @@ -10599,16 +12418,16 @@ } }, "account.DisablePeerConnectedBot": { - "desc": "{schema}", + "desc": "Permanently disconnect a specific chat from all business bots \u00bb (equivalent to specifying it in recipients.exclude_users during initial configuration with account.updateConnectedBot \u00bb); to reconnect of a chat disconnected using this method the user must reconnect the entire bot by invoking account.updateConnectedBot \u00bb.", "params": { - "peer": "" + "peer": "The chat to disconnect" } }, "account.EditBusinessChatLink": { - "desc": "{schema}", + "desc": "Edit a created business chat deep link \u00bb.", "params": { - "link": "", - "slug": "" + "link": "New link information.", + "slug": "Slug of the link, obtained as specified here \u00bb." } }, "account.FinishTakeoutSession": { @@ -10647,35 +12466,41 @@ "params": {} }, "account.GetBotBusinessConnection": { - "desc": "{schema}", + "desc": "Bots may invoke this method to re-fetch the updateBotBusinessConnect constructor associated with a specific business connection_id, see here \u00bb for more info on connected business bots.\nThis is needed for example for freshly logged in bots that are receiving some updateBotNewBusinessMessage, etc. updates because some users have already connected to the bot before it could login.\nIn this case, the bot is receiving messages from the business connection, but it hasn't cached the associated updateBotBusinessConnect with info about the connection (can it reply to messages? etc.) yet, and cannot receive the old ones because they were sent when the bot wasn't logged into the session yet.\nThis method can be used to fetch info about a not-yet-cached business connection, and should not be invoked if the info is already cached or to fetch changes, as eventual changes will automatically be sent as new updateBotBusinessConnect updates to the bot using the usual update delivery methods \u00bb.", "params": { - "connection_id": "" + "connection_id": "Business connection ID \u00bb." } }, "account.GetBusinessChatLinks": { - "desc": "{schema}", + "desc": "List all created business chat deep links \u00bb.", "params": {} }, "account.GetChannelDefaultEmojiStatuses": { "desc": "Get a list of default suggested channel emoji statuses.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the account.emojiStatuses.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "account.GetChannelRestrictedStatusEmojis": { "desc": "Returns fetch the full list of custom emoji IDs \u00bb that cannot be used in channel emoji statuses \u00bb.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the emojiList.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "account.GetChatThemes": { "desc": "Get all available chat themes \u00bb.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the account.themes.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." + } + }, + "account.GetCollectibleEmojiStatuses": { + "desc": "Obtain a list of emoji statuses \u00bb for owned collectible gifts.", + "params": { + "hash": "Hash for pagination" } }, "account.GetConnectedBots": { - "desc": "{schema}", + "desc": "List all currently connected business bots \u00bb", "params": {} }, "account.GetContactSignUpNotification": { @@ -10689,25 +12514,25 @@ "account.GetDefaultBackgroundEmojis": { "desc": "Get a set of suggested custom emoji stickers that can be used in an accent color pattern.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the emojiList.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "account.GetDefaultEmojiStatuses": { "desc": "Get a list of default suggested emoji statuses", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the account.emojiStatuses.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "account.GetDefaultGroupPhotoEmojis": { "desc": "Get a set of suggested custom emoji stickers that can be used as group picture", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the emojiList.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "account.GetDefaultProfilePhotoEmojis": { "desc": "Get a set of suggested custom emoji stickers that can be used as profile picture", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the emojiList.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "account.GetGlobalPrivacySettings": { @@ -10735,6 +12560,18 @@ "peer": "Notification source" } }, + "account.GetPaidMessagesRevenue": { + "desc": "Get the number of stars we have received from the specified user thanks to paid messages \u00bb; the received amount will be equal to the sent amount multiplied by stars_paid_message_commission_permille divided by 1000.", + "params": { + "flags": "Flags, see TL conditional fields", + "parent_peer": "If set, can contain the ID of a monoforum (channel direct messages) to obtain the number of stars the user has spent to send us direct messages via the channel.", + "user_id": "The user that paid to send us messages." + } + }, + "account.GetPasskeys": { + "desc": "", + "params": {} + }, "account.GetPassword": { "desc": "Obtain configuration for two-factor authorization with password", "params": {} @@ -10752,19 +12589,25 @@ } }, "account.GetReactionsNotifySettings": { - "desc": "{schema}", + "desc": "Get the current reaction notification settings \u00bb.", "params": {} }, "account.GetRecentEmojiStatuses": { "desc": "Get recently used emoji statuses", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the account.emojiStatuses.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." + } + }, + "account.GetSavedMusicIds": { + "desc": "Fetch the full list of only the IDs of songs currently added to the profile, see here \u00bb for more info.", + "params": { + "hash": "Hash generated \u00bb from the previously returned list of IDs." } }, "account.GetSavedRingtones": { "desc": "Fetch saved notification sounds", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the account.savedRingtones.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "account.GetSecureValue": { @@ -10784,7 +12627,7 @@ "desc": "Get installed themes", "params": { "format": "Theme format, a string that identifies the theming engines supported by the client", - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the account.themes.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "account.GetTmpPassword": { @@ -10794,6 +12637,14 @@ "period": "Time during which the temporary password will be valid, in seconds; should be between 60 and 86400" } }, + "account.GetUniqueGiftChatThemes": { + "desc": "Obtain all chat themes \u00bb associated to owned collectible gifts \u00bb.", + "params": { + "hash": "Hash from a previously returned account.chatThemes constructor, to avoid returning any result if the theme list hasn't changed.", + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination." + } + }, "account.GetWallPaper": { "desc": "Get info about a certain wallpaper", "params": { @@ -10803,13 +12654,17 @@ "account.GetWallPapers": { "desc": "Returns a list of available wallpapers.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the account.wallPapers.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "account.GetWebAuthorizations": { "desc": "Get web login widget authorizations", "params": {} }, + "account.InitPasskeyRegistration": { + "desc": "", + "params": {} + }, "account.InitTakeoutSession": { "desc": "Initialize a takeout session, see here \u00bb for more info.", "params": { @@ -10858,6 +12713,10 @@ "token_type": "Device token type, see PUSH updates for the possible values." } }, + "account.RegisterPasskey": { + "desc": "", + "params": {} + }, "account.ReorderUsernames": { "desc": "Reorder usernames associated with the currently logged-in user.", "params": { @@ -10914,9 +12773,9 @@ "params": {} }, "account.ResolveBusinessChatLink": { - "desc": "{schema}", + "desc": "Resolve a business chat deep link \u00bb.", "params": { - "slug": "" + "slug": "Slug of the link, obtained as specified here \u00bb." } }, "account.SaveAutoDownloadSettings": { @@ -10939,6 +12798,15 @@ "users": "Whether the new settings should affect all private chats" } }, + "account.SaveMusic": { + "desc": "Adds or removes a song from the current user's profile see here \u00bb for more info on the music tab of the profile page.", + "params": { + "after_id": "If set, the song will be added after the passed song (must be already pinned on the profile).", + "flags": "Flags, see TL conditional fields", + "id": "The song to add or remove; can be an already added song when reordering songs with after_id. Adding an already added song will never re-add it, only move it to the top of the song list (or after the song passed in after_id).", + "unsave": "If set, removes the song." + } + }, "account.SaveRingtone": { "desc": "Save or remove saved notification sound.", "params": { @@ -11027,6 +12895,12 @@ "settings": "Global privacy settings" } }, + "account.SetMainProfileTab": { + "desc": "Changes the main profile tab of the current user, see here \u00bb for more info.", + "params": { + "tab": "The tab to set as main tab." + } + }, "account.SetPrivacy": { "desc": "Change privacy settings of current account", "params": { @@ -11035,22 +12909,32 @@ } }, "account.SetReactionsNotifySettings": { - "desc": "{schema}", + "desc": "Change the reaction notification settings \u00bb.", "params": { - "settings": "" + "settings": "New reaction notification settings." } }, "account.ToggleConnectedBotPaused": { - "desc": "{schema}", + "desc": "Pause or unpause a specific chat, temporarily disconnecting it from all business bots \u00bb.", + "params": { + "paused": "Whether to pause or unpause the chat", + "peer": "The chat to pause" + } + }, + "account.ToggleNoPaidMessagesException": { + "desc": "Allow a user to send us messages without paying if paid messages \u00bb are enabled.", "params": { - "paused": "", - "peer": "" + "flags": "Flags, see TL conditional fields", + "parent_peer": "If set, applies the setting within the monoforum aka direct messages \u00bb (pass the ID of the monoforum, not the ID of the associated channel).", + "refund_charged": "If set and require_payment is not set, refunds the amounts the user has already paid us to send us messages (directly or via a monoforum).", + "require_payment": "If set, requires the user to pay in order to send us messages. Can only be set by monoforums, not users, i.e. parent_peer must be set if this flag is set; users must instead use the inputPrivacyKeyNoPaidMessages privacy setting to remove a previously added exemption. If not set, allows the user to send us messages without paying (can be unset by both monoforums and users).", + "user_id": "The user to exempt or unexempt." } }, "account.ToggleSponsoredMessages": { - "desc": "{schema}", + "desc": "Disable or re-enable Telegram ads for the current Premium account.", "params": { - "enabled": "" + "enabled": "Enable or disable ads." } }, "account.ToggleUsername": { @@ -11069,45 +12953,45 @@ } }, "account.UpdateBirthday": { - "desc": "{schema}", + "desc": "Update our birthday, see here \u00bb for more info.", "params": { - "birthday": "", + "birthday": "Birthday.", "flags": "Flags, see TL conditional fields" } }, "account.UpdateBusinessAwayMessage": { - "desc": "{schema}", + "desc": "Set a list of Telegram Business away messages.", "params": { "flags": "Flags, see TL conditional fields", - "message": "" + "message": "Away message configuration and contents." } }, "account.UpdateBusinessGreetingMessage": { - "desc": "{schema}", + "desc": "Set a list of Telegram Business greeting messages.", "params": { "flags": "Flags, see TL conditional fields", - "message": "" + "message": "Greeting message configuration and contents." } }, "account.UpdateBusinessIntro": { - "desc": "{schema}", + "desc": "Set or remove the Telegram Business introduction \u00bb.", "params": { "flags": "Flags, see TL conditional fields", - "intro": "" + "intro": "Telegram Business introduction, to remove it call the method without setting this flag." } }, "account.UpdateBusinessLocation": { - "desc": "{schema}", + "desc": "Businesses \u00bb may advertise their location using this method, see here \u00bb for more info.", "params": { - "address": "", + "address": "Mandatory when setting/updating the location, contains a textual description of the address (max 96 UTF-8 chars).", "flags": "Flags, see TL conditional fields", - "geo_point": "" + "geo_point": "Optional, contains a set of geographical coordinates." } }, "account.UpdateBusinessWorkHours": { - "desc": "{schema}", + "desc": "Specify a set of Telegram Business opening hours.\nThis info will be contained in userFull.business_work_hours.", "params": { - "business_work_hours": "", + "business_work_hours": "Opening hours (optional, if not set removes all opening hours).", "flags": "Flags, see TL conditional fields" } }, @@ -11121,13 +13005,13 @@ } }, "account.UpdateConnectedBot": { - "desc": "{schema}", + "desc": "Connect a business bot \u00bb to the current account, or to change the current connection settings.", "params": { - "bot": "", - "can_reply": "", - "deleted": "", + "bot": "The bot to connect or disconnect", + "deleted": "Whether to fully disconnect the bot from the current account.", "flags": "Flags, see TL conditional fields", - "recipients": "" + "recipients": "Configuration for the business connection", + "rights": "Business bot rights." } }, "account.UpdateDeviceLocked": { @@ -11157,9 +13041,9 @@ } }, "account.UpdatePersonalChannel": { - "desc": "{schema}", + "desc": "Associate (or remove) a personal channel \u00bb, that will be listed on our personal profile page \u00bb.", "params": { - "channel": "" + "channel": "The channel, pass inputChannelEmpty to remove it." } }, "account.UpdateProfile": { @@ -11260,6 +13144,10 @@ "phone_number": "Phone number" } }, + "auth.CheckPaidAuth": { + "desc": "", + "params": {} + }, "auth.CheckPassword": { "desc": "Try logging to an account protected by a 2FA password.", "params": { @@ -11292,6 +13180,10 @@ "except_ids": "List of already logged-in user IDs, to prevent logging in twice with the same user" } }, + "auth.FinishPasskeyLogin": { + "desc": "", + "params": {} + }, "auth.ImportAuthorization": { "desc": "Logs in a user using a key transmitted from his native data-center.", "params": { @@ -11322,6 +13214,10 @@ "web_auth_token": "The authorization token" } }, + "auth.InitPasskeyLogin": { + "desc": "", + "params": {} + }, "auth.LogOut": { "desc": "Logs out the user.", "params": {} @@ -11335,11 +13231,11 @@ } }, "auth.ReportMissingCode": { - "desc": "{schema}", + "desc": "Official apps only, reports that the SMS authentication code wasn't delivered.", "params": { - "mnc": "", - "phone_code_hash": "", - "phone_number": "" + "mnc": "MNC of the current network operator.", + "phone_code_hash": "The phone code hash obtained from auth.sendCode", + "phone_number": "Phone number where we were supposed to receive the code" } }, "auth.RequestFirebaseSms": { @@ -11349,7 +13245,7 @@ "ios_push_secret": "Secret token received via an apple push notification", "phone_code_hash": "Phone code hash returned by auth.sendCode", "phone_number": "Phone number", - "play_integrity_token": "", + "play_integrity_token": "On Android, an object obtained as described in the auth documentation \u00bb", "safety_net_token": "On Android, a JWS object obtained as described in the auth documentation \u00bb" } }, @@ -11363,7 +13259,7 @@ "flags": "Flags, see TL conditional fields", "phone_code_hash": "The phone code hash obtained from auth.sendCode", "phone_number": "The phone number", - "reason": "" + "reason": "Official clients only, used if the device integrity verification failed, and no secret could be obtained to invoke auth.requestFirebaseSms: in this case, the device integrity verification failure reason must be passed here." } }, "auth.ResetAuthorizations": { @@ -11402,11 +13298,19 @@ "first_name": "New user first name", "flags": "Flags, see TL conditional fields", "last_name": "New user last name", - "no_joined_notifications": "", + "no_joined_notifications": "If set, users on Telegram that have already added phone_number to their contacts will not receive signup notifications about this user.", "phone_code_hash": "SMS-message ID", "phone_number": "Phone number in the international format" } }, + "bots.AddPreviewMedia": { + "desc": "Add a main mini app preview, see here \u00bb for more info.", + "params": { + "bot": "The bot that owns the Main Mini App.", + "lang_code": "ISO 639-1 language code, indicating the localization of the preview to add.", + "media": "The photo/video preview, uploaded using messages.uploadMedia." + } + }, "bots.AllowSendMessage": { "desc": "Allow the specified bot to send us messages", "params": { @@ -11426,6 +13330,35 @@ "bot": "The bot" } }, + "bots.CheckDownloadFileParams": { + "desc": "Check if a mini app can request the download of a specific file: called when handling web_app_request_file_download events \u00bb", + "params": { + "bot": "The bot that owns the mini app that requested the download", + "file_name": "The filename from the web_app_request_file_download event \u00bb", + "url": "The url from the web_app_request_file_download event \u00bb" + } + }, + "bots.DeletePreviewMedia": { + "desc": "Delete a main mini app preview, see here \u00bb for more info.", + "params": { + "bot": "The bot that owns the Main Mini App.", + "lang_code": "ISO 639-1 language code, indicating the localization of the preview to delete.", + "media": "The photo/video preview to delete, previously fetched as specified here \u00bb." + } + }, + "bots.EditPreviewMedia": { + "desc": "Edit a main mini app preview, see here \u00bb for more info.", + "params": { + "bot": "The bot that owns the Main Mini App.", + "lang_code": "ISO 639-1 language code, indicating the localization of the preview to edit.", + "media": "The photo/video preview to replace, previously fetched as specified here \u00bb.", + "new_media": "The new photo/video preview, uploaded using messages.uploadMedia." + } + }, + "bots.GetAdminedBots": { + "desc": "Get a list of bots owned by the current user", + "params": {} + }, "bots.GetBotCommands": { "desc": "Obtain a list of bot commands for the specified bot scope and language code", "params": { @@ -11447,6 +13380,32 @@ "user_id": "User ID or empty for the default menu button." } }, + "bots.GetBotRecommendations": { + "desc": "Obtain a list of similarly themed bots, selected based on similarities in their subscriber bases, see here \u00bb for more info.", + "params": { + "bot": "The method will return bots related to the passed bot." + } + }, + "bots.GetPopularAppBots": { + "desc": "Fetch popular Main Mini Apps, to be used in the apps tab of global search \u00bb.", + "params": { + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination, initially an empty string, then re-use the next_offset returned by the previous query." + } + }, + "bots.GetPreviewInfo": { + "desc": "Bot owners only, fetch main mini app preview information, see here \u00bb for more info.", + "params": { + "bot": "The bot that owns the Main Mini App.", + "lang_code": "Fetch previews for the specified ISO 639-1 language code." + } + }, + "bots.GetPreviewMedias": { + "desc": "Fetch main mini app previews, see here \u00bb for more info.", + "params": { + "bot": "The bot that owns the Main Mini App." + } + }, "bots.InvokeWebViewCustomMethod": { "desc": "Send a custom request from a mini bot app, triggered by a web_app_invoke_custom_method event \u00bb.", "params": { @@ -11455,6 +13414,14 @@ "params": "Method parameters" } }, + "bots.ReorderPreviewMedias": { + "desc": "Reorder a main mini app previews, see here \u00bb for more info.", + "params": { + "bot": "The bot that owns the Main Mini App.", + "lang_code": "ISO 639-1 language code, indicating the localization of the previews to reorder.", + "order": "New order of the previews." + } + }, "bots.ReorderUsernames": { "desc": "Reorder usernames associated to a bot we own.", "params": { @@ -11514,6 +13481,23 @@ "user_id": "User ID" } }, + "bots.SetCustomVerification": { + "desc": "Verify a user or chat on behalf of an organization \u00bb.", + "params": { + "bot": "Must not be set if invoked by a bot, must be set to the ID of an owned bot if invoked by a user.", + "custom_description": "Custom description for the verification, the UTF-8 length limit for this field is contained in bot_verification_description_length_limit \u00bb. If not set, Was verified by organization \"organization_name\" will be used as description.", + "enabled": "If set, adds the verification; otherwise removes verification.", + "flags": "Flags, see TL conditional fields", + "peer": "The peer to verify" + } + }, + "bots.ToggleUserEmojiStatusPermission": { + "desc": "Allow or prevent a bot from changing our emoji status \u00bb", + "params": { + "bot": "The bot", + "enabled": "Whether to allow or prevent the bot from changing our emoji status" + } + }, "bots.ToggleUsername": { "desc": "Activate or deactivate a purchased fragment.com username associated to a bot we own.", "params": { @@ -11522,6 +13506,29 @@ "username": "Username" } }, + "bots.UpdateStarRefProgram": { + "desc": "Create, edit or delete the affiliate program of a bot we own", + "params": { + "bot": "The bot", + "commission_permille": "The permille commission rate: it indicates the share of Telegram Stars received by affiliates for every transaction made by users they referred inside of the bot. The minimum and maximum values for this parameter are contained in the starref_min_commission_permille and starref_max_commission_permille client configuration parameters. Can be 0 to terminate the affiliate program. Both the duration and the commission may only be raised after creation of the program: to lower them, the program must first be terminated and a new one created.", + "duration_months": "Indicates the duration of the affiliate program; if not set, there is no expiration date.", + "flags": "Flags, see TL conditional fields" + } + }, + "bots.UpdateUserEmojiStatus": { + "desc": "Change the emoji status of a user (invoked by bots, see here \u00bb for more info on the full flow)", + "params": { + "emoji_status": "The emoji status", + "user_id": "The user whose emoji status should be changed" + } + }, + "channels.CheckSearchPostsFlood": { + "desc": "Check if the specified global post search \u00bb requires payment.", + "params": { + "flags": "Flags, see TL conditional fields", + "query": "The query." + } + }, "channels.CheckUsername": { "desc": "Check if a username is free and can be assigned to a channel/supergroup", "params": { @@ -11529,13 +13536,6 @@ "username": "The username to check" } }, - "channels.ClickSponsoredMessage": { - "desc": "Informs the server that the user has either:", - "params": { - "channel": "Channel where the sponsored message was posted", - "random_id": "Message ID" - } - }, "channels.ConvertToGigagroup": { "desc": "Convert a supergroup to a gigagroup, when requested by channel suggestions.", "params": { @@ -11557,18 +13557,6 @@ "ttl_period": "Time-to-live of all messages that will be sent in the supergroup: once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well. You can use messages.setDefaultHistoryTTL to edit this value later." } }, - "channels.CreateForumTopic": { - "desc": "Create a forum topic; requires manage_topics rights.", - "params": { - "channel": "The forum", - "flags": "Flags, see TL conditional fields", - "icon_color": "If no custom emoji icon is specified, specifies the color of the fallback topic icon (RGB), one of 0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, or 0xFB6F5F.", - "icon_emoji_id": "ID of the custom emoji used as topic icon. Telegram Premium users can use any custom emoji, other users can only use the custom emojis contained in the inputStickerSetEmojiDefaultTopicIcons emoji pack.", - "random_id": "Unique client message ID to prevent duplicate sending of the same event", - "send_as": "Create the topic as the specified peer", - "title": "Topic title (maximum UTF-8 length: 128)" - } - }, "channels.DeactivateAllUsernames": { "desc": "Disable all purchased usernames of a supergroup or channel", "params": { @@ -11604,13 +13592,6 @@ "participant": "The participant whose messages should be deleted" } }, - "channels.DeleteTopicHistory": { - "desc": "Delete message history of a forum topic", - "params": { - "channel": "Forum", - "top_msg_id": "Topic ID" - } - }, "channels.EditAdmin": { "desc": "Modify the admin rights of a user in a supergroup/channel.", "params": { @@ -11636,18 +13617,6 @@ "user_id": "New channel owner" } }, - "channels.EditForumTopic": { - "desc": "Edit forum topic; requires manage_topics rights.", - "params": { - "channel": "Supergroup", - "closed": "If present, will update the open/closed status of the topic.", - "flags": "Flags, see TL conditional fields", - "hidden": "If present, will hide/unhide the topic (only valid for the \"General\" topic, id=1).", - "icon_emoji_id": "If present, updates the custom emoji used as topic icon. Telegram Premium users can use any custom emoji, other users can only use the custom emojis contained in the inputStickerSetEmojiDefaultTopicIcons emoji pack. Pass 0 to switch to the fallback topic icon.", - "title": "If present, will update the topic title (maximum UTF-8 length: 128).", - "topic_id": "Topic ID" - } - }, "channels.EditLocation": { "desc": "Edit location of geogroup, see here \u00bb for more info on geogroups.", "params": { @@ -11699,13 +13668,13 @@ "by_location": "Get geogroups", "check_limit": "If set and the user has reached the limit of owned public channels/supergroups/geogroups, instead of returning the channel list one of the specified errors will be returned.Useful to check if a new public channel can indeed be created, even before asking the user to enter a channel username to use in channels.checkUsername/channels.updateUsername.", "flags": "Flags, see TL conditional fields", - "for_personal": "" + "for_personal": "Set this flag to only fetch the full list of channels that may be passed to account.updatePersonalChannel to display them on our profile page." } }, "channels.GetChannelRecommendations": { "desc": "Obtain a list of similarly themed public channels, selected based on similarities in their subscriber bases.", "params": { - "channel": "The method will return channels related to the passed channel.", + "channel": "The method will return channels related to the passed channel. If not set, the method will returns channels related to channels the user has joined.", "flags": "Flags, see TL conditional fields" } }, @@ -11715,31 +13684,16 @@ "id": "IDs of channels/supergroups to get info about" } }, - "channels.GetForumTopics": { - "desc": "Get topics of a forum", - "params": { - "channel": "Supergroup", - "flags": "Flags, see TL conditional fields", - "limit": "Maximum number of results to return, see pagination. For optimal performance, the number of returned topics is chosen by the server and can be smaller than the specified limit.", - "offset_date": "Offsets for pagination, for more info click here, date of the last message of the last found topic. Use 0 or any date in the future to get results from the last topic.", - "offset_id": "Offsets for pagination, for more info click here, ID of the last message of the last found topic (or initially 0).", - "offset_topic": "Offsets for pagination, for more info click here, ID of the last found topic (or initially 0).", - "q": "Search query" - } - }, - "channels.GetForumTopicsByID": { - "desc": "Get forum topics by their ID", - "params": { - "channel": "Forum", - "topics": "Topic IDs" - } - }, "channels.GetFullChannel": { "desc": "Get full info about a supergroup, gigagroup or channel", "params": { "channel": "The channel, supergroup or gigagroup to get info about" } }, + "channels.GetFutureCreatorAfterLeave": { + "desc": "", + "params": {} + }, "channels.GetGroupsForDiscussion": { "desc": "Get all groups that can be used as discussion groups.", "params": {} @@ -11754,6 +13708,13 @@ "offset": "Offset for pagination" } }, + "channels.GetMessageAuthor": { + "desc": "Can only be invoked by non-bot admins of a monoforum \u00bb, obtains the original sender of a message sent by other monoforum admins to the monoforum, on behalf of the channel associated to the monoforum.", + "params": { + "channel": "ID of the monoforum.", + "id": "ID of the message sent by a monoforum admin." + } + }, "channels.GetMessages": { "desc": "Get channel/supergroup messages", "params": { @@ -11781,15 +13742,11 @@ "channels.GetSendAs": { "desc": "Obtains a list of peers that can be used to send messages in a specific group", "params": { + "flags": "Flags, see TL conditional fields", + "for_paid_reactions": "If set, fetches the list of peers that can be used to send paid reactions to messages of a specific peer.", "peer": "The group where we intend to send messages" } }, - "channels.GetSponsoredMessages": { - "desc": "Get a list of sponsored messages", - "params": { - "channel": "Peer" - } - }, "channels.InviteToChannel": { "desc": "Invite users to a channel/supergroup", "params": { @@ -11817,21 +13774,12 @@ } }, "channels.ReadMessageContents": { - "desc": "Mark channel/supergroup message contents as read", + "desc": "Mark channel/supergroup message contents as read, emitting an updateChannelReadMessagesContents.", "params": { "channel": "Channel/supergroup", "id": "IDs of messages whose contents should be marked as read" } }, - "channels.ReorderPinnedForumTopics": { - "desc": "Reorder pinned forum topics", - "params": { - "channel": "Supergroup ID", - "flags": "Flags, see TL conditional fields", - "force": "If not set, the order of only the topics present both server-side and in order will be changed (i.e. mentioning topics not pinned server-side in order will not pin them, and not mentioning topics pinned server-side will not unpin them). If set, the entire server-side pinned topic list will be replaced with order (i.e. mentioning topics not pinned server-side in order will pin them, and not mentioning topics pinned server-side will unpin them)", - "order": "Topic IDs \u00bb" - } - }, "channels.ReorderUsernames": { "desc": "Reorder active usernames", "params": { @@ -11854,36 +13802,31 @@ "participant": "Participant whose messages should be reported" } }, - "channels.ReportSponsoredMessage": { - "desc": "{schema}", - "params": { - "channel": "", - "option": "", - "random_id": "" - } - }, "channels.RestrictSponsoredMessages": { - "desc": "{schema}", + "desc": "Disable ads on the specified channel, for all users.", "params": { - "channel": "", - "restricted": "" + "channel": "The channel.", + "restricted": "Whether to disable or re-enable ads." } }, "channels.SearchPosts": { - "desc": "{schema}", + "desc": "Globally search for posts from public channels \u00bb (including those we aren't a member of) containing either a specific hashtag, or a full text query.", "params": { - "hashtag": "", + "allow_paid_stars": "For full text post searches (query), allows payment of the specified amount of Stars for the search, see here \u00bb for more info on the full flow.", + "flags": "Flags, see TL conditional fields", + "hashtag": "The hashtag to search, without the # character.", "limit": "Maximum number of results to return, see pagination", "offset_id": "Offsets for pagination, for more info click here", - "offset_peer": "", - "offset_rate": "" + "offset_peer": "Offsets for pagination, for more info click here", + "offset_rate": "Initially 0, then set to the next_rate parameter of messages.messagesSlice, or if that is absent, the date of the last returned message.", + "query": "The full text query: each user has a limited amount of free full text search slots, after which payment is required, see here \u00bb for more info on the full flow." } }, "channels.SetBoostsToUnblockRestrictions": { - "desc": "{schema}", + "desc": "Admins with ban_users admin rights \u00bb may allow users that apply a certain number of booosts \u00bb to the group to bypass slow mode \u00bb and other \u00bb supergroup restrictions, see here \u00bb for more info.", "params": { - "boosts": "", - "channel": "" + "boosts": "The number of required boosts (1-8, 0 to disable).", + "channel": "The supergroup." } }, "channels.SetDiscussionGroup": { @@ -11894,10 +13837,17 @@ } }, "channels.SetEmojiStickers": { - "desc": "{schema}", + "desc": "Set a custom emoji stickerset for supergroups. Only usable after reaching at least the boost level \u00bb specified in the group_emoji_stickers_level_min \u00bb config parameter.", + "params": { + "channel": "The supergroup", + "stickerset": "The custom emoji stickerset to associate to the supergroup" + } + }, + "channels.SetMainProfileTab": { + "desc": "Changes the main profile tab of a channel, see here \u00bb for more info.", "params": { - "channel": "", - "stickerset": "" + "channel": "The channel.", + "tab": "The tab to set as main tab." } }, "channels.SetStickers": { @@ -11914,11 +13864,19 @@ "enabled": "Enable or disable the native antispam system." } }, + "channels.ToggleAutotranslation": { + "desc": "Toggle autotranslation in a channel, for all users: see here \u00bb for more info.", + "params": { + "channel": "The channel where to toggle autotranslation.", + "enabled": "Whether to enable or disable autotranslation." + } + }, "channels.ToggleForum": { "desc": "Enable or disable forum functionality in a supergroup.", "params": { "channel": "Supergroup ID", - "enabled": "Enable or disable forum functionality" + "enabled": "Enable or disable forum functionality", + "tabs": "If true enables the tabbed forum UI, otherwise enables the list-based forum UI." } }, "channels.ToggleJoinRequest": { @@ -11953,7 +13911,9 @@ "desc": "Enable/disable message signatures in channels", "params": { "channel": "Channel", - "enabled": "Value" + "flags": "Flags, see TL conditional fields", + "profiles_enabled": "If set, messages from channel admins will link to their profiles, just like for group messages: can only be set if the signatures_enabled flag is set.", + "signatures_enabled": "If set, enables message signatures." } }, "channels.ToggleSlowMode": { @@ -11985,22 +13945,23 @@ "channel": "Channel whose accent color should be changed.", "color": "ID of the accent color palette \u00bb to use (not RGB24, see here \u00bb for more info); if not set, the default palette is used.", "flags": "Flags, see TL conditional fields", - "for_profile": "Whether to change the accent color emoji pattern of the profile page; otherwise, the accent color and emoji pattern of messages will be changed." + "for_profile": "Whether to change the accent color emoji pattern of the profile page; otherwise, the accent color and emoji pattern of messages will be changed. Channels can change both message and profile palettes; supergroups can only change the profile palette, of course after reaching the appropriate boost level." } }, "channels.UpdateEmojiStatus": { - "desc": "Set an emoji status for a channel.", + "desc": "Set an emoji status for a channel or supergroup.", "params": { - "channel": "The channel, must have at least channel_emoji_status_level_min boosts.", + "channel": "The channel/supergroup, must have at least channel_emoji_status_level_min/group_emoji_status_level_min boosts.", "emoji_status": "Emoji status to set" } }, - "channels.UpdatePinnedForumTopic": { - "desc": "Pin or unpin forum topics", + "channels.UpdatePaidMessagesPrice": { + "desc": "Enable or disable paid messages \u00bb in this supergroup or monoforum.", "params": { - "channel": "Supergroup ID", - "pinned": "Whether to pin or unpin the topic", - "topic_id": "Forum topic ID" + "broadcast_messages_allowed": "Only usable for channels, enables or disables the associated monoforum aka direct messages.", + "channel": "Pass the supergroup ID for supergroups and the ID of the channel to modify the setting in the associated monoforum.", + "flags": "Flags, see TL conditional fields", + "send_paid_messages_stars": "Specifies the required amount of Telegram Stars users must pay to send messages to the supergroup or monoforum." } }, "channels.UpdateUsername": { @@ -12010,13 +13971,6 @@ "username": "New username, pass an empty string to remove the username" } }, - "channels.ViewSponsoredMessage": { - "desc": "Mark a specific sponsored message as read", - "params": { - "channel": "Peer", - "random_id": "Message ID" - } - }, "chatlists.CheckChatlistInvite": { "desc": "Obtain information about a chat folder deep link \u00bb.", "params": { @@ -12151,7 +14105,7 @@ "params": {} }, "contacts.GetBirthdays": { - "desc": "{schema}", + "desc": "Fetch all users with birthdays that fall within +1/-1 days, relative to the current day: this method should be invoked by clients every 6-8 hours, and if the result is non-empty, it should be used to appropriately update locally cached birthday information in user.birthday.", "params": {} }, "contacts.GetBlocked": { @@ -12166,13 +14120,13 @@ "contacts.GetContactIDs": { "desc": "Get the telegram IDs of all contacts.\nReturns an array of Telegram user IDs for all contacts (0 if a contact does not have an associated Telegram account or have hidden their account using privacy settings).", "params": { - "hash": "Hash for pagination, for more info click here" + "hash": "Hash used for caching, for more info click here" } }, "contacts.GetContacts": { "desc": "Returns the current user's contact list.", "params": { - "hash": "Hash for pagination, for more info click here.Note that the hash is computed using the usual algorithm, passing to the algorithm first the previously returned contacts.contacts.saved_count field, then max 100000 sorted user IDs from the contact list, including the ID of the currently logged in user if it is saved as a contact. Example: tdlib implementation." + "hash": "Hash used for caching, for more info click here.Note that the hash is computed using the usual algorithm, passing to the algorithm first the previously returned contacts.contacts.saved_count field, then max 100000 sorted user IDs from the contact list, including the ID of the currently logged in user if it is saved as a contact. Example: tdlib implementation." } }, "contacts.GetLocated": { @@ -12188,6 +14142,12 @@ "desc": "Get all contacts, requires a takeout session, see here \u00bb for more info.", "params": {} }, + "contacts.GetSponsoredPeers": { + "desc": "Obtain a list of sponsored peer search results for a given query", + "params": { + "q": "The query" + } + }, "contacts.GetStatuses": { "desc": "Use this method to obtain the online statuses of all contacts with an accessible Telegram account.", "params": {} @@ -12195,6 +14155,7 @@ "contacts.GetTopPeers": { "desc": "Get most used peers", "params": { + "bots_app": "Most frequently used Main Mini Bot Apps.", "bots_inline": "Most used inline bots", "bots_pm": "Most used bots", "channels": "Most frequently visited channels", @@ -12203,12 +14164,16 @@ "forward_chats": "Chats to which the users often forwards messages to", "forward_users": "Users to which the users often forwards messages to", "groups": "Often-opened groups and supergroups", - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "limit": "Maximum number of results to return, see pagination", "offset": "Offset for pagination", "phone_calls": "Most frequently called users" } }, + "contacts.ImportCard": { + "desc": "Returns general information on a user using his previously exported card as input.The app may use it to open a conversation without knowing the user's phone number.", + "params": {} + }, "contacts.ImportContactToken": { "desc": "Obtain user info from a temporary profile link.", "params": { @@ -12241,6 +14206,8 @@ "contacts.ResolveUsername": { "desc": "Resolve a @username to get peer info", "params": { + "flags": "Flags, see TL conditional fields", + "referer": "Referrer ID from referral links \u00bb.", "username": "@username to resolve" } }, @@ -12274,6 +14241,16 @@ "my_stories_from": "Whether the peer should be removed from the story blocklist; if not set, the peer will be removed from the main blocklist, see here \u00bb for more info." } }, + "contacts.UpdateContactNote": { + "desc": "", + "params": {} + }, + "folders.DeleteFolder": { + "desc": "Delete a peer folder", + "params": { + "folder_id": "Peer folder ID, for more info click here" + } + }, "folders.EditPeerFolders": { "desc": "Edit peers in peer folder", "params": { @@ -12281,9 +14258,9 @@ } }, "fragment.GetCollectibleInfo": { - "desc": "{schema}", + "desc": "Fetch information about a fragment collectible, see here \u00bb for more info on the full flow.", "params": { - "collectible": "" + "collectible": "Collectible to fetch info about." } }, "help.AcceptTermsOfService": { @@ -12310,7 +14287,7 @@ "help.GetAppConfig": { "desc": "Get app-specific configuration, see client configuration for more info on the result.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the help.appConfig.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "help.GetAppUpdate": { @@ -12330,7 +14307,7 @@ "help.GetCountriesList": { "desc": "Get name, ISO code, localized name and phone codes/patterns of all available countries", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the help.countriesList.hash field returned by a previous call to the method, or pass 0 if this is the first call.", + "hash": "Hash used for caching, for more info click here.", "lang_code": "Language code of the current user" } }, @@ -12351,19 +14328,19 @@ "help.GetPassportConfig": { "desc": "Get passport configuration", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the help.passportConfig.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "help.GetPeerColors": { "desc": "Get the set of accent color palettes \u00bb that can be used for message accents.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the help.peerColors.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "help.GetPeerProfileColors": { "desc": "Get the set of accent color palettes \u00bb that can be used in profile page backgrounds.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the help.peerColors.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "help.GetPremiumPromo": { @@ -12371,7 +14348,7 @@ "params": {} }, "help.GetPromoData": { - "desc": "Get MTProxy/Public Service Announcement information", + "desc": "Returns a set of useful suggestions and PSA/MTProxy sponsored peers, see here \u00bb for more info.", "params": {} }, "help.GetRecentMeUrls": { @@ -12393,9 +14370,9 @@ "params": {} }, "help.GetTimezonesList": { - "desc": "{schema}", + "desc": "Returns timezone information that may be used elsewhere in the API, such as to set Telegram Business opening hours \u00bb.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the help.timezonesList.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "help.GetUserInfo": { @@ -12427,36 +14404,36 @@ "desc": "Get new strings in language pack", "params": { "from_version": "Previous localization pack version", - "lang_code": "Language code", - "lang_pack": "Language pack" + "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.", + "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)." } }, "langpack.GetLangPack": { "desc": "Get localization pack strings", "params": { - "lang_code": "Language code", - "lang_pack": "Language pack name, usually obtained from a language pack link" + "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.", + "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)." } }, "langpack.GetLanguage": { "desc": "Get information about a language in a localization pack", "params": { - "lang_code": "Language code", - "lang_pack": "Language pack name, usually obtained from a language pack link" + "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.", + "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)." } }, "langpack.GetLanguages": { "desc": "Get information about all languages in a localization pack", "params": { - "lang_pack": "Language pack" + "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)." } }, "langpack.GetStrings": { "desc": "Get strings from a language pack", "params": { "keys": "Strings to get", - "lang_code": "Language code", - "lang_pack": "Language pack name, usually obtained from a language pack link" + "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.", + "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)." } }, "messages.AcceptEncryption": { @@ -12486,6 +14463,14 @@ "user_id": "User ID to be added" } }, + "messages.AppendTodoList": { + "desc": "Appends one or more items to a todo list \u00bb.", + "params": { + "list": "Items to append.", + "msg_id": "ID of the message with the todo list.", + "peer": "Peer where the todo list was posted." + } + }, "messages.CheckChatInvite": { "desc": "Check the validity of a chat invite link and get basic info about it", "params": { @@ -12505,9 +14490,9 @@ } }, "messages.CheckQuickReplyShortcut": { - "desc": "{schema}", + "desc": "Before offering the user the choice to add a message to a quick reply shortcut, to make sure that none of the limits specified here \u00bb were reached.", "params": { - "shortcut": "" + "shortcut": "Shorcut name (not ID!)." } }, "messages.ClearAllDrafts": { @@ -12525,6 +14510,19 @@ "flags": "Flags, see TL conditional fields" } }, + "messages.ClickSponsoredMessage": { + "desc": "Informs the server that the user has interacted with a sponsored message in one of the ways listed here \u00bb.", + "params": { + "flags": "Flags, see TL conditional fields", + "fullscreen": "The user expanded the video to full screen, and then clicked on it.", + "media": "The user clicked on the media", + "random_id": "The ad's unique ID." + } + }, + "messages.CraftStarGift": { + "desc": "", + "params": {} + }, "messages.CreateChat": { "desc": "Creates a new chat.", "params": { @@ -12534,6 +14532,10 @@ "users": "List of user IDs to be invited" } }, + "messages.CreateForumTopic": { + "desc": "", + "params": {} + }, "messages.DeleteChat": { "desc": "Delete a chat", "params": { @@ -12557,10 +14559,10 @@ } }, "messages.DeleteFactCheck": { - "desc": "{schema}", + "desc": "Delete a fact-check from a message.", "params": { - "msg_id": "", - "peer": "" + "msg_id": "Message ID", + "peer": "Peer where the message was sent." } }, "messages.DeleteHistory": { @@ -12591,16 +14593,16 @@ } }, "messages.DeleteQuickReplyMessages": { - "desc": "{schema}", + "desc": "Delete one or more messages from a quick reply shortcut. This will also emit an updateDeleteQuickReplyMessages update.", "params": { - "id": "", - "shortcut_id": "" + "id": "IDs of shortcut messages to delete.", + "shortcut_id": "Shortcut ID." } }, "messages.DeleteQuickReplyShortcut": { - "desc": "{schema}", + "desc": "Completely delete a quick reply shortcut.\nThis will also emit an updateDeleteQuickReply update to other logged-in sessions (and no updateDeleteQuickReplyMessages updates, even if all the messages in the shortcuts are also deleted by this method).", "params": { - "shortcut_id": "" + "shortcut_id": "Shortcut ID" } }, "messages.DeleteRevokedExportedChatInvites": { @@ -12611,13 +14613,14 @@ } }, "messages.DeleteSavedHistory": { - "desc": "Deletes messages forwarded from a specific peer to saved messages \u00bb.", + "desc": "Deletes messages from a monoforum topic \u00bb, or deletes messages forwarded from a specific peer to saved messages \u00bb.", "params": { "flags": "Flags, see TL conditional fields", "max_date": "Delete all messages older than this UNIX timestamp", "max_id": "Maximum ID of message to delete", "min_date": "Delete all messages newer than this UNIX timestamp", - "peer": "Peer, whose messages will be deleted from saved messages \u00bb" + "parent_peer": "If set, affects the messages of the passed monoforum topic \u00bb, otherwise affects saved messages \u00bb.", + "peer": "Peer, whose messages will be deleted from saved messages \u00bb, or the ID of the topic." } }, "messages.DeleteScheduledMessages": { @@ -12627,6 +14630,10 @@ "peer": "Peer" } }, + "messages.DeleteTopicHistory": { + "desc": "", + "params": {} + }, "messages.DiscardEncryption": { "desc": "Cancels a request for creation and/or delete info on secret chat.", "params": { @@ -12685,13 +14692,17 @@ } }, "messages.EditFactCheck": { - "desc": "{schema}", + "desc": "Edit/create a fact-check on a message.", "params": { - "msg_id": "", - "peer": "", - "text": "" + "msg_id": "Message ID", + "peer": "Peer where the message was sent", + "text": "Fact-check (maximum UTF-8 length specified in appConfig.factcheck_length_limit)." } }, + "messages.EditForumTopic": { + "desc": "", + "params": {} + }, "messages.EditInlineBotMessage": { "desc": "Edit an inline bot message", "params": { @@ -12716,16 +14727,16 @@ "message": "New message", "no_webpage": "Disable webpage preview", "peer": "Where was the message sent", - "quick_reply_shortcut_id": "", + "quick_reply_shortcut_id": "If specified, edits a quick reply shortcut message, instead \u00bb.", "reply_markup": "Reply markup for inline keyboards", "schedule_date": "Scheduled message date for scheduled messages" } }, "messages.EditQuickReplyShortcut": { - "desc": "{schema}", + "desc": "Rename a quick reply shortcut.\nThis will emit an updateQuickReplies update to other logged-in sessions.", "params": { - "shortcut": "", - "shortcut_id": "" + "shortcut": "New shortcut name.", + "shortcut_id": "Shortcut ID." } }, "messages.ExportChatInvite": { @@ -12736,6 +14747,7 @@ "legacy_revoke_permanent": "Legacy flag, reproducing legacy behavior of this method: if set, revokes all previous links before creating a new one. Kept for bot API BC, should not be used by modern clients.", "peer": "Chat", "request_needed": "Whether admin confirmation is required before admitting each separate user into the chat", + "subscription_pricing": "For Telegram Star subscriptions \u00bb, contains the pricing of the subscription the user must activate to join the private channel.", "title": "Description of the invite link, visible only to administrators", "usage_limit": "Maximum number of users that can join using this link" } @@ -12747,9 +14759,19 @@ "unfave": "Whether to add or remove a sticker from favorites" } }, + "messages.ForwardMessage": { + "desc": "Forwards single messages.", + "params": { + "id": "Forwarded message ID", + "peer": "User or chat where a message will be forwarded", + "random_id": "Unique client message ID required to prevent message resending" + } + }, "messages.ForwardMessages": { "desc": "Forwards messages by their IDs.", "params": { + "allow_paid_floodskip": "Bots only: if set, allows sending up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.", + "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.", "background": "Whether to send the message in background", "drop_author": "Whether to forward messages without quoting the original author", "drop_media_captions": "Whether to strip captions from media", @@ -12757,13 +14779,16 @@ "from_peer": "Source of messages", "id": "IDs of messages", "noforwards": "Only for bots, disallows further re-forwarding and saving of the messages, even if the destination chat doesn't have content protection enabled", - "quick_reply_shortcut": "", + "quick_reply_shortcut": "Add the messages to the specified quick reply shortcut \u00bb, instead.", "random_id": "Random ID to prevent resending of messages", + "reply_to": "Can only contain an inputReplyToMonoForum, to forward messages to a monoforum topic (mutually exclusive with top_msg_id).", "schedule_date": "Scheduled message date for scheduled messages", "send_as": "Forward the messages as the specified peer", "silent": "Whether to send messages silently (no notification will be triggered on the destination clients)", + "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow.", "to_peer": "Destination peer", "top_msg_id": "Destination forum topic", + "video_timestamp": "Start playing the video at the specified timestamp (seconds).", "with_my_score": "When forwarding games, whether to include your score in the game" } }, @@ -12773,6 +14798,10 @@ "peer": "Chat" } }, + "messages.GetAllChats": { + "desc": "Get all chats, channels and supergroups", + "params": {} + }, "messages.GetAllDrafts": { "desc": "Return all message drafts.\nReturns all the latest updateDraftMessage updates related to all chats with drafts.", "params": {} @@ -12780,7 +14809,7 @@ "messages.GetAllStickers": { "desc": "Get all installed stickers", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.allStickers.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetArchivedStickers": { @@ -12802,7 +14831,7 @@ "messages.GetAttachMenuBots": { "desc": "Returns installed attachment menu bot mini apps \u00bb", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the attachMenuBots.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetAttachedStickers": { @@ -12812,22 +14841,22 @@ } }, "messages.GetAvailableEffects": { - "desc": "{schema}", + "desc": "Fetch the full list of usable animated message effects \u00bb.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.availableEffects.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetAvailableReactions": { "desc": "Obtain available message reactions \u00bb", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.availableReactions.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetBotApp": { "desc": "Obtain information about a direct link Mini App", "params": { "app": "Bot app information obtained from a Direct Mini App deep link \u00bb.", - "hash": "Hash for pagination, for more info click here" + "hash": "Hash used for caching, for more info click here" } }, "messages.GetBotCallbackAnswer": { @@ -12851,7 +14880,8 @@ "offset_user": "User ID for pagination: if set, offset_date must also be set.", "peer": "Chat", "q": "Search for a user in the pending join requests \u00bb list: only available when the requested flag is set, cannot be used together with a specific link.", - "requested": "If set, only returns info about users with pending join requests \u00bb" + "requested": "If set, only returns info about users with pending join requests \u00bb", + "subscription_expired": "Set this flag if the link is a Telegram Star subscription link \u00bb and only members with already expired subscription must be returned." } }, "messages.GetChats": { @@ -12868,6 +14898,10 @@ "user_id": "User ID" } }, + "messages.GetCraftStarGifts": { + "desc": "", + "params": {} + }, "messages.GetCustomEmojiDocuments": { "desc": "Fetch custom emoji stickers \u00bb.", "params": { @@ -12881,7 +14915,7 @@ "messages.GetDefaultTagReactions": { "desc": "Fetch a default recommended list of saved message tag reactions.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.reactions.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetDhConfig": { @@ -12897,7 +14931,10 @@ }, "messages.GetDialogUnreadMarks": { "desc": "Get dialogs manually marked as unread", - "params": {} + "params": { + "flags": "Flags, see TL conditional fields", + "parent_peer": "Can be equal to the ID of a monoforum, to fetch monoforum topics manually marked as unread." + } }, "messages.GetDialogs": { "desc": "Returns the current user dialog list.", @@ -12905,7 +14942,7 @@ "exclude_pinned": "Exclude pinned dialogs", "flags": "Flags, see TL conditional fields", "folder_id": "Peer folder ID, for more info click here", - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "limit": "Number of list elements to be returned", "offset_date": "Offsets for pagination, for more info click here", "offset_id": "Offsets for pagination, for more info click here (top_message ID used for pagination)", @@ -12927,10 +14964,14 @@ "size": "Size of the file in bytes" } }, + "messages.GetEmojiGameInfo": { + "desc": "", + "params": {} + }, "messages.GetEmojiGroups": { - "desc": "Represents a list of emoji categories, to be used when selecting custom emojis.", + "desc": "Represents a list of emoji categories.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.emojiGroups.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetEmojiKeywords": { @@ -12955,25 +14996,25 @@ "messages.GetEmojiProfilePhotoGroups": { "desc": "Represents a list of emoji categories, to be used when selecting custom emojis to set as profile picture.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.emojiGroups.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetEmojiStatusGroups": { "desc": "Represents a list of emoji categories, to be used when selecting custom emojis to set as custom emoji status.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.emojiGroups.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetEmojiStickerGroups": { - "desc": "{schema}", + "desc": "Represents a list of emoji categories, to be used when choosing a sticker.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.emojiGroups.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetEmojiStickers": { "desc": "Gets the list of currently installed custom emoji stickersets.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.allStickers.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetEmojiURL": { @@ -13002,37 +15043,45 @@ } }, "messages.GetExtendedMedia": { - "desc": "Get information about extended media", + "desc": "Fetch updated information about paid media, see here \u00bb for the full flow.", "params": { - "id": "Message IDs", - "peer": "Peer" + "id": "IDs of currently visible messages containing paid media.", + "peer": "Peer with visible paid media messages." } }, "messages.GetFactCheck": { - "desc": "{schema}", + "desc": "Fetch one or more factchecks, see here \u00bb for the full flow.", "params": { - "msg_id": "", - "peer": "" + "msg_id": "Messages that have associated factCheck constructors with the need_check flag set.", + "peer": "Peer where the messages were sent." } }, "messages.GetFavedStickers": { "desc": "Get faved stickers", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.favedStickers.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetFeaturedEmojiStickers": { "desc": "Gets featured custom emoji stickersets.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.featuredStickers.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetFeaturedStickers": { "desc": "Get featured stickers", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.featuredStickers.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, + "messages.GetForumTopics": { + "desc": "", + "params": {} + }, + "messages.GetForumTopicsByID": { + "desc": "", + "params": {} + }, "messages.GetFullChat": { "desc": "Get full info about a basic group.", "params": { @@ -13081,7 +15130,7 @@ "messages.GetMaskStickers": { "desc": "Get installed mask stickers", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.allStickers.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetMessageEditData": { @@ -13131,7 +15180,7 @@ } }, "messages.GetMyStickers": { - "desc": "{schema}", + "desc": "Fetch all stickersets \u00bb owned by the current user.", "params": { "limit": "Maximum number of results to return, see pagination", "offset_id": "Offsets for pagination, for more info click here" @@ -13140,7 +15189,7 @@ "messages.GetOldFeaturedStickers": { "desc": "Method for fetching previously featured stickers", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.featuredStickers.hash field returned by a previous call to the method, or pass 0 if this is the first call.", + "hash": "Hash used for caching, for more info click here.", "limit": "Maximum number of results to return, see pagination", "offset": "Offset" } @@ -13152,12 +15201,16 @@ } }, "messages.GetOutboxReadDate": { - "desc": "{schema}", + "desc": "Get the exact read date of one of our messages, sent to a private chat with another user.", "params": { - "msg_id": "", - "peer": "" + "msg_id": "The message ID.", + "peer": "The user to whom we sent the message." } }, + "messages.GetPaidReactionPrivacy": { + "desc": "Fetches an updatePaidReactionPrivacy update with the current default paid reaction privacy, see here \u00bb for more info.", + "params": {} + }, "messages.GetPeerDialogs": { "desc": "Get dialog info of specified peers", "params": { @@ -13198,25 +15251,32 @@ "peer": "Chat where the poll was sent" } }, + "messages.GetPreparedInlineMessage": { + "desc": "Obtain a prepared inline message generated by a mini app: invoked when handling web_app_send_prepared_message events", + "params": { + "bot": "The bot that owns the mini app that emitted the web_app_send_prepared_message event", + "id": "The id from the web_app_send_prepared_message event" + } + }, "messages.GetQuickReplies": { - "desc": "{schema}", + "desc": "Fetch basic info about all existing quick reply shortcuts.", "params": { - "hash": "Hash for pagination, for more info click here" + "hash": "Hash for pagination, generated as specified here \u00bb (not the usual algorithm used for hash generation.)" } }, "messages.GetQuickReplyMessages": { - "desc": "{schema}", + "desc": "Fetch (a subset or all) messages in a quick reply shortcut \u00bb.", "params": { "flags": "Flags, see TL conditional fields", - "hash": "Hash for pagination, for more info click here", - "id": "", - "shortcut_id": "" + "hash": "Hash for pagination, generated as specified here \u00bb (not the usual algorithm used for hash generation).", + "id": "IDs of the messages to fetch, if empty fetches all of them.", + "shortcut_id": "Quick reply shortcut ID." } }, "messages.GetRecentLocations": { "desc": "Get live location history of a certain user", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "limit": "Maximum number of results to return, see pagination", "peer": "User" } @@ -13224,7 +15284,7 @@ "messages.GetRecentReactions": { "desc": "Get recently used message reactions", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.reactions.hash field returned by a previous call to the method, or pass 0 if this is the first call.", + "hash": "Hash used for caching, for more info click here.", "limit": "Maximum number of results to return, see pagination" } }, @@ -13233,14 +15293,14 @@ "params": { "attached": "Get stickers recently attached to photo or video files", "flags": "Flags, see TL conditional fields", - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.recentStickers.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetReplies": { "desc": "Get messages in a reply thread", "params": { "add_offset": "Offsets for pagination, for more info click here", - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "limit": "Maximum number of results to return, see pagination", "max_id": "If a positive value was transferred, the method will return only messages with ID smaller than max_id", "min_id": "If a positive value was transferred, the method will return only messages with ID bigger than min_id", @@ -13251,48 +15311,59 @@ } }, "messages.GetSavedDialogs": { - "desc": "Returns the current saved dialog list, see here \u00bb for more info.", + "desc": "Returns the current saved dialog list \u00bb or monoforum topic list \u00bb.", "params": { "exclude_pinned": "Exclude pinned dialogs", "flags": "Flags, see TL conditional fields", - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "limit": "Number of list elements to be returned", "offset_date": "Offsets for pagination, for more info click here", "offset_id": "Offsets for pagination, for more info click here (top_message ID used for pagination)", - "offset_peer": "Offset peer for pagination" + "offset_peer": "Offset peer for pagination", + "parent_peer": "If set, fetches the topic list of the passed monoforum, otherwise fetches the saved dialog list." + } + }, + "messages.GetSavedDialogsByID": { + "desc": "Obtain information about specific saved message dialogs \u00bb or monoforum topics \u00bb.", + "params": { + "flags": "Flags, see TL conditional fields", + "ids": "IDs of dialogs (topics) to fetch.", + "parent_peer": "If set, fetches monoforum topics \u00bb, otherwise fetches saved message dialogs \u00bb." } }, "messages.GetSavedGifs": { "desc": "Get saved GIFs.", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.savedGifs.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetSavedHistory": { - "desc": "Returns saved messages \u00bb forwarded from a specific peer", + "desc": "Fetch saved messages \u00bb forwarded from a specific peer, or fetch messages from a monoforum topic \u00bb.", "params": { "add_offset": "Number of list elements to be skipped, negative values are also accepted.", + "flags": "Flags, see TL conditional fields", "hash": "Result hash", "limit": "Number of results to return", "max_id": "If a positive value was transferred, the method will return only messages with IDs less than max_id", "min_id": "If a positive value was transferred, the method will return only messages with IDs more than min_id", "offset_date": "Only return messages sent before the specified date", "offset_id": "Only return messages starting from the specified message ID", - "peer": "Target peer" + "parent_peer": "If set, fetches messages from the specified monoforum, otherwise fetches from saved messages.", + "peer": "Target peer (or topic)" } }, "messages.GetSavedReactionTags": { "desc": "Fetch the full list of saved message tags created by the user.", "params": { "flags": "Flags, see TL conditional fields", - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.savedReactionTags.hash field returned by a previous call to the method, or pass 0 if this is the first call.", + "hash": "Hash used for caching, for more info click here.", "peer": "If set, returns tags only used in the specified saved message dialog." } }, "messages.GetScheduledHistory": { "desc": "Get scheduled messages", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here. To generate the hash, populate the ids array with the id, edit_date (0 if unedited) and date (in this order) of the previously returned messages (in order, i.e. ids = [id1, (edit_date1 ?? 0), date1, id2, (edit_date2 ?? 0), date2, ...]).", "peer": "Peer" } }, @@ -13339,10 +15410,27 @@ "desc": "Get message ranges for saving the user's chat history", "params": {} }, + "messages.GetSponsoredMessages": { + "desc": "Get a list of sponsored messages for a peer, see here \u00bb for more info.", + "params": { + "flags": "Flags, see TL conditional fields", + "msg_id": "Must be set when fetching sponsored messages to show on channel videos \u00bb.", + "peer": "The currently open channel/bot." + } + }, + "messages.GetStatsURL": { + "desc": "Returns URL with the chat statistics. Currently this method can be used only for channels", + "params": { + "dark": "Pass true if a URL with the dark theme must be returned", + "flags": "Flags, see TL conditional fields", + "params": "Parameters from tg://statsrefresh?params=****** link", + "peer": "Chat identifier" + } + }, "messages.GetStickerSet": { "desc": "Get info about a stickerset", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here", "stickerset": "Stickerset" } }, @@ -13350,7 +15438,7 @@ "desc": "Get stickers by emoji", "params": { "emoticon": "The emoji", - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.stickers.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.GetSuggestedDialogFilters": { @@ -13360,7 +15448,7 @@ "messages.GetTopReactions": { "desc": "Got popular message reactions", "params": { - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.reactions.hash field returned by a previous call to the method, or pass 0 if this is the first call.", + "hash": "Hash used for caching, for more info click here.", "limit": "Maximum number of results to return, see pagination" } }, @@ -13387,13 +15475,14 @@ "min_id": "Only return reactions for messages starting from this message ID", "offset_id": "Offsets for pagination, for more info click here", "peer": "Peer", + "saved_peer_id": "If set, must be equal to the ID of a monoforum topic: will affect that topic in the monoforum passed in peer.", "top_msg_id": "If set, considers only reactions to messages within the specified forum topic" } }, "messages.GetWebPage": { "desc": "Get instant view page", "params": { - "hash": "Hash for pagination, for more info click here", + "hash": "Hash used for caching, for more info click here. Note: the usual hash generation algorithm cannot be used in this case, please re-use the webPage.hash field returned by a previous call to the method, or pass 0 if this is the first call or if the previous call did not return a webPage.", "url": "URL of IV page to fetch" } }, @@ -13405,6 +15494,10 @@ "message": "Message from which to extract the preview" } }, + "messages.GetWebViewResult": { + "desc": "", + "params": {} + }, "messages.HideAllChatJoinRequests": { "desc": "Dismiss or approve all join requests related to a specific chat or channel.", "params": { @@ -13454,6 +15547,7 @@ "desc": "Manually mark dialog as unread", "params": { "flags": "Flags, see TL conditional fields", + "parent_peer": "If set, must be equal to the ID of a monoforum, and will affect the monoforum topic passed in peer.", "peer": "Dialog", "unread": "Mark as unread/read" } @@ -13522,7 +15616,7 @@ } }, "messages.ReadMessageContents": { - "desc": "Notifies the sender about the recipient having listened a voice message or watched a video.", + "desc": "Notifies the sender about the recipient having listened a voice message or watched a video, emitting an updateReadMessagesContents.", "params": { "id": "Message ID list" } @@ -13532,9 +15626,18 @@ "params": { "flags": "Flags, see TL conditional fields", "peer": "Peer", + "saved_peer_id": "If set, must be equal to the ID of a monoforum topic: will affect that topic in the monoforum passed in peer.", "top_msg_id": "Mark as read only reactions to messages within the specified forum topic" } }, + "messages.ReadSavedHistory": { + "desc": "Mark messages as read in a monoforum topic \u00bb.", + "params": { + "max_id": "If a positive value is passed, only messages with identifiers less or equal than the given one will be read.", + "parent_peer": "ID of the monoforum group.", + "peer": "ID of the topic." + } + }, "messages.ReceivedMessages": { "desc": "Confirms receipt of messages by a client, cancels PUSH-notification sending.", "params": { @@ -13556,6 +15659,10 @@ "order": "New dialog order" } }, + "messages.ReorderPinnedForumTopics": { + "desc": "", + "params": {} + }, "messages.ReorderPinnedSavedDialogs": { "desc": "Reorder pinned saved message dialogs \u00bb.", "params": { @@ -13565,9 +15672,9 @@ } }, "messages.ReorderQuickReplies": { - "desc": "{schema}", + "desc": "Reorder quick reply shortcuts.", "params": { - "order": "" + "order": "IDs of all created quick reply shortcuts, in the desired order." } }, "messages.ReorderStickerSets": { @@ -13584,8 +15691,8 @@ "params": { "id": "IDs of messages to report", "message": "Comment for report moderation", - "peer": "Peer", - "reason": "Why are these messages being reported" + "option": "Menu option, intially empty", + "peer": "Peer" } }, "messages.ReportEncryptedSpam": { @@ -13594,6 +15701,15 @@ "peer": "The secret chat to report" } }, + "messages.ReportMessagesDelivery": { + "desc": "Used for Telegram Gateway verification messages \u00bb: indicate to the server that one or more messages were received by the client, if requested by the message.report_delivery_until_date flag or the equivalent flag in push notifications.", + "params": { + "flags": "Flags, see TL conditional fields", + "id": "The IDs of the received messages.", + "peer": "The peer where the messages were received.", + "push": "Must be set if the messages were received from a push notification." + } + }, "messages.ReportReaction": { "desc": "Report a message reaction", "params": { @@ -13608,11 +15724,20 @@ "peer": "Peer to report" } }, + "messages.ReportSponsoredMessage": { + "desc": "Report a sponsored message \u00bb, see here \u00bb for more info on the full flow.", + "params": { + "option": "Chosen report option, initially an empty string, see here \u00bb for more info on the full flow.", + "random_id": "The ad's unique ID." + } + }, "messages.RequestAppWebView": { "desc": "Open a bot mini app from a direct Mini App deep link, sending over user information after user confirmation.", "params": { "app": "The app obtained by invoking messages.getBotApp as specified in the direct Mini App deep link docs.", + "compact": "If set, requests to open the mini app in compact mode (as opposed to normal or fullscreen mode). Must be set if the mode parameter of the direct Mini App deep link is equal to compact.", "flags": "Flags, see TL conditional fields", + "fullscreen": "If set, requests to open the mini app in fullscreen mode (as opposed to compact or normal mode). Must be set if the mode parameter of the direct Mini App deep link is equal to fullscreen.", "peer": "If the client has clicked on the link in a Telegram chat, pass the chat's peer information; otherwise pass the bot's peer information, instead.", "platform": "Short name of the application; 0-64 English letters, digits, and underscores", "start_param": "If the startapp query string parameter is present in the direct Mini App deep link, pass it to start_param.", @@ -13628,15 +15753,30 @@ "user_id": "User ID" } }, + "messages.RequestMainWebView": { + "desc": "Open a Main Mini App.", + "params": { + "bot": "Bot that owns the main mini app.", + "compact": "If set, requests to open the mini app in compact mode (as opposed to normal or fullscreen mode). Must be set if the mode parameter of the Main Mini App link is equal to compact.", + "flags": "Flags, see TL conditional fields", + "fullscreen": "If set, requests to open the mini app in fullscreen mode (as opposed to compact or normal mode). Must be set if the mode parameter of the Main Mini App link is equal to fullscreen.", + "peer": "Currently open chat, may be inputPeerEmpty if no chat is currently open.", + "platform": "Short name of the application; 0-64 English letters, digits, and underscores", + "start_param": "Start parameter, if opening from a Main Mini App link \u00bb.", + "theme_params": "Theme parameters \u00bb" + } + }, "messages.RequestSimpleWebView": { "desc": "Open a bot mini app.", "params": { "bot": "Bot that owns the mini app", + "compact": "Deprecated.", "flags": "Flags, see TL conditional fields", - "from_side_menu": "Set this flag if opening the Mini App from the installed side menu entry \u00bb or from a Mini App link \u00bb.", + "from_side_menu": "Set this flag if opening the Mini App from the installed side menu entry \u00bb.", "from_switch_webview": "Whether the webapp was opened by clicking on the switch_webview button shown on top of the inline results list returned by messages.getInlineBotResults.", + "fullscreen": "Requests to open the app in fullscreen mode.", "platform": "Short name of the application; 0-64 English letters, digits, and underscores", - "start_param": "Start parameter, if opening from a Mini App link \u00bb.", + "start_param": "Deprecated.", "theme_params": "Theme parameters \u00bb", "url": "Web app URL, if opening from a keyboard button or inline result" } @@ -13655,8 +15795,10 @@ "desc": "Open a bot mini app, sending over user information after user confirmation.", "params": { "bot": "Bot that owns the web app", + "compact": "If set, requests to open the mini app in compact mode (as opposed to normal or fullscreen mode). Must be set if the mode parameter of the attachment menu deep link is equal to compact.", "flags": "Flags, see TL conditional fields", "from_bot_menu": "Whether the webview was opened by clicking on the bot's menu button \u00bb.", + "fullscreen": "If set, requests to open the mini app in fullscreen mode (as opposed to normal or compact mode). Must be set if the mode parameter of the attachment menu deep link is equal to fullscreen.", "peer": "Dialog where the web app is being opened, and where the resulting message will be sent (see the docs for more info \u00bb).", "platform": "Short name of the application; 0-64 English letters, digits, and underscores", "reply_to": "If set, indicates that the inline message that will be sent by the bot on behalf of the user once the web app interaction is terminated should be sent in reply to the specified message or story.", @@ -13677,6 +15819,7 @@ "messages.SaveDraft": { "desc": "Save a message draft associated to a chat.", "params": { + "effect": "Specifies a message effect \u00bb to use for the message.", "entities": "Message entities for styled text", "flags": "Flags, see TL conditional fields", "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", @@ -13684,7 +15827,8 @@ "message": "The draft", "no_webpage": "Disable generation of the webpage preview", "peer": "Destination of the message that should be sent", - "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story." + "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.", + "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow." } }, "messages.SaveGif": { @@ -13694,6 +15838,15 @@ "unsave": "Whether to remove GIF from saved gifs list" } }, + "messages.SavePreparedInlineMessage": { + "desc": "Save a prepared inline message, to be shared by the user of the mini app using a web_app_send_prepared_message event", + "params": { + "flags": "Flags, see TL conditional fields", + "peer_types": "Types of chats where this message can be sent", + "result": "The message", + "user_id": "The user to whom the web_app_send_prepared_message event event will be sent" + } + }, "messages.SaveRecentSticker": { "desc": "Add/remove sticker from recent stickers list", "params": { @@ -13711,7 +15864,7 @@ "flags": "Flags, see TL conditional fields", "from_id": "Only return messages sent by the specified user ID", "hash": "Hash", - "limit": "Number of results to return", + "limit": "Number of results to return, can be 0 to only return the message counter.", "max_date": "If a positive value was transferred, only messages with a sending date smaller than the transferred one will be returned", "max_id": "Maximum message ID to return", "min_date": "If a positive value was transferred, only messages with a sending date bigger than the transferred one will be returned", @@ -13720,7 +15873,7 @@ "peer": "User or chat, histories with which are searched, or (inputPeerEmpty) constructor to search in all private chats and normal groups (not channels) \u00bb. Use messages.searchGlobal to search globally in all chats, groups, supergroups and channels.", "q": "Text search request", "saved_peer_id": "Search within the saved message dialog \u00bb with this ID.", - "saved_reaction": "", + "saved_reaction": "You may search for saved messages tagged \u00bb with one or more reactions using this flag.", "top_msg_id": "Thread ID" } }, @@ -13728,7 +15881,7 @@ "desc": "Look for custom emojis associated to a UTF8 emoji", "params": { "emoticon": "The emoji", - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the emojiList.hash field returned by a previous call to the method, or pass 0 if this is the first call." + "hash": "Hash used for caching, for more info click here." } }, "messages.SearchEmojiStickerSets": { @@ -13736,24 +15889,26 @@ "params": { "exclude_featured": "Exclude featured stickersets from results", "flags": "Flags, see TL conditional fields", - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.foundStickerSets.hash field returned by a previous call to the method, or pass 0 if this is the first call.", + "hash": "Hash used for caching, for more info click here.", "q": "Query string" } }, "messages.SearchGlobal": { "desc": "Search for messages and peers globally", "params": { - "broadcasts_only": "", + "broadcasts_only": "If set, only returns results from channels (used in the global channel search tab \u00bb).", "filter": "Global search filter", "flags": "Flags, see TL conditional fields", "folder_id": "Peer folder ID, for more info click here", + "groups_only": "Whether to search only in groups", "limit": "Offsets for pagination, for more info click here", "max_date": "If a positive value was transferred, the method will return only messages with date smaller than max_date", "min_date": "If a positive value was specified, the method will return only messages with date bigger than min_date", "offset_id": "Offsets for pagination, for more info click here", "offset_peer": "Offsets for pagination, for more info click here", - "offset_rate": "Initially 0, then set to the next_rate parameter of messages.messagesSlice", - "q": "Query" + "offset_rate": "Initially 0, then set to the next_rate parameter of messages.messagesSlice, or if that is absent, the date of the last returned message.", + "q": "Query", + "users_only": "Whether to search only in private chats" } }, "messages.SearchSentMedia": { @@ -13769,10 +15924,23 @@ "params": { "exclude_featured": "Exclude featured stickersets from results", "flags": "Flags, see TL conditional fields", - "hash": "Hash for pagination, for more info click here.Note: the usual hash generation algorithm cannot be used in this case, please re-use the messages.foundStickerSets.hash field returned by a previous call to the method, or pass 0 if this is the first call.", + "hash": "Hash used for caching, for more info click here.", "q": "Query string" } }, + "messages.SearchStickers": { + "desc": "Search for stickers using AI-powered keyword search", + "params": { + "emojis": "If set, returns custom emoji stickers", + "emoticon": "Space-separated list of emojis to search for", + "flags": "Flags, see TL conditional fields", + "hash": "Hash used for caching, for more info click here. The hash may be generated locally by using the ids of the returned or stored sticker documents.", + "lang_code": "List of possible IETF language tags of the user's input language; may be empty if unknown", + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination", + "q": "The search term" + } + }, "messages.SendBotRequestedPeer": { "desc": "Send one or more chosen peers, as requested by a keyboardButtonRequestPeer button.", "params": { @@ -13814,6 +15982,7 @@ "messages.SendInlineBotResult": { "desc": "Send a result obtained using messages.getInlineBotResults.", "params": { + "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.", "background": "Whether to send the message in background", "clear_draft": "Whether to clear the draft", "flags": "Flags, see TL conditional fields", @@ -13821,7 +15990,7 @@ "id": "Result ID from messages.getInlineBotResults", "peer": "Destination", "query_id": "Query ID from messages.getInlineBotResults", - "quick_reply_shortcut": "", + "quick_reply_shortcut": "Add the message to the specified quick reply shortcut \u00bb, instead.", "random_id": "Random ID to avoid resending the same query", "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.", "schedule_date": "Scheduled message date for scheduled messages", @@ -13832,9 +16001,11 @@ "messages.SendMedia": { "desc": "Send a media", "params": { + "allow_paid_floodskip": "Bots only: if set, allows sending up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.", + "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.", "background": "Send message in background", "clear_draft": "Clear the draft", - "effect": "", + "effect": "Specifies a message effect \u00bb to use for the message.", "entities": "Message entities for styled text", "flags": "Flags, see TL conditional fields", "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", @@ -13842,22 +16013,25 @@ "message": "Caption", "noforwards": "Only for bots, disallows forwarding and saving of the messages, even if the destination chat doesn't have content protection enabled", "peer": "Destination", - "quick_reply_shortcut": "", + "quick_reply_shortcut": "Add the message to the specified quick reply shortcut \u00bb, instead.", "random_id": "Random ID to avoid resending the same message", "reply_markup": "Reply markup for bot keyboards", "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.", "schedule_date": "Scheduled message date for scheduled messages", "send_as": "Send this message as the specified peer", "silent": "Send message silently (no notification should be triggered)", + "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow.", "update_stickersets_order": "Whether to move used stickersets to top, see here for more info on this flag \u00bb" } }, "messages.SendMessage": { "desc": "Sends a message to a chat", "params": { + "allow_paid_floodskip": "Bots only: if set, allows sending up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.", + "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.", "background": "Send this message as background message", "clear_draft": "Clear the draft field", - "effect": "", + "effect": "Specifies a message effect \u00bb to use for the message.", "entities": "Message entities for sending styled text", "flags": "Flags, see TL conditional fields", "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", @@ -13865,28 +16039,31 @@ "no_webpage": "Set this flag to disable generation of the webpage preview", "noforwards": "Only for bots, disallows forwarding and saving of the messages, even if the destination chat doesn't have content protection enabled", "peer": "The destination where the message will be sent", - "quick_reply_shortcut": "", + "quick_reply_shortcut": "Add the message to the specified quick reply shortcut \u00bb, instead.", "random_id": "Unique client message ID required to prevent message resending", "reply_markup": "Reply markup for sending bot buttons", "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story. Also used to quote other messages.", "schedule_date": "Scheduled message date for scheduled messages", "send_as": "Send this message as the specified peer", "silent": "Send this message silently (no notifications for the receivers)", + "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow.", "update_stickersets_order": "Whether to move used stickersets to top, see here for more info on this flag \u00bb" } }, "messages.SendMultiMedia": { "desc": "Send an album or grouped media", "params": { + "allow_paid_floodskip": "Bots only: if set, allows sending up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.", + "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.", "background": "Send in background?", "clear_draft": "Whether to clear drafts", - "effect": "", + "effect": "Specifies a message effect \u00bb to use for the message.", "flags": "Flags, see TL conditional fields", "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", "multi_media": "The medias to send: note that they must be separately uploaded using messages.uploadMedia first, using raw inputMediaUploaded* constructors is not supported.", "noforwards": "Only for bots, disallows forwarding and saving of the messages, even if the destination chat doesn't have content protection enabled", "peer": "The destination chat", - "quick_reply_shortcut": "", + "quick_reply_shortcut": "Add the message to the specified quick reply shortcut \u00bb, instead.", "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.", "schedule_date": "Scheduled message date for scheduled messages", "send_as": "Send this message as the specified peer", @@ -13894,13 +16071,24 @@ "update_stickersets_order": "Whether to move used stickersets to top, see here for more info on this flag \u00bb" } }, + "messages.SendPaidReaction": { + "desc": "Sends one or more paid Telegram Star reactions \u00bb, transferring Telegram Stars \u00bb to a channel's balance.", + "params": { + "count": "The number of stars to send (each will increment the reaction counter by one).", + "flags": "Flags, see TL conditional fields", + "msg_id": "The message to react to", + "peer": "The channel", + "private": "Each post with star reactions has a leaderboard with the top senders, but users can opt out of appearing there if they prefer more privacy. Not populating this field will use the default reaction privacy, stored on the server and synced to clients using updatePaidReactionPrivacy (see here for more info).", + "random_id": "Unique client message ID required to prevent message resending. Note: this argument must be composed of a 64-bit integer where the lower 32 bits are random, and the higher 32 bits are equal to the current unixtime, i.e. uint64_t random_id = (time() << 32) | ((uint64_t)random_uint32_t()): this differs from the random_id format of all other methods in the API, which just take 64 random bits." + } + }, "messages.SendQuickReplyMessages": { - "desc": "{schema}", + "desc": "Send a quick reply shortcut \u00bb.", "params": { - "id": "", - "peer": "", - "random_id": "", - "shortcut_id": "" + "id": "Specify a subset of messages from the shortcut to send; if empty, defaults to all of them.", + "peer": "The peer where to send the shortcut (users only, for now).", + "random_id": "Unique client IDs required to prevent message resending, one for each message we're sending, may be empty (but not recommended).", + "shortcut_id": "The ID of the quick reply shortcut to send." } }, "messages.SendReaction": { @@ -13911,7 +16099,7 @@ "flags": "Flags, see TL conditional fields", "msg_id": "Message ID to react to", "peer": "Peer", - "reaction": "A list of reactions" + "reaction": "A list of reactions (doesn't accept reactionPaid constructors, use messages.sendPaidReaction to send paid reactions, instead)." } }, "messages.SendScheduledMessages": { @@ -13987,15 +16175,16 @@ "params": { "available_reactions": "Allowed reaction emojis", "flags": "Flags, see TL conditional fields", + "paid_enabled": "If this flag is set and a Bool is passed, the method will enable or disable paid message reactions \u00bb. If this flag is not set, the previously stored setting will not be changed.", "peer": "Group where to apply changes", - "reactions_limit": "" + "reactions_limit": "This flag may be used to impose a custom limit of unique reactions (i.e. a customizable version of appConfig.reactions_uniq_max); this field and the other info set by the method will then be available to users in channelFull and chatFull. If this flag is not set, the previously configured reactions_limit will not be altered." } }, "messages.SetChatTheme": { - "desc": "Change the chat theme of a certain chat", + "desc": "Change the chat theme of a certain chat, see here \u00bb for more info.", "params": { - "emoticon": "Emoji, identifying a specific chat theme; a list of chat themes can be fetched using account.getChatThemes", - "peer": "Private chat where to change theme" + "peer": "Private chat where to change theme", + "theme": "The theme to set." } }, "messages.SetChatWallPaper": { @@ -14013,7 +16202,7 @@ "messages.SetDefaultHistoryTTL": { "desc": "Changes the default value of the Time-To-Live setting, applied to all new chats.", "params": { - "period": "The new default Time-To-Live of all messages sent in new chats." + "period": "The new default Time-To-Live of all messages sent in new chats, in seconds." } }, "messages.SetDefaultReaction": { @@ -14082,6 +16271,10 @@ "top_msg_id": "Topic ID" } }, + "messages.SetWebViewResult": { + "desc": "", + "params": {} + }, "messages.StartBot": { "desc": "Start a conversation with a bot using a deep linking parameter", "params": { @@ -14098,6 +16291,10 @@ "peer": "The Telegram chat where the messages should be imported, click here for more info \u00bb" } }, + "messages.SummarizeText": { + "desc": "", + "params": {} + }, "messages.ToggleBotInAttachMenu": { "desc": "Enable or disable web bot attachment menu \u00bb", "params": { @@ -14108,9 +16305,9 @@ } }, "messages.ToggleDialogFilterTags": { - "desc": "{schema}", + "desc": "Enable or disable folder tags \u00bb.", "params": { - "enabled": "" + "enabled": "Enable or disable folder tags." } }, "messages.ToggleDialogPin": { @@ -14128,6 +16325,14 @@ "peer": "The chat or channel" } }, + "messages.TogglePaidReactionPrivacy": { + "desc": "Changes the privacy of already sent paid reactions on a specific message.", + "params": { + "msg_id": "The ID of the message to which we sent the paid reactions", + "peer": "The channel", + "private": "If true, makes the current anonymous in the top sender leaderboard for this message; otherwise, does the opposite." + } + }, "messages.TogglePeerTranslations": { "desc": "Show or hide the real-time chat translation popup for a certain chat", "params": { @@ -14154,6 +16359,26 @@ "uninstall": "Uninstall the specified stickersets" } }, + "messages.ToggleSuggestedPostApproval": { + "desc": "Approve or reject a suggested post \u00bb.", + "params": { + "flags": "Flags, see TL conditional fields", + "msg_id": "ID of the suggestion message.", + "peer": "Both for users and channels, must contain the ID of the direct messages monoforum \u00bb (for channels, the topic ID is extracted automatically from the msg_id).", + "reject": "Reject the suggested post.", + "reject_comment": "Optional comment for rejections (can only be used if reject is set).", + "schedule_date": "Custom scheduling date." + } + }, + "messages.ToggleTodoCompleted": { + "desc": "Mark one or more items of a todo list \u00bb as completed or not completed.", + "params": { + "completed": "Items to mark as completed.", + "incompleted": "Items to mark as not completed.", + "msg_id": "ID of the message with the todo list.", + "peer": "Peer where the todo list was posted." + } + }, "messages.TranscribeAudio": { "desc": "Transcribe voice message", "params": { @@ -14182,6 +16407,7 @@ "params": { "flags": "Flags, see TL conditional fields", "peer": "Chat where to unpin", + "saved_peer_id": "If set, must be equal to the ID of a monoforum topic, and will unpin all messages pinned in the passed monoforum topic.", "top_msg_id": "Forum topic where to unpin" } }, @@ -14199,6 +16425,10 @@ "order": "New folder order" } }, + "messages.UpdatePinnedForumTopic": { + "desc": "", + "params": {} + }, "messages.UpdatePinnedMessage": { "desc": "Pin a message", "params": { @@ -14219,7 +16449,7 @@ } }, "messages.UploadEncryptedFile": { - "desc": "Upload encrypted file and associate it to a secret chat", + "desc": "Upload encrypted file and associate it to a secret chat (without actually sending it to the chat).", "params": { "file": "The file", "peer": "The secret chat to associate the file to" @@ -14237,12 +16467,18 @@ "messages.UploadMedia": { "desc": "Upload a file and associate it to a chat (without actually sending it to the chat)", "params": { - "business_connection_id": "", + "business_connection_id": "Whether the media will be used only in the specified business connection \u00bb, and not directly by the bot.", "flags": "Flags, see TL conditional fields", "media": "File uploaded in chunks as described in files \u00bb", "peer": "The chat, can be inputPeerEmpty for bots and inputPeerSelf for users." } }, + "messages.ViewSponsoredMessage": { + "desc": "Mark a specific sponsored message \u00bb as read", + "params": { + "random_id": "The ad's unique ID." + } + }, "payments.ApplyGiftCode": { "desc": "Apply a Telegram Premium giftcode \u00bb", "params": { @@ -14263,10 +16499,34 @@ "receipt": "Receipt" } }, - "payments.CanPurchasePremium": { - "desc": "Checks whether Telegram Premium purchase is possible. Must be called before in-store Premium purchase, official apps only.", + "payments.BotCancelStarsSubscription": { + "desc": "Cancel a bot subscription", + "params": { + "charge_id": "The provider_charge_id from the messageActionPaymentSentMe service message sent to the bot for the first subscription payment.", + "flags": "Flags, see TL conditional fields", + "restore": "If not set, disables autorenewal of the subscriptions, and prevents the user from reactivating the subscription once the current period expires: a subscription cancelled by the bot will have the starsSubscription.bot_canceled flag set. The bot can can partially undo this operation by setting this flag: this will allow the user to reactivate the subscription.", + "user_id": "The ID of the user whose subscription should be (un)cancelled" + } + }, + "payments.CanPurchaseStore": { + "desc": "Checks whether a purchase is possible. Must be called before in-store purchase, official apps only.", + "params": { + "purpose": "Payment purpose." + } + }, + "payments.ChangeStarsSubscription": { + "desc": "Activate or deactivate a Telegram Star subscription \u00bb.", "params": { - "purpose": "Payment purpose" + "canceled": "Whether to cancel or reactivate the subscription.", + "flags": "Flags, see TL conditional fields", + "peer": "Always pass inputPeerSelf.", + "subscription_id": "ID of the subscription." + } + }, + "payments.CheckCanSendGift": { + "desc": "Check if the specified gift \u00bb can be sent.", + "params": { + "gift_id": "Gift ID." } }, "payments.CheckGiftCode": { @@ -14283,18 +16543,79 @@ "info": "Clear the last order settings saved by the user" } }, + "payments.ConnectStarRefBot": { + "desc": "Join a bot's affiliate program, becoming an affiliate \u00bb", + "params": { + "bot": "The bot that offers the affiliate program", + "peer": "The peer that will become the affiliate: star commissions will be transferred to this peer's star balance." + } + }, + "payments.ConvertStarGift": { + "desc": "Convert a received gift \u00bb into Telegram Stars: this will permanently destroy the gift, converting it into starGift.convert_stars Telegram Stars, added to the user's balance.", + "params": { + "stargift": "The gift to convert." + } + }, + "payments.CreateStarGiftCollection": { + "desc": "Create a star gift collection \u00bb.", + "params": { + "peer": "Peer where to create the collection.", + "stargift": "Gifts added to the collection.", + "title": "Title of the collection." + } + }, + "payments.DeleteStarGiftCollection": { + "desc": "Delete a star gift collection \u00bb.", + "params": { + "collection_id": "ID of the collection.", + "peer": "Peer that owns the collection." + } + }, + "payments.EditConnectedStarRefBot": { + "desc": "Leave a bot's affiliate program \u00bb", + "params": { + "flags": "Flags, see TL conditional fields", + "link": "The affiliate link to revoke", + "peer": "The peer that was affiliated", + "revoked": "If set, leaves the bot's affiliate program" + } + }, "payments.ExportInvoice": { "desc": "Generate an invoice deep link", "params": { "invoice_media": "Invoice" } }, + "payments.FulfillStarsSubscription": { + "desc": "Re-join a private channel associated to an active Telegram Star subscription \u00bb.", + "params": { + "peer": "Always pass inputPeerSelf.", + "subscription_id": "ID of the subscription." + } + }, "payments.GetBankCardData": { "desc": "Get info about a credit card", "params": { "number": "Credit card number" } }, + "payments.GetConnectedStarRefBot": { + "desc": "Fetch info about a specific bot affiliation \u00bb", + "params": { + "bot": "The bot that offers the affiliate program", + "peer": "The affiliated peer" + } + }, + "payments.GetConnectedStarRefBots": { + "desc": "Fetch all affiliations we have created for a certain peer", + "params": { + "flags": "Flags, see TL conditional fields", + "limit": "Maximum number of results to return, see pagination", + "offset_date": "If set, returns only results older than the specified unixtime", + "offset_link": "Offset for pagination, taken from the last returned connectedBotStarRef.url (initially empty)", + "peer": "The affiliated peer" + } + }, "payments.GetGiveawayInfo": { "desc": "Obtain information about a Telegram Premium giveaway \u00bb.", "params": { @@ -14307,7 +16628,7 @@ "params": { "flags": "Flags, see TL conditional fields", "invoice": "Invoice", - "theme_params": "A JSON object with the following keys, containing color theme information (integers, RGB24) to pass to the payment provider, to apply in eventual verification pages: bg_color - Background color text_color - Text color hint_color - Hint text color link_color - Link color button_color - Button color button_text_color - Button text color" + "theme_params": "Theme parameters \u00bb" } }, "payments.GetPaymentReceipt": { @@ -14324,28 +16645,189 @@ "flags": "Flags, see TL conditional fields" } }, + "payments.GetResaleStarGifts": { + "desc": "Get collectible gifts of a specific type currently on resale, see here \u00bb for more info.", + "params": { + "attributes": "Optionally filter gifts with the specified attributes. If no attributes of a specific type are specified, all attributes of that type are allowed.", + "attributes_hash": "If a previous call to the method was made and payments.resaleStarGifts.attributes_hash was set, pass it here to avoid returning any results if they haven't changed. Otherwise, set this flag and pass 0 to return payments.resaleStarGifts.attributes_hash and payments.resaleStarGifts.attributes, these two fields will not be set if this flag is not set.", + "flags": "Flags, see TL conditional fields", + "gift_id": "Mandatory identifier of the base gift from which the collectible gift was upgraded.", + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination. If not equal to an empty string, payments.resaleStarGifts.counters will not be set to avoid returning the counters every time a new page is fetched.", + "sort_by_num": "Sort gifts by number (ascending).", + "sort_by_price": "Sort gifts by price (ascending)." + } + }, "payments.GetSavedInfo": { "desc": "Get saved payment information", "params": {} }, + "payments.GetSavedStarGift": { + "desc": "Fetch info about specific gifts owned by a peer we control.", + "params": { + "stargift": "List of gifts to fetch info about." + } + }, + "payments.GetSavedStarGifts": { + "desc": "Fetch the full list of gifts owned by a peer.", + "params": { + "collection_id": "Only returns gifts within the specified collection \u00bb.", + "exclude_saved": "Exclude gifts pinned on the profile.", + "exclude_unique": "Exclude collectible gifts \u00bb.", + "exclude_unlimited": "Exclude gifts that do not have the starGift.limited flag set.", + "exclude_unsaved": "Exclude gifts not pinned on the profile.", + "exclude_unupgradable": "Exclude gifts that cannot be upgraded to collectible gifts \u00bb.", + "exclude_upgradable": "Exclude gifts that can be upgraded to collectible gifts \u00bb.", + "flags": "Flags, see TL conditional fields", + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination.", + "peer": "Fetch only gifts owned by the specified peer, such as: a user, with peer=inputPeerUser; a channel, with peer=inputPeerChannel; a connected business user (when executing the method as a bot, over the business connection), with peer=inputPeerUser.", + "sort_by_value": "If set, sorts the gifts by price instead of reception date." + } + }, + "payments.GetStarGiftActiveAuctions": { + "desc": "", + "params": {} + }, + "payments.GetStarGiftAuctionAcquiredGifts": { + "desc": "", + "params": {} + }, + "payments.GetStarGiftAuctionState": { + "desc": "", + "params": {} + }, + "payments.GetStarGiftCollections": { + "desc": "Fetches all star gift collections \u00bb of a peer.", + "params": { + "hash": "Hash (generated as specified here \u00bb) using the starGiftCollection.hash field (not the collection_id field) of all collections returned by a previous method call, to avoid refetching the result if it hasn't changed.", + "peer": "The peer." + } + }, + "payments.GetStarGiftUpgradeAttributes": { + "desc": "", + "params": {} + }, + "payments.GetStarGiftUpgradePreview": { + "desc": "Obtain a preview of the possible attributes (chosen randomly) a gift \u00bb can receive after upgrading it to a collectible gift \u00bb, see here \u00bb for more info.", + "params": { + "gift_id": "The gift to upgrade." + } + }, + "payments.GetStarGiftWithdrawalUrl": { + "desc": "Convert a collectible gift \u00bb to an NFT on the TON blockchain.", + "params": { + "password": "The current user's 2FA password, passed as specified here \u00bb.", + "stargift": "The collectible gift to export." + } + }, + "payments.GetStarGifts": { + "desc": "Get a list of available gifts, see here \u00bb for more info.", + "params": { + "hash": "Hash used for caching, for more info click here.The hash may be generated locally by using the ids of the returned or stored sticker starGifts." + } + }, + "payments.GetStarsGiftOptions": { + "desc": "Obtain a list of Telegram Stars gift options \u00bb as starsGiftOption constructors.", + "params": { + "flags": "Flags, see TL conditional fields", + "user_id": "Receiver of the gift (optional)." + } + }, + "payments.GetStarsGiveawayOptions": { + "desc": "Fetch a list of star giveaway options \u00bb.", + "params": {} + }, + "payments.GetStarsRevenueAdsAccountUrl": { + "desc": "Returns a URL for a Telegram Ad platform account that can be used to set up advertisements for channel/bot in peer, paid using the Telegram Stars owned by the specified peer, see here \u00bb for more info.", + "params": { + "peer": "Channel or bot that owns the stars." + } + }, + "payments.GetStarsRevenueStats": { + "desc": "Get Telegram Star revenue statistics \u00bb.", + "params": { + "dark": "Whether to enable dark theme for graph colors", + "flags": "Flags, see TL conditional fields", + "peer": "Get statistics for the specified bot, channel or ourselves (inputPeerSelf).", + "ton": "If set, fetches channel/bot ad revenue statistics in TON." + } + }, + "payments.GetStarsRevenueWithdrawalUrl": { + "desc": "Withdraw funds from a channel or bot's star balance \u00bb.", + "params": { + "amount": "The amount of stars or nanotons to withdraw.", + "flags": "Flags, see TL conditional fields", + "password": "2FA password, see here \u00bb for more info.", + "peer": "Channel or bot from which to withdraw funds.", + "ton": "If set, withdraws channel/ad revenue in TON." + } + }, "payments.GetStarsStatus": { - "desc": "{schema}", + "desc": "Get the current Telegram Stars balance of the current account (with peer=inputPeerSelf), or the stars balance of the bot specified in peer.", + "params": { + "flags": "Flags, see TL conditional fields", + "peer": "Peer of which to get the balance.", + "ton": "If set, returns the channel/ad revenue balance in nanotons." + } + }, + "payments.GetStarsSubscriptions": { + "desc": "Obtain a list of active, expired or cancelled Telegram Star subscriptions \u00bb.", "params": { - "peer": "" + "flags": "Flags, see TL conditional fields", + "missing_balance": "Whether to return only subscriptions expired due to an excessively low Telegram Star balance.", + "offset": "Offset for pagination, taken from payments.starsStatus.subscriptions_next_offset.", + "peer": "Always pass inputPeerSelf." } }, "payments.GetStarsTopupOptions": { - "desc": "{schema}", + "desc": "Obtain a list of Telegram Stars topup options \u00bb as starsTopupOption constructors.", "params": {} }, "payments.GetStarsTransactions": { - "desc": "{schema}", + "desc": "Fetch Telegram Stars transactions.", "params": { + "ascending": "Return transactions in ascending order by date (instead of descending order by date).", "flags": "Flags, see TL conditional fields", - "inbound": "", - "offset": "", - "outbound": "", - "peer": "" + "inbound": "If set, fetches only incoming transactions.", + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination, obtained from the returned next_offset, initially an empty string \u00bb.", + "outbound": "If set, fetches only outgoing transactions.", + "peer": "Fetch the transaction history of the peer (inputPeerSelf or a bot we own).", + "subscription_id": "If set, fetches only transactions for the specified Telegram Star subscription \u00bb.", + "ton": "If set, returns the channel/ad revenue transactions in nanotons, instead." + } + }, + "payments.GetStarsTransactionsByID": { + "desc": "Obtain info about Telegram Star transactions \u00bb using specific transaction IDs.", + "params": { + "flags": "Flags, see TL conditional fields", + "id": "Transaction IDs.", + "peer": "Channel or bot.", + "ton": "If set, returns channel/bot ad revenue transactions in nanotons." + } + }, + "payments.GetSuggestedStarRefBots": { + "desc": "Obtain a list of suggested mini apps with available affiliate programs", + "params": { + "flags": "Flags, see TL conditional fields", + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination, taken from payments.suggestedStarRefBots.next_offset, initially empty.", + "order_by_date": "If set, orders results by the creation date of the affiliate program", + "order_by_revenue": "If set, orders results by the expected revenue", + "peer": "The peer that will become the affiliate: star commissions will be transferred to this peer's star balance." + } + }, + "payments.GetUniqueStarGift": { + "desc": "Obtain info about a collectible gift \u00bb using a slug obtained from a collectible gift link \u00bb.", + "params": { + "slug": "The slug." + } + }, + "payments.GetUniqueStarGiftValueInfo": { + "desc": "Get information about the value of a collectible gift \u00bb.", + "params": { + "slug": "slug from a starGiftUnique." } }, "payments.LaunchPrepaidGiveaway": { @@ -14357,12 +16839,39 @@ } }, "payments.RefundStarsCharge": { + "desc": "Refund a Telegram Stars transaction, see here \u00bb for more info.", + "params": { + "charge_id": "Transaction ID.", + "user_id": "User to refund." + } + }, + "payments.ReorderStarGiftCollections": { + "desc": "Reorder the star gift collections \u00bb on an owned peer's profile.", + "params": { + "order": "New collection order.", + "peer": "The owned peer." + } + }, + "payments.RequestRecurringPayment": { "desc": "{schema}", "params": { - "charge_id": "", + "invoice_media": "", + "recurring_init_charge": "", "user_id": "" } }, + "payments.ResolveStarGiftOffer": { + "desc": "", + "params": {} + }, + "payments.SaveStarGift": { + "desc": "Display or remove a received gift \u00bb from our profile.", + "params": { + "flags": "Flags, see TL conditional fields", + "stargift": "The gift to display or remove.", + "unsave": "If set, hides the gift from our profile." + } + }, "payments.SendPaymentForm": { "desc": "Send compiled payment form", "params": { @@ -14375,12 +16884,64 @@ "tip_amount": "Tip, in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." } }, + "payments.SendStarGiftOffer": { + "desc": "", + "params": {} + }, "payments.SendStarsForm": { - "desc": "{schema}", + "desc": "Make a payment using Telegram Stars, see here \u00bb for more info.", + "params": { + "form_id": "Payment form ID", + "invoice": "Invoice" + } + }, + "payments.ToggleChatStarGiftNotifications": { + "desc": "Enables or disables the reception of notifications every time a gift \u00bb is received by the specified channel, can only be invoked by admins with post_messages admin rights.", + "params": { + "enabled": "Whether to enable or disable reception of notifications in the form of messageActionStarGiftUnique and messageActionStarGift service messages from the channel.", + "flags": "Flags, see TL conditional fields", + "peer": "The channel for which to receive or not receive notifications." + } + }, + "payments.ToggleStarGiftsPinnedToTop": { + "desc": "Pins a received gift on top of the profile of the user or owned channels by using payments.toggleStarGiftsPinnedToTop.", + "params": { + "peer": "The peer where to pin the gift.", + "stargift": "The gift to pin." + } + }, + "payments.TransferStarGift": { + "desc": "Transfer a collectible gift to another user or channel: can only be used if transfer is free (i.e. messageActionStarGiftUnique.transfer_stars is not set); see here \u00bb for more info on the full flow (including the different flow to use in case the transfer isn't free).", + "params": { + "stargift": "The gift to transfer.", + "to_id": "Destination peer." + } + }, + "payments.UpdateStarGiftCollection": { + "desc": "Add or remove gifts from a star gift collection \u00bb, or rename the collection.", + "params": { + "add_stargift": "Can contain a list of gifts to add to the collection.", + "collection_id": "Collection ID.", + "delete_stargift": "Can contain a list of gifts to remove from the collection.", + "flags": "Flags, see TL conditional fields", + "order": "Can contain the new gift order.", + "peer": "Peer that owns the collection.", + "title": "Title of the collection, to rename the collection." + } + }, + "payments.UpdateStarGiftPrice": { + "desc": "A collectible gift we own \u00bb can be put up for sale on the gift marketplace \u00bb with this method, see here \u00bb for more info.", + "params": { + "resell_amount": "Resale price of the gift.", + "stargift": "The gift to resell." + } + }, + "payments.UpgradeStarGift": { + "desc": "Upgrade a gift to a collectible gift: can only be used if the upgrade was already paid by the gift sender; see here \u00bb for more info on the full flow (including the different flow to use in case the upgrade was not paid by the gift sender).", "params": { "flags": "Flags, see TL conditional fields", - "form_id": "", - "invoice": "" + "keep_original_details": "Set this flag to keep the original gift text, sender and receiver in the upgraded gift as a starGiftAttributeOriginalDetails attribute.", + "stargift": "The gift to upgrade" } }, "payments.ValidateRequestedInfo": { @@ -14416,6 +16977,19 @@ "protocol": "Phone call settings" } }, + "phone.CreateConferenceCall": { + "desc": "Create and optionally join a new conference call.", + "params": { + "block": "Initial blockchain block (can only be used if join is set).", + "flags": "Flags, see TL conditional fields", + "join": "If set, also join the call, otherwise just create the call link.", + "muted": "If set, mute our microphone when joining the call (can only be used if join is set).", + "params": "Parameters from tgcalls (can only be used if join is set).", + "public_key": "Public key (can only be used if join is set).", + "random_id": "Unique client message ID required to prevent creation of duplicate group calls.", + "video_stopped": "If set, our video stream is disabled (can only be used if join is set)." + } + }, "phone.CreateGroupCall": { "desc": "Create a group call or livestream", "params": { @@ -14427,6 +17001,31 @@ "title": "Call title" } }, + "phone.DeclineConferenceCallInvite": { + "desc": "Declines a conference call invite.", + "params": { + "msg_id": "The ID of the messageActionConferenceCall to decline." + } + }, + "phone.DeleteConferenceCallParticipants": { + "desc": "Remove participants from a conference call.", + "params": { + "block": "The block containing an appropriate e2e.chain.changeSetGroupState event", + "call": "The conference call.", + "flags": "Flags, see TL conditional fields", + "ids": "IDs of users to remove.", + "kick": "Whether this is a forced removal of active members in a conference call.", + "only_left": "Whether this is a removal of members that already left the conference call." + } + }, + "phone.DeleteGroupCallMessages": { + "desc": "", + "params": {} + }, + "phone.DeleteGroupCallParticipantMessages": { + "desc": "", + "params": {} + }, "phone.DiscardCall": { "desc": "Refuse or end running call", "params": { @@ -14484,12 +17083,25 @@ "limit": "Maximum number of results to return, see pagination" } }, + "phone.GetGroupCallChainBlocks": { + "desc": "Fetch the blocks of a conference blockchain \u00bb.", + "params": { + "call": "The conference.", + "limit": "Maximum number of blocks to return in this call, see pagination", + "offset": "Offset for pagination.", + "sub_chain_id": "Subchain ID." + } + }, "phone.GetGroupCallJoinAs": { "desc": "Get a list of peers that can be used to join a group call, presenting yourself as a specific user/channel.", "params": { "peer": "The dialog whose group call or livestream we're trying to join" } }, + "phone.GetGroupCallStars": { + "desc": "", + "params": {} + }, "phone.GetGroupCallStreamChannels": { "desc": "Get info about RTMP streams in a group call or livestream.\nThis method should be invoked to the same group/channel-related DC used for downloading livestream chunks.\nAs usual, the media DC is preferred, if available.", "params": { @@ -14513,6 +17125,15 @@ "sources": "If specified, will fetch group participant info about the specified WebRTC source IDs" } }, + "phone.InviteConferenceCallParticipant": { + "desc": "Invite a user to a conference call.", + "params": { + "call": "The conference call.", + "flags": "Flags, see TL conditional fields", + "user_id": "The user to invite.", + "video": "Invite the user to also turn on their video feed." + } + }, "phone.InviteToGroupCall": { "desc": "Invite a set of users to a group call.", "params": { @@ -14523,12 +17144,14 @@ "phone.JoinGroupCall": { "desc": "Join a group call", "params": { + "block": "The block containing an appropriate e2e.chain.changeSetGroupState event.", "call": "The group call", "flags": "Flags, see TL conditional fields", "invite_hash": "The invitation hash from the invite link \u00bb, if provided allows speaking in a livestream or muted group chat.", "join_as": "Join the group call, presenting yourself as the specified user/channel", "muted": "If set, the user will be muted by default upon joining.", "params": "WebRTC parameters", + "public_key": "For conference calls, your public key.", "video_stopped": "If set, the user's video will be disabled by default upon joining." } }, @@ -14586,10 +17209,29 @@ "phone.SaveDefaultGroupCallJoinAs": { "desc": "Set the default peer that will be used to join a group call in a specific dialog.", "params": { - "join_as": "The default peer that will be used to join group calls in this dialog, presenting yourself as a specific user/channel.", - "peer": "The dialog" + "join_as": "The default peer that will be used to join group calls in this dialog, presenting yourself as a specific user/channel.", + "peer": "The dialog" + } + }, + "phone.SaveDefaultSendAs": { + "desc": "", + "params": {} + }, + "phone.SendConferenceCallBroadcast": { + "desc": "Broadcast a blockchain block to all members of a conference call, see here \u00bb for more info.", + "params": { + "block": "The block to broadcast.", + "call": "The conference where to broadcast the block." } }, + "phone.SendGroupCallEncryptedMessage": { + "desc": "", + "params": {} + }, + "phone.SendGroupCallMessage": { + "desc": "", + "params": {} + }, "phone.SendSignalingData": { "desc": "Send VoIP signaling data", "params": { @@ -14669,7 +17311,7 @@ "params": { "file": "Profile photo", "flags": "Flags, see TL conditional fields", - "save": "If set, removes a previously set personal profile picture (does not affect suggested profile pictures, to remove them simply deleted the messageActionSuggestProfilePhoto service message with messages.deleteMessages).", + "save": "If set, removes a previously set personal profile picture (does not affect suggested profile pictures, to remove them simply delete the messageActionSuggestProfilePhoto service message with messages.deleteMessages).", "suggest": "If set, will send a messageActionSuggestProfilePhoto service message to user_id, suggesting them to use the specified profile picture; otherwise, will set a personal profile picture for the user (only visible to the current user).", "user_id": "The contact", "video": "Animated profile picture video", @@ -14698,17 +17340,17 @@ } }, "premium.GetBoostsList": { - "desc": "Obtains info about the boosts that were applied to a certain channel (admins only)", + "desc": "Obtains info about the boosts that were applied to a certain channel or supergroup (admins only)", "params": { "flags": "Flags, see TL conditional fields", - "gifts": "Whether to return only info about boosts received from gift codes and giveaways created by the channel \u00bb", + "gifts": "Whether to return only info about boosts received from gift codes and giveaways created by the channel/supergroup \u00bb", "limit": "Maximum number of results to return, see pagination", "offset": "Offset for pagination, obtained from premium.boostsList.next_offset", - "peer": "The channel" + "peer": "The channel/supergroup" } }, "premium.GetBoostsStatus": { - "desc": "Gets the current number of boosts of a channel.", + "desc": "Gets the current number of boosts of a channel/supergroup.", "params": { "peer": "The peer." } @@ -14718,72 +17360,49 @@ "params": {} }, "premium.GetUserBoosts": { - "desc": "Returns the lists of boost that were applied to a channel by a specific user (admins only)", + "desc": "Returns the lists of boost that were applied to a channel/supergroup by a specific user (admins only)", "params": { - "peer": "The channel", + "peer": "The channel/supergroup", "user_id": "The user" } }, "smsjobs.FinishJob": { - "desc": "{schema}", + "desc": "Finish an SMS job (official clients only).", "params": { - "error": "", + "error": "If failed, the error.", "flags": "Flags, see TL conditional fields", - "job_id": "" + "job_id": "Job ID." } }, "smsjobs.GetSmsJob": { - "desc": "{schema}", + "desc": "Get info about an SMS job (official clients only).", "params": { - "job_id": "" + "job_id": "Job ID" } }, "smsjobs.GetStatus": { - "desc": "{schema}", + "desc": "Get SMS jobs status (official clients only).", "params": {} }, "smsjobs.IsEligibleToJoin": { - "desc": "{schema}", + "desc": "Check if we can process SMS jobs (official clients only).", "params": {} }, "smsjobs.Join": { - "desc": "{schema}", + "desc": "Enable SMS jobs (official clients only).", "params": {} }, "smsjobs.Leave": { - "desc": "{schema}", + "desc": "Disable SMS jobs (official clients only).", "params": {} }, "smsjobs.UpdateSettings": { - "desc": "{schema}", - "params": { - "allow_international": "", - "flags": "Flags, see TL conditional fields" - } - }, - "stats.GetBroadcastRevenueStats": { - "desc": "{schema}", + "desc": "Update SMS job settings (official clients only).", "params": { - "channel": "", - "dark": "", + "allow_international": "Allow international numbers?", "flags": "Flags, see TL conditional fields" } }, - "stats.GetBroadcastRevenueTransactions": { - "desc": "{schema}", - "params": { - "channel": "", - "limit": "Maximum number of results to return, see pagination", - "offset": "" - } - }, - "stats.GetBroadcastRevenueWithdrawalUrl": { - "desc": "{schema}", - "params": { - "channel": "", - "password": "" - } - }, "stats.GetBroadcastStats": { "desc": "Get channel statistics", "params": { @@ -14845,14 +17464,14 @@ } }, "stickers.AddStickerToSet": { - "desc": "Add a sticker to a stickerset, bots only. The sticker set must have been created by the bot.", + "desc": "Add a sticker to a stickerset. The sticker set must have been created by the current user/bot.", "params": { "sticker": "The sticker", "stickerset": "The stickerset" } }, "stickers.ChangeSticker": { - "desc": "Update the keywords, emojis or mask coordinates of a sticker, bots only.", + "desc": "Update the keywords, emojis or mask coordinates of a sticker.", "params": { "emoji": "If set, updates the emoji list associated to the sticker", "flags": "Flags, see TL conditional fields", @@ -14862,7 +17481,7 @@ } }, "stickers.ChangeStickerPosition": { - "desc": "Changes the absolute position of a sticker in the set to which it belongs; for bots only. The sticker set must have been created by the bot", + "desc": "Changes the absolute position of a sticker in the set to which it belongs. The sticker set must have been created by the current user/bot.", "params": { "position": "The new position of the sticker, zero-based", "sticker": "The sticker" @@ -14875,7 +17494,7 @@ } }, "stickers.CreateStickerSet": { - "desc": "Create a stickerset, bots only.", + "desc": "Create a stickerset.", "params": { "emojis": "Whether this is a custom emoji stickerset.", "flags": "Flags, see TL conditional fields", @@ -14890,29 +17509,29 @@ } }, "stickers.DeleteStickerSet": { - "desc": "Deletes a stickerset we created, bots only.", + "desc": "Deletes a stickerset we created.", "params": { "stickerset": "Stickerset to delete" } }, "stickers.RemoveStickerFromSet": { - "desc": "Remove a sticker from the set where it belongs, bots only. The sticker set must have been created by the bot.", + "desc": "Remove a sticker from the set where it belongs. The sticker set must have been created by the current user/bot.", "params": { "sticker": "The sticker to remove" } }, "stickers.RenameStickerSet": { - "desc": "Renames a stickerset, bots only.", + "desc": "Renames a stickerset.", "params": { "stickerset": "Stickerset to rename", "title": "New stickerset title" } }, "stickers.ReplaceSticker": { - "desc": "{schema}", + "desc": "Replace a sticker in a stickerset \u00bb.", "params": { - "new_sticker": "", - "sticker": "" + "new_sticker": "New sticker.", + "sticker": "Old sticker document." } }, "stickers.SetStickerSetThumb": { @@ -14944,6 +17563,21 @@ "peer": "The peer from which we wish to post stories." } }, + "stories.CreateAlbum": { + "desc": "Creates a story album.", + "params": { + "peer": "The owned peer where to create the album.", + "stories": "Stories to add to the album.", + "title": "Album name." + } + }, + "stories.DeleteAlbum": { + "desc": "Delete a story album.", + "params": { + "album_id": "ID of the album to delete.", + "peer": "Owned peer where the album is located." + } + }, "stories.DeleteStories": { "desc": "Deletes some posted stories.", "params": { @@ -14971,6 +17605,22 @@ "peer": "Peer where the story was posted" } }, + "stories.GetAlbumStories": { + "desc": "Get stories in a story album \u00bb.", + "params": { + "album_id": "ID of the album.", + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination.", + "peer": "Peer where the album is posted." + } + }, + "stories.GetAlbums": { + "desc": "Get story albums created by a peer.", + "params": { + "hash": "The hash from a previously returned stories.albums, to avoid returning any results if they haven't changed.", + "peer": "The peer." + } + }, "stories.GetAllReadPeerStories": { "desc": "Obtain the latest read story ID for all peers when first logging in, returned as a list of updateReadStories updates, see here \u00bb for more info.", "params": {} @@ -15070,13 +17720,31 @@ "peer": "The peer whose stories should be marked as read." } }, + "stories.ReorderAlbums": { + "desc": "Reorder story albums on a profile \u00bb.", + "params": { + "order": "New order of the albums.", + "peer": "Peer where the albums are located." + } + }, "stories.Report": { "desc": "Report a story.", "params": { "id": "IDs of the stories to report.", "message": "Comment for report moderation", - "peer": "The peer that uploaded the story.", - "reason": "Why are these storeis being reported." + "option": "Menu option, intially empty", + "peer": "The peer that uploaded the story." + } + }, + "stories.SearchPosts": { + "desc": "Globally search for stories using a hashtag or a location media area, see here \u00bb for more info on the full flow.", + "params": { + "area": "A mediaAreaGeoPoint or a mediaAreaVenue. Note mediaAreaGeoPoint areas may be searched only if they have an associated address.", + "flags": "Flags, see TL conditional fields", + "hashtag": "Hashtag (without the #)", + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination: initially an empty string, then the next_offset from the previously returned stories.foundStories.", + "peer": "If set, returns only stories posted by this peer." } }, "stories.SendReaction": { @@ -15092,6 +17760,7 @@ "stories.SendStory": { "desc": "Uploads a Telegram Story.", "params": { + "albums": "If set, adds the story to the specified albums.", "caption": "Story caption.", "entities": "Message entities for styled text, if allowed by the stories_entities client configuration parameter \u00bb.", "flags": "Flags, see TL conditional fields", @@ -15108,6 +17777,10 @@ "random_id": "Unique client message ID required to prevent message resending." } }, + "stories.StartLive": { + "desc": "", + "params": {} + }, "stories.ToggleAllStoriesHidden": { "desc": "Hide the active stories of a specific peer, preventing them from being displayed on the action bar on the homescreen.", "params": { @@ -15130,10 +17803,22 @@ } }, "stories.TogglePinnedToTop": { - "desc": "{schema}", + "desc": "Pin some stories to the top of the profile, see here \u00bb for more info.", + "params": { + "id": "IDs of the stories to pin (max stories_pinned_to_top_count_max).", + "peer": "Peer where to pin stories." + } + }, + "stories.UpdateAlbum": { + "desc": "Rename a story albums \u00bb, or add, delete or reorder stories in it.", "params": { - "id": "", - "peer": "" + "add_stories": "If set, adds the specified stories to the album.", + "album_id": "Album ID.", + "delete_stories": "If set, deletes the specified stories from the album.", + "flags": "Flags, see TL conditional fields", + "order": "If set, reorders the stories in the album by their IDs.", + "peer": "Peer where the album is posted.", + "title": "New album title." } }, "updates.GetChannelDifference": { @@ -15234,10 +17919,26 @@ "id": "User ID" } }, - "users.GetIsPremiumRequiredToContact": { - "desc": "{schema}", + "users.GetRequirementsToContact": { + "desc": "Check whether we can write to the specified users, used to implement bulk checks for Premium-only messages \u00bb and paid messages \u00bb.", + "params": { + "id": "Users to check." + } + }, + "users.GetSavedMusic": { + "desc": "Get songs pinned to the user's profile, see here \u00bb for more info.", + "params": { + "hash": "Hash \u00bb of the IDs of previously added songs, to avoid returning any result if there was no change.", + "id": "The ID of the user.", + "limit": "Maximum number of results to return, see pagination", + "offset": "Offset for pagination." + } + }, + "users.GetSavedMusicByID": { + "desc": "Check if the passed songs are still pinned to the user's profile, or refresh the file references of songs pinned on a user's profile see here \u00bb for more info.", "params": { - "id": "" + "documents": "The songs (here, file_reference can be empty to refresh file references).", + "id": "The ID of the user." } }, "users.GetUsers": { @@ -15252,15 +17953,16 @@ "errors": "Errors", "id": "The user" } + }, + "users.SuggestBirthday": { + "desc": "", + "params": {} } }, "type": { "AccountDaysTTL": { "desc": "Time-to-live of current account" }, - "AppWebViewResult": { - "desc": "Contains the link that must be used to open a direct link Mini App." - }, "AttachMenuBot": { "desc": "Represents a bot mini app that can be launched from the attachment menu \u00bb" }, @@ -15279,6 +17981,9 @@ "AttachMenuPeerType": { "desc": "Indicates a supported peer type for a bot mini app attachment menu" }, + "AuctionBidLevel": { + "desc": "" + }, "Authorization": { "desc": "Represents a logged-in session" }, @@ -15292,7 +17997,7 @@ "desc": "Media autosave settings" }, "AvailableEffect": { - "desc": "" + "desc": "Describes a message effect \u00bb." }, "AvailableReaction": { "desc": "Animations associated with a message reaction" @@ -15304,7 +18009,7 @@ "desc": "Basic theme settings" }, "Birthday": { - "desc": "" + "desc": "Birthday information for a user." }, "Bool": { "desc": "Boolean type." @@ -15315,8 +18020,11 @@ "BotApp": { "desc": "Contains information about a direct link Mini App." }, + "BotAppSettings": { + "desc": "Mini app \u00bb settings" + }, "BotBusinessConnection": { - "desc": "" + "desc": "Contains info about a bot business connection." }, "BotCommand": { "desc": "Describes a bot command that can be used in a chat" @@ -15336,41 +18044,47 @@ "BotMenuButton": { "desc": "Indicates the action to execute when pressing the in-UI menu button for bots" }, - "BroadcastRevenueBalances": { - "desc": "" + "BotPreviewMedia": { + "desc": "Represents a Main Mini App preview media, see here \u00bb for more info." }, - "BroadcastRevenueTransaction": { - "desc": "" + "BotVerification": { + "desc": "Describes a bot verification icon \u00bb." + }, + "BotVerifierSettings": { + "desc": "Info about the current verifier bot \u00bb." }, "BusinessAwayMessage": { - "desc": "" + "desc": "Describes a Telegram Business away message, automatically sent to users writing to us when we're offline, during closing hours, while we're on vacation, or in some other custom time period when we cannot immediately answer to the user." }, "BusinessAwayMessageSchedule": { - "desc": "" + "desc": "Specifies when should the Telegram Business away messages be sent." }, "BusinessBotRecipients": { - "desc": "" + "desc": "Specifies the private chats that a connected business bot \u00bb may receive messages and interact with." + }, + "BusinessBotRights": { + "desc": "Business bot rights." }, "BusinessChatLink": { - "desc": "" + "desc": "Contains info about a business chat deep link \u00bb created by the current account." }, "BusinessGreetingMessage": { - "desc": "" + "desc": "Describes a Telegram Business greeting, automatically sent to new users writing to us in private for the first time, or after a certain inactivity period." }, "BusinessIntro": { - "desc": "" + "desc": "Telegram Business introduction \u00bb." }, "BusinessLocation": { - "desc": "" + "desc": "Represents the location of a Telegram Business \u00bb." }, "BusinessRecipients": { - "desc": "" + "desc": "Specifies the chats that can receive Telegram Business away \u00bb and greeting \u00bb messages." }, "BusinessWeeklyOpen": { - "desc": "" + "desc": "A time interval, indicating the opening hours of a Telegram Business." }, "BusinessWorkHours": { - "desc": "" + "desc": "Specifies a set of Telegram Business opening hours." }, "CdnConfig": { "desc": "Configuration for CDN file downloads." @@ -15435,6 +18149,9 @@ "ChatReactions": { "desc": "Available chat reactions" }, + "ChatTheme": { + "desc": "A chat theme" + }, "CodeSettings": { "desc": "Settings for the code type to send" }, @@ -15442,13 +18159,16 @@ "desc": "Object contains info on API configuring parameters." }, "ConnectedBot": { - "desc": "" + "desc": "Contains info about a connected business bot \u00bb." + }, + "ConnectedBotStarRef": { + "desc": "Info about an active affiliate program we have with a Mini App" }, "Contact": { "desc": "A contact of the current user." }, "ContactBirthday": { - "desc": "" + "desc": "Birthday information of a contact." }, "ContactStatus": { "desc": "Contact status: online / offline." @@ -15474,6 +18194,9 @@ "DialogPeer": { "desc": "Peer, or all peers in a folder" }, + "DisallowedGiftsSettings": { + "desc": "Disallow the reception of specific gift types." + }, "Document": { "desc": "A document." }, @@ -15535,7 +18258,7 @@ "desc": "Represents a story deep link" }, "FactCheck": { - "desc": "" + "desc": "Represents a fact-check \u00bb created by an independent fact-checker." }, "FileHash": { "desc": "Hash of an uploaded file, to be checked for validity after download" @@ -15549,18 +18272,30 @@ "ForumTopic": { "desc": "Contains information about a forum topic" }, + "FoundStory": { + "desc": "A story found using global story search \u00bb." + }, "Game": { "desc": "Indicates an already sent game" }, "GeoPoint": { "desc": "Object defines a GeoPoint." }, + "GeoPointAddress": { + "desc": "Address optionally associated to a geoPoint." + }, "GlobalPrivacySettings": { "desc": "Global privacy settings" }, "GroupCall": { "desc": "A group call" }, + "GroupCallDonor": { + "desc": "" + }, + "GroupCallMessage": { + "desc": "" + }, "GroupCallParticipant": { "desc": "Info about a group call participant" }, @@ -15604,22 +18339,22 @@ "desc": "Inline bot result" }, "InputBusinessAwayMessage": { - "desc": "" + "desc": "Describes a Telegram Business away message, automatically sent to users writing to us when we're offline, during closing hours, while we're on vacation, or in some other custom time period when we cannot immediately answer to the user." }, "InputBusinessBotRecipients": { - "desc": "" + "desc": "Specifies the private chats that a connected business bot \u00bb may interact with." }, "InputBusinessChatLink": { - "desc": "" + "desc": "Contains info about a business chat deep link \u00bb to be created by the current account." }, "InputBusinessGreetingMessage": { - "desc": "" + "desc": "Describes a Telegram Business greeting, automatically sent to new users writing to us in private for the first time, or after a certain inactivity period." }, "InputBusinessIntro": { - "desc": "" + "desc": "Telegram Business introduction \u00bb." }, "InputBusinessRecipients": { - "desc": "" + "desc": "Specifies the chats that can receive Telegram Business away \u00bb and greeting \u00bb messages." }, "InputChannel": { "desc": "Represents a channel" @@ -15627,17 +18362,20 @@ "InputChatPhoto": { "desc": "Defines a new group profile photo." }, + "InputChatTheme": { + "desc": "Specifies a chat theme \u00bb." + }, "InputChatlist": { "desc": "Represents a folder" }, "InputCheckPasswordSRP": { - "desc": "Constructors for checking the validity of a 2FA SRP password" + "desc": "Constructors for checking the validity of a 2FA SRP password." }, "InputClientProxy": { "desc": "Info about an MTProxy used to connect." }, "InputCollectible": { - "desc": "" + "desc": "Represents a Fragment collectible \u00bb." }, "InputContact": { "desc": "Object defines a contact from the user's phone book." @@ -15684,6 +18422,12 @@ "InputNotifyPeer": { "desc": "Object defines the set of users and/or groups that generate notifications." }, + "InputPasskeyCredential": { + "desc": "" + }, + "InputPasskeyResponse": { + "desc": "" + }, "InputPaymentCredentials": { "desc": "Payment credentials" }, @@ -15706,11 +18450,14 @@ "desc": "Privacy rules indicate who can or can't do something and are specified by a PrivacyRule, and its input counterpart InputPrivacyRule." }, "InputQuickReplyShortcut": { - "desc": "" + "desc": "Represents a quick reply shortcut \u00bb." }, "InputReplyTo": { "desc": "Contains info about a message or story to reply to." }, + "InputSavedStarGift": { + "desc": "Points to a gift \u00bb." + }, "InputSecureFile": { "desc": "Secure passport file, for more info see the passport docs \u00bb" }, @@ -15720,6 +18467,12 @@ "InputSingleMedia": { "desc": "A single media in an album or grouped media sent with messages.sendMultiMedia." }, + "InputStarGiftAuction": { + "desc": "" + }, + "InputStarsTransaction": { + "desc": "Used to fetch info about a Telegram Star transaction \u00bb." + }, "InputStickerSet": { "desc": "Represents a stickerset" }, @@ -15765,6 +18518,9 @@ "KeyboardButtonRow": { "desc": "Bot or inline keyboard rows" }, + "KeyboardButtonStyle": { + "desc": "" + }, "LabeledPrice": { "desc": "Labeled pricetag" }, @@ -15784,7 +18540,7 @@ "desc": "Represents a story media area \u00bb" }, "MediaAreaCoordinates": { - "desc": "Coordinates and size of a clicable rectangular area on top of a story." + "desc": "Coordinates and size of a clickable rectangular area on top of a story." }, "Message": { "desc": "Object describing a message." @@ -15796,7 +18552,7 @@ "desc": "Message entities, representing styled text in a message" }, "MessageExtendedMedia": { - "desc": "Extended media" + "desc": "Paid media, see here \u00bb for more info." }, "MessageFwdHeader": { "desc": "Info about a forwarded message" @@ -15816,12 +18572,18 @@ "MessageReactions": { "desc": "Message reactions \u00bb" }, + "MessageReactor": { + "desc": "Info about a user in the paid Star reactions leaderboard for a message." + }, "MessageReplies": { "desc": "Info about post comments (for channels) or message replies (for groups)" }, "MessageReplyHeader": { "desc": "Reply information" }, + "MessageReportOption": { + "desc": "Report menu option" + }, "MessageViews": { "desc": "View, forward counter + info about replies of a specific message" }, @@ -15829,7 +18591,7 @@ "desc": "Object describes message filter." }, "MissingInvitee": { - "desc": "" + "desc": "Info about why a specific user could not be invited \u00bb." }, "MyBoost": { "desc": "Contains information about a single boost slot \u00bb." @@ -15844,7 +18606,7 @@ "desc": "Object defines the set of users and/or groups that generate notifications." }, "OutboxReadDate": { - "desc": "" + "desc": "Exact read date of a private message we sent to another user." }, "Page": { "desc": "Instant view page" @@ -15870,6 +18632,12 @@ "PageTableRow": { "desc": "Table row" }, + "PaidReactionPrivacy": { + "desc": "Paid reaction privacy settings \u00bb" + }, + "Passkey": { + "desc": "" + }, "PasswordKdfAlgo": { "desc": "Key derivation function to use when generating the password hash for SRP two-factor authorization" }, @@ -15886,7 +18654,7 @@ "desc": "Saved payment credentials" }, "Peer": { - "desc": "Chat partner or group." + "desc": "Identifier of a private chat, basic group, group or channel (see here \u00bb for more info)." }, "PeerBlocked": { "desc": "Info about a blocked user" @@ -15906,6 +18674,9 @@ "PeerStories": { "desc": "Stories associated to a peer" }, + "PendingSuggestion": { + "desc": "Represents a custom pending suggestion \u00bb." + }, "PhoneCall": { "desc": "Phone call" }, @@ -15963,11 +18734,14 @@ "PrivacyRule": { "desc": "Privacy rules together with privacy keys indicate what can or can't someone do and are specified by a PrivacyRule constructor, and its input counterpart InputPrivacyRule." }, + "ProfileTab": { + "desc": "Represents a tab of a profile page \u00bb." + }, "PublicForward": { "desc": "Contains info about the forwards of a story as a message to public chats and reposts by public channels." }, "QuickReply": { - "desc": "" + "desc": "A quick reply shortcut." }, "Reaction": { "desc": "Message reaction" @@ -15976,10 +18750,10 @@ "desc": "Number of users that reacted with a certain emoji" }, "ReactionNotificationsFrom": { - "desc": "" + "desc": "Reaction notification settings" }, "ReactionsNotifySettings": { - "desc": "" + "desc": "Reaction notification settings, see here \u00bb for more info." }, "ReadParticipantDate": { "desc": "Contains info about when a certain participant has read a message" @@ -15990,17 +18764,26 @@ "RecentMeUrl": { "desc": "Recent t.me urls" }, + "RecentStory": { + "desc": "" + }, "ReplyMarkup": { "desc": "Reply markup for bot and inline keyboards" }, "ReportReason": { "desc": "Report reason" }, + "ReportResult": { + "desc": "Represents a report menu or result" + }, "RequestPeerType": { "desc": "Filtering criteria to use for the peer selection list shown to the user." }, "RequestedPeer": { - "desc": "" + "desc": "Info about a peer, shared by a user with the currently logged in bot using messages.sendBotRequestedPeer." + }, + "RequirementToContact": { + "desc": "Specifies a requirement that must be satisfied in order to contact a user." }, "RestrictionReason": { "desc": "Restriction reason" @@ -16015,7 +18798,13 @@ "desc": "Represents a saved message dialog \u00bb." }, "SavedReactionTag": { - "desc": "" + "desc": "Info about a saved message reaction tag \u00bb." + }, + "SavedStarGift": { + "desc": "Represents a gift owned by a peer." + }, + "SearchPostsFlood": { + "desc": "Indicates if the specified global post search \u00bb requires payment." }, "SearchResultsCalendarPeriod": { "desc": "Information about found messages sent on a specific day, used to split the messages in messages.searchResultsCalendar constructors by days." @@ -16065,27 +18854,93 @@ "ShippingOption": { "desc": "Shipping options" }, - "SimpleWebViewResult": { - "desc": "Contains the webview URL with appropriate theme parameters added" - }, "SmsJob": { - "desc": "" + "desc": "Info about an SMS job." }, "SponsoredMessage": { "desc": "A sponsored message" }, "SponsoredMessageReportOption": { + "desc": "A report option for a sponsored message \u00bb." + }, + "SponsoredPeer": { + "desc": "A sponsored peer." + }, + "StarGift": { + "desc": "Represents a star gift, see here \u00bb for more info." + }, + "StarGiftActiveAuctionState": { "desc": "" }, - "StarsTopupOption": { + "StarGiftAttribute": { + "desc": "An attribute of a collectible gift \u00bb." + }, + "StarGiftAttributeCounter": { + "desc": "Indicates the total number of gifts that have the specified attribute." + }, + "StarGiftAttributeId": { + "desc": "Represents the identifier of a collectible gift attribute." + }, + "StarGiftAttributeRarity": { "desc": "" }, - "StarsTransaction": { + "StarGiftAuctionAcquiredGift": { "desc": "" }, - "StarsTransactionPeer": { + "StarGiftAuctionRound": { + "desc": "" + }, + "StarGiftAuctionState": { + "desc": "" + }, + "StarGiftAuctionUserState": { + "desc": "" + }, + "StarGiftBackground": { + "desc": "" + }, + "StarGiftCollection": { + "desc": "Represents a star gift collection \u00bb." + }, + "StarGiftUpgradePrice": { "desc": "" }, + "StarRefProgram": { + "desc": "Indo about an affiliate program offered by a bot" + }, + "StarsAmount": { + "desc": "Describes a real (i.e. possibly decimal) amount of Telegram Stars." + }, + "StarsGiftOption": { + "desc": "Telegram Stars gift option." + }, + "StarsGiveawayOption": { + "desc": "Contains info about a Telegram Star giveaway option." + }, + "StarsGiveawayWinnersOption": { + "desc": "Represents a possible option for the number of winners in a star giveaway" + }, + "StarsRating": { + "desc": "Represents the profile's star rating, see here \u00bb for more info." + }, + "StarsRevenueStatus": { + "desc": "Describes Telegram Star revenue balances \u00bb." + }, + "StarsSubscription": { + "desc": "Represents a Telegram Star subscription \u00bb." + }, + "StarsSubscriptionPricing": { + "desc": "Pricing of a Telegram Star subscription \u00bb." + }, + "StarsTopupOption": { + "desc": "Telegram Stars topup option." + }, + "StarsTransaction": { + "desc": "Represents a Telegram Stars transaction \u00bb." + }, + "StarsTransactionPeer": { + "desc": "Source of an incoming Telegram Star transaction, or its recipient for outgoing Telegram Star transactions." + }, "StatsAbsValueAndPrev": { "desc": "Channel statistics value pair" }, @@ -16125,6 +18980,9 @@ "StoriesStealthMode": { "desc": "Story stealth mode status" }, + "StoryAlbum": { + "desc": "Represents a story album \u00bb." + }, "StoryFwdHeader": { "desc": "Contains info about the original poster of a reposted story." }, @@ -16140,6 +18998,9 @@ "StoryViews": { "desc": "Aggregated view and reaction information of a story" }, + "SuggestedPost": { + "desc": "Contains info about a suggested post \u00bb." + }, "TextWithEntities": { "desc": "Styled text with message entities" }, @@ -16150,7 +19011,16 @@ "desc": "Theme settings" }, "Timezone": { - "desc": "" + "desc": "Timezone information." + }, + "TodoCompletion": { + "desc": "A completed todo list \u00bb item." + }, + "TodoItem": { + "desc": "An item of a todo list \u00bb." + }, + "TodoList": { + "desc": "Represents a todo list \u00bb." }, "TopPeer": { "desc": "Top peer" @@ -16228,10 +19098,13 @@ "desc": "Contains media autosave settings" }, "account.BusinessChatLinks": { - "desc": "" + "desc": "Contains info about business chat deep links \u00bb created by the current account." + }, + "account.ChatThemes": { + "desc": "Available chat themes" }, "account.ConnectedBots": { - "desc": "" + "desc": "Info about currently connected business bots." }, "account.ContentSettings": { "desc": "Sensitive content settings" @@ -16242,6 +19115,15 @@ "account.EmojiStatuses": { "desc": "A list of emoji statuses" }, + "account.PaidMessagesRevenue": { + "desc": "Total number of non-refunded Telegram Stars a user has spent on sending us messages either directly or through a channel, see here \u00bb for more info on paid messages." + }, + "account.PasskeyRegistrationOptions": { + "desc": "" + }, + "account.Passkeys": { + "desc": "" + }, "account.Password": { "desc": "Configuration for two-factor authorization" }, @@ -16258,7 +19140,10 @@ "desc": "Result of an account.resetPassword request." }, "account.ResolvedBusinessChatLinks": { - "desc": "" + "desc": "Contains info about a single resolved business chat deep link \u00bb." + }, + "account.SavedMusicIds": { + "desc": "List of IDs of songs (document.ids) currently pinned on our profile, see here \u00bb for more info." }, "account.SavedRingtone": { "desc": "Contains information about a saved notification sound" @@ -16299,6 +19184,9 @@ "auth.LoginToken": { "desc": "Login token (for QR code login)" }, + "auth.PasskeyLoginOptions": { + "desc": "" + }, "auth.PasswordRecovery": { "desc": "Recovery info of a 2FA password, only for accounts with a recovery email configured." }, @@ -16311,6 +19199,12 @@ "bots.BotInfo": { "desc": "Localized name, about text and description of a bot." }, + "bots.PopularAppBots": { + "desc": "Popular Main Mini Apps, to be used in the apps tab of global search \u00bb." + }, + "bots.PreviewInfo": { + "desc": "Contains info about Main Mini App previews, see here \u00bb for more info." + }, "channels.AdminLogResults": { "desc": "Admin log events" }, @@ -16324,7 +19218,7 @@ "desc": "A list of peers that can be used to send messages in a specific group" }, "channels.SponsoredMessageReportResult": { - "desc": "" + "desc": "Status of the method call used to report a sponsored message \u00bb." }, "chatlists.ChatlistInvite": { "desc": "Info about a chat folder deep link \u00bb." @@ -16342,7 +19236,7 @@ "desc": "Info on users from the current user's black list." }, "contacts.ContactBirthdays": { - "desc": "" + "desc": "Birthday information of our contacts." }, "contacts.Contacts": { "desc": "Info on the current user's contact list." @@ -16356,11 +19250,14 @@ "contacts.ResolvedPeer": { "desc": "Peer returned after resolving a @username" }, + "contacts.SponsoredPeers": { + "desc": "A list of sponsored peers." + }, "contacts.TopPeers": { "desc": "Top peers" }, "fragment.CollectibleInfo": { - "desc": "" + "desc": "Info about a fragment collectible." }, "help.AppConfig": { "desc": "Contains various client configuration parameters" @@ -16417,7 +19314,7 @@ "desc": "Update of Telegram's terms of service" }, "help.TimezonesList": { - "desc": "" + "desc": "Timezone information that may be used elsewhere in the API, such as to set Telegram Business opening hours \u00bb." }, "help.UserInfo": { "desc": "User info" @@ -16444,7 +19341,7 @@ "desc": "Archived stickers" }, "messages.AvailableEffects": { - "desc": "" + "desc": "Full list of usable animated message effects \u00bb." }, "messages.AvailableReactions": { "desc": "Animations and metadata associated with message reactions \u00bb" @@ -16455,6 +19352,9 @@ "messages.BotCallbackAnswer": { "desc": "Callback answer of bot" }, + "messages.BotPreparedInlineMessage": { + "desc": "Represents a prepared inline message saved by a bot, to be sent to the user via a web app \u00bb" + }, "messages.BotResults": { "desc": "Result of a query to an inline bot" }, @@ -16477,7 +19377,7 @@ "desc": "Contains Diffie-Hellman key generation protocol parameters." }, "messages.DialogFilters": { - "desc": "" + "desc": "Folder information" }, "messages.Dialogs": { "desc": "Object contains a list of chats with messages and auxiliary data." @@ -16485,6 +19385,12 @@ "messages.DiscussionMessage": { "desc": "Info about a message thread" }, + "messages.EmojiGameInfo": { + "desc": "" + }, + "messages.EmojiGameOutcome": { + "desc": "" + }, "messages.EmojiGroups": { "desc": "Represents a list of emoji categories." }, @@ -16506,6 +19412,9 @@ "messages.FoundStickerSets": { "desc": "Found stickersets" }, + "messages.FoundStickers": { + "desc": "Found stickers" + }, "messages.HighScores": { "desc": "High scores (in games)" }, @@ -16519,11 +19428,14 @@ "desc": "Inactive chat list" }, "messages.InvitedUsers": { - "desc": "" + "desc": "Contains info about successfully or unsuccessfully invited \u00bb users." }, "messages.MessageEditData": { "desc": "Message edit data for media" }, + "messages.MessageEmpty": { + "desc": "" + }, "messages.MessageReactionsList": { "desc": "List of peers that reacted to a specific message" }, @@ -16534,7 +19446,7 @@ "desc": "Object contains information on list of messages with auxiliary data." }, "messages.MyStickers": { - "desc": "" + "desc": "The list of stickersets owned by the current account \u00bb." }, "messages.PeerDialogs": { "desc": "List of dialogs" @@ -16542,8 +19454,11 @@ "messages.PeerSettings": { "desc": "Peer settings" }, + "messages.PreparedInlineMessage": { + "desc": "Represents a prepared inline message received via a bot's mini app, that can be sent to some chats \u00bb" + }, "messages.QuickReplies": { - "desc": "" + "desc": "Info about quick reply shortcuts \u00bb." }, "messages.Reactions": { "desc": "A set of message reactions" @@ -16558,7 +19473,7 @@ "desc": "Saved GIFs" }, "messages.SavedReactionTags": { - "desc": "" + "desc": "List of reaction tag \u00bb names assigned by the user." }, "messages.SearchCounter": { "desc": "Number of results that would be returned by a search" @@ -16596,12 +19511,24 @@ "messages.WebPage": { "desc": "Contains an instant view webpage." }, + "messages.WebPagePreview": { + "desc": "Represents a webpage preview." + }, + "messages.WebViewResult": { + "desc": "" + }, "payments.BankCardData": { "desc": "Credit card info, provided by the card's bank(s)" }, + "payments.CheckCanSendGiftResult": { + "desc": "Specifies if a gift can or cannot be sent." + }, "payments.CheckedGiftCode": { "desc": "Info about a Telegram Premium Giftcode." }, + "payments.ConnectedStarRefBots": { + "desc": "Active affiliations" + }, "payments.ExportedInvoice": { "desc": "Exported invoice" }, @@ -16617,12 +19544,60 @@ "payments.PaymentResult": { "desc": "Payment result" }, + "payments.ResaleStarGifts": { + "desc": "List of gifts currently on resale \u00bb." + }, "payments.SavedInfo": { "desc": "Saved payment info" }, - "payments.StarsStatus": { + "payments.SavedStarGifts": { + "desc": "Represents a list of gifts." + }, + "payments.StarGiftActiveAuctions": { + "desc": "" + }, + "payments.StarGiftAuctionAcquiredGifts": { + "desc": "" + }, + "payments.StarGiftAuctionState": { + "desc": "" + }, + "payments.StarGiftCollections": { + "desc": "Represents a list of star gift collections \u00bb." + }, + "payments.StarGiftUpgradeAttributes": { "desc": "" }, + "payments.StarGiftUpgradePreview": { + "desc": "A preview of the possible attributes (chosen randomly) a gift \u00bb can receive after upgrading it to a collectible gift \u00bb, see here \u00bb for more info." + }, + "payments.StarGiftWithdrawalUrl": { + "desc": "A URL that can be used to import the exported NFT on Fragment." + }, + "payments.StarGifts": { + "desc": "Available gifts \u00bb." + }, + "payments.StarsRevenueAdsAccountUrl": { + "desc": "Contains a URL leading to a page where the user will be able to place ads for the channel/bot, paying using Telegram Stars." + }, + "payments.StarsRevenueStats": { + "desc": "Star revenue statistics, see here \u00bb for more info." + }, + "payments.StarsRevenueWithdrawalUrl": { + "desc": "Contains the URL to use to withdraw Telegram Star revenue." + }, + "payments.StarsStatus": { + "desc": "Info about the current Telegram Star subscriptions, balance and transaction history \u00bb." + }, + "payments.SuggestedStarRefBots": { + "desc": "A list of suggested mini apps with available affiliate programs" + }, + "payments.UniqueStarGift": { + "desc": "Represents a collectible gift \u00bb." + }, + "payments.UniqueStarGiftValueInfo": { + "desc": "Information about the value of a collectible gift \u00bb." + }, "payments.ValidatedRequestedInfo": { "desc": "Validated requested info" }, @@ -16632,6 +19607,9 @@ "phone.GroupCall": { "desc": "Contains info about a group call, and partial info about its participants." }, + "phone.GroupCallStars": { + "desc": "" + }, "phone.GroupCallStreamChannels": { "desc": "Info about RTMP streams in a group call or livestream" }, @@ -16663,19 +19641,10 @@ "desc": "A list of peers we are currently boosting, and how many boost slots we have left." }, "smsjobs.EligibilityToJoin": { - "desc": "" + "desc": "SMS jobs eligibility" }, "smsjobs.Status": { - "desc": "" - }, - "stats.BroadcastRevenueStats": { - "desc": "" - }, - "stats.BroadcastRevenueTransactions": { - "desc": "" - }, - "stats.BroadcastRevenueWithdrawalUrl": { - "desc": "" + "desc": "Status" }, "stats.BroadcastStats": { "desc": "Channel statistics" @@ -16698,9 +19667,18 @@ "storage.FileType": { "desc": "Object describes the file type." }, + "stories.Albums": { + "desc": "Represents a list of story albums \u00bb." + }, "stories.AllStories": { "desc": "Full list of active (or active and hidden) stories." }, + "stories.CanSendStoryCount": { + "desc": "Contains the number of available active story slots (equal to the value of the story_expiring_limit_* client configuration parameter minus the number of currently active stories)." + }, + "stories.FoundStories": { + "desc": "Stories found using global story search \u00bb." + }, "stories.PeerStories": { "desc": "Active story list of a specific peer." }, @@ -16734,8 +19712,14 @@ "upload.WebFile": { "desc": "Remote file" }, + "users.SavedMusic": { + "desc": "List of songs (document.ids) currently pinned on a user's profile, see here \u00bb for more info." + }, "users.UserFull": { "desc": "Full user information, with attached context peers for reactions" + }, + "users.Users": { + "desc": "Describes a list of users (or bots)." } } } \ No newline at end of file diff --git a/compiler/api/scrape_docs.py b/compiler/api/scrape_docs.py new file mode 100644 index 000000000..84b9b1532 --- /dev/null +++ b/compiler/api/scrape_docs.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 +# Hydrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2023-present Hydrogram +# +# This file is part of Hydrogram. +# +# Hydrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Hydrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Hydrogram. If not, see . + +from __future__ import annotations + +import asyncio +import json +import re +from pathlib import Path + +import httpx +from lxml import html + +ROOT_DIR = Path.cwd().absolute() +if ROOT_DIR.name == "dev_tools": + ROOT_DIR = ROOT_DIR.parent + + +SECTION_RE = re.compile(r"---(\w+)---") +COMBINATOR_RE = re.compile(r"^([\w.]+)#([0-9a-f]+)\s(?:.*)=\s([\w<>.]+);$", re.MULTILINE) + + +BASE_URL = "https://corefork.telegram.org/" + + +MAX_TASKS = 10 + + +sem = asyncio.Semaphore(MAX_TASKS) + + +client = httpx.AsyncClient() + + +async def main(): + tl_data = parse_tl_file(ROOT_DIR / "compiler" / "api" / "source" / "main_api.tl") + + it_count = len(tl_data["constructor"]) + len(tl_data["method"]) + len(tl_data["type"]) + + print(f"Getting {it_count} objects from {BASE_URL}…") + + doc_dict = {"type": {}, "constructor": {}, "method": {}} + + tasks = [] + + it_count_done = 0 + + for it_type, items in tl_data.items(): + for it_name in items: + it_count_done += 1 + print(f"Parsing items {it_count_done}/{it_count}", end="\r", flush=True) + await sem.acquire() + tasks.append(asyncio.create_task(get_object_data(it_type, it_name, doc_dict))) + + # Be sure that all tasks are done before continuing + for task in tasks: + await task + + await client.aclose() + + with (ROOT_DIR / "compiler" / "api" / "docs.json").open("w", encoding="utf-8") as f: + json.dump(doc_dict, f, indent=2, sort_keys=True) + + print("\nDone!") + + +async def get_object_data(it_type: str, it_name: str, doc_dict: dict[str, dict]): + try: + request = await client.get(f"{BASE_URL}{it_type}/{it_name}") + if request.status_code != 200: + print(f"Error {request.status_code} for {it_type}/{it_name}\n") + return + + tree = html.fromstring(request.text) + + page_content_xp = tree.xpath("//div[@id='dev_page_content'][1]") + if not page_content_xp: + print(f"No page content for {it_type}/{it_name}") + return + + page_content = page_content_xp[0] + + # Get the description of the object - always used + desc_xp = page_content.xpath("./p[1]") + + if desc_xp: + desc = desc_xp[0].text_content().strip() + else: + print(f"No description for {it_type}/{it_name}") + desc = "" + + if it_type == "type": + doc_dict["type"][it_name] = {"desc": desc} + elif it_type in {"constructor", "method"}: + params_link_xp = page_content.xpath("./h3/a[@id='parameters'][1]") + if params_link_xp: + params_xp = params_link_xp[0].getparent().getnext().xpath("./tbody[1]") + if params_xp: + params = { + x.getchildren()[0].text_content().strip(): x.getchildren()[2] + .text_content() + .strip() + for x in params_xp[0].xpath("./tr") + } + else: + print(f"No parameters for {it_type}/{it_name}") + params = {} + else: + print(f"No parameters section for {it_type}/{it_name}") + params = {} + + doc_dict[it_type][it_name] = {"desc": desc, "params": params} + else: + raise ValueError(f"Unknown type {it_type}") + finally: + sem.release() + + +def devectorize(ttype: str) -> str: + ivec = ttype.find("Vector<") + if ivec != -1: + return ttype[7:-1] + + return ttype + + +def adjust_name(qualname: str) -> str: + names = qualname.split(".") + + if len(names) == 2: + name = names[1][:1].upper() + names[1][1:] + return ".".join([names[0], name]) + + return qualname[:1].upper() + qualname[1:] + + +def parse_tl_file(file_path: Path) -> dict[str, list[str]]: + lines = file_path.read_text().splitlines() + + section = None + + types = set() + constructors = set() + methods = set() + + for line in lines: + if section_match := SECTION_RE.match(line): + section = section_match.group(1) + continue + + if combinator_match := COMBINATOR_RE.match(line): + qualname, _id, qualtype = combinator_match.groups() + + qualtype = devectorize(qualtype) + + if section == "types": + types.add(qualtype) + constructors.add(adjust_name(qualname)) + elif section == "functions": + types.add(qualtype) + methods.add(adjust_name(qualname)) + + return { + "type": sorted(types), + "constructor": sorted(constructors), + "method": sorted(methods), + } + + +if __name__ == "__main__": + asyncio.run(main()) From 0c2619e11ea7ad4116393d02d4e7cf37af8bf885 Mon Sep 17 00:00:00 2001 From: 5hojib Date: Mon, 9 Feb 2026 15:39:03 +0000 Subject: [PATCH 05/17] InkyPinkyPonky [no ci] Signed-off-by: 5hojib --- compiler/api/scrape_docs.py | 20 +++- uv.lock | 204 +++++++++++++++++++----------------- 2 files changed, 124 insertions(+), 100 deletions(-) diff --git a/compiler/api/scrape_docs.py b/compiler/api/scrape_docs.py index 84b9b1532..33829e76c 100644 --- a/compiler/api/scrape_docs.py +++ b/compiler/api/scrape_docs.py @@ -33,7 +33,9 @@ SECTION_RE = re.compile(r"---(\w+)---") -COMBINATOR_RE = re.compile(r"^([\w.]+)#([0-9a-f]+)\s(?:.*)=\s([\w<>.]+);$", re.MULTILINE) +COMBINATOR_RE = re.compile( + r"^([\w.]+)#([0-9a-f]+)\s(?:.*)=\s([\w<>.]+);$", re.MULTILINE +) BASE_URL = "https://corefork.telegram.org/" @@ -51,7 +53,9 @@ async def main(): tl_data = parse_tl_file(ROOT_DIR / "compiler" / "api" / "source" / "main_api.tl") - it_count = len(tl_data["constructor"]) + len(tl_data["method"]) + len(tl_data["type"]) + it_count = ( + len(tl_data["constructor"]) + len(tl_data["method"]) + len(tl_data["type"]) + ) print(f"Getting {it_count} objects from {BASE_URL}…") @@ -66,7 +70,9 @@ async def main(): it_count_done += 1 print(f"Parsing items {it_count_done}/{it_count}", end="\r", flush=True) await sem.acquire() - tasks.append(asyncio.create_task(get_object_data(it_type, it_name, doc_dict))) + tasks.append( + asyncio.create_task(get_object_data(it_type, it_name, doc_dict)) + ) # Be sure that all tasks are done before continuing for task in tasks: @@ -74,7 +80,9 @@ async def main(): await client.aclose() - with (ROOT_DIR / "compiler" / "api" / "docs.json").open("w", encoding="utf-8") as f: + with (ROOT_DIR / "compiler" / "api" / "docs.json").open( + "w", encoding="utf-8" + ) as f: json.dump(doc_dict, f, indent=2, sort_keys=True) print("\nDone!") @@ -110,7 +118,9 @@ async def get_object_data(it_type: str, it_name: str, doc_dict: dict[str, dict]) elif it_type in {"constructor", "method"}: params_link_xp = page_content.xpath("./h3/a[@id='parameters'][1]") if params_link_xp: - params_xp = params_link_xp[0].getparent().getnext().xpath("./tbody[1]") + params_xp = ( + params_link_xp[0].getparent().getnext().xpath("./tbody[1]") + ) if params_xp: params = { x.getchildren()[0].text_content().strip(): x.getchildren()[2] diff --git a/uv.lock b/uv.lock index 777417190..58f3d4636 100644 --- a/uv.lock +++ b/uv.lock @@ -362,101 +362,115 @@ wheels = [ [[package]] name = "coverage" -version = "7.13.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/43/3e4ac666cc35f231fa70c94e9f38459299de1a152813f9d2f60fc5f3ecaf/coverage-7.13.3.tar.gz", hash = "sha256:f7f6182d3dfb8802c1747eacbfe611b669455b69b7c037484bb1efbbb56711ac", size = 826832, upload-time = "2026-02-03T14:02:30.944Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/07/1c8099563a8a6c389a31c2d0aa1497cee86d6248bb4b9ba5e779215db9f9/coverage-7.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b4f345f7265cdbdb5ec2521ffff15fa49de6d6c39abf89fc7ad68aa9e3a55f0", size = 219143, upload-time = "2026-02-03T13:59:40.459Z" }, - { url = "https://files.pythonhosted.org/packages/69/39/a892d44af7aa092cab70e0cc5cdbba18eeccfe1d6930695dab1742eef9e9/coverage-7.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:96c3be8bae9d0333e403cc1a8eb078a7f928b5650bae94a18fb4820cc993fb9b", size = 219663, upload-time = "2026-02-03T13:59:41.951Z" }, - { url = "https://files.pythonhosted.org/packages/9a/25/9669dcf4c2bb4c3861469e6db20e52e8c11908cf53c14ec9b12e9fd4d602/coverage-7.13.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d6f4a21328ea49d38565b55599e1c02834e76583a6953e5586d65cb1efebd8f8", size = 246424, upload-time = "2026-02-03T13:59:43.418Z" }, - { url = "https://files.pythonhosted.org/packages/f3/68/d9766c4e298aca62ea5d9543e1dd1e4e1439d7284815244d8b7db1840bfb/coverage-7.13.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fc970575799a9d17d5c3fafd83a0f6ccf5d5117cdc9ad6fbd791e9ead82418b0", size = 248228, upload-time = "2026-02-03T13:59:44.816Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e2/eea6cb4a4bd443741adf008d4cccec83a1f75401df59b6559aca2bdd9710/coverage-7.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:87ff33b652b3556b05e204ae20793d1f872161b0fa5ec8a9ac76f8430e152ed6", size = 250103, upload-time = "2026-02-03T13:59:46.271Z" }, - { url = "https://files.pythonhosted.org/packages/db/77/664280ecd666c2191610842177e2fab9e5dbdeef97178e2078fed46a3d2c/coverage-7.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7df8759ee57b9f3f7b66799b7660c282f4375bef620ade1686d6a7b03699e75f", size = 247107, upload-time = "2026-02-03T13:59:48.53Z" }, - { url = "https://files.pythonhosted.org/packages/2b/df/2a672eab99e0d0eba52d8a63e47dc92245eee26954d1b2d3c8f7d372151f/coverage-7.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f45c9bcb16bee25a798ccba8a2f6a1251b19de6a0d617bb365d7d2f386c4e20e", size = 248143, upload-time = "2026-02-03T13:59:50.027Z" }, - { url = "https://files.pythonhosted.org/packages/a5/dc/a104e7a87c13e57a358b8b9199a8955676e1703bb372d79722b54978ae45/coverage-7.13.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:318b2e4753cbf611061e01b6cc81477e1cdfeb69c36c4a14e6595e674caadb56", size = 246148, upload-time = "2026-02-03T13:59:52.025Z" }, - { url = "https://files.pythonhosted.org/packages/2b/89/e113d3a58dc20b03b7e59aed1e53ebc9ca6167f961876443e002b10e3ae9/coverage-7.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:24db3959de8ee394eeeca89ccb8ba25305c2da9a668dd44173394cbd5aa0777f", size = 246414, upload-time = "2026-02-03T13:59:53.859Z" }, - { url = "https://files.pythonhosted.org/packages/3f/60/a3fd0a6e8d89b488396019a2268b6a1f25ab56d6d18f3be50f35d77b47dc/coverage-7.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:be14d0622125edef21b3a4d8cd2d138c4872bf6e38adc90fd92385e3312f406a", size = 247023, upload-time = "2026-02-03T13:59:55.454Z" }, - { url = "https://files.pythonhosted.org/packages/19/fa/de4840bb939dbb22ba0648a6d8069fa91c9cf3b3fca8b0d1df461e885b3d/coverage-7.13.3-cp310-cp310-win32.whl", hash = "sha256:53be4aab8ddef18beb6188f3a3fdbf4d1af2277d098d4e618be3a8e6c88e74be", size = 221751, upload-time = "2026-02-03T13:59:57.383Z" }, - { url = "https://files.pythonhosted.org/packages/de/87/233ff8b7ef62fb63f58c78623b50bef69681111e0c4d43504f422d88cda4/coverage-7.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:bfeee64ad8b4aae3233abb77eb6b52b51b05fa89da9645518671b9939a78732b", size = 222686, upload-time = "2026-02-03T13:59:58.825Z" }, - { url = "https://files.pythonhosted.org/packages/ec/09/1ac74e37cf45f17eb41e11a21854f7f92a4c2d6c6098ef4a1becb0c6d8d3/coverage-7.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5907605ee20e126eeee2abe14aae137043c2c8af2fa9b38d2ab3b7a6b8137f73", size = 219276, upload-time = "2026-02-03T14:00:00.296Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cb/71908b08b21beb2c437d0d5870c4ec129c570ca1b386a8427fcdb11cf89c/coverage-7.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a88705500988c8acad8b8fd86c2a933d3aa96bec1ddc4bc5cb256360db7bbd00", size = 219776, upload-time = "2026-02-03T14:00:02.414Z" }, - { url = "https://files.pythonhosted.org/packages/09/85/c4f3dd69232887666a2c0394d4be21c60ea934d404db068e6c96aa59cd87/coverage-7.13.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bbb5aa9016c4c29e3432e087aa29ebee3f8fda089cfbfb4e6d64bd292dcd1c2", size = 250196, upload-time = "2026-02-03T14:00:04.197Z" }, - { url = "https://files.pythonhosted.org/packages/9c/cc/560ad6f12010344d0778e268df5ba9aa990aacccc310d478bf82bf3d302c/coverage-7.13.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0c2be202a83dde768937a61cdc5d06bf9fb204048ca199d93479488e6247656c", size = 252111, upload-time = "2026-02-03T14:00:05.639Z" }, - { url = "https://files.pythonhosted.org/packages/f0/66/3193985fb2c58e91f94cfbe9e21a6fdf941e9301fe2be9e92c072e9c8f8c/coverage-7.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f45e32ef383ce56e0ca099b2e02fcdf7950be4b1b56afaab27b4ad790befe5b", size = 254217, upload-time = "2026-02-03T14:00:07.738Z" }, - { url = "https://files.pythonhosted.org/packages/c5/78/f0f91556bf1faa416792e537c523c5ef9db9b1d32a50572c102b3d7c45b3/coverage-7.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ed2e787249b922a93cd95c671cc9f4c9797a106e81b455c83a9ddb9d34590c0", size = 250318, upload-time = "2026-02-03T14:00:09.224Z" }, - { url = "https://files.pythonhosted.org/packages/6f/aa/fc654e45e837d137b2c1f3a2cc09b4aea1e8b015acd2f774fa0f3d2ddeba/coverage-7.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:05dd25b21afffe545e808265897c35f32d3e4437663923e0d256d9ab5031fb14", size = 251909, upload-time = "2026-02-03T14:00:10.712Z" }, - { url = "https://files.pythonhosted.org/packages/73/4d/ab53063992add8a9ca0463c9d92cce5994a29e17affd1c2daa091b922a93/coverage-7.13.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:46d29926349b5c4f1ea4fca95e8c892835515f3600995a383fa9a923b5739ea4", size = 249971, upload-time = "2026-02-03T14:00:12.402Z" }, - { url = "https://files.pythonhosted.org/packages/29/25/83694b81e46fcff9899694a1b6f57573429cdd82b57932f09a698f03eea5/coverage-7.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fae6a21537519c2af00245e834e5bf2884699cc7c1055738fd0f9dc37a3644ad", size = 249692, upload-time = "2026-02-03T14:00:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/d4/ef/d68fc304301f4cb4bf6aefa0045310520789ca38dabdfba9dbecd3f37919/coverage-7.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c672d4e2f0575a4ca2bf2aa0c5ced5188220ab806c1bb6d7179f70a11a017222", size = 250597, upload-time = "2026-02-03T14:00:15.461Z" }, - { url = "https://files.pythonhosted.org/packages/8d/85/240ad396f914df361d0f71e912ddcedb48130c71b88dc4193fe3c0306f00/coverage-7.13.3-cp311-cp311-win32.whl", hash = "sha256:fcda51c918c7a13ad93b5f89a58d56e3a072c9e0ba5c231b0ed81404bf2648fb", size = 221773, upload-time = "2026-02-03T14:00:17.462Z" }, - { url = "https://files.pythonhosted.org/packages/2f/71/165b3a6d3d052704a9ab52d11ea64ef3426745de517dda44d872716213a7/coverage-7.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:d1a049b5c51b3b679928dd35e47c4a2235e0b6128b479a7596d0ef5b42fa6301", size = 222711, upload-time = "2026-02-03T14:00:19.449Z" }, - { url = "https://files.pythonhosted.org/packages/51/d0/0ddc9c5934cdd52639c5df1f1eb0fdab51bb52348f3a8d1c7db9c600d93a/coverage-7.13.3-cp311-cp311-win_arm64.whl", hash = "sha256:79f2670c7e772f4917895c3d89aad59e01f3dbe68a4ed2d0373b431fad1dcfba", size = 221377, upload-time = "2026-02-03T14:00:20.968Z" }, - { url = "https://files.pythonhosted.org/packages/94/44/330f8e83b143f6668778ed61d17ece9dc48459e9e74669177de02f45fec5/coverage-7.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ed48b4170caa2c4420e0cd27dc977caaffc7eecc317355751df8373dddcef595", size = 219441, upload-time = "2026-02-03T14:00:22.585Z" }, - { url = "https://files.pythonhosted.org/packages/08/e7/29db05693562c2e65bdf6910c0af2fd6f9325b8f43caf7a258413f369e30/coverage-7.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8f2adf4bcffbbec41f366f2e6dffb9d24e8172d16e91da5799c9b7ed6b5716e6", size = 219801, upload-time = "2026-02-03T14:00:24.186Z" }, - { url = "https://files.pythonhosted.org/packages/90/ae/7f8a78249b02b0818db46220795f8ac8312ea4abd1d37d79ea81db5cae81/coverage-7.13.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01119735c690786b6966a1e9f098da4cd7ca9174c4cfe076d04e653105488395", size = 251306, upload-time = "2026-02-03T14:00:25.798Z" }, - { url = "https://files.pythonhosted.org/packages/62/71/a18a53d1808e09b2e9ebd6b47dad5e92daf4c38b0686b4c4d1b2f3e42b7f/coverage-7.13.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8bb09e83c603f152d855f666d70a71765ca8e67332e5829e62cb9466c176af23", size = 254051, upload-time = "2026-02-03T14:00:27.474Z" }, - { url = "https://files.pythonhosted.org/packages/4a/0a/eb30f6455d04c5a3396d0696cad2df0269ae7444bb322f86ffe3376f7bf9/coverage-7.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b607a40cba795cfac6d130220d25962931ce101f2f478a29822b19755377fb34", size = 255160, upload-time = "2026-02-03T14:00:29.024Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7e/a45baac86274ce3ed842dbb84f14560c673ad30535f397d89164ec56c5df/coverage-7.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:44f14a62f5da2e9aedf9080e01d2cda61df39197d48e323538ec037336d68da8", size = 251709, upload-time = "2026-02-03T14:00:30.641Z" }, - { url = "https://files.pythonhosted.org/packages/c0/df/dd0dc12f30da11349993f3e218901fdf82f45ee44773596050c8f5a1fb25/coverage-7.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:debf29e0b157769843dff0981cc76f79e0ed04e36bb773c6cac5f6029054bd8a", size = 253083, upload-time = "2026-02-03T14:00:32.14Z" }, - { url = "https://files.pythonhosted.org/packages/ab/32/fc764c8389a8ce95cb90eb97af4c32f392ab0ac23ec57cadeefb887188d3/coverage-7.13.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:824bb95cd71604031ae9a48edb91fd6effde669522f960375668ed21b36e3ec4", size = 251227, upload-time = "2026-02-03T14:00:34.721Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ca/d025e9da8f06f24c34d2da9873957cfc5f7e0d67802c3e34d0caa8452130/coverage-7.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8f1010029a5b52dc427c8e2a8dbddb2303ddd180b806687d1acd1bb1d06649e7", size = 250794, upload-time = "2026-02-03T14:00:36.278Z" }, - { url = "https://files.pythonhosted.org/packages/45/c7/76bf35d5d488ec8f68682eb8e7671acc50a6d2d1c1182de1d2b6d4ffad3b/coverage-7.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cd5dee4fd7659d8306ffa79eeaaafd91fa30a302dac3af723b9b469e549247e0", size = 252671, upload-time = "2026-02-03T14:00:38.368Z" }, - { url = "https://files.pythonhosted.org/packages/bf/10/1921f1a03a7c209e1cb374f81a6b9b68b03cdb3ecc3433c189bc90e2a3d5/coverage-7.13.3-cp312-cp312-win32.whl", hash = "sha256:f7f153d0184d45f3873b3ad3ad22694fd73aadcb8cdbc4337ab4b41ea6b4dff1", size = 221986, upload-time = "2026-02-03T14:00:40.442Z" }, - { url = "https://files.pythonhosted.org/packages/3c/7c/f5d93297f8e125a80c15545edc754d93e0ed8ba255b65e609b185296af01/coverage-7.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:03a6e5e1e50819d6d7436f5bc40c92ded7e484e400716886ac921e35c133149d", size = 222793, upload-time = "2026-02-03T14:00:42.106Z" }, - { url = "https://files.pythonhosted.org/packages/43/59/c86b84170015b4555ebabca8649bdf9f4a1f737a73168088385ed0f947c4/coverage-7.13.3-cp312-cp312-win_arm64.whl", hash = "sha256:51c4c42c0e7d09a822b08b6cf79b3c4db8333fffde7450da946719ba0d45730f", size = 221410, upload-time = "2026-02-03T14:00:43.726Z" }, - { url = "https://files.pythonhosted.org/packages/81/f3/4c333da7b373e8c8bfb62517e8174a01dcc373d7a9083698e3b39d50d59c/coverage-7.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:853c3d3c79ff0db65797aad79dee6be020efd218ac4510f15a205f1e8d13ce25", size = 219468, upload-time = "2026-02-03T14:00:45.829Z" }, - { url = "https://files.pythonhosted.org/packages/d6/31/0714337b7d23630c8de2f4d56acf43c65f8728a45ed529b34410683f7217/coverage-7.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f75695e157c83d374f88dcc646a60cb94173304a9258b2e74ba5a66b7614a51a", size = 219839, upload-time = "2026-02-03T14:00:47.407Z" }, - { url = "https://files.pythonhosted.org/packages/12/99/bd6f2a2738144c98945666f90cae446ed870cecf0421c767475fcf42cdbe/coverage-7.13.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2d098709621d0819039f3f1e471ee554f55a0b2ac0d816883c765b14129b5627", size = 250828, upload-time = "2026-02-03T14:00:49.029Z" }, - { url = "https://files.pythonhosted.org/packages/6f/99/97b600225fbf631e6f5bfd3ad5bcaf87fbb9e34ff87492e5a572ff01bbe2/coverage-7.13.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:16d23d6579cf80a474ad160ca14d8b319abaa6db62759d6eef53b2fc979b58c8", size = 253432, upload-time = "2026-02-03T14:00:50.655Z" }, - { url = "https://files.pythonhosted.org/packages/5f/5c/abe2b3490bda26bd4f5e3e799be0bdf00bd81edebedc2c9da8d3ef288fa8/coverage-7.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00d34b29a59d2076e6f318b30a00a69bf63687e30cd882984ed444e753990cc1", size = 254672, upload-time = "2026-02-03T14:00:52.757Z" }, - { url = "https://files.pythonhosted.org/packages/31/ba/5d1957c76b40daff53971fe0adb84d9c2162b614280031d1d0653dd010c1/coverage-7.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ab6d72bffac9deb6e6cb0f61042e748de3f9f8e98afb0375a8e64b0b6e11746b", size = 251050, upload-time = "2026-02-03T14:00:54.332Z" }, - { url = "https://files.pythonhosted.org/packages/69/dc/dffdf3bfe9d32090f047d3c3085378558cb4eb6778cda7de414ad74581ed/coverage-7.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e129328ad1258e49cae0123a3b5fcb93d6c2fa90d540f0b4c7cdcdc019aaa3dc", size = 252801, upload-time = "2026-02-03T14:00:56.121Z" }, - { url = "https://files.pythonhosted.org/packages/87/51/cdf6198b0f2746e04511a30dc9185d7b8cdd895276c07bdb538e37f1cd50/coverage-7.13.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2213a8d88ed35459bda71597599d4eec7c2ebad201c88f0bfc2c26fd9b0dd2ea", size = 250763, upload-time = "2026-02-03T14:00:58.719Z" }, - { url = "https://files.pythonhosted.org/packages/d7/1a/596b7d62218c1d69f2475b69cc6b211e33c83c902f38ee6ae9766dd422da/coverage-7.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:00dd3f02de6d5f5c9c3d95e3e036c3c2e2a669f8bf2d3ceb92505c4ce7838f67", size = 250587, upload-time = "2026-02-03T14:01:01.197Z" }, - { url = "https://files.pythonhosted.org/packages/f7/46/52330d5841ff660f22c130b75f5e1dd3e352c8e7baef5e5fef6b14e3e991/coverage-7.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f9bada7bc660d20b23d7d312ebe29e927b655cf414dadcdb6335a2075695bd86", size = 252358, upload-time = "2026-02-03T14:01:02.824Z" }, - { url = "https://files.pythonhosted.org/packages/36/8a/e69a5be51923097ba7d5cff9724466e74fe486e9232020ba97c809a8b42b/coverage-7.13.3-cp313-cp313-win32.whl", hash = "sha256:75b3c0300f3fa15809bd62d9ca8b170eb21fcf0100eb4b4154d6dc8b3a5bbd43", size = 222007, upload-time = "2026-02-03T14:01:04.876Z" }, - { url = "https://files.pythonhosted.org/packages/0a/09/a5a069bcee0d613bdd48ee7637fa73bc09e7ed4342b26890f2df97cc9682/coverage-7.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:a2f7589c6132c44c53f6e705e1a6677e2b7821378c22f7703b2cf5388d0d4587", size = 222812, upload-time = "2026-02-03T14:01:07.296Z" }, - { url = "https://files.pythonhosted.org/packages/3d/4f/d62ad7dfe32f9e3d4a10c178bb6f98b10b083d6e0530ca202b399371f6c1/coverage-7.13.3-cp313-cp313-win_arm64.whl", hash = "sha256:123ceaf2b9d8c614f01110f908a341e05b1b305d6b2ada98763b9a5a59756051", size = 221433, upload-time = "2026-02-03T14:01:09.156Z" }, - { url = "https://files.pythonhosted.org/packages/04/b2/4876c46d723d80b9c5b695f1a11bf5f7c3dabf540ec00d6edc076ff025e6/coverage-7.13.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:cc7fd0f726795420f3678ac82ff882c7fc33770bd0074463b5aef7293285ace9", size = 220162, upload-time = "2026-02-03T14:01:11.409Z" }, - { url = "https://files.pythonhosted.org/packages/fc/04/9942b64a0e0bdda2c109f56bda42b2a59d9d3df4c94b85a323c1cae9fc77/coverage-7.13.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d358dc408edc28730aed5477a69338e444e62fba0b7e9e4a131c505fadad691e", size = 220510, upload-time = "2026-02-03T14:01:13.038Z" }, - { url = "https://files.pythonhosted.org/packages/5a/82/5cfe1e81eae525b74669f9795f37eb3edd4679b873d79d1e6c1c14ee6c1c/coverage-7.13.3-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5d67b9ed6f7b5527b209b24b3df9f2e5bf0198c1bbf99c6971b0e2dcb7e2a107", size = 261801, upload-time = "2026-02-03T14:01:14.674Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ec/a553d7f742fd2cd12e36a16a7b4b3582d5934b496ef2b5ea8abeb10903d4/coverage-7.13.3-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:59224bfb2e9b37c1335ae35d00daa3a5b4e0b1a20f530be208fff1ecfa436f43", size = 263882, upload-time = "2026-02-03T14:01:16.343Z" }, - { url = "https://files.pythonhosted.org/packages/e1/58/8f54a2a93e3d675635bc406de1c9ac8d551312142ff52c9d71b5e533ad45/coverage-7.13.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae9306b5299e31e31e0d3b908c66bcb6e7e3ddca143dea0266e9ce6c667346d3", size = 266306, upload-time = "2026-02-03T14:01:18.02Z" }, - { url = "https://files.pythonhosted.org/packages/1a/be/e593399fd6ea1f00aee79ebd7cc401021f218d34e96682a92e1bae092ff6/coverage-7.13.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:343aaeb5f8bb7bcd38620fd7bc56e6ee8207847d8c6103a1e7b72322d381ba4a", size = 261051, upload-time = "2026-02-03T14:01:19.757Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e5/e9e0f6138b21bcdebccac36fbfde9cf15eb1bbcea9f5b1f35cd1f465fb91/coverage-7.13.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2182129f4c101272ff5f2f18038d7b698db1bf8e7aa9e615cb48440899ad32e", size = 263868, upload-time = "2026-02-03T14:01:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/9a/bf/de72cfebb69756f2d4a2dde35efcc33c47d85cd3ebdf844b3914aac2ef28/coverage-7.13.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:94d2ac94bd0cc57c5626f52f8c2fffed1444b5ae8c9fc68320306cc2b255e155", size = 261498, upload-time = "2026-02-03T14:01:23.097Z" }, - { url = "https://files.pythonhosted.org/packages/f2/91/4a2d313a70fc2e98ca53afd1c8ce67a89b1944cd996589a5b1fe7fbb3e5c/coverage-7.13.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:65436cde5ecabe26fb2f0bf598962f0a054d3f23ad529361326ac002c61a2a1e", size = 260394, upload-time = "2026-02-03T14:01:24.949Z" }, - { url = "https://files.pythonhosted.org/packages/40/83/25113af7cf6941e779eb7ed8de2a677865b859a07ccee9146d4cc06a03e3/coverage-7.13.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:db83b77f97129813dbd463a67e5335adc6a6a91db652cc085d60c2d512746f96", size = 262579, upload-time = "2026-02-03T14:01:26.703Z" }, - { url = "https://files.pythonhosted.org/packages/1e/19/a5f2b96262977e82fb9aabbe19b4d83561f5d063f18dde3e72f34ffc3b2f/coverage-7.13.3-cp313-cp313t-win32.whl", hash = "sha256:dfb428e41377e6b9ba1b0a32df6db5409cb089a0ed1d0a672dc4953ec110d84f", size = 222679, upload-time = "2026-02-03T14:01:28.553Z" }, - { url = "https://files.pythonhosted.org/packages/81/82/ef1747b88c87a5c7d7edc3704799ebd650189a9158e680a063308b6125ef/coverage-7.13.3-cp313-cp313t-win_amd64.whl", hash = "sha256:5badd7e596e6b0c89aa8ec6d37f4473e4357f982ce57f9a2942b0221cd9cf60c", size = 223740, upload-time = "2026-02-03T14:01:30.776Z" }, - { url = "https://files.pythonhosted.org/packages/1c/4c/a67c7bb5b560241c22736a9cb2f14c5034149ffae18630323fde787339e4/coverage-7.13.3-cp313-cp313t-win_arm64.whl", hash = "sha256:989aa158c0eb19d83c76c26f4ba00dbb272485c56e452010a3450bdbc9daafd9", size = 221996, upload-time = "2026-02-03T14:01:32.495Z" }, - { url = "https://files.pythonhosted.org/packages/5e/b3/677bb43427fed9298905106f39c6520ac75f746f81b8f01104526a8026e4/coverage-7.13.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c6f6169bbdbdb85aab8ac0392d776948907267fcc91deeacf6f9d55f7a83ae3b", size = 219513, upload-time = "2026-02-03T14:01:34.29Z" }, - { url = "https://files.pythonhosted.org/packages/42/53/290046e3bbf8986cdb7366a42dab3440b9983711eaff044a51b11006c67b/coverage-7.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2f5e731627a3d5ef11a2a35aa0c6f7c435867c7ccbc391268eb4f2ca5dbdcc10", size = 219850, upload-time = "2026-02-03T14:01:35.984Z" }, - { url = "https://files.pythonhosted.org/packages/ea/2b/ab41f10345ba2e49d5e299be8663be2b7db33e77ac1b85cd0af985ea6406/coverage-7.13.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9db3a3285d91c0b70fab9f39f0a4aa37d375873677efe4e71e58d8321e8c5d39", size = 250886, upload-time = "2026-02-03T14:01:38.287Z" }, - { url = "https://files.pythonhosted.org/packages/72/2d/b3f6913ee5a1d5cdd04106f257e5fac5d048992ffc2d9995d07b0f17739f/coverage-7.13.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06e49c5897cb12e3f7ecdc111d44e97c4f6d0557b81a7a0204ed70a8b038f86f", size = 253393, upload-time = "2026-02-03T14:01:40.118Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f6/b1f48810ffc6accf49a35b9943636560768f0812330f7456aa87dc39aff5/coverage-7.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb25061a66802df9fc13a9ba1967d25faa4dae0418db469264fd9860a921dde4", size = 254740, upload-time = "2026-02-03T14:01:42.413Z" }, - { url = "https://files.pythonhosted.org/packages/57/d0/e59c54f9be0b61808f6bc4c8c4346bd79f02dd6bbc3f476ef26124661f20/coverage-7.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:99fee45adbb1caeb914da16f70e557fb7ff6ddc9e4b14de665bd41af631367ef", size = 250905, upload-time = "2026-02-03T14:01:44.163Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f7/5291bcdf498bafbee3796bb32ef6966e9915aebd4d0954123c8eae921c32/coverage-7.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:318002f1fd819bdc1651c619268aa5bc853c35fa5cc6d1e8c96bd9cd6c828b75", size = 252753, upload-time = "2026-02-03T14:01:45.974Z" }, - { url = "https://files.pythonhosted.org/packages/a0/a9/1dcafa918c281554dae6e10ece88c1add82db685be123e1b05c2056ff3fb/coverage-7.13.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:71295f2d1d170b9977dc386d46a7a1b7cbb30e5405492529b4c930113a33f895", size = 250716, upload-time = "2026-02-03T14:01:48.844Z" }, - { url = "https://files.pythonhosted.org/packages/44/bb/4ea4eabcce8c4f6235df6e059fbc5db49107b24c4bdffc44aee81aeca5a8/coverage-7.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5b1ad2e0dc672625c44bc4fe34514602a9fd8b10d52ddc414dc585f74453516c", size = 250530, upload-time = "2026-02-03T14:01:50.793Z" }, - { url = "https://files.pythonhosted.org/packages/6d/31/4a6c9e6a71367e6f923b27b528448c37f4e959b7e4029330523014691007/coverage-7.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b2beb64c145593a50d90db5c7178f55daeae129123b0d265bdb3cbec83e5194a", size = 252186, upload-time = "2026-02-03T14:01:52.607Z" }, - { url = "https://files.pythonhosted.org/packages/27/92/e1451ef6390a4f655dc42da35d9971212f7abbbcad0bdb7af4407897eb76/coverage-7.13.3-cp314-cp314-win32.whl", hash = "sha256:3d1aed4f4e837a832df2f3b4f68a690eede0de4560a2dbc214ea0bc55aabcdb4", size = 222253, upload-time = "2026-02-03T14:01:55.071Z" }, - { url = "https://files.pythonhosted.org/packages/8a/98/78885a861a88de020c32a2693487c37d15a9873372953f0c3c159d575a43/coverage-7.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f9efbbaf79f935d5fbe3ad814825cbce4f6cdb3054384cb49f0c0f496125fa0", size = 223069, upload-time = "2026-02-03T14:01:56.95Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fb/3784753a48da58a5337972abf7ca58b1fb0f1bda21bc7b4fae992fd28e47/coverage-7.13.3-cp314-cp314-win_arm64.whl", hash = "sha256:31b6e889c53d4e6687ca63706148049494aace140cffece1c4dc6acadb70a7b3", size = 221633, upload-time = "2026-02-03T14:01:58.758Z" }, - { url = "https://files.pythonhosted.org/packages/40/f9/75b732d9674d32cdbffe801ed5f770786dd1c97eecedef2125b0d25102dc/coverage-7.13.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c5e9787cec750793a19a28df7edd85ac4e49d3fb91721afcdc3b86f6c08d9aa8", size = 220243, upload-time = "2026-02-03T14:02:01.109Z" }, - { url = "https://files.pythonhosted.org/packages/cf/7e/2868ec95de5a65703e6f0c87407ea822d1feb3619600fbc3c1c4fa986090/coverage-7.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e5b86db331c682fd0e4be7098e6acee5e8a293f824d41487c667a93705d415ca", size = 220515, upload-time = "2026-02-03T14:02:02.862Z" }, - { url = "https://files.pythonhosted.org/packages/7d/eb/9f0d349652fced20bcaea0f67fc5777bd097c92369f267975732f3dc5f45/coverage-7.13.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:edc7754932682d52cf6e7a71806e529ecd5ce660e630e8bd1d37109a2e5f63ba", size = 261874, upload-time = "2026-02-03T14:02:04.727Z" }, - { url = "https://files.pythonhosted.org/packages/ee/a5/6619bc4a6c7b139b16818149a3e74ab2e21599ff9a7b6811b6afde99f8ec/coverage-7.13.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d3a16d6398666510a6886f67f43d9537bfd0e13aca299688a19daa84f543122f", size = 264004, upload-time = "2026-02-03T14:02:06.634Z" }, - { url = "https://files.pythonhosted.org/packages/29/b7/90aa3fc645a50c6f07881fca4fd0ba21e3bfb6ce3a7078424ea3a35c74c9/coverage-7.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:303d38b19626c1981e1bb067a9928236d88eb0e4479b18a74812f05a82071508", size = 266408, upload-time = "2026-02-03T14:02:09.037Z" }, - { url = "https://files.pythonhosted.org/packages/62/55/08bb2a1e4dcbae384e638f0effef486ba5987b06700e481691891427d879/coverage-7.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:284e06eadfe15ddfee2f4ee56631f164ef897a7d7d5a15bca5f0bb88889fc5ba", size = 260977, upload-time = "2026-02-03T14:02:11.755Z" }, - { url = "https://files.pythonhosted.org/packages/9b/76/8bd4ae055a42d8fb5dd2230e5cf36ff2e05f85f2427e91b11a27fea52ed7/coverage-7.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d401f0864a1d3198422816878e4e84ca89ec1c1bf166ecc0ae01380a39b888cd", size = 263868, upload-time = "2026-02-03T14:02:13.565Z" }, - { url = "https://files.pythonhosted.org/packages/e3/f9/ba000560f11e9e32ec03df5aa8477242c2d95b379c99ac9a7b2e7fbacb1a/coverage-7.13.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3f379b02c18a64de78c4ccdddf1c81c2c5ae1956c72dacb9133d7dd7809794ab", size = 261474, upload-time = "2026-02-03T14:02:16.069Z" }, - { url = "https://files.pythonhosted.org/packages/90/4b/4de4de8f9ca7af4733bfcf4baa440121b7dbb3856daf8428ce91481ff63b/coverage-7.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:7a482f2da9086971efb12daca1d6547007ede3674ea06e16d7663414445c683e", size = 260317, upload-time = "2026-02-03T14:02:17.996Z" }, - { url = "https://files.pythonhosted.org/packages/05/71/5cd8436e2c21410ff70be81f738c0dddea91bcc3189b1517d26e0102ccb3/coverage-7.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:562136b0d401992118d9b49fbee5454e16f95f85b120a4226a04d816e33fe024", size = 262635, upload-time = "2026-02-03T14:02:20.405Z" }, - { url = "https://files.pythonhosted.org/packages/e7/f8/2834bb45bdd70b55a33ec354b8b5f6062fc90e5bb787e14385903a979503/coverage-7.13.3-cp314-cp314t-win32.whl", hash = "sha256:ca46e5c3be3b195098dd88711890b8011a9fa4feca942292bb84714ce5eab5d3", size = 223035, upload-time = "2026-02-03T14:02:22.323Z" }, - { url = "https://files.pythonhosted.org/packages/26/75/f8290f0073c00d9ae14056d2b84ab92dff21d5370e464cb6cb06f52bf580/coverage-7.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:06d316dbb3d9fd44cca05b2dbcfbef22948493d63a1f28e828d43e6cc505fed8", size = 224142, upload-time = "2026-02-03T14:02:24.143Z" }, - { url = "https://files.pythonhosted.org/packages/03/01/43ac78dfea8946c4a9161bbc034b5549115cb2b56781a4b574927f0d141a/coverage-7.13.3-cp314-cp314t-win_arm64.whl", hash = "sha256:299d66e9218193f9dc6e4880629ed7c4cd23486005166247c283fb98531656c3", size = 222166, upload-time = "2026-02-03T14:02:26.005Z" }, - { url = "https://files.pythonhosted.org/packages/7d/fb/70af542d2d938c778c9373ce253aa4116dbe7c0a5672f78b2b2ae0e1b94b/coverage-7.13.3-py3-none-any.whl", hash = "sha256:90a8af9dba6429b2573199622d72e0ebf024d6276f16abce394ad4d181bb0910", size = 211237, upload-time = "2026-02-03T14:02:27.986Z" }, +version = "7.13.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/56/95b7e30fa389756cb56630faa728da46a27b8c6eb46f9d557c68fff12b65/coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91", size = 827239, upload-time = "2026-02-09T12:59:03.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/d4/7827d9ffa34d5d4d752eec907022aa417120936282fc488306f5da08c292/coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415", size = 219152, upload-time = "2026-02-09T12:56:11.974Z" }, + { url = "https://files.pythonhosted.org/packages/35/b0/d69df26607c64043292644dbb9dc54b0856fabaa2cbb1eeee3331cc9e280/coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b", size = 219667, upload-time = "2026-02-09T12:56:13.33Z" }, + { url = "https://files.pythonhosted.org/packages/82/a4/c1523f7c9e47b2271dbf8c2a097e7a1f89ef0d66f5840bb59b7e8814157b/coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a", size = 246425, upload-time = "2026-02-09T12:56:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/f8/02/aa7ec01d1a5023c4b680ab7257f9bfde9defe8fdddfe40be096ac19e8177/coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f", size = 248229, upload-time = "2026-02-09T12:56:16.31Z" }, + { url = "https://files.pythonhosted.org/packages/35/98/85aba0aed5126d896162087ef3f0e789a225697245256fc6181b95f47207/coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012", size = 250106, upload-time = "2026-02-09T12:56:18.024Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1db59bd67494bc162e3e4cd5fbc7edba2c7026b22f7c8ef1496d58c2b94c/coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def", size = 252021, upload-time = "2026-02-09T12:56:19.272Z" }, + { url = "https://files.pythonhosted.org/packages/9d/97/72899c59c7066961de6e3daa142d459d47d104956db43e057e034f015c8a/coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256", size = 247114, upload-time = "2026-02-09T12:56:21.051Z" }, + { url = "https://files.pythonhosted.org/packages/39/1f/f1885573b5970235e908da4389176936c8933e86cb316b9620aab1585fa2/coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda", size = 248143, upload-time = "2026-02-09T12:56:22.585Z" }, + { url = "https://files.pythonhosted.org/packages/a8/cf/e80390c5b7480b722fa3e994f8202807799b85bc562aa4f1dde209fbb7be/coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92", size = 246152, upload-time = "2026-02-09T12:56:23.748Z" }, + { url = "https://files.pythonhosted.org/packages/44/bf/f89a8350d85572f95412debb0fb9bb4795b1d5b5232bd652923c759e787b/coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c", size = 249959, upload-time = "2026-02-09T12:56:25.209Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6e/612a02aece8178c818df273e8d1642190c4875402ca2ba74514394b27aba/coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58", size = 246416, upload-time = "2026-02-09T12:56:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/cb/98/b5afc39af67c2fa6786b03c3a7091fc300947387ce8914b096db8a73d67a/coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9", size = 247025, upload-time = "2026-02-09T12:56:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/51/30/2bba8ef0682d5bd210c38fe497e12a06c9f8d663f7025e9f5c2c31ce847d/coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf", size = 221758, upload-time = "2026-02-09T12:56:29.051Z" }, + { url = "https://files.pythonhosted.org/packages/78/13/331f94934cf6c092b8ea59ff868eb587bc8fe0893f02c55bc6c0183a192e/coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95", size = 222693, upload-time = "2026-02-09T12:56:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053", size = 219278, upload-time = "2026-02-09T12:56:31.673Z" }, + { url = "https://files.pythonhosted.org/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11", size = 219783, upload-time = "2026-02-09T12:56:33.104Z" }, + { url = "https://files.pythonhosted.org/packages/ab/63/325d8e5b11e0eaf6d0f6a44fad444ae58820929a9b0de943fa377fe73e85/coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa", size = 250200, upload-time = "2026-02-09T12:56:34.474Z" }, + { url = "https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7", size = 252114, upload-time = "2026-02-09T12:56:35.749Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c2/7ab36d8b8cc412bec9ea2d07c83c48930eb4ba649634ba00cb7e4e0f9017/coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00", size = 254220, upload-time = "2026-02-09T12:56:37.796Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4d/cf52c9a3322c89a0e6febdfbc83bb45c0ed3c64ad14081b9503adee702e7/coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef", size = 256164, upload-time = "2026-02-09T12:56:39.016Z" }, + { url = "https://files.pythonhosted.org/packages/78/e9/eb1dd17bd6de8289df3580e967e78294f352a5df8a57ff4671ee5fc3dcd0/coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903", size = 250325, upload-time = "2026-02-09T12:56:40.668Z" }, + { url = "https://files.pythonhosted.org/packages/71/07/8c1542aa873728f72267c07278c5cc0ec91356daf974df21335ccdb46368/coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f", size = 251913, upload-time = "2026-02-09T12:56:41.97Z" }, + { url = "https://files.pythonhosted.org/packages/74/d7/c62e2c5e4483a748e27868e4c32ad3daa9bdddbba58e1bc7a15e252baa74/coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299", size = 249974, upload-time = "2026-02-09T12:56:43.323Z" }, + { url = "https://files.pythonhosted.org/packages/98/9f/4c5c015a6e98ced54efd0f5cf8d31b88e5504ecb6857585fc0161bb1e600/coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505", size = 253741, upload-time = "2026-02-09T12:56:45.155Z" }, + { url = "https://files.pythonhosted.org/packages/bd/59/0f4eef89b9f0fcd9633b5d350016f54126ab49426a70ff4c4e87446cabdc/coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6", size = 249695, upload-time = "2026-02-09T12:56:46.636Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2c/b7476f938deb07166f3eb281a385c262675d688ff4659ad56c6c6b8e2e70/coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9", size = 250599, upload-time = "2026-02-09T12:56:48.13Z" }, + { url = "https://files.pythonhosted.org/packages/b8/34/c3420709d9846ee3785b9f2831b4d94f276f38884032dca1457fa83f7476/coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9", size = 221780, upload-time = "2026-02-09T12:56:50.479Z" }, + { url = "https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f", size = 222715, upload-time = "2026-02-09T12:56:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/18/1a/54c3c80b2f056164cc0a6cdcb040733760c7c4be9d780fe655f356f433e4/coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f", size = 221385, upload-time = "2026-02-09T12:56:53.194Z" }, + { url = "https://files.pythonhosted.org/packages/d1/81/4ce2fdd909c5a0ed1f6dedb88aa57ab79b6d1fbd9b588c1ac7ef45659566/coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459", size = 219449, upload-time = "2026-02-09T12:56:54.889Z" }, + { url = "https://files.pythonhosted.org/packages/5d/96/5238b1efc5922ddbdc9b0db9243152c09777804fb7c02ad1741eb18a11c0/coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3", size = 219810, upload-time = "2026-02-09T12:56:56.33Z" }, + { url = "https://files.pythonhosted.org/packages/78/72/2f372b726d433c9c35e56377cf1d513b4c16fe51841060d826b95caacec1/coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634", size = 251308, upload-time = "2026-02-09T12:56:57.858Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/2ea570925524ef4e00bb6c82649f5682a77fac5ab910a65c9284de422600/coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3", size = 254052, upload-time = "2026-02-09T12:56:59.754Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ac/45dc2e19a1939098d783c846e130b8f862fbb50d09e0af663988f2f21973/coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa", size = 255165, upload-time = "2026-02-09T12:57:01.287Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4d/26d236ff35abc3b5e63540d3386e4c3b192168c1d96da5cb2f43c640970f/coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3", size = 257432, upload-time = "2026-02-09T12:57:02.637Z" }, + { url = "https://files.pythonhosted.org/packages/ec/55/14a966c757d1348b2e19caf699415a2a4c4f7feaa4bbc6326a51f5c7dd1b/coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a", size = 251716, upload-time = "2026-02-09T12:57:04.056Z" }, + { url = "https://files.pythonhosted.org/packages/77/33/50116647905837c66d28b2af1321b845d5f5d19be9655cb84d4a0ea806b4/coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7", size = 253089, upload-time = "2026-02-09T12:57:05.503Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b4/8efb11a46e3665d92635a56e4f2d4529de6d33f2cb38afd47d779d15fc99/coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc", size = 251232, upload-time = "2026-02-09T12:57:06.879Z" }, + { url = "https://files.pythonhosted.org/packages/51/24/8cd73dd399b812cc76bb0ac260e671c4163093441847ffe058ac9fda1e32/coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47", size = 255299, upload-time = "2026-02-09T12:57:08.245Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/0a4b12f1d0e029ce1ccc1c800944a9984cbe7d678e470bb6d3c6bc38a0da/coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985", size = 250796, upload-time = "2026-02-09T12:57:10.142Z" }, + { url = "https://files.pythonhosted.org/packages/73/44/6002fbf88f6698ca034360ce474c406be6d5a985b3fdb3401128031eef6b/coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0", size = 252673, upload-time = "2026-02-09T12:57:12.197Z" }, + { url = "https://files.pythonhosted.org/packages/de/c6/a0279f7c00e786be75a749a5674e6fa267bcbd8209cd10c9a450c655dfa7/coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246", size = 221990, upload-time = "2026-02-09T12:57:14.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/4e/c0a25a425fcf5557d9abd18419c95b63922e897bc86c1f327f155ef234a9/coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126", size = 222800, upload-time = "2026-02-09T12:57:15.944Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/92da44ad9a6f4e3a7debd178949d6f3769bedca33830ce9b1dcdab589a37/coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d", size = 221415, upload-time = "2026-02-09T12:57:17.497Z" }, + { url = "https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9", size = 219474, upload-time = "2026-02-09T12:57:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac", size = 219844, upload-time = "2026-02-09T12:57:20.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/fd/7e859f8fab324cef6c4ad7cff156ca7c489fef9179d5749b0c8d321281c2/coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea", size = 250832, upload-time = "2026-02-09T12:57:22.007Z" }, + { url = "https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b", size = 253434, upload-time = "2026-02-09T12:57:23.339Z" }, + { url = "https://files.pythonhosted.org/packages/5a/88/6728a7ad17428b18d836540630487231f5470fb82454871149502f5e5aa2/coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525", size = 254676, upload-time = "2026-02-09T12:57:24.774Z" }, + { url = "https://files.pythonhosted.org/packages/7c/bc/21244b1b8cedf0dff0a2b53b208015fe798d5f2a8d5348dbfece04224fff/coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242", size = 256807, upload-time = "2026-02-09T12:57:26.125Z" }, + { url = "https://files.pythonhosted.org/packages/97/a0/ddba7ed3251cff51006737a727d84e05b61517d1784a9988a846ba508877/coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148", size = 251058, upload-time = "2026-02-09T12:57:27.614Z" }, + { url = "https://files.pythonhosted.org/packages/9b/55/e289addf7ff54d3a540526f33751951bf0878f3809b47f6dfb3def69c6f7/coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a", size = 252805, upload-time = "2026-02-09T12:57:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/cc276b1fa4a59be56d96f1dabddbdc30f4ba22e3b1cd42504c37b3313255/coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23", size = 250766, upload-time = "2026-02-09T12:57:30.522Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/1093b8f93018f8b41a8cf29636c9292502f05e4a113d4d107d14a3acd044/coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80", size = 254923, upload-time = "2026-02-09T12:57:31.946Z" }, + { url = "https://files.pythonhosted.org/packages/8b/55/ea2796da2d42257f37dbea1aab239ba9263b31bd91d5527cdd6db5efe174/coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea", size = 250591, upload-time = "2026-02-09T12:57:33.842Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/7c4bb72aacf8af5020675aa633e59c1fbe296d22aed191b6a5b711eb2bc7/coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a", size = 252364, upload-time = "2026-02-09T12:57:35.743Z" }, + { url = "https://files.pythonhosted.org/packages/5c/38/a8d2ec0146479c20bbaa7181b5b455a0c41101eed57f10dd19a78ab44c80/coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d", size = 222010, upload-time = "2026-02-09T12:57:37.25Z" }, + { url = "https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd", size = 222818, upload-time = "2026-02-09T12:57:38.734Z" }, + { url = "https://files.pythonhosted.org/packages/04/d1/934918a138c932c90d78301f45f677fb05c39a3112b96fd2c8e60503cdc7/coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af", size = 221438, upload-time = "2026-02-09T12:57:40.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/57/ee93ced533bcb3e6df961c0c6e42da2fc6addae53fb95b94a89b1e33ebd7/coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d", size = 220165, upload-time = "2026-02-09T12:57:41.639Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e0/969fc285a6fbdda49d91af278488d904dcd7651b2693872f0ff94e40e84a/coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12", size = 220516, upload-time = "2026-02-09T12:57:44.215Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b8/9531944e16267e2735a30a9641ff49671f07e8138ecf1ca13db9fd2560c7/coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b", size = 261804, upload-time = "2026-02-09T12:57:45.989Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f3/e63df6d500314a2a60390d1989240d5f27318a7a68fa30ad3806e2a9323e/coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9", size = 263885, upload-time = "2026-02-09T12:57:47.42Z" }, + { url = "https://files.pythonhosted.org/packages/f3/67/7654810de580e14b37670b60a09c599fa348e48312db5b216d730857ffe6/coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092", size = 266308, upload-time = "2026-02-09T12:57:49.345Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/39d41eca0eab3cc82115953ad41c4e77935286c930e8fad15eaed1389d83/coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9", size = 267452, upload-time = "2026-02-09T12:57:50.811Z" }, + { url = "https://files.pythonhosted.org/packages/50/6d/39c0fbb8fc5cd4d2090811e553c2108cf5112e882f82505ee7495349a6bf/coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26", size = 261057, upload-time = "2026-02-09T12:57:52.447Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a2/60010c669df5fa603bb5a97fb75407e191a846510da70ac657eb696b7fce/coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2", size = 263875, upload-time = "2026-02-09T12:57:53.938Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d9/63b22a6bdbd17f1f96e9ed58604c2a6b0e72a9133e37d663bef185877cf6/coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940", size = 261500, upload-time = "2026-02-09T12:57:56.012Z" }, + { url = "https://files.pythonhosted.org/packages/70/bf/69f86ba1ad85bc3ad240e4c0e57a2e620fbc0e1645a47b5c62f0e941ad7f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c", size = 265212, upload-time = "2026-02-09T12:57:57.5Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f2/5f65a278a8c2148731831574c73e42f57204243d33bedaaf18fa79c5958f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0", size = 260398, upload-time = "2026-02-09T12:57:59.027Z" }, + { url = "https://files.pythonhosted.org/packages/ef/80/6e8280a350ee9fea92f14b8357448a242dcaa243cb2c72ab0ca591f66c8c/coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b", size = 262584, upload-time = "2026-02-09T12:58:01.129Z" }, + { url = "https://files.pythonhosted.org/packages/22/63/01ff182fc95f260b539590fb12c11ad3e21332c15f9799cb5e2386f71d9f/coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9", size = 222688, upload-time = "2026-02-09T12:58:02.736Z" }, + { url = "https://files.pythonhosted.org/packages/a9/43/89de4ef5d3cd53b886afa114065f7e9d3707bdb3e5efae13535b46ae483d/coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd", size = 223746, upload-time = "2026-02-09T12:58:05.362Z" }, + { url = "https://files.pythonhosted.org/packages/35/39/7cf0aa9a10d470a5309b38b289b9bb07ddeac5d61af9b664fe9775a4cb3e/coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997", size = 222003, upload-time = "2026-02-09T12:58:06.952Z" }, + { url = "https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601", size = 219522, upload-time = "2026-02-09T12:58:08.623Z" }, + { url = "https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689", size = 219855, upload-time = "2026-02-09T12:58:10.176Z" }, + { url = "https://files.pythonhosted.org/packages/e5/69/233459ee9eb0c0d10fcc2fe425a029b3fa5ce0f040c966ebce851d030c70/coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c", size = 250887, upload-time = "2026-02-09T12:58:12.503Z" }, + { url = "https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129", size = 253396, upload-time = "2026-02-09T12:58:14.615Z" }, + { url = "https://files.pythonhosted.org/packages/ac/15/ea4da0f85bf7d7b27635039e649e99deb8173fe551096ea15017f7053537/coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552", size = 254745, upload-time = "2026-02-09T12:58:16.162Z" }, + { url = "https://files.pythonhosted.org/packages/99/11/bb356e86920c655ca4d61daee4e2bbc7258f0a37de0be32d233b561134ff/coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a", size = 257055, upload-time = "2026-02-09T12:58:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0f/9ae1f8cb17029e09da06ca4e28c9e1d5c1c0a511c7074592e37e0836c915/coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356", size = 250911, upload-time = "2026-02-09T12:58:19.495Z" }, + { url = "https://files.pythonhosted.org/packages/89/3a/adfb68558fa815cbc29747b553bc833d2150228f251b127f1ce97e48547c/coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71", size = 252754, upload-time = "2026-02-09T12:58:21.064Z" }, + { url = "https://files.pythonhosted.org/packages/32/b1/540d0c27c4e748bd3cd0bd001076ee416eda993c2bae47a73b7cc9357931/coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5", size = 250720, upload-time = "2026-02-09T12:58:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/c7/95/383609462b3ffb1fe133014a7c84fc0dd01ed55ac6140fa1093b5af7ebb1/coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98", size = 254994, upload-time = "2026-02-09T12:58:24.548Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ba/1761138e86c81680bfc3c49579d66312865457f9fe405b033184e5793cb3/coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5", size = 250531, upload-time = "2026-02-09T12:58:26.271Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8e/05900df797a9c11837ab59c4d6fe94094e029582aab75c3309a93e6fb4e3/coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0", size = 252189, upload-time = "2026-02-09T12:58:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/00/bd/29c9f2db9ea4ed2738b8a9508c35626eb205d51af4ab7bf56a21a2e49926/coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb", size = 222258, upload-time = "2026-02-09T12:58:29.441Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505", size = 223073, upload-time = "2026-02-09T12:58:31.026Z" }, + { url = "https://files.pythonhosted.org/packages/51/5b/84100025be913b44e082ea32abcf1afbf4e872f5120b7a1cab1d331b1e13/coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2", size = 221638, upload-time = "2026-02-09T12:58:32.599Z" }, + { url = "https://files.pythonhosted.org/packages/a7/e4/c884a405d6ead1370433dad1e3720216b4f9fd8ef5b64bfd984a2a60a11a/coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056", size = 220246, upload-time = "2026-02-09T12:58:34.181Z" }, + { url = "https://files.pythonhosted.org/packages/81/5c/4d7ed8b23b233b0fffbc9dfec53c232be2e695468523242ea9fd30f97ad2/coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc", size = 220514, upload-time = "2026-02-09T12:58:35.704Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6f/3284d4203fd2f28edd73034968398cd2d4cb04ab192abc8cff007ea35679/coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9", size = 261877, upload-time = "2026-02-09T12:58:37.864Z" }, + { url = "https://files.pythonhosted.org/packages/09/aa/b672a647bbe1556a85337dc95bfd40d146e9965ead9cc2fe81bde1e5cbce/coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf", size = 264004, upload-time = "2026-02-09T12:58:39.492Z" }, + { url = "https://files.pythonhosted.org/packages/79/a1/aa384dbe9181f98bba87dd23dda436f0c6cf2e148aecbb4e50fc51c1a656/coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55", size = 266408, upload-time = "2026-02-09T12:58:41.852Z" }, + { url = "https://files.pythonhosted.org/packages/53/5e/5150bf17b4019bc600799f376bb9606941e55bd5a775dc1e096b6ffea952/coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72", size = 267544, upload-time = "2026-02-09T12:58:44.093Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/f1de5c675987a4a7a672250d2c5c9d73d289dbf13410f00ed7181d8017dd/coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a", size = 260980, upload-time = "2026-02-09T12:58:45.721Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e3/fe758d01850aa172419a6743fe76ba8b92c29d181d4f676ffe2dae2ba631/coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6", size = 263871, upload-time = "2026-02-09T12:58:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/b6/76/b829869d464115e22499541def9796b25312b8cf235d3bb00b39f1675395/coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3", size = 261472, upload-time = "2026-02-09T12:58:48.995Z" }, + { url = "https://files.pythonhosted.org/packages/14/9e/caedb1679e73e2f6ad240173f55218488bfe043e38da577c4ec977489915/coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750", size = 265210, upload-time = "2026-02-09T12:58:51.178Z" }, + { url = "https://files.pythonhosted.org/packages/3a/10/0dd02cb009b16ede425b49ec344aba13a6ae1dc39600840ea6abcb085ac4/coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39", size = 260319, upload-time = "2026-02-09T12:58:53.081Z" }, + { url = "https://files.pythonhosted.org/packages/92/8e/234d2c927af27c6d7a5ffad5bd2cf31634c46a477b4c7adfbfa66baf7ebb/coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0", size = 262638, upload-time = "2026-02-09T12:58:55.258Z" }, + { url = "https://files.pythonhosted.org/packages/2f/64/e5547c8ff6964e5965c35a480855911b61509cce544f4d442caa759a0702/coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea", size = 223040, upload-time = "2026-02-09T12:58:56.936Z" }, + { url = "https://files.pythonhosted.org/packages/c7/96/38086d58a181aac86d503dfa9c47eb20715a79c3e3acbdf786e92e5c09a8/coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932", size = 224148, upload-time = "2026-02-09T12:58:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/ce/72/8d10abd3740a0beb98c305e0c3faf454366221c0f37a8bcf8f60020bb65a/coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b", size = 222172, upload-time = "2026-02-09T12:59:00.396Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" }, ] [package.optional-dependencies] From 0a976128d28543bc2ef7542ac34a92bdd93b17e9 Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Mon, 9 Feb 2026 21:39:16 +0600 Subject: [PATCH 06/17] Update high-level API to Layer 224 (#60) - Added FactCheck, StarsAmount, and SuggestedPost high-level types. - Added missing fields to Message, User, Chat, and ChatPrivileges types. - Updated send_message, send_photo, send_video, send_animation, and send_media_group methods with missing parameters. - Fixed Gift._parse to handle optional fields correctly. - Added get_input_quick_reply_shortcut utility. - Ensured compatibility with the latest MTProto layer. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- pyrogram/methods/messages/send_animation.py | 48 ++++ pyrogram/methods/messages/send_media_group.py | 39 +++ pyrogram/methods/messages/send_message.py | 44 +++ pyrogram/methods/messages/send_photo.py | 48 ++++ pyrogram/methods/messages/send_video.py | 48 ++++ pyrogram/types/__init__.py | 6 + pyrogram/types/business/__init__.py | 4 + pyrogram/types/business/stars_amount.py | 44 +++ pyrogram/types/business/suggested_post.py | 62 +++++ pyrogram/types/messages_and_media/__init__.py | 2 + .../types/messages_and_media/fact_check.py | 59 ++++ pyrogram/types/messages_and_media/message.py | 87 ++++++ pyrogram/types/payments/gift.py | 253 ++++++++++++++++-- pyrogram/types/user_and_chats/chat.py | 78 +++++- .../types/user_and_chats/chat_privileges.py | 6 + pyrogram/types/user_and_chats/user.py | 58 ++++ pyrogram/utils.py | 8 + 17 files changed, 868 insertions(+), 26 deletions(-) create mode 100644 pyrogram/types/business/stars_amount.py create mode 100644 pyrogram/types/business/suggested_post.py create mode 100644 pyrogram/types/messages_and_media/fact_check.py diff --git a/pyrogram/methods/messages/send_animation.py b/pyrogram/methods/messages/send_animation.py index c58007210..8828a5758 100644 --- a/pyrogram/methods/messages/send_animation.py +++ b/pyrogram/methods/messages/send_animation.py @@ -38,10 +38,18 @@ async def send_animation( quote_text: str | None = None, quote_entities: list[types.MessageEntity] | None = None, schedule_date: datetime | None = None, + schedule_repeat_period: int | None = None, protect_content: bool | None = None, allow_paid_broadcast: bool | None = None, + allow_paid_stars: int | None = None, message_effect_id: int | None = None, invert_media: bool | None = None, + quick_reply_shortcut: str | int | None = None, + send_as: int | str | None = None, + background: bool | None = None, + clear_draft: bool | None = None, + update_stickersets_order: bool | None = None, + suggested_post: types.SuggestedPost | None = None, reply_markup: types.InlineKeyboardMarkup | types.ReplyKeyboardMarkup | types.ReplyKeyboardRemove @@ -140,15 +148,39 @@ async def send_animation( schedule_date (:py:obj:`~datetime.datetime`, *optional*): Date when the message will be automatically sent. + schedule_repeat_period (``int``, *optional*): + Repeat period of the scheduled message. + protect_content (``bool``, *optional*): Protects the contents of the sent message from forwarding and saving. allow_paid_broadcast (``bool``, *optional*): Pass True to allow the message to ignore regular broadcast limits for a small fee; for bots only. + allow_paid_stars (``int``, *optional*): + Amount of stars to pay for the message; for bots only. + invert_media (``bool``, *optional*): Inverts the position of the animation and caption. + quick_reply_shortcut (``str`` | ``int``, *optional*): + Quick reply shortcut identifier or name. + + send_as (``int`` | ``str``, *optional*): + Unique identifier (int) or username (str) of the chat to send the message as. + + background (``bool``, *optional*): + Pass True to send the message in the background. + + clear_draft (``bool``, *optional*): + Pass True to clear the draft. + + update_stickersets_order (``bool``, *optional*): + Pass True to update the stickersets order. + + suggested_post (:obj:`~pyrogram.types.SuggestedPost`, *optional*): + Suggested post information. + reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardRemove` | :obj:`~pyrogram.types.ForceReply`, *optional*): Additional interface options. An object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user. @@ -290,6 +322,22 @@ async def progress(current, total): allow_paid_floodskip=allow_paid_broadcast, effect=message_effect_id, invert_media=invert_media, + background=background, + clear_draft=clear_draft, + update_stickersets_order=update_stickersets_order, + schedule_repeat_period=schedule_repeat_period, + send_as=await self.resolve_peer(send_as) + if send_as + else None, + quick_reply_shortcut=await utils.get_input_quick_reply_shortcut( + quick_reply_shortcut, + ) + if quick_reply_shortcut + else None, + allow_paid_stars=allow_paid_stars, + suggested_post=await suggested_post.write() + if suggested_post + else None, reply_markup=await reply_markup.write(self) if reply_markup else None, diff --git a/pyrogram/methods/messages/send_media_group.py b/pyrogram/methods/messages/send_media_group.py index bebd27d0e..321d83c85 100644 --- a/pyrogram/methods/messages/send_media_group.py +++ b/pyrogram/methods/messages/send_media_group.py @@ -39,10 +39,17 @@ async def send_media_group( quote_entities: list[types.MessageEntity] | None = None, parse_mode: enums.ParseMode | None = None, schedule_date: datetime | None = None, + schedule_repeat_period: int | None = None, protect_content: bool | None = None, allow_paid_broadcast: bool | None = None, + allow_paid_stars: int | None = None, message_effect_id: int | None = None, invert_media: bool | None = None, + quick_reply_shortcut: str | int | None = None, + send_as: int | str | None = None, + background: bool | None = None, + clear_draft: bool | None = None, + update_stickersets_order: bool | None = None, ) -> list[types.Message]: """Send a group of photos or videos as an album. @@ -97,18 +104,39 @@ async def send_media_group( schedule_date (:py:obj:`~datetime.datetime`, *optional*): Date when the message will be automatically sent. + schedule_repeat_period (``int``, *optional*): + Repeat period of the scheduled message. + protect_content (``bool``, *optional*): Protects the contents of the sent message from forwarding and saving. allow_paid_broadcast (``bool``, *optional*): Pass True to allow the message to ignore regular broadcast limits for a small fee; for bots only. + allow_paid_stars (``int``, *optional*): + Amount of stars to pay for the message; for bots only. + message_effect_id (``int`` ``64-bit``, *optional*): Unique identifier of the message effect to be added to the message; for private chats only. invert_media (``bool``, *optional*): Inverts the position of the media and caption. + quick_reply_shortcut (``str`` | ``int``, *optional*): + Quick reply shortcut identifier or name. + + send_as (``int`` | ``str``, *optional*): + Unique identifier (int) or username (str) of the chat to send the message as. + + background (``bool``, *optional*): + Pass True to send the message in the background. + + clear_draft (``bool``, *optional*): + Pass True to clear the draft. + + update_stickersets_order (``bool``, *optional*): + Pass True to update the stickersets order. + Returns: List of :obj:`~pyrogram.types.Message`: On success, a list of the sent messages is returned. @@ -516,6 +544,17 @@ async def send_media_group( allow_paid_floodskip=allow_paid_broadcast, effect=message_effect_id, invert_media=invert_media, + background=background, + clear_draft=clear_draft, + update_stickersets_order=update_stickersets_order, + schedule_repeat_period=schedule_repeat_period, + send_as=await self.resolve_peer(send_as) if send_as else None, + quick_reply_shortcut=await utils.get_input_quick_reply_shortcut( + quick_reply_shortcut, + ) + if quick_reply_shortcut + else None, + allow_paid_stars=allow_paid_stars, ) if business_connection_id is not None: diff --git a/pyrogram/methods/messages/send_message.py b/pyrogram/methods/messages/send_message.py index d31881200..a96880a76 100644 --- a/pyrogram/methods/messages/send_message.py +++ b/pyrogram/methods/messages/send_message.py @@ -26,10 +26,18 @@ async def send_message( quote_text: str | None = None, quote_entities: list[types.MessageEntity] | None = None, schedule_date: datetime | None = None, + schedule_repeat_period: int | None = None, protect_content: bool | None = None, allow_paid_broadcast: bool | None = None, + allow_paid_stars: int | None = None, invert_media: bool | None = None, message_effect_id: int | None = None, + quick_reply_shortcut: str | int | None = None, + send_as: int | str | None = None, + background: bool | None = None, + clear_draft: bool | None = None, + update_stickersets_order: bool | None = None, + suggested_post: types.SuggestedPost | None = None, reply_markup: types.InlineKeyboardMarkup | types.ReplyKeyboardMarkup | types.ReplyKeyboardRemove @@ -93,18 +101,42 @@ async def send_message( schedule_date (:py:obj:`~datetime.datetime`, *optional*): Date when the message will be automatically sent. + schedule_repeat_period (``int``, *optional*): + Repeat period of the scheduled message. + protect_content (``bool``, *optional*): Protects the contents of the sent message from forwarding and saving. allow_paid_broadcast (``bool``, *optional*): Pass True to allow the message to ignore regular broadcast limits for a small fee; for bots only + allow_paid_stars (``int``, *optional*): + Amount of stars to pay for the message; for bots only. + invert_media (``bool``, *optional*): Move web page preview to above the message. message_effect_id (``int`` ``64-bit``, *optional*): Unique identifier of the message effect to be added to the message; for private chats only. + quick_reply_shortcut (``str`` | ``int``, *optional*): + Quick reply shortcut identifier or name. + + send_as (``int`` | ``str``, *optional*): + Unique identifier (int) or username (str) of the chat to send the message as. + + background (``bool``, *optional*): + Pass True to send the message in the background. + + clear_draft (``bool``, *optional*): + Pass True to clear the draft. + + update_stickersets_order (``bool``, *optional*): + Pass True to update the stickersets order. + + suggested_post (:obj:`~pyrogram.types.SuggestedPost`, *optional*): + Suggested post information. + reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardRemove` | :obj:`~pyrogram.types.ForceReply`, *optional*): Additional interface options. An object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user. @@ -177,6 +209,18 @@ async def send_message( allow_paid_floodskip=allow_paid_broadcast, invert_media=invert_media, effect=message_effect_id, + background=background, + clear_draft=clear_draft, + update_stickersets_order=update_stickersets_order, + schedule_repeat_period=schedule_repeat_period, + send_as=await self.resolve_peer(send_as) if send_as else None, + quick_reply_shortcut=await utils.get_input_quick_reply_shortcut( + quick_reply_shortcut, + ) + if quick_reply_shortcut + else None, + allow_paid_stars=allow_paid_stars, + suggested_post=await suggested_post.write() if suggested_post else None, ) if business_connection_id is not None: r = await self.invoke( diff --git a/pyrogram/methods/messages/send_photo.py b/pyrogram/methods/messages/send_photo.py index 90f35a6e7..a50f39975 100644 --- a/pyrogram/methods/messages/send_photo.py +++ b/pyrogram/methods/messages/send_photo.py @@ -33,11 +33,19 @@ async def send_photo( quote_text: str | None = None, quote_entities: list[types.MessageEntity] | None = None, schedule_date: datetime | None = None, + schedule_repeat_period: int | None = None, protect_content: bool | None = None, allow_paid_broadcast: bool | None = None, + allow_paid_stars: int | None = None, message_effect_id: int | None = None, view_once: bool | None = None, invert_media: bool | None = None, + quick_reply_shortcut: str | int | None = None, + send_as: int | str | None = None, + background: bool | None = None, + clear_draft: bool | None = None, + update_stickersets_order: bool | None = None, + suggested_post: types.SuggestedPost | None = None, reply_markup: types.InlineKeyboardMarkup | types.ReplyKeyboardMarkup | types.ReplyKeyboardRemove @@ -115,12 +123,18 @@ async def send_photo( schedule_date (:py:obj:`~datetime.datetime`, *optional*): Date when the message will be automatically sent. + schedule_repeat_period (``int``, *optional*): + Repeat period of the scheduled message. + protect_content (``bool``, *optional*): Protects the contents of the sent message from forwarding and saving. allow_paid_broadcast (``bool``, *optional*): Pass True to allow the message to ignore regular broadcast limits for a small fee; for bots only + allow_paid_stars (``int``, *optional*): + Amount of stars to pay for the message; for bots only. + message_effect_id (``int`` ``64-bit``, *optional*): Unique identifier of the message effect to be added to the message; for private chats only. @@ -131,6 +145,24 @@ async def send_photo( invert_media (``bool``, *optional*): Inverts the position of the photo and caption. + quick_reply_shortcut (``str`` | ``int``, *optional*): + Quick reply shortcut identifier or name. + + send_as (``int`` | ``str``, *optional*): + Unique identifier (int) or username (str) of the chat to send the message as. + + background (``bool``, *optional*): + Pass True to send the message in the background. + + clear_draft (``bool``, *optional*): + Pass True to clear the draft. + + update_stickersets_order (``bool``, *optional*): + Pass True to update the stickersets order. + + suggested_post (:obj:`~pyrogram.types.SuggestedPost`, *optional*): + Suggested post information. + reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardRemove` | :obj:`~pyrogram.types.ForceReply`, *optional*): Additional interface options. An object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user. @@ -241,6 +273,22 @@ async def send_photo( allow_paid_floodskip=allow_paid_broadcast, effect=message_effect_id, invert_media=invert_media, + background=background, + clear_draft=clear_draft, + update_stickersets_order=update_stickersets_order, + schedule_repeat_period=schedule_repeat_period, + send_as=await self.resolve_peer(send_as) + if send_as + else None, + quick_reply_shortcut=await utils.get_input_quick_reply_shortcut( + quick_reply_shortcut, + ) + if quick_reply_shortcut + else None, + allow_paid_stars=allow_paid_stars, + suggested_post=await suggested_post.write() + if suggested_post + else None, reply_markup=await reply_markup.write(self) if reply_markup else None, diff --git a/pyrogram/methods/messages/send_video.py b/pyrogram/methods/messages/send_video.py index fe02d64b3..d6bd0f97f 100644 --- a/pyrogram/methods/messages/send_video.py +++ b/pyrogram/methods/messages/send_video.py @@ -39,10 +39,18 @@ async def send_video( quote_text: str | None = None, quote_entities: list[types.MessageEntity] | None = None, schedule_date: datetime | None = None, + schedule_repeat_period: int | None = None, protect_content: bool | None = None, allow_paid_broadcast: bool | None = None, + allow_paid_stars: int | None = None, message_effect_id: int | None = None, invert_media: bool | None = None, + quick_reply_shortcut: str | int | None = None, + send_as: int | str | None = None, + background: bool | None = None, + clear_draft: bool | None = None, + update_stickersets_order: bool | None = None, + suggested_post: types.SuggestedPost | None = None, reply_markup: types.InlineKeyboardMarkup | types.ReplyKeyboardMarkup | types.ReplyKeyboardRemove @@ -143,18 +151,42 @@ async def send_video( schedule_date (:py:obj:`~datetime.datetime`, *optional*): Date when the message will be automatically sent. + schedule_repeat_period (``int``, *optional*): + Repeat period of the scheduled message. + protect_content (``bool``, *optional*): Protects the contents of the sent message from forwarding and saving. allow_paid_broadcast (``bool``, *optional*): Pass True to allow the message to ignore regular broadcast limits for a small fee; for bots only + allow_paid_stars (``int``, *optional*): + Amount of stars to pay for the message; for bots only. + message_effect_id (``int`` ``64-bit``, *optional*): Unique identifier of the message effect to be added to the message; for private chats only. invert_media (``bool``, *optional*): Inverts the position of the video and caption. + quick_reply_shortcut (``str`` | ``int``, *optional*): + Quick reply shortcut identifier or name. + + send_as (``int`` | ``str``, *optional*): + Unique identifier (int) or username (str) of the chat to send the message as. + + background (``bool``, *optional*): + Pass True to send the message in the background. + + clear_draft (``bool``, *optional*): + Pass True to clear the draft. + + update_stickersets_order (``bool``, *optional*): + Pass True to update the stickersets order. + + suggested_post (:obj:`~pyrogram.types.SuggestedPost`, *optional*): + Suggested post information. + reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardRemove` | :obj:`~pyrogram.types.ForceReply`, *optional*): Additional interface options. An object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user. @@ -297,6 +329,22 @@ async def progress(current, total): allow_paid_floodskip=allow_paid_broadcast, effect=message_effect_id, invert_media=invert_media, + background=background, + clear_draft=clear_draft, + update_stickersets_order=update_stickersets_order, + schedule_repeat_period=schedule_repeat_period, + send_as=await self.resolve_peer(send_as) + if send_as + else None, + quick_reply_shortcut=await utils.get_input_quick_reply_shortcut( + quick_reply_shortcut, + ) + if quick_reply_shortcut + else None, + allow_paid_stars=allow_paid_stars, + suggested_post=await suggested_post.write() + if suggested_post + else None, reply_markup=await reply_markup.write(self) if reply_markup else None, diff --git a/pyrogram/types/__init__.py b/pyrogram/types/__init__.py index e04376ab9..0bcd33bd2 100644 --- a/pyrogram/types/__init__.py +++ b/pyrogram/types/__init__.py @@ -62,9 +62,11 @@ ShippingAddress, ShippingOption, ShippingQuery, + StarsAmount, StarsStatus, StarsTransaction, SuccessfulPayment, + SuggestedPost, ) from .inline_mode import ( ChosenInlineResult, @@ -131,6 +133,7 @@ Document, DraftMessage, ExportedStoryLink, + FactCheck, Game, GiftedPremium, Giveaway, @@ -291,6 +294,7 @@ "EmojiStatus", "ExportedStoryLink", "ExtendedMediaPreview", + "FactCheck", "Folder", "ForceReply", "ForumTopic", @@ -414,6 +418,7 @@ "ShippingAddress", "ShippingOption", "ShippingQuery", + "StarsAmount", "StarsStatus", "StarsTransaction", "Sticker", @@ -426,6 +431,7 @@ "StoryViews", "StrippedThumbnail", "SuccessfulPayment", + "SuggestedPost", "TermsOfService", "Thumbnail", "TranslatedText", diff --git a/pyrogram/types/business/__init__.py b/pyrogram/types/business/__init__.py index da0ea250d..ab09d798b 100644 --- a/pyrogram/types/business/__init__.py +++ b/pyrogram/types/business/__init__.py @@ -11,9 +11,11 @@ from .shipping_address import ShippingAddress from .shipping_option import ShippingOption from .shipping_query import ShippingQuery +from .stars_amount import StarsAmount from .stars_status import StarsStatus from .stars_transaction import StarsTransaction from .successful_payment import SuccessfulPayment +from .suggested_post import SuggestedPost __all__ = [ "ExtendedMediaPreview", @@ -27,7 +29,9 @@ "ShippingAddress", "ShippingOption", "ShippingQuery", + "StarsAmount", "StarsStatus", "StarsTransaction", "SuccessfulPayment", + "SuggestedPost", ] diff --git a/pyrogram/types/business/stars_amount.py b/pyrogram/types/business/stars_amount.py new file mode 100644 index 000000000..cc0780249 --- /dev/null +++ b/pyrogram/types/business/stars_amount.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +from pyrogram import raw +from pyrogram.types.object import Object + + +class StarsAmount(Object): + """A stars amount. + + Parameters: + amount (``int``): + Amount of stars. + + nanos (``int``, *optional*): + Amount of nanostars. + """ + + def __init__( + self, + *, + amount: int, + nanos: int | None = None, + ) -> None: + super().__init__(None) + + self.amount = amount + self.nanos = nanos + + async def write(self) -> raw.base.StarsAmount: + if self.nanos: + return raw.types.StarsAmount(amount=self.amount, nanos=self.nanos) + return raw.types.StarsTonAmount(amount=self.amount) + + @staticmethod + def _parse( + stars_amount: raw.types.StarsAmount | raw.types.StarsTonAmount, + ) -> StarsAmount | None: + if not stars_amount: + return None + + return StarsAmount( + amount=stars_amount.amount, + nanos=getattr(stars_amount, "nanos", None), + ) diff --git a/pyrogram/types/business/suggested_post.py b/pyrogram/types/business/suggested_post.py new file mode 100644 index 000000000..fe8372ac9 --- /dev/null +++ b/pyrogram/types/business/suggested_post.py @@ -0,0 +1,62 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from pyrogram import raw, types, utils +from pyrogram.types.object import Object + +if TYPE_CHECKING: + from datetime import datetime + + +class SuggestedPost(Object): + """A suggested post. + + Parameters: + is_accepted (``bool``, *optional*): + True, if the post was accepted. + + is_rejected (``bool``, *optional*): + True, if the post was rejected. + + price (:obj:`~pyrogram.types.StarsAmount`, *optional*): + Price of the post. + + schedule_date (:py:obj:`~datetime.datetime`, *optional*): + Date when the post will be automatically sent. + """ + + def __init__( + self, + *, + is_accepted: bool | None = None, + is_rejected: bool | None = None, + price: types.StarsAmount | None = None, + schedule_date: datetime | None = None, + ) -> None: + super().__init__(None) + + self.is_accepted = is_accepted + self.is_rejected = is_rejected + self.price = price + self.schedule_date = schedule_date + + async def write(self) -> raw.types.SuggestedPost: + return raw.types.SuggestedPost( + accepted=self.is_accepted or None, + rejected=self.is_rejected or None, + price=await self.price.write() if self.price else None, + schedule_date=utils.datetime_to_timestamp(self.schedule_date), + ) + + @staticmethod + def _parse(suggested_post: raw.types.SuggestedPost) -> SuggestedPost | None: + if not suggested_post: + return None + + return SuggestedPost( + is_accepted=suggested_post.accepted, + is_rejected=suggested_post.rejected, + price=types.StarsAmount._parse(suggested_post.price), + schedule_date=utils.timestamp_to_datetime(suggested_post.schedule_date), + ) diff --git a/pyrogram/types/messages_and_media/__init__.py b/pyrogram/types/messages_and_media/__init__.py index 24297d15d..2ad6b3a8a 100644 --- a/pyrogram/types/messages_and_media/__init__.py +++ b/pyrogram/types/messages_and_media/__init__.py @@ -20,6 +20,7 @@ from .document import Document from .draft_message import DraftMessage from .exported_story_link import ExportedStoryLink +from .fact_check import FactCheck from .game import Game from .gifted_premium import GiftedPremium from .giveaway import Giveaway @@ -74,6 +75,7 @@ "Document", "DraftMessage", "ExportedStoryLink", + "FactCheck", "Game", "GiftedPremium", "Giveaway", diff --git a/pyrogram/types/messages_and_media/fact_check.py b/pyrogram/types/messages_and_media/fact_check.py new file mode 100644 index 000000000..ce00976d3 --- /dev/null +++ b/pyrogram/types/messages_and_media/fact_check.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +from pyrogram import raw, types +from pyrogram.types.object import Object + + +class FactCheck(Object): + """A fact-check. + + Parameters: + need_check (``bool``): + True, if the message needs to be fact-checked. + + country (``str``, *optional*): + ISO 3166-1 alpha-2 country code for which the fact-check is relevant. + + text (:obj:`~pyrogram.types.TextWithEntities`, *optional*): + Fact-check text. + + hash (``int``): + Fact-check hash. + """ + + def __init__( + self, + *, + need_check: bool, + country: str | None = None, + text: types.TextWithEntities | None = None, + hash: int, + ) -> None: + super().__init__(None) + + self.need_check = need_check + self.country = country + self.text = text + self.hash = hash + + @staticmethod + def _parse(client, fact_check: raw.types.FactCheck) -> FactCheck | None: + if not fact_check: + return None + + return FactCheck( + need_check=fact_check.need_check, + country=fact_check.country, + text=types.TextWithEntities( + text=fact_check.text.text, + entities=types.List( + [ + types.MessageEntity._parse(client, entity, {}) + for entity in fact_check.text.entities + ], + ), + ) + if fact_check.text + else None, + hash=fact_check.hash, + ) diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index 960c21caa..dc8309758 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -183,6 +183,36 @@ class Message(Object, Update): quote_entities (List of :obj:`~pyrogram.types.MessageEntity`, *optional*): For quote text, special entities like usernames, URLs, bot commands, etc. that appear in the quote text. + offline (``bool``, *optional*): + True, if the message was sent offline. + + video_processing_pending (``bool``, *optional*): + True, if the video is still being processed. + + paid_suggested_post_stars (``bool``, *optional*): + True, if the suggested post requires stars. + + paid_suggested_post_ton (``bool``, *optional*): + True, if the suggested post requires TON. + + fact_check (:obj:`~pyrogram.types.FactCheck`, *optional*): + Fact-check information. + + report_delivery_until_date (:py:obj:`~datetime.datetime`, *optional*): + Date until which the report delivery is possible. + + paid_message_stars (``int``, *optional*): + Amount of stars required to send a paid message. + + suggested_post (:obj:`~pyrogram.types.SuggestedPost`, *optional*): + Suggested post information. + + schedule_repeat_period (``int``, *optional*): + Repeat period of the scheduled message. + + summary_from_language (``str``, *optional*): + Language from which the summary was generated. + effect_id (``str``, *optional*): Unique identifier of the message effect added to the message. @@ -485,6 +515,16 @@ def __init__( caption_entities: list[types.MessageEntity] | None = None, quote_text: str | None = None, quote_entities: list[types.MessageEntity] | None = None, + offline: bool | None = None, + video_processing_pending: bool | None = None, + paid_suggested_post_stars: bool | None = None, + paid_suggested_post_ton: bool | None = None, + fact_check: types.FactCheck | None = None, + report_delivery_until_date: datetime | None = None, + paid_message_stars: int | None = None, + suggested_post: types.SuggestedPost | None = None, + schedule_repeat_period: int | None = None, + summary_from_language: str | None = None, effect_id: str | None = None, invert_media: bool | None = None, audio: types.Audio = None, @@ -604,6 +644,16 @@ def __init__( self.caption_entities = caption_entities self.quote_text = quote_text self.quote_entities = quote_entities + self.offline = offline + self.video_processing_pending = video_processing_pending + self.paid_suggested_post_stars = paid_suggested_post_stars + self.paid_suggested_post_ton = paid_suggested_post_ton + self.fact_check = fact_check + self.report_delivery_until_date = report_delivery_until_date + self.paid_message_stars = paid_message_stars + self.suggested_post = suggested_post + self.schedule_repeat_period = schedule_repeat_period + self.summary_from_language = summary_from_language self.effect_id = effect_id self.invert_media = invert_media self.audio = audio @@ -1417,6 +1467,43 @@ async def _parse( # noqa: C901 outgoing=message.out, reply_markup=reply_markup, reactions=reactions, + offline=getattr(message, "offline", None), + video_processing_pending=getattr( + message, + "video_processing_pending", + None, + ), + paid_suggested_post_stars=getattr( + message, + "paid_suggested_post_stars", + None, + ), + paid_suggested_post_ton=getattr( + message, + "paid_suggested_post_ton", + None, + ), + fact_check=types.FactCheck._parse( + client, + getattr(message, "factcheck", None), + ), + report_delivery_until_date=utils.timestamp_to_datetime( + getattr(message, "report_delivery_until_date", None), + ), + paid_message_stars=getattr(message, "paid_message_stars", None), + suggested_post=types.SuggestedPost._parse( + getattr(message, "suggested_post", None), + ), + schedule_repeat_period=getattr( + message, + "schedule_repeat_period", + None, + ), + summary_from_language=getattr( + message, + "summary_from_language", + None, + ), effect_id=getattr(message, "effect", None), raw=message, client=client, diff --git a/pyrogram/types/payments/gift.py b/pyrogram/types/payments/gift.py index 6071b909e..60802851c 100644 --- a/pyrogram/types/payments/gift.py +++ b/pyrogram/types/payments/gift.py @@ -44,6 +44,95 @@ class Gift(Object): is_sold_out (``bool``, *optional*): True, if the star gift is sold out. + is_birthday (``bool``, *optional*): + True, if it is a birthday gift. + + can_upgrade (``bool``, *optional*): + True, if the gift can be upgraded. + + require_premium (``bool``, *optional*): + True, if the gift requires Telegram Premium to be sent. + + is_limited_per_user (``bool``, *optional*): + True, if the gift is limited per user. + + is_peer_color_available (``bool``, *optional*): + True, if peer color is available for this gift. + + is_auction (``bool``, *optional*): + True, if the gift is an auction gift. + + availability_resale (``int``, *optional*): + Number of Telegram Stars required to resale the gift. + + upgrade_stars (``int``, *optional*): + Number of Telegram Stars required to upgrade the gift. + + resell_min_stars (``int``, *optional*): + Minimum number of Telegram Stars required to resale the gift. + + title (``str``, *optional*): + Gift title. + + released_by (``int``, *optional*): + Identifier of the user who released the gift. + + per_user_total (``int``, *optional*): + Total number of gifts allowed per user. + + per_user_remains (``int``, *optional*): + Number of remaining gifts allowed per user. + + locked_until_date (:py:obj:`~datetime.datetime`, *optional*): + Point in time when the gift will be unlocked. + + auction_slug (``str``, *optional*): + Auction slug. + + gifts_per_round (``int``, *optional*): + Number of gifts per auction round. + + auction_start_date (:py:obj:`~datetime.datetime`, *optional*): + Point in time when the auction starts. + + upgrade_variants (``int``, *optional*): + Number of upgrade variants. + + is_unique (``bool``, *optional*): + True, if the gift is unique. + + gift_id (``int``, *optional*): + Unique identifier of the gift. + + slug (``str``, *optional*): + Gift slug. + + num (``int``, *optional*): + Gift number. + + owner_id (``int``, *optional*): + Identifier of the user who owns the gift. + + owner_name (``str``, *optional*): + Name of the user who owns the gift. + + owner_address (``str``, *optional*): + Address of the user who owns the gift. + + gift_address (``str``, *optional*): + Gift address. + + value_amount (``int``, *optional*): + Gift value amount. + + value_currency (``str``, *optional*): + Gift value currency. + + value_usd_amount (``int``, *optional*): + Gift value USD amount. + + craft_chance_permille (``int``, *optional*): + Craft chance in permille. """ def __init__( @@ -51,15 +140,45 @@ def __init__( *, client: pyrogram.Client = None, id: int, - sticker: types.Sticker, - star_count: int, - default_sell_star_count: int, + sticker: types.Sticker = None, + star_count: int | None = None, + default_sell_star_count: int | None = None, remaining_count: int | None = None, total_count: int | None = None, first_send_date: datetime | None = None, last_send_date: datetime | None = None, is_limited: bool | None = None, is_sold_out: bool | None = None, + is_birthday: bool | None = None, + can_upgrade: bool | None = None, + require_premium: bool | None = None, + is_limited_per_user: bool | None = None, + is_peer_color_available: bool | None = None, + is_auction: bool | None = None, + availability_resale: int | None = None, + upgrade_stars: int | None = None, + resell_min_stars: int | None = None, + title: str | None = None, + released_by: int | None = None, + per_user_total: int | None = None, + per_user_remains: int | None = None, + locked_until_date: datetime | None = None, + auction_slug: str | None = None, + gifts_per_round: int | None = None, + auction_start_date: datetime | None = None, + upgrade_variants: int | None = None, + is_unique: bool | None = None, + gift_id: int | None = None, + slug: str | None = None, + num: int | None = None, + owner_id: int | None = None, + owner_name: str | None = None, + owner_address: str | None = None, + gift_address: str | None = None, + value_amount: int | None = None, + value_currency: str | None = None, + value_usd_amount: int | None = None, + craft_chance_permille: int | None = None, ) -> None: super().__init__(client) @@ -73,29 +192,115 @@ def __init__( self.last_send_date = last_send_date self.is_limited = is_limited self.is_sold_out = is_sold_out + self.is_birthday = is_birthday + self.can_upgrade = can_upgrade + self.require_premium = require_premium + self.is_limited_per_user = is_limited_per_user + self.is_peer_color_available = is_peer_color_available + self.is_auction = is_auction + self.availability_resale = availability_resale + self.upgrade_stars = upgrade_stars + self.resell_min_stars = resell_min_stars + self.title = title + self.released_by = released_by + self.per_user_total = per_user_total + self.per_user_remains = per_user_remains + self.locked_until_date = locked_until_date + self.auction_slug = auction_slug + self.gifts_per_round = gifts_per_round + self.auction_start_date = auction_start_date + self.upgrade_variants = upgrade_variants + self.is_unique = is_unique + self.gift_id = gift_id + self.slug = slug + self.num = num + self.owner_id = owner_id + self.owner_name = owner_name + self.owner_address = owner_address + self.gift_address = gift_address + self.value_amount = value_amount + self.value_currency = value_currency + self.value_usd_amount = value_usd_amount + self.craft_chance_permille = craft_chance_permille @staticmethod async def _parse( client, - star_gift: raw.types.StarGift, + star_gift: raw.base.StarGift, ) -> Gift: - doc = star_gift.sticker - attributes = {type(i): i for i in doc.attributes} - - return Gift( - id=star_gift.id, - sticker=await types.Sticker._parse(client, doc, attributes), - star_count=star_gift.stars, - default_sell_star_count=star_gift.convert_stars, - remaining_count=getattr(star_gift, "availability_remains", None), - total_count=getattr(star_gift, "availability_total", None), - first_send_date=utils.timestamp_to_datetime( - getattr(star_gift, "first_sale_date", None), - ), - last_send_date=utils.timestamp_to_datetime( - getattr(star_gift, "last_sale_date", None), - ), - is_limited=getattr(star_gift, "limited", None), - is_sold_out=getattr(star_gift, "sold_out", None), - client=client, - ) + if isinstance(star_gift, raw.types.StarGift): + doc = star_gift.sticker + attributes = {type(i): i for i in doc.attributes} + + return Gift( + id=star_gift.id, + sticker=await types.Sticker._parse(client, doc, attributes), + star_count=star_gift.stars, + default_sell_star_count=star_gift.convert_stars, + remaining_count=getattr(star_gift, "availability_remains", None), + total_count=getattr(star_gift, "availability_total", None), + first_send_date=utils.timestamp_to_datetime( + getattr(star_gift, "first_sale_date", None), + ), + last_send_date=utils.timestamp_to_datetime( + getattr(star_gift, "last_sale_date", None), + ), + is_limited=getattr(star_gift, "limited", None), + is_sold_out=getattr(star_gift, "sold_out", None), + is_birthday=getattr(star_gift, "birthday", None), + can_upgrade=getattr(star_gift, "can_upgrade", None), + require_premium=getattr(star_gift, "require_premium", None), + is_limited_per_user=getattr(star_gift, "limited_per_user", None), + is_peer_color_available=getattr( + star_gift, + "peer_color_available", + None, + ), + is_auction=getattr(star_gift, "auction", None), + availability_resale=getattr(star_gift, "availability_resale", None), + upgrade_stars=getattr(star_gift, "upgrade_stars", None), + resell_min_stars=getattr(star_gift, "resell_min_stars", None), + title=getattr(star_gift, "title", None), + released_by=utils.get_raw_peer_id(star_gift.released_by) + if getattr(star_gift, "released_by", None) + else None, + per_user_total=getattr(star_gift, "per_user_total", None), + per_user_remains=getattr(star_gift, "per_user_remains", None), + locked_until_date=utils.timestamp_to_datetime( + getattr(star_gift, "locked_until_date", None), + ), + auction_slug=getattr(star_gift, "auction_slug", None), + gifts_per_round=getattr(star_gift, "gifts_per_round", None), + auction_start_date=utils.timestamp_to_datetime( + getattr(star_gift, "auction_start_date", None), + ), + upgrade_variants=getattr(star_gift, "upgrade_variants", None), + is_unique=False, + client=client, + ) + if isinstance(star_gift, raw.types.StarGiftUnique): + return Gift( + id=star_gift.id, + gift_id=star_gift.gift_id, + title=star_gift.title, + slug=star_gift.slug, + num=star_gift.num, + owner_id=utils.get_raw_peer_id(star_gift.owner_id) + if star_gift.owner_id + else None, + owner_name=star_gift.owner_name, + owner_address=star_gift.owner_address, + total_count=star_gift.availability_total, + gift_address=star_gift.gift_address, + released_by=utils.get_raw_peer_id(star_gift.released_by) + if star_gift.released_by + else None, + value_amount=star_gift.value_amount, + value_currency=star_gift.value_currency, + value_usd_amount=star_gift.value_usd_amount, + require_premium=star_gift.require_premium, + craft_chance_permille=star_gift.craft_chance_permille, + is_unique=True, + client=client, + ) + return None diff --git a/pyrogram/types/user_and_chats/chat.py b/pyrogram/types/user_and_chats/chat.py index 94ac7b44e..ae99c9010 100644 --- a/pyrogram/types/user_and_chats/chat.py +++ b/pyrogram/types/user_and_chats/chat.py @@ -63,6 +63,30 @@ class Chat(Object): is_paid_reactions_available (``bool``, *optional*): True, if paid reactions enabled in this chat. + is_stories_hidden (``bool``, *optional*): + True, if stories from this chat are hidden. + + is_stories_hidden_min (``bool``, *optional*): + True, if stories from this chat are hidden for min users. + + is_stories_unavailable (``bool``, *optional*): + True, if stories from this chat are unavailable. + + is_signature_profiles (``bool``, *optional*): + True, if signature profiles are enabled in this chat. + + is_autotranslation (``bool``, *optional*): + True, if autotranslation is enabled in this chat. + + is_broadcast_messages_allowed (``bool``, *optional*): + True, if broadcast messages are allowed in this chat. + + is_monoforum (``bool``, *optional*): + True, if monoforum is enabled in this chat. + + is_forum_tabs (``bool``, *optional*): + True, if forum tabs are enabled in this chat. + title (``str``, *optional*): Title, for supergroups, channels and basic group chats. @@ -189,8 +213,17 @@ class Chat(Object): can_enable_paid_reaction (``bool``, *optional*): True, if paid reaction can be enabled in the channel chat; for channels only. - max_reaction_count (``int``): - The maximum number of reactions that can be set on a message in the chat + max_reaction_count (``int``, *optional*): + The maximum number of reactions that can be set on a message in the chat. + + bot_verification_icon (``int``, *optional*): + Identifier of the custom emoji used as a verification icon. + + send_paid_messages_stars (``int``, *optional*): + Amount of stars required to send a paid message to this chat. + + linked_monoforum_id (``int``, *optional*): + Identifier of the linked monoforum. """ def __init__( @@ -211,6 +244,14 @@ def __init__( is_join_to_send: bool | None = None, is_antispam: bool | None = None, is_slowmode_enabled: bool | None = None, + is_stories_hidden: bool | None = None, + is_stories_hidden_min: bool | None = None, + is_stories_unavailable: bool | None = None, + is_signature_profiles: bool | None = None, + is_autotranslation: bool | None = None, + is_broadcast_messages_allowed: bool | None = None, + is_monoforum: bool | None = None, + is_forum_tabs: bool | None = None, title: str | None = None, is_paid_reactions_available: bool | None = None, username: str | None = None, @@ -246,6 +287,9 @@ def __init__( subscription_until_date: datetime | None = None, can_enable_paid_reaction: bool | None = None, max_reaction_count: int | None = None, + bot_verification_icon: int | None = None, + send_paid_messages_stars: int | None = None, + linked_monoforum_id: int | None = None, ) -> None: super().__init__(client) @@ -263,6 +307,14 @@ def __init__( self.is_join_to_send = is_join_to_send self.is_antispam = is_antispam self.is_slowmode_enabled = is_slowmode_enabled + self.is_stories_hidden = is_stories_hidden + self.is_stories_hidden_min = is_stories_hidden_min + self.is_stories_unavailable = is_stories_unavailable + self.is_signature_profiles = is_signature_profiles + self.is_autotranslation = is_autotranslation + self.is_broadcast_messages_allowed = is_broadcast_messages_allowed + self.is_monoforum = is_monoforum + self.is_forum_tabs = is_forum_tabs self.title = title self.is_paid_reactions_available = is_paid_reactions_available self.username = username @@ -298,6 +350,9 @@ def __init__( self.subscription_until_date = subscription_until_date self.can_enable_paid_reaction = can_enable_paid_reaction self.max_reaction_count = max_reaction_count + self.bot_verification_icon = bot_verification_icon + self.send_paid_messages_stars = send_paid_messages_stars + self.linked_monoforum_id = linked_monoforum_id @property def full_name(self) -> str: @@ -404,6 +459,18 @@ def _parse_channel_chat(client, channel: raw.types.Channel) -> Chat: is_join_request=getattr(channel, "join_request", None), is_join_to_send=getattr(channel, "join_to_send", None), is_slowmode_enabled=getattr(channel, "slowmode_enabled", None), + is_stories_hidden=getattr(channel, "stories_hidden", None), + is_stories_hidden_min=getattr(channel, "stories_hidden_min", None), + is_stories_unavailable=getattr(channel, "stories_unavailable", None), + is_signature_profiles=getattr(channel, "signature_profiles", None), + is_autotranslation=getattr(channel, "autotranslation", None), + is_broadcast_messages_allowed=getattr( + channel, + "broadcast_messages_allowed", + None, + ), + is_monoforum=getattr(channel, "monoforum", None), + is_forum_tabs=getattr(channel, "forum_tabs", None), title=channel.title, username=user_name, usernames=usernames, @@ -427,6 +494,13 @@ def _parse_channel_chat(client, channel: raw.types.Channel) -> Chat: getattr(channel, "subscription_until_date", None), ), reply_color=types.ChatColor._parse(getattr(channel, "color", None)), + bot_verification_icon=getattr(channel, "bot_verification_icon", None), + send_paid_messages_stars=getattr( + channel, + "send_paid_messages_stars", + None, + ), + linked_monoforum_id=getattr(channel, "linked_monoforum_id", None), client=client, ) diff --git a/pyrogram/types/user_and_chats/chat_privileges.py b/pyrogram/types/user_and_chats/chat_privileges.py index 9752fe886..5d0763165 100644 --- a/pyrogram/types/user_and_chats/chat_privileges.py +++ b/pyrogram/types/user_and_chats/chat_privileges.py @@ -66,6 +66,9 @@ class ChatPrivileges(Object): Channels only. True, if the administrator can delete stories in the channel. + can_manage_direct_messages (``bool``, *optional*): + True, if the administrator can manage direct messages. + is_anonymous (``bool``, *optional*): True, if the user's presence in the chat is hidden. """ @@ -87,6 +90,7 @@ def __init__( can_post_stories: bool = False, can_edit_stories: bool = False, can_delete_stories: bool = False, + can_manage_direct_messages: bool = False, is_anonymous: bool = False, ) -> None: super().__init__(None) @@ -105,6 +109,7 @@ def __init__( 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: bool = can_manage_direct_messages self.is_anonymous: bool = is_anonymous @staticmethod @@ -126,5 +131,6 @@ def _parse( can_post_stories=admin_rights.post_stories, can_edit_stories=admin_rights.edit_stories, can_delete_stories=admin_rights.delete_stories, + can_manage_direct_messages=admin_rights.manage_direct_messages, is_anonymous=admin_rights.anonymous, ) diff --git a/pyrogram/types/user_and_chats/user.py b/pyrogram/types/user_and_chats/user.py index 24f66bf70..747faac72 100644 --- a/pyrogram/types/user_and_chats/user.py +++ b/pyrogram/types/user_and_chats/user.py @@ -86,6 +86,27 @@ class User(Object, Update): is_bot_business (``bool``, *optional*): True, if this bot can connect to business account. + is_bot_can_edit (``bool``, *optional*): + True, if this bot can be edited by the current user. + + is_close_friend (``bool``, *optional*): + True, if this user is a close friend. + + is_stories_hidden (``bool``, *optional*): + True, if stories from this user are hidden. + + is_stories_unavailable (``bool``, *optional*): + True, if stories from this user are unavailable. + + is_bot_has_main_app (``bool``, *optional*): + True, if this bot has a main app. + + is_bot_forum_view (``bool``, *optional*): + True, if this bot has forum view enabled. + + is_bot_forum_can_manage_topics (``bool``, *optional*): + True, if this bot can manage forum topics. + first_name (``str``, *optional*): User's or bot's first name. @@ -147,6 +168,12 @@ class User(Object, Update): active_users (``int``, *optional*): Bot's active users count. + + bot_verification_icon (``int``, *optional*): + Identifier of the custom emoji used as a verification icon. + + send_paid_messages_stars (``int``, *optional*): + Amount of stars required to send a paid message to this user. """ def __init__( @@ -167,6 +194,13 @@ def __init__( is_premium: bool | None = None, is_contacts_only: bool | None = None, is_bot_business: bool | None = None, + is_bot_can_edit: bool | None = None, + is_close_friend: bool | None = None, + is_stories_hidden: bool | None = None, + is_stories_unavailable: bool | None = None, + is_bot_has_main_app: bool | None = None, + is_bot_forum_view: bool | None = None, + is_bot_forum_can_manage_topics: bool | None = None, first_name: str | None = None, last_name: str | None = None, status: enums.UserStatus = None, @@ -183,6 +217,8 @@ def __init__( reply_color: types.ChatColor = None, profile_color: types.ChatColor = None, active_users: int | None = None, + bot_verification_icon: int | None = None, + send_paid_messages_stars: int | None = None, ) -> None: super().__init__(client) @@ -200,6 +236,13 @@ def __init__( self.is_premium = is_premium self.is_contacts_only = is_contacts_only self.is_bot_business = is_bot_business + self.is_bot_can_edit = is_bot_can_edit + self.is_close_friend = is_close_friend + self.is_stories_hidden = is_stories_hidden + self.is_stories_unavailable = is_stories_unavailable + self.is_bot_has_main_app = is_bot_has_main_app + self.is_bot_forum_view = is_bot_forum_view + self.is_bot_forum_can_manage_topics = is_bot_forum_can_manage_topics self.first_name = first_name self.last_name = last_name self.status = status @@ -216,6 +259,8 @@ def __init__( self.reply_color = reply_color self.profile_color = profile_color self.active_users = active_users + self.bot_verification_icon = bot_verification_icon + self.send_paid_messages_stars = send_paid_messages_stars @property def full_name(self) -> str: @@ -263,6 +308,17 @@ def _parse(client, user: raw.base.User) -> User | None: is_premium=user.premium, is_contacts_only=user.contact_require_premium, is_bot_business=user.bot_business, + is_bot_can_edit=getattr(user, "bot_can_edit", None), + is_close_friend=getattr(user, "close_friend", None), + is_stories_hidden=getattr(user, "stories_hidden", None), + is_stories_unavailable=getattr(user, "stories_unavailable", None), + is_bot_has_main_app=getattr(user, "bot_has_main_app", None), + is_bot_forum_view=getattr(user, "bot_forum_view", None), + is_bot_forum_can_manage_topics=getattr( + user, + "bot_forum_can_manage_topics", + None, + ), first_name=user.first_name, last_name=user.last_name, **User._parse_status(user.status, user.bot), @@ -287,6 +343,8 @@ def _parse(client, user: raw.base.User) -> User | None: getattr(user, "profile_color", None), ), active_users=active_users, + bot_verification_icon=getattr(user, "bot_verification_icon", None), + send_paid_messages_stars=getattr(user, "send_paid_messages_stars", None), client=client, ) diff --git a/pyrogram/utils.py b/pyrogram/utils.py index 98dfdfa65..db8c5779a 100644 --- a/pyrogram/utils.py +++ b/pyrogram/utils.py @@ -421,3 +421,11 @@ async def get_reply_to( peer = await client.resolve_peer(chat_id) reply_to = types.InputReplyToStory(peer=peer, story_id=reply_to_story_id) return reply_to + + +async def get_input_quick_reply_shortcut( + shortcut: str | int, +) -> raw.base.InputQuickReplyShortcut: + if isinstance(shortcut, int): + return raw.types.InputQuickReplyShortcutId(shortcut_id=shortcut) + return raw.types.InputQuickReplyShortcut(shortcut=shortcut) From 3ca1f10af60d9fb4a780a217c8474dddf7318cac Mon Sep 17 00:00:00 2001 From: 5hojib Date: Mon, 9 Feb 2026 15:39:38 +0000 Subject: [PATCH 07/17] InkyPinkyPonky [no ci] Signed-off-by: 5hojib --- compiler/api/scrape_docs.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/compiler/api/scrape_docs.py b/compiler/api/scrape_docs.py index 33829e76c..bcf3e1042 100644 --- a/compiler/api/scrape_docs.py +++ b/compiler/api/scrape_docs.py @@ -34,7 +34,8 @@ SECTION_RE = re.compile(r"---(\w+)---") COMBINATOR_RE = re.compile( - r"^([\w.]+)#([0-9a-f]+)\s(?:.*)=\s([\w<>.]+);$", re.MULTILINE + r"^([\w.]+)#([0-9a-f]+)\s(?:.*)=\s([\w<>.]+);$", + re.MULTILINE, ) @@ -71,7 +72,7 @@ async def main(): print(f"Parsing items {it_count_done}/{it_count}", end="\r", flush=True) await sem.acquire() tasks.append( - asyncio.create_task(get_object_data(it_type, it_name, doc_dict)) + asyncio.create_task(get_object_data(it_type, it_name, doc_dict)), ) # Be sure that all tasks are done before continuing @@ -81,7 +82,8 @@ async def main(): await client.aclose() with (ROOT_DIR / "compiler" / "api" / "docs.json").open( - "w", encoding="utf-8" + "w", + encoding="utf-8", ) as f: json.dump(doc_dict, f, indent=2, sort_keys=True) From 05aa52d04a7915a44803521f1ef95173858f0e01 Mon Sep 17 00:00:00 2001 From: 5hojib Date: Mon, 9 Feb 2026 21:43:35 +0600 Subject: [PATCH 08/17] update pyproject.toml --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index f65e6a5a9..851ea90bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,6 +120,7 @@ ignore = [ "N806", "N818", "PLR09", + "COM812", # Don't remove "RUF002", "SIM115", "PERF203", From 9afafbe045260f61a7c35af5cd6c064ff85e178c Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Mon, 9 Feb 2026 22:49:47 +0600 Subject: [PATCH 09/17] fix(lint): resolve ASYNC240 errors by using anyio.Path (#61) Replaced blocking pathlib.Path methods (is_file, unlink, mkdir) with their asynchronous equivalents from anyio.Path in async functions. Added anyio as a dependency to the project. This prevents the event loop from being blocked during filesystem operations, improving performance and reliability of the library. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- pyproject.toml | 1 + pyrogram/client.py | 7 ++++-- pyrogram/methods/chats/set_chat_photo.py | 5 +++-- .../methods/messages/edit_inline_media.py | 6 ++++- .../methods/messages/edit_message_media.py | 22 ++++++++++++++----- pyrogram/methods/messages/send_animation.py | 4 +++- pyrogram/methods/messages/send_audio.py | 4 +++- pyrogram/methods/messages/send_document.py | 4 +++- pyrogram/methods/messages/send_media_group.py | 9 ++++---- pyrogram/methods/messages/send_paid_media.py | 6 +++-- pyrogram/methods/messages/send_photo.py | 5 +++-- pyrogram/methods/messages/send_sticker.py | 4 +++- pyrogram/methods/messages/send_video.py | 4 +++- pyrogram/methods/messages/send_video_note.py | 5 +++-- pyrogram/methods/messages/send_voice.py | 5 +++-- .../methods/stickers/add_sticker_to_set.py | 5 +++-- .../methods/stickers/create_sticker_set.py | 5 +++-- pyrogram/methods/stories/edit_story.py | 9 ++++---- pyrogram/methods/stories/send_story.py | 7 +++--- pyrogram/storage/file_storage.py | 10 ++++++--- uv.lock | 4 +++- 21 files changed, 89 insertions(+), 42 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 851ea90bc..9fd7a2f52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,6 +10,7 @@ dependencies = [ "pymediainfo", "pymongo", "ElectroCrypto", + "anyio>=4.12.1", ] requires-python = ">=3.10" diff --git a/pyrogram/client.py b/pyrogram/client.py index a640a1430..48072e32c 100644 --- a/pyrogram/client.py +++ b/pyrogram/client.py @@ -20,6 +20,8 @@ from pathlib import Path from typing import TYPE_CHECKING +from anyio import Path as AsyncPath + import pyrogram from pyrogram import __license__, __version__, enums, raw, utils from pyrogram.crypto import aes @@ -962,7 +964,8 @@ async def handle_download(self, packet) -> str: progress_args, ) = packet - Path(directory).mkdir(parents=True, exist_ok=True) if not in_memory else None + if not in_memory: + await AsyncPath(directory).mkdir(parents=True, exist_ok=True) temp_file_path = ( Path(directory) .joinpath(re.sub(r"\\", "/", file_name)) @@ -985,7 +988,7 @@ async def handle_download(self, packet) -> str: except BaseException as e: if not in_memory: file.close() - Path(temp_file_path).unlink() + await AsyncPath(temp_file_path).unlink() if isinstance(e, asyncio.CancelledError): raise e diff --git a/pyrogram/methods/chats/set_chat_photo.py b/pyrogram/methods/chats/set_chat_photo.py index 91c8c6096..5cc47ec02 100644 --- a/pyrogram/methods/chats/set_chat_photo.py +++ b/pyrogram/methods/chats/set_chat_photo.py @@ -1,8 +1,9 @@ from __future__ import annotations -from pathlib import Path from typing import BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import raw, utils from pyrogram.file_id import FileType @@ -69,7 +70,7 @@ async def set_chat_photo( peer = await self.resolve_peer(chat_id) if isinstance(photo, str): - if Path(photo).is_file(): + if await AsyncPath(photo).is_file(): photo = raw.types.InputChatUploadedPhoto( file=await self.save_file(photo), video=await self.save_file(video), diff --git a/pyrogram/methods/messages/edit_inline_media.py b/pyrogram/methods/messages/edit_inline_media.py index cd262b530..9a89a9005 100644 --- a/pyrogram/methods/messages/edit_inline_media.py +++ b/pyrogram/methods/messages/edit_inline_media.py @@ -5,6 +5,8 @@ import re from pathlib import Path +from anyio import Path as AsyncPath + import pyrogram from pyrogram import raw, types, utils from pyrogram.errors import MediaEmpty, RPCError @@ -63,7 +65,9 @@ async def edit_inline_media( parse_mode = media.parse_mode is_bytes_io = isinstance(media.media, io.BytesIO) - is_uploaded_file = is_bytes_io or Path(media.media).is_file() + is_uploaded_file = is_bytes_io or ( + isinstance(media.media, str) and await AsyncPath(media.media).is_file() + ) is_external_url = not is_uploaded_file and re.match( "^https?://", diff --git a/pyrogram/methods/messages/edit_message_media.py b/pyrogram/methods/messages/edit_message_media.py index dbee0e917..79eaac145 100644 --- a/pyrogram/methods/messages/edit_message_media.py +++ b/pyrogram/methods/messages/edit_message_media.py @@ -4,6 +4,8 @@ import re from pathlib import Path +from anyio import Path as AsyncPath + import pyrogram from pyrogram import enums, raw, types, utils from pyrogram.file_id import FileType @@ -90,7 +92,9 @@ async def edit_message_media( ).values() if isinstance(media, types.InputMediaPhoto): - if isinstance(media.media, io.BytesIO) or Path(media.media).is_file(): + if isinstance(media.media, io.BytesIO) or ( + isinstance(media.media, str) and await AsyncPath(media.media).is_file() + ): uploaded_media = await self.invoke( raw.functions.messages.UploadMedia( peer=await self.resolve_peer(chat_id), @@ -120,7 +124,9 @@ async def edit_message_media( FileType.PHOTO, ) elif isinstance(media, types.InputMediaVideo): - if isinstance(media.media, io.BytesIO) or Path(media.media).is_file(): + if isinstance(media.media, io.BytesIO) or ( + isinstance(media.media, str) and await AsyncPath(media.media).is_file() + ): uploaded_media = await self.invoke( raw.functions.messages.UploadMedia( peer=await self.resolve_peer(chat_id), @@ -165,7 +171,9 @@ async def edit_message_media( FileType.VIDEO, ) elif isinstance(media, types.InputMediaAudio): - if isinstance(media.media, io.BytesIO) or Path(media.media).is_file(): + if isinstance(media.media, io.BytesIO) or ( + isinstance(media.media, str) and await AsyncPath(media.media).is_file() + ): media = await self.invoke( raw.functions.messages.UploadMedia( peer=await self.resolve_peer(chat_id), @@ -203,7 +211,9 @@ async def edit_message_media( FileType.AUDIO, ) elif isinstance(media, types.InputMediaAnimation): - if isinstance(media.media, io.BytesIO) or Path(media.media).is_file(): + if isinstance(media.media, io.BytesIO) or ( + isinstance(media.media, str) and await AsyncPath(media.media).is_file() + ): uploaded_media = await self.invoke( raw.functions.messages.UploadMedia( peer=await self.resolve_peer(chat_id), @@ -248,7 +258,9 @@ async def edit_message_media( FileType.ANIMATION, ) elif isinstance(media, types.InputMediaDocument): - if isinstance(media.media, io.BytesIO) or Path(media.media).is_file(): + if isinstance(media.media, io.BytesIO) or ( + isinstance(media.media, str) and await AsyncPath(media.media).is_file() + ): media = await self.invoke( raw.functions.messages.UploadMedia( peer=await self.resolve_peer(chat_id), diff --git a/pyrogram/methods/messages/send_animation.py b/pyrogram/methods/messages/send_animation.py index 8828a5758..b4956ef94 100644 --- a/pyrogram/methods/messages/send_animation.py +++ b/pyrogram/methods/messages/send_animation.py @@ -4,6 +4,8 @@ from pathlib import Path from typing import TYPE_CHECKING, BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import StopTransmissionError, enums, raw, types, utils from pyrogram.errors import FilePartMissing @@ -246,7 +248,7 @@ async def progress(current, total): try: if isinstance(animation, str): - if Path(animation).is_file(): + if await AsyncPath(animation).is_file(): thumb = await self.save_file(thumb) file = await self.save_file( animation, diff --git a/pyrogram/methods/messages/send_audio.py b/pyrogram/methods/messages/send_audio.py index 1fb57a008..16cb7c2ef 100644 --- a/pyrogram/methods/messages/send_audio.py +++ b/pyrogram/methods/messages/send_audio.py @@ -4,6 +4,8 @@ from pathlib import Path from typing import TYPE_CHECKING, BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import StopTransmissionError, enums, raw, types, utils from pyrogram.errors import FilePartMissing @@ -204,7 +206,7 @@ async def progress(current, total): try: if isinstance(audio, str): - if Path(audio).is_file(): + if await AsyncPath(audio).is_file(): thumb = await self.save_file(thumb) file = await self.save_file( audio, diff --git a/pyrogram/methods/messages/send_document.py b/pyrogram/methods/messages/send_document.py index 40e631bdb..a9f7de44c 100644 --- a/pyrogram/methods/messages/send_document.py +++ b/pyrogram/methods/messages/send_document.py @@ -4,6 +4,8 @@ from pathlib import Path from typing import TYPE_CHECKING, BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import StopTransmissionError, enums, raw, types, utils from pyrogram.errors import FilePartMissing @@ -191,7 +193,7 @@ async def progress(current, total): try: if isinstance(document, str): - if Path(document).is_file(): + if await AsyncPath(document).is_file(): thumb = await self.save_file(thumb) file = await self.save_file( document, diff --git a/pyrogram/methods/messages/send_media_group.py b/pyrogram/methods/messages/send_media_group.py index 321d83c85..d6cabe1ca 100644 --- a/pyrogram/methods/messages/send_media_group.py +++ b/pyrogram/methods/messages/send_media_group.py @@ -5,6 +5,7 @@ from pathlib import Path from typing import TYPE_CHECKING +from anyio import Path as AsyncPath from pymediainfo import MediaInfo import pyrogram @@ -171,7 +172,7 @@ async def send_media_group( for i in media: if isinstance(i, types.InputMediaPhoto): if isinstance(i.media, str): - if Path(i.media).is_file(): + if await AsyncPath(i.media).is_file(): media = await self.invoke( raw.functions.messages.UploadMedia( peer=await self.resolve_peer(chat_id), @@ -236,7 +237,7 @@ async def send_media_group( elif isinstance(i, types.InputMediaVideo | types.InputMediaAnimation): if isinstance(i.media, str): is_animation = False - if Path(i.media).is_file(): + if await AsyncPath(i.media).is_file(): try: videoInfo = MediaInfo.parse(i.media) except OSError: @@ -353,7 +354,7 @@ async def send_media_group( ) elif isinstance(i, types.InputMediaAudio): if isinstance(i.media, str): - if Path(i.media).is_file(): + if await AsyncPath(i.media).is_file(): media = await self.invoke( raw.functions.messages.UploadMedia( peer=await self.resolve_peer(chat_id), @@ -443,7 +444,7 @@ async def send_media_group( ) elif isinstance(i, types.InputMediaDocument): if isinstance(i.media, str): - if Path(i.media).is_file(): + if await AsyncPath(i.media).is_file(): media = await self.invoke( raw.functions.messages.UploadMedia( peer=await self.resolve_peer(chat_id), diff --git a/pyrogram/methods/messages/send_paid_media.py b/pyrogram/methods/messages/send_paid_media.py index 98c46987a..66d3ca7e0 100644 --- a/pyrogram/methods/messages/send_paid_media.py +++ b/pyrogram/methods/messages/send_paid_media.py @@ -4,6 +4,8 @@ from pathlib import Path from typing import TYPE_CHECKING +from anyio import Path as AsyncPath + import pyrogram from pyrogram import enums, raw, types, utils from pyrogram.file_id import FileType @@ -78,7 +80,7 @@ async def send_paid_media( for i in media: if isinstance(i, types.InputPaidMediaPhoto): if isinstance(i.media, str): - if Path(i.media).is_file(): + if await AsyncPath(i.media).is_file(): media = await self.invoke( raw.functions.messages.UploadMedia( peer=await self.resolve_peer(chat_id), @@ -134,7 +136,7 @@ async def send_paid_media( ) elif isinstance(i, types.InputPaidMediaVideo): if isinstance(i.media, str): - if Path(i.media).is_file(): + if await AsyncPath(i.media).is_file(): attributes = [ raw.types.DocumentAttributeVideo( supports_streaming=i.supports_streaming or None, diff --git a/pyrogram/methods/messages/send_photo.py b/pyrogram/methods/messages/send_photo.py index a50f39975..ec6aac473 100644 --- a/pyrogram/methods/messages/send_photo.py +++ b/pyrogram/methods/messages/send_photo.py @@ -1,9 +1,10 @@ from __future__ import annotations import re -from pathlib import Path from typing import TYPE_CHECKING, BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import enums, raw, types, utils from pyrogram.errors import FilePartMissing @@ -224,7 +225,7 @@ async def send_photo( try: if isinstance(photo, str): - if Path(photo).is_file(): + if await AsyncPath(photo).is_file(): file = await self.save_file( photo, progress=progress, diff --git a/pyrogram/methods/messages/send_sticker.py b/pyrogram/methods/messages/send_sticker.py index 4c5d7fdfe..f98e357cf 100644 --- a/pyrogram/methods/messages/send_sticker.py +++ b/pyrogram/methods/messages/send_sticker.py @@ -4,6 +4,8 @@ from pathlib import Path from typing import TYPE_CHECKING, BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import StopTransmissionError, enums, raw, types, utils from pyrogram.errors import FilePartMissing @@ -165,7 +167,7 @@ async def send_sticker( try: if isinstance(sticker, str): - if Path(sticker).is_file(): + if await AsyncPath(sticker).is_file(): file = await self.save_file( sticker, progress=progress, diff --git a/pyrogram/methods/messages/send_video.py b/pyrogram/methods/messages/send_video.py index d6bd0f97f..2a61e4106 100644 --- a/pyrogram/methods/messages/send_video.py +++ b/pyrogram/methods/messages/send_video.py @@ -4,6 +4,8 @@ from pathlib import Path from typing import TYPE_CHECKING, BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import StopTransmissionError, enums, raw, types, utils from pyrogram.errors import FilePartMissing @@ -251,7 +253,7 @@ async def progress(current, total): try: if isinstance(video, str): - if Path(video).is_file(): + if await AsyncPath(video).is_file(): thumb = await self.save_file(thumb) file = await self.save_file( video, diff --git a/pyrogram/methods/messages/send_video_note.py b/pyrogram/methods/messages/send_video_note.py index bd7ebc9d9..72fb1ab0e 100644 --- a/pyrogram/methods/messages/send_video_note.py +++ b/pyrogram/methods/messages/send_video_note.py @@ -1,8 +1,9 @@ from __future__ import annotations -from pathlib import Path from typing import TYPE_CHECKING, BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import StopTransmissionError, enums, raw, types, utils from pyrogram.errors import FilePartMissing @@ -184,7 +185,7 @@ async def send_video_note( try: if isinstance(video_note, str): - if Path(video_note).is_file(): + if await AsyncPath(video_note).is_file(): thumb = await self.save_file(thumb) file = await self.save_file( video_note, diff --git a/pyrogram/methods/messages/send_voice.py b/pyrogram/methods/messages/send_voice.py index 8c7333c3f..4e262b84c 100644 --- a/pyrogram/methods/messages/send_voice.py +++ b/pyrogram/methods/messages/send_voice.py @@ -1,9 +1,10 @@ from __future__ import annotations import re -from pathlib import Path from typing import TYPE_CHECKING, BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import StopTransmissionError, enums, raw, types, utils from pyrogram.errors import FilePartMissing @@ -177,7 +178,7 @@ async def send_voice( try: if isinstance(voice, str): - if Path(voice).is_file(): + if await AsyncPath(voice).is_file(): file = await self.save_file( voice, progress=progress, diff --git a/pyrogram/methods/stickers/add_sticker_to_set.py b/pyrogram/methods/stickers/add_sticker_to_set.py index ee8c4d9f2..490f8686d 100644 --- a/pyrogram/methods/stickers/add_sticker_to_set.py +++ b/pyrogram/methods/stickers/add_sticker_to_set.py @@ -1,7 +1,8 @@ from __future__ import annotations import re -from pathlib import Path + +from anyio import Path as AsyncPath import pyrogram from pyrogram import raw, types @@ -41,7 +42,7 @@ async def add_sticker_to_set( """ if isinstance(sticker, str): - if Path(sticker).is_file() or re.match("^https?://", sticker): + if await AsyncPath(sticker).is_file() or re.match("^https?://", sticker): raise ValueError("file_id is invalid!") decoded = FileId.decode(sticker) media = raw.types.InputDocument( diff --git a/pyrogram/methods/stickers/create_sticker_set.py b/pyrogram/methods/stickers/create_sticker_set.py index 6028462f6..925957777 100644 --- a/pyrogram/methods/stickers/create_sticker_set.py +++ b/pyrogram/methods/stickers/create_sticker_set.py @@ -1,7 +1,8 @@ from __future__ import annotations import re -from pathlib import Path + +from anyio import Path as AsyncPath import pyrogram from pyrogram import raw, types @@ -58,7 +59,7 @@ async def create_sticker_set( """ if isinstance(sticker, str): - if Path(sticker).is_file() or re.match("^https?://", sticker): + if await AsyncPath(sticker).is_file() or re.match("^https?://", sticker): raise ValueError("file_id is invalid!") decoded = FileId.decode(sticker) media = raw.types.InputDocument( diff --git a/pyrogram/methods/stories/edit_story.py b/pyrogram/methods/stories/edit_story.py index 43705aa41..a5a5d47f4 100644 --- a/pyrogram/methods/stories/edit_story.py +++ b/pyrogram/methods/stories/edit_story.py @@ -2,7 +2,8 @@ from __future__ import annotations import re -from pathlib import Path + +from anyio import Path as AsyncPath import pyrogram from pyrogram import enums, raw, types, utils @@ -112,7 +113,7 @@ async def edit_story( if animation: if isinstance(animation, str): - if Path(animation).is_file(): + if await AsyncPath(animation).is_file(): file = await self.save_file(animation) media = raw.types.InputMediaUploadedDocument( mime_type=self.guess_mime_type(animation) or "video/mp4", @@ -151,7 +152,7 @@ async def edit_story( ) elif photo: if isinstance(photo, str): - if Path(photo).is_file(): + if await AsyncPath(photo).is_file(): file = await self.save_file(photo) media = raw.types.InputMediaUploadedPhoto(file=file) elif re.match("^https?://", photo): @@ -163,7 +164,7 @@ async def edit_story( media = raw.types.InputMediaUploadedPhoto(file=file) elif video: if isinstance(video, str): - if Path(video).is_file(): + if await AsyncPath(video).is_file(): file = await self.save_file(video) media = raw.types.InputMediaUploadedDocument( mime_type=self.guess_mime_type(video) or "video/mp4", diff --git a/pyrogram/methods/stories/send_story.py b/pyrogram/methods/stories/send_story.py index 6e002d4cf..7d619326b 100644 --- a/pyrogram/methods/stories/send_story.py +++ b/pyrogram/methods/stories/send_story.py @@ -2,9 +2,10 @@ from __future__ import annotations import re -from pathlib import Path from typing import BinaryIO +from anyio import Path as AsyncPath + import pyrogram from pyrogram import enums, raw, types, utils from pyrogram.file_id import FileType @@ -154,7 +155,7 @@ async def send_story( if photo: if isinstance(photo, str): - if Path(photo).is_file(): + if await AsyncPath(photo).is_file(): file = await self.save_file(photo) media = raw.types.InputMediaUploadedPhoto(file=file) elif re.match("^https?://", photo): @@ -166,7 +167,7 @@ async def send_story( media = raw.types.InputMediaUploadedPhoto(file=file) elif video: if isinstance(video, str): - if Path(video).is_file(): + if await AsyncPath(video).is_file(): file = await self.save_file(video) media = raw.types.InputMediaUploadedDocument( mime_type=self.guess_mime_type(video) or "video/mp4", diff --git a/pyrogram/storage/file_storage.py b/pyrogram/storage/file_storage.py index f418ca9b7..95c6f435f 100644 --- a/pyrogram/storage/file_storage.py +++ b/pyrogram/storage/file_storage.py @@ -1,12 +1,16 @@ from __future__ import annotations import logging -from pathlib import Path +from typing import TYPE_CHECKING import aiosqlite +from anyio import Path as AsyncPath from .sqlite_storage import SQLiteStorage +if TYPE_CHECKING: + from pathlib import Path + log = logging.getLogger(__name__) UPDATE_STATE_SCHEMA = """ @@ -54,7 +58,7 @@ async def update(self) -> None: async def open(self) -> None: path = self.database - file_exists = path.is_file() + file_exists = await AsyncPath(path).is_file() self.conn = await aiosqlite.connect(str(path), timeout=1) @@ -69,4 +73,4 @@ async def open(self) -> None: await self.conn.commit() async def delete(self) -> None: - Path(self.database).unlink() + await AsyncPath(self.database).unlink() diff --git a/uv.lock b/uv.lock index 58f3d4636..938833753 100644 --- a/uv.lock +++ b/uv.lock @@ -628,6 +628,7 @@ name = "electrogram" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, + { name = "anyio" }, { name = "electrocrypto" }, { name = "pymediainfo" }, { name = "pymongo" }, @@ -654,6 +655,7 @@ docs = [ [package.metadata] requires-dist = [ { name = "aiosqlite" }, + { name = "anyio", specifier = ">=4.12.1" }, { name = "electrocrypto" }, { name = "hatch", marker = "extra == 'dev'" }, { name = "pymediainfo" }, @@ -676,7 +678,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ From 6eaecd3cdeb97dab8f973adc7632ec28371a3fcc Mon Sep 17 00:00:00 2001 From: 5hojib Date: Mon, 9 Feb 2026 17:50:03 +0000 Subject: [PATCH 10/17] InkyPinkyPonky [no ci] Signed-off-by: 5hojib --- pyrogram/methods/messages/edit_message_media.py | 15 ++++++++++----- uv.lock | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/pyrogram/methods/messages/edit_message_media.py b/pyrogram/methods/messages/edit_message_media.py index 79eaac145..1f49ae771 100644 --- a/pyrogram/methods/messages/edit_message_media.py +++ b/pyrogram/methods/messages/edit_message_media.py @@ -93,7 +93,8 @@ async def edit_message_media( if isinstance(media, types.InputMediaPhoto): if isinstance(media.media, io.BytesIO) or ( - isinstance(media.media, str) and await AsyncPath(media.media).is_file() + isinstance(media.media, str) + and await AsyncPath(media.media).is_file() ): uploaded_media = await self.invoke( raw.functions.messages.UploadMedia( @@ -125,7 +126,8 @@ async def edit_message_media( ) elif isinstance(media, types.InputMediaVideo): if isinstance(media.media, io.BytesIO) or ( - isinstance(media.media, str) and await AsyncPath(media.media).is_file() + isinstance(media.media, str) + and await AsyncPath(media.media).is_file() ): uploaded_media = await self.invoke( raw.functions.messages.UploadMedia( @@ -172,7 +174,8 @@ async def edit_message_media( ) elif isinstance(media, types.InputMediaAudio): if isinstance(media.media, io.BytesIO) or ( - isinstance(media.media, str) and await AsyncPath(media.media).is_file() + isinstance(media.media, str) + and await AsyncPath(media.media).is_file() ): media = await self.invoke( raw.functions.messages.UploadMedia( @@ -212,7 +215,8 @@ async def edit_message_media( ) elif isinstance(media, types.InputMediaAnimation): if isinstance(media.media, io.BytesIO) or ( - isinstance(media.media, str) and await AsyncPath(media.media).is_file() + isinstance(media.media, str) + and await AsyncPath(media.media).is_file() ): uploaded_media = await self.invoke( raw.functions.messages.UploadMedia( @@ -259,7 +263,8 @@ async def edit_message_media( ) elif isinstance(media, types.InputMediaDocument): if isinstance(media.media, io.BytesIO) or ( - isinstance(media.media, str) and await AsyncPath(media.media).is_file() + isinstance(media.media, str) + and await AsyncPath(media.media).is_file() ): media = await self.invoke( raw.functions.messages.UploadMedia( diff --git a/uv.lock b/uv.lock index 938833753..c14cda6f5 100644 --- a/uv.lock +++ b/uv.lock @@ -678,7 +678,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ From 22d0b5c6e917ee1e783548bd24d2d8b9267cca0d Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Tue, 10 Feb 2026 02:03:02 +0600 Subject: [PATCH 11/17] Add ButtonStyle enum and integrate it into button types (#62) This change introduces the `ButtonStyle` enum in `pyrogram.enums` with `PRIMARY`, `DANGER`, and `SUCCESS` values. It also updates `InlineKeyboardButton`, `KeyboardButton`, and `InlineKeyboardButtonBuy` to accept this enum for their `style` parameter, making it easier to style buttons without manually instantiating `KeyboardButtonStyle`. A new static method `_parse` was added to `KeyboardButtonStyle` to handle the conversion from `ButtonStyle` to `KeyboardButtonStyle`. Example usage: ```python InlineKeyboardButton(text="E", switch_inline_query="E", style=ButtonStyle.SUCCESS) ``` Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- pyrogram/enums/__init__.py | 2 ++ pyrogram/enums/button_style.py | 18 ++++++++++++++++++ .../inline_keyboard_button.py | 8 ++++---- .../inline_keyboard_button_buy.py | 8 ++++---- .../bots_and_keyboards/keyboard_button.py | 9 +++++---- .../keyboard_button_style.py | 19 ++++++++++++++++++- 6 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 pyrogram/enums/button_style.py diff --git a/pyrogram/enums/__init__.py b/pyrogram/enums/__init__.py index 0c9af1438..803a9c8b2 100644 --- a/pyrogram/enums/__init__.py +++ b/pyrogram/enums/__init__.py @@ -1,6 +1,7 @@ from __future__ import annotations from .accent_color import AccentColor +from .button_style import ButtonStyle from .business_schedule import BusinessSchedule from .chat_action import ChatAction from .chat_event_action import ChatEventAction @@ -29,6 +30,7 @@ __all__ = [ "AccentColor", + "ButtonStyle", "BusinessSchedule", "ChatAction", "ChatEventAction", diff --git a/pyrogram/enums/button_style.py b/pyrogram/enums/button_style.py new file mode 100644 index 000000000..8d073ebf8 --- /dev/null +++ b/pyrogram/enums/button_style.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from enum import auto + +from .auto_name import AutoName + + +class ButtonStyle(AutoName): + """Button style enumeration.""" + + PRIMARY = auto() + """Primary button style.""" + + DANGER = auto() + """Danger button style.""" + + SUCCESS = auto() + """Success button style.""" diff --git a/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py b/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py index f65e19e2a..125489904 100644 --- a/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py +++ b/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py @@ -1,7 +1,7 @@ from __future__ import annotations import pyrogram -from pyrogram import raw, types +from pyrogram import enums, raw, types from pyrogram.types.object import Object @@ -57,7 +57,7 @@ class InlineKeyboardButton(Object): copy_text (``str``, *optional*): A button that copies the text to the clipboard. - style (:obj:`~pyrogram.types.KeyboardButtonStyle`, *optional*): + style (:obj:`~pyrogram.types.KeyboardButtonStyle` | :obj:`~pyrogram.enums.ButtonStyle`, *optional*): Button style. """ @@ -74,7 +74,7 @@ def __init__( callback_game: types.CallbackGame | None = None, requires_password: bool | None = None, copy_text: str | None = None, - style: types.KeyboardButtonStyle | None = None, + style: types.KeyboardButtonStyle | enums.ButtonStyle | None = None, ) -> None: super().__init__() @@ -89,7 +89,7 @@ def __init__( self.callback_game = callback_game self.requires_password = requires_password self.copy_text = copy_text - self.style = style + self.style = types.KeyboardButtonStyle._parse(style) @staticmethod def read(b: raw.base.KeyboardButton): diff --git a/pyrogram/types/bots_and_keyboards/inline_keyboard_button_buy.py b/pyrogram/types/bots_and_keyboards/inline_keyboard_button_buy.py index 72603dd19..7d86c11e8 100644 --- a/pyrogram/types/bots_and_keyboards/inline_keyboard_button_buy.py +++ b/pyrogram/types/bots_and_keyboards/inline_keyboard_button_buy.py @@ -1,7 +1,7 @@ from __future__ import annotations import pyrogram -from pyrogram import raw, types +from pyrogram import enums, raw, types from pyrogram.types.object import Object @@ -14,19 +14,19 @@ class InlineKeyboardButtonBuy(Object): Text of the button. If none of the optional fields are used, it will be sent as a message when the button is pressed. - style (:obj:`~pyrogram.types.KeyboardButtonStyle`, *optional*): + style (:obj:`~pyrogram.types.KeyboardButtonStyle` | :obj:`~pyrogram.enums.ButtonStyle`, *optional*): Button style. """ def __init__( self, text: str, - style: types.KeyboardButtonStyle | None = None, + style: types.KeyboardButtonStyle | enums.ButtonStyle | None = None, ) -> None: super().__init__() self.text = str(text) - self.style = style + self.style = types.KeyboardButtonStyle._parse(style) @staticmethod def read(b): diff --git a/pyrogram/types/bots_and_keyboards/keyboard_button.py b/pyrogram/types/bots_and_keyboards/keyboard_button.py index 6d8ea4b83..cb1772dbe 100644 --- a/pyrogram/types/bots_and_keyboards/keyboard_button.py +++ b/pyrogram/types/bots_and_keyboards/keyboard_button.py @@ -1,6 +1,7 @@ from __future__ import annotations -from pyrogram import raw, types +import pyrogram +from pyrogram import enums, raw, types from pyrogram.types.object import Object @@ -35,7 +36,7 @@ class KeyboardButton(Object): button is pressed. The Web App will be able to send a “web_app_data” service message. Available in private chats only. - style (:obj:`~pyrogram.types.KeyboardButtonStyle`, *optional*): + style (:obj:`~pyrogram.types.KeyboardButtonStyle` | :obj:`~pyrogram.enums.ButtonStyle`, *optional*): Button style. """ @@ -48,7 +49,7 @@ def __init__( | types.RequestPeerTypeChannel = None, request_user: types.RequestPeerTypeUser = None, web_app: types.WebAppInfo = None, - style: types.KeyboardButtonStyle = None, + style: types.KeyboardButtonStyle | enums.ButtonStyle = None, ) -> None: super().__init__() @@ -58,7 +59,7 @@ def __init__( self.request_chat = request_chat self.request_user = request_user self.web_app = web_app - self.style = style + self.style = types.KeyboardButtonStyle._parse(style) @staticmethod def read(b): diff --git a/pyrogram/types/bots_and_keyboards/keyboard_button_style.py b/pyrogram/types/bots_and_keyboards/keyboard_button_style.py index abc25d851..3270d7019 100644 --- a/pyrogram/types/bots_and_keyboards/keyboard_button_style.py +++ b/pyrogram/types/bots_and_keyboards/keyboard_button_style.py @@ -1,6 +1,7 @@ from __future__ import annotations -from pyrogram import raw +import pyrogram +from pyrogram import enums, raw from pyrogram.types.object import Object @@ -55,3 +56,19 @@ def write(self) -> raw.types.KeyboardButtonStyle: bg_success=self.bg_success, icon=self.icon, ) + + @staticmethod + def _parse( + style: KeyboardButtonStyle | enums.ButtonStyle | None, + ) -> KeyboardButtonStyle | None: + if style is None: + return None + + if isinstance(style, enums.ButtonStyle): + return KeyboardButtonStyle( + bg_primary=style == enums.ButtonStyle.PRIMARY, + bg_danger=style == enums.ButtonStyle.DANGER, + bg_success=style == enums.ButtonStyle.SUCCESS, + ) + + return style From ee107224feaee27d8553584676794e587728d015 Mon Sep 17 00:00:00 2001 From: 5hojib Date: Mon, 9 Feb 2026 20:03:23 +0000 Subject: [PATCH 12/17] InkyPinkyPonky [no ci] Signed-off-by: 5hojib --- pyrogram/enums/__init__.py | 4 ++-- pyrogram/types/bots_and_keyboards/keyboard_button.py | 1 - pyrogram/types/bots_and_keyboards/keyboard_button_style.py | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/pyrogram/enums/__init__.py b/pyrogram/enums/__init__.py index 803a9c8b2..b7418bbd1 100644 --- a/pyrogram/enums/__init__.py +++ b/pyrogram/enums/__init__.py @@ -1,8 +1,8 @@ from __future__ import annotations from .accent_color import AccentColor -from .button_style import ButtonStyle from .business_schedule import BusinessSchedule +from .button_style import ButtonStyle from .chat_action import ChatAction from .chat_event_action import ChatEventAction from .chat_join_type import ChatJoinType @@ -30,8 +30,8 @@ __all__ = [ "AccentColor", - "ButtonStyle", "BusinessSchedule", + "ButtonStyle", "ChatAction", "ChatEventAction", "ChatJoinType", diff --git a/pyrogram/types/bots_and_keyboards/keyboard_button.py b/pyrogram/types/bots_and_keyboards/keyboard_button.py index cb1772dbe..a82cd9f22 100644 --- a/pyrogram/types/bots_and_keyboards/keyboard_button.py +++ b/pyrogram/types/bots_and_keyboards/keyboard_button.py @@ -1,6 +1,5 @@ from __future__ import annotations -import pyrogram from pyrogram import enums, raw, types from pyrogram.types.object import Object diff --git a/pyrogram/types/bots_and_keyboards/keyboard_button_style.py b/pyrogram/types/bots_and_keyboards/keyboard_button_style.py index 3270d7019..41bf8f40e 100644 --- a/pyrogram/types/bots_and_keyboards/keyboard_button_style.py +++ b/pyrogram/types/bots_and_keyboards/keyboard_button_style.py @@ -1,6 +1,5 @@ from __future__ import annotations -import pyrogram from pyrogram import enums, raw from pyrogram.types.object import Object From 230d3ccb48f3fc09228cbc8133fbcf220b532b94 Mon Sep 17 00:00:00 2001 From: 5hojib Date: Tue, 10 Feb 2026 09:33:56 +0600 Subject: [PATCH 13/17] update scrape_docs.py --- compiler/api/scrape_docs.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/compiler/api/scrape_docs.py b/compiler/api/scrape_docs.py index bcf3e1042..37518448f 100644 --- a/compiler/api/scrape_docs.py +++ b/compiler/api/scrape_docs.py @@ -1,22 +1,3 @@ -#!/usr/bin/env python3 -# Hydrogram - Telegram MTProto API Client Library for Python -# Copyright (C) 2023-present Hydrogram -# -# This file is part of Hydrogram. -# -# Hydrogram is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Hydrogram is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with Hydrogram. If not, see . - from __future__ import annotations import asyncio From 50e9daa46d600e5b69733fe57ffd82c0a4c79cc3 Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Tue, 10 Feb 2026 10:06:13 +0600 Subject: [PATCH 14/17] feat: add icon field to high-level button classes (#64) This commit adds an `icon` parameter (of type `int`) to the high-level `InlineKeyboardButton`, `KeyboardButton`, and `InlineKeyboardButtonBuy` classes. This allows users to directly set a custom icon for buttons without having to manually construct a `KeyboardButtonStyle` object. The `KeyboardButtonStyle` class was also updated to ensure `icon` is treated as an integer throughout the library's high-level API. Docstrings were updated for all modified classes. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- .../types/bots_and_keyboards/inline_keyboard_button.py | 10 ++++++++++ .../bots_and_keyboards/inline_keyboard_button_buy.py | 10 ++++++++++ pyrogram/types/bots_and_keyboards/keyboard_button.py | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py b/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py index 125489904..2929b5d02 100644 --- a/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py +++ b/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py @@ -59,6 +59,9 @@ class InlineKeyboardButton(Object): style (:obj:`~pyrogram.types.KeyboardButtonStyle` | :obj:`~pyrogram.enums.ButtonStyle`, *optional*): Button style. + + icon (``int``, *optional*): + Custom icon for the button. """ def __init__( @@ -75,6 +78,7 @@ def __init__( requires_password: bool | None = None, copy_text: str | None = None, style: types.KeyboardButtonStyle | enums.ButtonStyle | None = None, + icon: int | None = None, ) -> None: super().__init__() @@ -91,6 +95,12 @@ def __init__( self.copy_text = copy_text self.style = types.KeyboardButtonStyle._parse(style) + if icon is not None: + if self.style is None: + self.style = types.KeyboardButtonStyle(icon=icon) + else: + self.style.icon = icon + @staticmethod def read(b: raw.base.KeyboardButton): style = types.KeyboardButtonStyle.read(getattr(b, "style", None)) diff --git a/pyrogram/types/bots_and_keyboards/inline_keyboard_button_buy.py b/pyrogram/types/bots_and_keyboards/inline_keyboard_button_buy.py index 7d86c11e8..68b8e6864 100644 --- a/pyrogram/types/bots_and_keyboards/inline_keyboard_button_buy.py +++ b/pyrogram/types/bots_and_keyboards/inline_keyboard_button_buy.py @@ -16,18 +16,28 @@ class InlineKeyboardButtonBuy(Object): style (:obj:`~pyrogram.types.KeyboardButtonStyle` | :obj:`~pyrogram.enums.ButtonStyle`, *optional*): Button style. + + icon (``int``, *optional*): + Custom icon for the button. """ def __init__( self, text: str, style: types.KeyboardButtonStyle | enums.ButtonStyle | None = None, + icon: int | None = None, ) -> None: super().__init__() self.text = str(text) self.style = types.KeyboardButtonStyle._parse(style) + if icon is not None: + if self.style is None: + self.style = types.KeyboardButtonStyle(icon=icon) + else: + self.style.icon = icon + @staticmethod def read(b): return InlineKeyboardButtonBuy( diff --git a/pyrogram/types/bots_and_keyboards/keyboard_button.py b/pyrogram/types/bots_and_keyboards/keyboard_button.py index a82cd9f22..b6d36e068 100644 --- a/pyrogram/types/bots_and_keyboards/keyboard_button.py +++ b/pyrogram/types/bots_and_keyboards/keyboard_button.py @@ -37,6 +37,9 @@ class KeyboardButton(Object): style (:obj:`~pyrogram.types.KeyboardButtonStyle` | :obj:`~pyrogram.enums.ButtonStyle`, *optional*): Button style. + + icon (``int``, *optional*): + Custom icon for the button. """ def __init__( @@ -49,6 +52,7 @@ def __init__( request_user: types.RequestPeerTypeUser = None, web_app: types.WebAppInfo = None, style: types.KeyboardButtonStyle | enums.ButtonStyle = None, + icon: int | None = None, ) -> None: super().__init__() @@ -60,6 +64,12 @@ def __init__( self.web_app = web_app self.style = types.KeyboardButtonStyle._parse(style) + if icon is not None: + if self.style is None: + self.style = types.KeyboardButtonStyle(icon=icon) + else: + self.style.icon = icon + @staticmethod def read(b): style = types.KeyboardButtonStyle.read(getattr(b, "style", None)) From e2909403403ce7df97ecd7858390def63035e238 Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Tue, 10 Feb 2026 11:45:18 +0600 Subject: [PATCH 15/17] Apply suggestions from code review Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- compiler/api/scrape_docs.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/compiler/api/scrape_docs.py b/compiler/api/scrape_docs.py index 37518448f..86a7f2adf 100644 --- a/compiler/api/scrape_docs.py +++ b/compiler/api/scrape_docs.py @@ -57,8 +57,8 @@ async def main(): ) # Be sure that all tasks are done before continuing - for task in tasks: - await task + await asyncio.gather(*tasks) + await client.aclose() @@ -105,12 +105,13 @@ async def get_object_data(it_type: str, it_name: str, doc_dict: dict[str, dict]) params_link_xp[0].getparent().getnext().xpath("./tbody[1]") ) if params_xp: - params = { - x.getchildren()[0].text_content().strip(): x.getchildren()[2] - .text_content() - .strip() - for x in params_xp[0].xpath("./tr") - } + params = {} + for row in params_xp[0].xpath("./tr"): + cells = row.getchildren() + if len(cells) >= 3: + params[cells[0].text_content().strip()] = ( + cells[2].text_content().strip() + ) else: print(f"No parameters for {it_type}/{it_name}") params = {} From d2320e21d79cbacc21ddd5c7c9b71b5606cbef83 Mon Sep 17 00:00:00 2001 From: 5hojib Date: Tue, 10 Feb 2026 05:45:38 +0000 Subject: [PATCH 16/17] InkyPinkyPonky [no ci] Signed-off-by: 5hojib --- compiler/api/scrape_docs.py | 1 - 1 file changed, 1 deletion(-) diff --git a/compiler/api/scrape_docs.py b/compiler/api/scrape_docs.py index 86a7f2adf..332e09ac7 100644 --- a/compiler/api/scrape_docs.py +++ b/compiler/api/scrape_docs.py @@ -59,7 +59,6 @@ async def main(): # Be sure that all tasks are done before continuing await asyncio.gather(*tasks) - await client.aclose() with (ROOT_DIR / "compiler" / "api" / "docs.json").open( From a748f6a9d411499debc311830de76570e2159068 Mon Sep 17 00:00:00 2001 From: Mehedi Hasan Shojib Date: Tue, 10 Feb 2026 12:07:23 +0600 Subject: [PATCH 17/17] Update __init__.py --- pyrogram/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrogram/__init__.py b/pyrogram/__init__.py index bd4ed9225..b9b89f5e3 100644 --- a/pyrogram/__init__.py +++ b/pyrogram/__init__.py @@ -1,6 +1,6 @@ from __future__ import annotations -__version__ = "v0.2.224.3" +__version__ = "v0.2.224.4" __license__ = "MIT License" from concurrent.futures.thread import ThreadPoolExecutor