1
0
mirror of https://github.com/danog/MadelineProto.git synced 2025-01-10 16:28:16 +01:00

Merge branch 'v8' into message_refactoring

This commit is contained in:
Daniil Gentili 2024-12-10 16:59:14 +00:00
commit 5c3318511a
29 changed files with 1133 additions and 339 deletions

View File

@ -162,6 +162,7 @@ Some of MadelineProto's core components are also available as separate, standalo
* [danog\MadelineProto\EventHandler\Message\Service\DialogGameScore »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGameScore.html) - Someone scored in a game. * [danog\MadelineProto\EventHandler\Message\Service\DialogGameScore »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGameScore.html) - Someone scored in a game.
* [danog\MadelineProto\EventHandler\Message\Service\DialogGeoProximityReached »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGeoProximityReached.html) - A user of the chat is now in proximity of another user. * [danog\MadelineProto\EventHandler\Message\Service\DialogGeoProximityReached »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGeoProximityReached.html) - A user of the chat is now in proximity of another user.
* [danog\MadelineProto\EventHandler\Message\Service\DialogGiftPremium »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGiftPremium.html) - Info about a gifted Telegram Premium subscription. * [danog\MadelineProto\EventHandler\Message\Service\DialogGiftPremium »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGiftPremium.html) - Info about a gifted Telegram Premium subscription.
* [danog\MadelineProto\EventHandler\Message\Service\DialogGiftStars »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGiftStars.html) - Info about a gifted Telegram Stars.
* [danog\MadelineProto\EventHandler\Message\Service\DialogGroupCall »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGroupCall.html) - Represents a service message about a group call. * [danog\MadelineProto\EventHandler\Message\Service\DialogGroupCall »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGroupCall.html) - Represents a service message about a group call.
* [danog\MadelineProto\EventHandler\Message\Service\DialogGroupCall\GroupCall »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGroupCall/GroupCall.html) - The group call has started or ended. * [danog\MadelineProto\EventHandler\Message\Service\DialogGroupCall\GroupCall »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGroupCall/GroupCall.html) - The group call has started or ended.
* [danog\MadelineProto\EventHandler\Message\Service\DialogGroupCall\GroupCallInvited »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGroupCall/GroupCallInvited.html) - A set of users was invited to the group call. * [danog\MadelineProto\EventHandler\Message\Service\DialogGroupCall\GroupCallInvited »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogGroupCall/GroupCallInvited.html) - A set of users was invited to the group call.
@ -179,11 +180,13 @@ Some of MadelineProto's core components are also available as separate, standalo
* [danog\MadelineProto\EventHandler\Message\Service\DialogSetChatTheme »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogSetChatTheme.html) - The chat theme was changed. * [danog\MadelineProto\EventHandler\Message\Service\DialogSetChatTheme »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogSetChatTheme.html) - The chat theme was changed.
* [danog\MadelineProto\EventHandler\Message\Service\DialogSetChatWallPaper »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogSetChatWallPaper.html) - The [wallpaper](https://core.telegram.org/api/wallpapers) of the current chat was changed. * [danog\MadelineProto\EventHandler\Message\Service\DialogSetChatWallPaper »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogSetChatWallPaper.html) - The [wallpaper](https://core.telegram.org/api/wallpapers) of the current chat was changed.
* [danog\MadelineProto\EventHandler\Message\Service\DialogSetTTL »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogSetTTL.html) - The Time-To-Live of messages in this chat was changed. * [danog\MadelineProto\EventHandler\Message\Service\DialogSetTTL »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogSetTTL.html) - The Time-To-Live of messages in this chat was changed.
* [danog\MadelineProto\EventHandler\Message\Service\DialogStarGift »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogStarGift.html) - Info about a Star gifted.
* [danog\MadelineProto\EventHandler\Message\Service\DialogSuggestProfilePhoto »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogSuggestProfilePhoto.html) - A new profile picture was suggested using [photos.uploadContactProfilePhoto](https://docs.madelineproto.xyz/API_docs/methods/photos.uploadContactProfilePhoto.html). * [danog\MadelineProto\EventHandler\Message\Service\DialogSuggestProfilePhoto »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogSuggestProfilePhoto.html) - A new profile picture was suggested using [photos.uploadContactProfilePhoto](https://docs.madelineproto.xyz/API_docs/methods/photos.uploadContactProfilePhoto.html).
* [danog\MadelineProto\EventHandler\Message\Service\DialogTitleChanged »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogTitleChanged.html) - The title of a channel or group has changed. * [danog\MadelineProto\EventHandler\Message\Service\DialogTitleChanged »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogTitleChanged.html) - The title of a channel or group has changed.
* [danog\MadelineProto\EventHandler\Message\Service\DialogTopicCreated »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogTopicCreated.html) - A [forum topic](https://core.telegram.org/api/forum#forum-topics) was created. * [danog\MadelineProto\EventHandler\Message\Service\DialogTopicCreated »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogTopicCreated.html) - A [forum topic](https://core.telegram.org/api/forum#forum-topics) was created.
* [danog\MadelineProto\EventHandler\Message\Service\DialogTopicEdited »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogTopicEdited.html) - [Forum topic](https://core.telegram.org/api/forum#forum-topics) information was edited. * [danog\MadelineProto\EventHandler\Message\Service\DialogTopicEdited »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogTopicEdited.html) - [Forum topic](https://core.telegram.org/api/forum#forum-topics) information was edited.
* [danog\MadelineProto\EventHandler\Message\Service\DialogWebView »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogWebView.html) - Data from an opened [reply keyboard bot web app](https://core.telegram.org/api/bots/webapps) was relayed to the bot that owns it (user & bot side service message). * [danog\MadelineProto\EventHandler\Message\Service\DialogWebView »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message/Service/DialogWebView.html) - Data from an opened [reply keyboard bot web app](https://core.telegram.org/api/bots/webapps) was relayed to the bot that owns it (user & bot side service message).
* [danog\MadelineProto\EventHandler\Payments\Payment »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Payments/Payment.html) - This object contains information about an incoming pre-checkout query.
* [danog\MadelineProto\EventHandler\Pinned »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Pinned.html) - Indicates that some messages were pinned/unpinned. * [danog\MadelineProto\EventHandler\Pinned »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Pinned.html) - Indicates that some messages were pinned/unpinned.
* [danog\MadelineProto\EventHandler\Pinned\PinnedChannelMessages »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Pinned/PinnedChannelMessages.html) - Represents messages that were pinned/unpinned in a [channel](https://core.telegram.org/api/channel). * [danog\MadelineProto\EventHandler\Pinned\PinnedChannelMessages »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Pinned/PinnedChannelMessages.html) - Represents messages that were pinned/unpinned in a [channel](https://core.telegram.org/api/channel).
* [danog\MadelineProto\EventHandler\Pinned\PinnedGroupMessages »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Pinned/PinnedGroupMessages.html) - Represents messages that were pinned/unpinned in a [chat/supergroup](https://core.telegram.org/api/channel). * [danog\MadelineProto\EventHandler\Pinned\PinnedGroupMessages »](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Pinned/PinnedGroupMessages.html) - Represents messages that were pinned/unpinned in a [chat/supergroup](https://core.telegram.org/api/channel).
@ -569,7 +572,6 @@ Some of MadelineProto's core components are also available as separate, standalo
* <a href="https://docs.madelineproto.xyz/API_docs/methods/account.getChannelDefaultEmojiStatuses.html" name="account.getChannelDefaultEmojiStatuses">Get a list of default suggested channel emoji statuses: account.getChannelDefaultEmojiStatuses</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/account.getChannelDefaultEmojiStatuses.html" name="account.getChannelDefaultEmojiStatuses">Get a list of default suggested channel emoji statuses: account.getChannelDefaultEmojiStatuses</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/account.getDefaultEmojiStatuses.html" name="account.getDefaultEmojiStatuses">Get a list of default suggested emoji statuses: account.getDefaultEmojiStatuses</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/account.getDefaultEmojiStatuses.html" name="account.getDefaultEmojiStatuses">Get a list of default suggested emoji statuses: account.getDefaultEmojiStatuses</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/phone.getGroupCallJoinAs.html" name="phone.getGroupCallJoinAs">Get a list of peers that can be used to join a group call, presenting yourself as a specific user/channel: phone.getGroupCallJoinAs</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/phone.getGroupCallJoinAs.html" name="phone.getGroupCallJoinAs">Get a list of peers that can be used to join a group call, presenting yourself as a specific user/channel: phone.getGroupCallJoinAs</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.getSponsoredMessages.html" name="channels.getSponsoredMessages">Get a list of sponsored messages: channels.getSponsoredMessages</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getWebMessage" name="getWebMessage">Get a message to show to the user when starting the bot: getWebMessage</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getWebMessage" name="getWebMessage">Get a message to show to the user when starting the bot: getWebMessage</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.getPaymentForm.html" name="payments.getPaymentForm">Get a payment form: payments.getPaymentForm</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.getPaymentForm.html" name="payments.getPaymentForm">Get a payment form: payments.getPaymentForm</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/account.getDefaultGroupPhotoEmojis.html" name="account.getDefaultGroupPhotoEmojis">Get a set of suggested custom emoji stickers that can be used as group picture: account.getDefaultGroupPhotoEmojis</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/account.getDefaultGroupPhotoEmojis.html" name="account.getDefaultGroupPhotoEmojis">Get a set of suggested custom emoji stickers that can be used as group picture: account.getDefaultGroupPhotoEmojis</a>
@ -747,7 +749,6 @@ Some of MadelineProto's core components are also available as separate, standalo
* <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.assignAppStoreTransaction.html" name="payments.assignAppStoreTransaction">Informs server about a purchase made through the App Store: for official applications only: payments.assignAppStoreTransaction</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.assignAppStoreTransaction.html" name="payments.assignAppStoreTransaction">Informs server about a purchase made through the App Store: for official applications only: payments.assignAppStoreTransaction</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.assignPlayMarketTransaction.html" name="payments.assignPlayMarketTransaction">Informs server about a purchase made through the Play Store: for official applications only: payments.assignPlayMarketTransaction</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.assignPlayMarketTransaction.html" name="payments.assignPlayMarketTransaction">Informs server about a purchase made through the Play Store: for official applications only: payments.assignPlayMarketTransaction</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/help.setBotUpdatesStatus.html" name="help.setBotUpdatesStatus">Informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only: help.setBotUpdatesStatus</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/help.setBotUpdatesStatus.html" name="help.setBotUpdatesStatus">Informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only: help.setBotUpdatesStatus</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.clickSponsoredMessage.html" name="channels.clickSponsoredMessage">Informs the server that the user has either:: channels.clickSponsoredMessage</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/account.initTakeoutSession.html" name="account.initTakeoutSession">Initialize a takeout session, see here » for more info: account.initTakeoutSession</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/account.initTakeoutSession.html" name="account.initTakeoutSession">Initialize a takeout session, see here » for more info: account.initTakeoutSession</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/initConnection.html" name="initConnection">Initialize connection: initConnection</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/initConnection.html" name="initConnection">Initialize connection: initConnection</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#initSelfRestart" name="initSelfRestart">Initialize self-restart hack: initSelfRestart</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#initSelfRestart" name="initSelfRestart">Initialize self-restart hack: initSelfRestart</a>
@ -794,7 +795,6 @@ Some of MadelineProto's core components are also available as separate, standalo
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#htmlToMessageEntities" name="htmlToMessageEntities">Manually convert HTML to a message and a set of entities: htmlToMessageEntities</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#htmlToMessageEntities" name="htmlToMessageEntities">Manually convert HTML to a message and a set of entities: htmlToMessageEntities</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#markdownToMessageEntities" name="markdownToMessageEntities">Manually convert markdown to a message and a set of entities: markdownToMessageEntities</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#markdownToMessageEntities" name="markdownToMessageEntities">Manually convert markdown to a message and a set of entities: markdownToMessageEntities</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.markDialogUnread.html" name="messages.markDialogUnread">Manually mark dialog as unread: messages.markDialogUnread</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.markDialogUnread.html" name="messages.markDialogUnread">Manually mark dialog as unread: messages.markDialogUnread</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.viewSponsoredMessage.html" name="channels.viewSponsoredMessage">Mark a specific sponsored message as read: channels.viewSponsoredMessage</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.readDiscussion.html" name="messages.readDiscussion">Mark a thread as read: messages.readDiscussion</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.readDiscussion.html" name="messages.readDiscussion">Mark a thread as read: messages.readDiscussion</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/stories.readStories.html" name="stories.readStories">Mark all stories up to a certain ID as read, for a given peer; will emit an updateReadStories update to all logged-in sessions: stories.readStories</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/stories.readStories.html" name="stories.readStories">Mark all stories up to a certain ID as read, for a given peer; will emit an updateReadStories update to all logged-in sessions: stories.readStories</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.readHistory.html" name="channels.readHistory">Mark channel/supergroup history as read: channels.readHistory</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.readHistory.html" name="channels.readHistory">Mark channel/supergroup history as read: channels.readHistory</a>
@ -1116,13 +1116,15 @@ Some of MadelineProto's core components are also available as separate, standalo
* <a href="https://docs.madelineproto.xyz/API_docs/methods/auth.reportMissingCode.html" name="auth.reportMissingCode">auth.reportMissingCode</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/auth.reportMissingCode.html" name="auth.reportMissingCode">auth.reportMissingCode</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#base64urlDecode" name="base64urlDecode">base64URL decode: base64urlDecode</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#base64urlDecode" name="base64urlDecode">base64URL decode: base64urlDecode</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.addPreviewMedia.html" name="bots.addPreviewMedia">bots.addPreviewMedia</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.addPreviewMedia.html" name="bots.addPreviewMedia">bots.addPreviewMedia</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.checkDownloadFileParams.html" name="bots.checkDownloadFileParams">bots.checkDownloadFileParams</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.deletePreviewMedia.html" name="bots.deletePreviewMedia">bots.deletePreviewMedia</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.deletePreviewMedia.html" name="bots.deletePreviewMedia">bots.deletePreviewMedia</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.editPreviewMedia.html" name="bots.editPreviewMedia">bots.editPreviewMedia</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.editPreviewMedia.html" name="bots.editPreviewMedia">bots.editPreviewMedia</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.getPopularAppBots.html" name="bots.getPopularAppBots">bots.getPopularAppBots</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.getPopularAppBots.html" name="bots.getPopularAppBots">bots.getPopularAppBots</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.getPreviewInfo.html" name="bots.getPreviewInfo">bots.getPreviewInfo</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.getPreviewInfo.html" name="bots.getPreviewInfo">bots.getPreviewInfo</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.getPreviewMedias.html" name="bots.getPreviewMedias">bots.getPreviewMedias</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.getPreviewMedias.html" name="bots.getPreviewMedias">bots.getPreviewMedias</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.reorderPreviewMedias.html" name="bots.reorderPreviewMedias">bots.reorderPreviewMedias</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.reorderPreviewMedias.html" name="bots.reorderPreviewMedias">bots.reorderPreviewMedias</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.reportSponsoredMessage.html" name="channels.reportSponsoredMessage">channels.reportSponsoredMessage</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.toggleUserEmojiStatusPermission.html" name="bots.toggleUserEmojiStatusPermission">bots.toggleUserEmojiStatusPermission</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.updateUserEmojiStatus.html" name="bots.updateUserEmojiStatus">bots.updateUserEmojiStatus</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.restrictSponsoredMessages.html" name="channels.restrictSponsoredMessages">channels.restrictSponsoredMessages</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.restrictSponsoredMessages.html" name="channels.restrictSponsoredMessages">channels.restrictSponsoredMessages</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.searchPosts.html" name="channels.searchPosts">channels.searchPosts</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.searchPosts.html" name="channels.searchPosts">channels.searchPosts</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.setBoostsToUnblockRestrictions.html" name="channels.setBoostsToUnblockRestrictions">channels.setBoostsToUnblockRestrictions</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.setBoostsToUnblockRestrictions.html" name="channels.setBoostsToUnblockRestrictions">channels.setBoostsToUnblockRestrictions</a>
@ -1134,6 +1136,7 @@ Some of MadelineProto's core components are also available as separate, standalo
* <a href="https://docs.madelineproto.xyz/API_docs/methods/invokeWithBusinessConnection.html" name="invokeWithBusinessConnection">invokeWithBusinessConnection</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/invokeWithBusinessConnection.html" name="invokeWithBusinessConnection">invokeWithBusinessConnection</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/invokeWithGooglePlayIntegrity.html" name="invokeWithGooglePlayIntegrity">invokeWithGooglePlayIntegrity</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/invokeWithGooglePlayIntegrity.html" name="invokeWithGooglePlayIntegrity">invokeWithGooglePlayIntegrity</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.checkQuickReplyShortcut.html" name="messages.checkQuickReplyShortcut">messages.checkQuickReplyShortcut</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.checkQuickReplyShortcut.html" name="messages.checkQuickReplyShortcut">messages.checkQuickReplyShortcut</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.clickSponsoredMessage.html" name="messages.clickSponsoredMessage">messages.clickSponsoredMessage</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.deleteFactCheck.html" name="messages.deleteFactCheck">messages.deleteFactCheck</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.deleteFactCheck.html" name="messages.deleteFactCheck">messages.deleteFactCheck</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.deleteQuickReplyMessages.html" name="messages.deleteQuickReplyMessages">messages.deleteQuickReplyMessages</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.deleteQuickReplyMessages.html" name="messages.deleteQuickReplyMessages">messages.deleteQuickReplyMessages</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.deleteQuickReplyShortcut.html" name="messages.deleteQuickReplyShortcut">messages.deleteQuickReplyShortcut</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.deleteQuickReplyShortcut.html" name="messages.deleteQuickReplyShortcut">messages.deleteQuickReplyShortcut</a>
@ -1146,18 +1149,24 @@ Some of MadelineProto's core components are also available as separate, standalo
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getMyStickers.html" name="messages.getMyStickers">messages.getMyStickers</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getMyStickers.html" name="messages.getMyStickers">messages.getMyStickers</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getOutboxReadDate.html" name="messages.getOutboxReadDate">messages.getOutboxReadDate</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getOutboxReadDate.html" name="messages.getOutboxReadDate">messages.getOutboxReadDate</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getPaidReactionPrivacy.html" name="messages.getPaidReactionPrivacy">messages.getPaidReactionPrivacy</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getPaidReactionPrivacy.html" name="messages.getPaidReactionPrivacy">messages.getPaidReactionPrivacy</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getPreparedInlineMessage.html" name="messages.getPreparedInlineMessage">messages.getPreparedInlineMessage</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getQuickReplies.html" name="messages.getQuickReplies">messages.getQuickReplies</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getQuickReplies.html" name="messages.getQuickReplies">messages.getQuickReplies</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getQuickReplyMessages.html" name="messages.getQuickReplyMessages">messages.getQuickReplyMessages</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getQuickReplyMessages.html" name="messages.getQuickReplyMessages">messages.getQuickReplyMessages</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getSavedReactionTags.html" name="messages.getSavedReactionTags">messages.getSavedReactionTags</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getSavedReactionTags.html" name="messages.getSavedReactionTags">messages.getSavedReactionTags</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getSponsoredMessages.html" name="messages.getSponsoredMessages">messages.getSponsoredMessages</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.reorderQuickReplies.html" name="messages.reorderQuickReplies">messages.reorderQuickReplies</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.reorderQuickReplies.html" name="messages.reorderQuickReplies">messages.reorderQuickReplies</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.reportSponsoredMessage.html" name="messages.reportSponsoredMessage">messages.reportSponsoredMessage</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.requestMainWebView.html" name="messages.requestMainWebView">messages.requestMainWebView</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.requestMainWebView.html" name="messages.requestMainWebView">messages.requestMainWebView</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.savePreparedInlineMessage.html" name="messages.savePreparedInlineMessage">messages.savePreparedInlineMessage</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.sendPaidReaction.html" name="messages.sendPaidReaction">messages.sendPaidReaction</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.sendPaidReaction.html" name="messages.sendPaidReaction">messages.sendPaidReaction</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.sendQuickReplyMessages.html" name="messages.sendQuickReplyMessages">messages.sendQuickReplyMessages</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.sendQuickReplyMessages.html" name="messages.sendQuickReplyMessages">messages.sendQuickReplyMessages</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.toggleDialogFilterTags.html" name="messages.toggleDialogFilterTags">messages.toggleDialogFilterTags</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.toggleDialogFilterTags.html" name="messages.toggleDialogFilterTags">messages.toggleDialogFilterTags</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.togglePaidReactionPrivacy.html" name="messages.togglePaidReactionPrivacy">messages.togglePaidReactionPrivacy</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.togglePaidReactionPrivacy.html" name="messages.togglePaidReactionPrivacy">messages.togglePaidReactionPrivacy</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.updateSavedReactionTag.html" name="messages.updateSavedReactionTag">messages.updateSavedReactionTag</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.updateSavedReactionTag.html" name="messages.updateSavedReactionTag">messages.updateSavedReactionTag</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.viewSponsoredMessage.html" name="messages.viewSponsoredMessage">messages.viewSponsoredMessage</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#rleDecode" name="rleDecode">null-byte RLE decode: rleDecode</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#rleDecode" name="rleDecode">null-byte RLE decode: rleDecode</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#rleEncode" name="rleEncode">null-byte RLE encode: rleEncode</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#rleEncode" name="rleEncode">null-byte RLE encode: rleEncode</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.botCancelStarsSubscription.html" name="payments.botCancelStarsSubscription">payments.botCancelStarsSubscription</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.changeStarsSubscription.html" name="payments.changeStarsSubscription">payments.changeStarsSubscription</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.changeStarsSubscription.html" name="payments.changeStarsSubscription">payments.changeStarsSubscription</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.convertStarGift.html" name="payments.convertStarGift">payments.convertStarGift</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.convertStarGift.html" name="payments.convertStarGift">payments.convertStarGift</a>
* <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.fulfillStarsSubscription.html" name="payments.fulfillStarsSubscription">payments.fulfillStarsSubscription</a> * <a href="https://docs.madelineproto.xyz/API_docs/methods/payments.fulfillStarsSubscription.html" name="payments.fulfillStarsSubscription">payments.fulfillStarsSubscription</a>

View File

@ -36,13 +36,13 @@
"amphp/amp": "^3.0.2", "amphp/amp": "^3.0.2",
"amphp/http-client": "^5.1.0", "amphp/http-client": "^5.1.0",
"amphp/websocket-client": "^2", "amphp/websocket-client": "^2",
"amphp/http": "^2.1.1", "amphp/http": "^2.1.2",
"amphp/socket": "^2.3.1", "amphp/socket": "^2.3.1",
"amphp/dns": "^2.2.0", "amphp/dns": "^2.2.0",
"amphp/byte-stream": "^2.1.1", "amphp/byte-stream": "^2.1.1",
"amphp/file": "^3.1.1", "amphp/file": "^3.1.1",
"amphp/mysql": "^3", "amphp/mysql": "^3",
"amphp/postgres": "^2", "amphp/postgres": "^2.1.1",
"danog/dns-over-https": "^1", "danog/dns-over-https": "^1",
"amphp/http-client-cookies": "^2", "amphp/http-client-cookies": "^2",
"danog/tg-file-decoder": "^1.0.1", "danog/tg-file-decoder": "^1.0.1",
@ -55,8 +55,8 @@
"psr/http-factory": "^1.1.0", "psr/http-factory": "^1.1.0",
"psr/log": "^3.0.2", "psr/log": "^3.0.2",
"webmozart/assert": "^1.11", "webmozart/assert": "^1.11",
"bacon/bacon-qr-code": "^3", "bacon/bacon-qr-code": "^3.0.1",
"nikic/php-parser": "^5.2.0", "nikic/php-parser": "^5.3.1",
"revolt/event-loop": "^1.0.6", "revolt/event-loop": "^1.0.6",
"danog/async-orm": "^1.1.0", "danog/async-orm": "^1.1.0",
"danog/telegram-entities": "^1.0.4", "danog/telegram-entities": "^1.0.4",
@ -70,7 +70,7 @@
"phpunit/phpunit": "^9.6.21", "phpunit/phpunit": "^9.6.21",
"amphp/phpunit-util": "^3", "amphp/phpunit-util": "^3",
"bamarni/composer-bin-plugin": "1.8.2", "bamarni/composer-bin-plugin": "1.8.2",
"symfony/yaml": "^6.4.12", "symfony/yaml": "^6.4.13",
"revolt/event-loop-adapter-react": "^1.1.1", "revolt/event-loop-adapter-react": "^1.1.1",
"dg/bypass-finals": "dev-master", "dg/bypass-finals": "dev-master",
"brianium/paratest": "^6.11.1", "brianium/paratest": "^6.11.1",

2
docs

@ -1 +1 @@
Subproject commit 9545494397382ac8ebc073fc9e74fc97451f5fb0 Subproject commit 6df8ad8cf2859557125197b1c467ea667f1fbef4

View File

@ -91,5 +91,44 @@
"login_code_sending": "Отправка кода...", "login_code_sending": "Отправка кода...",
"login_code_sent": "Код успешно отправлен! Как только Вы получите код Вам нужно использовать функцию completePhoneLogin.", "login_code_sent": "Код успешно отправлен! Как только Вы получите код Вам нужно использовать функцию completePhoneLogin.",
"login_2fa_enabled": "2FA активно, вам необходимо сначала вызвать функцию complete2falogin...", "login_2fa_enabled": "2FA активно, вам необходимо сначала вызвать функцию complete2falogin...",
"not_loggedIn": "Я вошёл в систему!" "not_loggedIn": "Я вошёл в систему!",
"call_error_1": "Не смог найти и принять звонок %s",
"string_required": "Ожидана string!",
"waveform_must_have_100_values": "Массив waveform должен иметь 100 значений!",
"waveform_value": "Значение waveform должно быть между 0 и 31!",
"method_not_found": "Невозможно найти метод: ",
"params_missing": "Не хватает необходимого папаметра",
"sec_peer_not_in_db": "Этого секретного чата нету во внутренней базе",
"length_too_big": "Длина слишком большая",
"login_user": "Вхожу как пользователь...",
"signup_ok": "Запись прошла успешно!",
"accepting_call": "Принимяю звонок от %s...",
"call_already_declined": "Звонок %s уже был отвергнут",
"call_error_3": "Невозможно найти и подтвердить звонок %s",
"call_completing": "Финализирую звонок от %s...",
"fingerprint_invalid": "Невалидный фингерпринт ключа!",
"file_parsing": "Чтение %s...",
"src_file_invalid": "Невалидный файл: ",
"bool_error": "Невозможно считать boolean",
"not_numeric": "Данное значение не цифра",
"long_not_32": "Длинна данного значения не равна 32 байтам",
"array_invalid": "Вы указали невалидный массив",
"predicate_not_set": "Предикат (значение под ключом _) не был указан!",
"login_bot": "Вхожу как бот...",
"login_need_signup": "На этот номер телефона не найдена учётная запись Телеграм...",
"long_not_16": "Длинна данного значения не равна 16 байтам",
"signup_uncalled": "Я не в процессе записи! Пожалуйста, вызовите сначала методы phoneLogin и completePhoneLogin!",
"2fa_uncalled": "Я не жду сейчас пароля! Вызовите сначала методы phoneLogin и completePhoneLogin!",
"call_already_accepted": "Звонок %s уже был принят",
"call_error_2": "Невозможно найти и подтвердить звонок %s",
"call_confirming": "Подтверждаю звонок от %s...",
"translate_madelineproto_cli": "MadelineProto можно локализировать на ваш язык (на данный момент переведено: %d%%), откройте https://weblate.madelineproto.xyz чтобы помочь с переводом!",
"translate_madelineproto_web": "MadelineProto можно локализировать на ваш язык (на данный момент переведено: %d%%), кликните <a href=\"https://weblate.madelineproto.xyz\" target=\"_blank\">сюда чтобы помочь с переводом!</a>",
"peer_not_in_db": "Этот peer не находится во внутренней базе",
"call_discarding": "Отвергаю звонок %s...",
"stream_handle_invalid": "Использован невалидный стрим.",
"long_not_64": "Длинна данного значения не равна 64 байтам",
"update_madelineproto": "Вы используете старую версию MadelineProto, необходимо обновится: сейчас используется версия %s, но последняя версия со многими поправками и с новым функционалом - %s!",
"type_extract_error": "Невозможно распаковать тип \"%s\", необходимо обновить MadelineProto!",
"could_not_convert_object": "Невозможно сконвертировать объект типа %s"
} }

File diff suppressed because one or more lines are too long

@ -1 +1 @@
Subproject commit f0d60e35a9566ade2a29cd3e9e7f67f323e9ad4d Subproject commit 1407d279c0bf6ae94b816ee61b8276713079bd66

View File

@ -51,7 +51,7 @@ final class API extends AbstractAPI
* *
* @var string * @var string
*/ */
public const RELEASE = '8.3.5'; public const RELEASE = '8.3.7';
/** /**
* We're not logged in. * We're not logged in.
* *

View File

@ -40,13 +40,13 @@ abstract class CallbackQuery extends Update
} }
/** /**
* @param string $message Popup to show * @param ?string $message Popup to show
* @param bool $alert Whether to show the message as a popup instead of a toast notification * @param bool $alert Whether to show the message as a popup instead of a toast notification
* @param string|null $url URL to open * @param string|null $url URL to open
* @param int $cacheTime Cache validity (default set to 5 min based on telegram official docs ...) * @param int $cacheTime Cache validity (default set to 5 min based on telegram official docs ...)
*/ */
public function answer( public function answer(
string $message, ?string $message = null,
bool $alert = false, bool $alert = false,
?string $url = null, ?string $url = null,
int $cacheTime = 5 * 60 int $cacheTime = 5 * 60

View File

@ -0,0 +1,71 @@
<?php declare(strict_types=1);
/**
* This file is part of MadelineProto.
* MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* MadelineProto 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 Affero General Public License for more details.
* You should have received a copy of the GNU General Public License along with MadelineProto.
* If not, see <http://www.gnu.org/licenses/>.
*
* @author Mahdi <mahdi.talaee1379@gmail.com>
* @copyright 2016-2023 Mahdi <mahdi.talaee1379@gmail.com>
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
* @link https://docs.madelineproto.xyz MadelineProto documentation
*/
namespace danog\MadelineProto\EventHandler\Message\Entities;
use danog\MadelineProto\ParseMode;
use danog\MadelineProto\StrTools;
use JsonSerializable;
use ReflectionClass;
use ReflectionProperty;
final class TextWithEntities implements JsonSerializable
{
public function __construct(
/** Text */
public readonly string $text,
/**
* Message entities for styled text.
* @var list<MessageEntity>
*/
public readonly array $entities,
/** Whether to parse HTML or Markdown markup in the message */
public readonly ?ParseMode $parseMode,
) {
}
/** @internal */
public function jsonSerialize(): mixed
{
$res = ['_' => static::class];
$refl = new ReflectionClass($this);
foreach ($refl->getProperties(ReflectionProperty::IS_PUBLIC) as $prop) {
$res[$prop->getName()] = $prop->getValue($this);
}
return $res;
}
protected readonly string $html;
protected readonly string $htmlTelegram;
/**
* Get an HTML version of the message.
*
* @psalm-suppress InaccessibleProperty
*
* @param bool $allowTelegramTags Whether to allow telegram-specific tags like tg-spoiler, tg-emoji, mention links and so on...
*/
public function getHTML(bool $allowTelegramTags = false): string
{
if (!$this->entities) {
return StrTools::htmlEscape($this->text);
}
if ($allowTelegramTags) {
return $this->htmlTelegram ??= StrTools::entitiesToHtml($this->text, MessageEntity::fromRawEntities($this->entities), $allowTelegramTags);
}
return $this->html ??= StrTools::entitiesToHtml($this->text, MessageEntity::fromRawEntities($this->entities), $allowTelegramTags);
}
}

View File

@ -0,0 +1,47 @@
<?php declare(strict_types=1);
/**
* This file is part of MadelineProto.
* MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* MadelineProto 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 Affero General Public License for more details.
* You should have received a copy of the GNU General Public License along with MadelineProto.
* If not, see <http://www.gnu.org/licenses/>.
*
* @author Mahdi <mahdi.talaee1379@gmail.com>
* @copyright 2016-2023 Mahdi <mahdi.talaee1379@gmail.com>
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
* @link https://docs.madelineproto.xyz MadelineProto documentation
*/
namespace danog\MadelineProto\EventHandler\Message\Service;
use danog\MadelineProto\EventHandler\Message\ServiceMessage;
use danog\MadelineProto\MTProto;
/**
* Info about a gifted Telegram Stars.
*/
class DialogGiftStars extends ServiceMessage
{
/** @internal */
public function __construct(
MTProto $API,
array $rawMessage,
array $info,
/** Three-letter ISO 4217 currency code */
public readonly string $currency,
/** Price of the gift in the smallest units of the currency (integer, not float/double). */
public readonly int $amount,
/** Amount of gifted stars */
public readonly int $stars,
/** If the gift was bought using a cryptocurrency, the cryptocurrency name. */
public readonly ?string $cryptoCurrency,
/** If the gift was bought using a cryptocurrency, price of the gift in the smallest units of a cryptocurrency. */
public readonly ?int $cryptoAmount,
/** Identifier of the transaction, only visible to the receiver of the gift. */
public readonly string $transactionId,
) {
parent::__construct($API, $rawMessage, $info);
}
}

View File

@ -0,0 +1,49 @@
<?php declare(strict_types=1);
/**
* This file is part of MadelineProto.
* MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* MadelineProto 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 Affero General Public License for more details.
* You should have received a copy of the GNU General Public License along with MadelineProto.
* If not, see <http://www.gnu.org/licenses/>.
*
* @author Mahdi <mahdi.talaee1379@gmail.com>
* @copyright 2016-2023 Mahdi <mahdi.talaee1379@gmail.com>
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
* @link https://docs.madelineproto.xyz MadelineProto documentation
*/
namespace danog\MadelineProto\EventHandler\Message\Service;
use danog\MadelineProto\EventHandler\Message\Entities\TextWithEntities;
use danog\MadelineProto\EventHandler\Message\ServiceMessage;
use danog\MadelineProto\EventHandler\Payments\StarGift;
use danog\MadelineProto\MTProto;
/**
* Info about a Star gifted.
*/
class DialogStarGift extends ServiceMessage
{
/** @internal */
public function __construct(
MTProto $API,
array $rawMessage,
array $info,
/** Show the name of sender hide or no */
public readonly ?bool $hide,
/** Show the gift is saved on profile or no */
public readonly ?bool $saved,
/** Show the gift is converted to stars or no */
public readonly ?bool $converted,
/** The gift */
public readonly StarGift $gift,
/** Styled text that sender of gift provided */
public readonly ?TextWithEntities $message,
/** Amount of stars after the gift converted */
public readonly ?int $convertStars
) {
parent::__construct($API, $rawMessage, $info);
}
}

View File

@ -0,0 +1,90 @@
<?php declare(strict_types=1);
/**
* This file is part of MadelineProto.
* MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* MadelineProto 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 Affero General Public License for more details.
* You should have received a copy of the GNU General Public License along with MadelineProto.
* If not, see <http://www.gnu.org/licenses/>.
*
* @author Mahdi <mahdi.talaee1379@gmail.com>
* @copyright 2016-2023 Mahdi <mahdi.talaee1379@gmail.com>
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
* @link https://docs.madelineproto.xyz MadelineProto documentation
*/
namespace danog\MadelineProto\EventHandler\Payments;
use danog\MadelineProto\EventHandler\Update;
use danog\MadelineProto\MTProto;
/**
* This object contains information about an incoming pre-checkout query.
*/
class Payment extends Update
{
/** Unique query identifier */
public readonly int $queryId;
/** User who sent the query */
public readonly int $userId;
/** Bot specified invoice payload */
public readonly string $payload;
/** Order info provided by the user */
public readonly ?PaymentRequestedInfo $info;
/** Identifier of the shipping option chosen by the user */
public readonly ?string $shippingOptionId;
/** Three-letter ISO 4217 currency code */
public readonly string $currency;
/**Total amount in the smallest units of the currency (integer, not float/double). */
public readonly int $totalAmount;
/** @internal */
public function __construct(MTProto $API, array $rawRequestedPayment)
{
parent::__construct($API);
$this->queryId = $rawRequestedPayment['query_id'];
$this->userId = $rawRequestedPayment['user_id'];
$this->payload = $rawRequestedPayment['payload'];
$this->info = isset($rawRequestedPayment['payload']) ? new PaymentRequestedInfo(
$rawRequestedPayment['name'],
$rawRequestedPayment['phone'],
$rawRequestedPayment['email'],
) : null;
$this->shippingOptionId = $rawRequestedPayment['shipping_option_id'] ?? null;
$this->currency = $rawRequestedPayment['currency'];
$this->totalAmount = $rawRequestedPayment['total_amount'];
}
/**
* Accept pending payment.
* note that you must call this function or reject function up to 10 seconds after user accept payment!!.
*/
public function accept(): true
{
return $this->getClient()->methodCallAsyncRead(
'messages.setBotPrecheckoutResults',
[
'success' => true,
'query_id' => $this->queryId,
]
);
}
/**
* Reject pending payment.
* note that you must call this function or accept function up to 10 seconds after user accept payment!!.
* @param string $errorMessage if the success isnt set. Error message in human-readable form that explains the reason for failure to proceed with the checkout
*/
public function reject(string $errorMessage): false
{
return $this->getClient()->methodCallAsyncRead(
'messages.setBotPrecheckoutResults',
[
'success' => false,
'query_id' => $this->queryId,
'error' => $errorMessage,
]
);
}
}

View File

@ -0,0 +1,32 @@
<?php declare(strict_types=1);
namespace danog\MadelineProto\EventHandler\Payments;
use JsonSerializable;
use ReflectionClass;
use ReflectionProperty;
final class PaymentRequestedInfo implements JsonSerializable
{
public function __construct(
/** Users full name */
public readonly string $name,
/** Users phone number */
public readonly string $phone,
/** Users email address */
public readonly string $email
) {
}
/** @internal */
public function jsonSerialize(): mixed
{
$res = ['_' => static::class];
$refl = new ReflectionClass($this);
foreach ($refl->getProperties(ReflectionProperty::IS_PUBLIC) as $prop) {
$res[$prop->getName()] = $prop->getValue($this);
}
return $res;
}
}

View File

@ -0,0 +1,61 @@
<?php declare(strict_types=1);
namespace danog\MadelineProto\EventHandler\Payments;
use danog\MadelineProto\EventHandler\Media\StaticSticker;
use danog\MadelineProto\EventHandler\Media\Sticker;
use danog\MadelineProto\Ipc\IpcCapable;
use danog\MadelineProto\MTProto;
final class StarGift extends IpcCapable implements \JsonSerializable
{
/** Show the gift is limited or not. */
public readonly ?bool $limited;
/** Show the gift is soldOut or not. */
public readonly ?bool $soldOut;
/** Gift id. */
public readonly int $id;
/** Gift sticker info. */
public readonly ?Sticker $sticker;
/** Amount of stars that need for buying this gift. */
public readonly int $stars;
/** Amount of gift that left. */
public readonly ?int $availabilityRemains;
/** Amount of total gift. */
public readonly ?int $availabilityTotal;
public readonly int $convertStars;
/** Show timestamp for first buy of the gift */
public readonly ?int $startSell;
/** Show timestamp for last buy of the gift */
public readonly ?int $endSell;
public function __construct(MTProto $API, array $rawStarGift)
{
$this->limited = $rawStarGift['limited'] ?? null;
$this->soldOut = $rawStarGift['sold_out'] ?? null;
$this->id = $rawStarGift['id'];
$this->sticker = isset($rawStarGift['sticker']) ?
new StaticSticker(
$API,
$rawStarGift['sticker'],
$rawStarGift['sticker']['attributes'],
$rawStarGift['sticker']['attributes'],
false
) : null;
$this->stars = $rawStarGift['stars'];
$this->availabilityRemains = $rawStarGift['availability_remains'] ?? null;
$this->availabilityTotal = $rawStarGift['availability_total'] ?? null;
$this->convertStars = $rawStarGift['convert_stars'];
$this->startSell = $rawStarGift['first_sale_date'] ?? null;
$this->endSell = $rawStarGift['last_sale_date'] ?? null;
parent::__construct($API);
}
/** @internal */
public function jsonSerialize(): mixed
{
$v = get_object_vars($this);
unset($v['API'], $v['session']);
return $v;
}
}

View File

@ -30,7 +30,7 @@ final class Lang
'ckb' => 74, 'ckb' => 74,
'fa' => 100, 'fa' => 100,
'pt' => 0, 'pt' => 0,
'ru' => 58, 'ru' => 82,
'uz' => 75, 'uz' => 75,
]; ];
@ -1383,8 +1383,8 @@ If you intentionally deleted this account, ignore this message.',
], ],
'ru' => 'ru' =>
[ [
'2fa_uncalled' => 'I\'m not waiting for the password! Please call the phoneLogin and the completePhoneLogin methods first!', '2fa_uncalled' => 'Я не жду сейчас пароля! Вызовите сначала методы phoneLogin и completePhoneLogin!',
'accepting_call' => 'Accepting call from %s...', 'accepting_call' => 'Принимяю звонок от %s...',
'account_banned' => '!!!!!!! WARNING !!!!!!! 'account_banned' => '!!!!!!! WARNING !!!!!!!
Telegram\'s flood prevention system suspended this account. Telegram\'s flood prevention system suspended this account.
To continue, manual verification is required. To continue, manual verification is required.
@ -1419,23 +1419,23 @@ If you intentionally deleted this account, ignore this message.',
'apiManualWeb' => 'Введите ваш API ID и API hash', 'apiManualWeb' => 'Введите ваш API ID и API hash',
'apiParamsError' => 'Вы не заполнили все обязательные параметры!', 'apiParamsError' => 'Вы не заполнили все обязательные параметры!',
'api_not_set' => 'Необходимо указать свой api ключ, достаньте свой @ my.telegram.org', 'api_not_set' => 'Необходимо указать свой api ключ, достаньте свой @ my.telegram.org',
'array_invalid' => 'You didn\'t provide a valid array', 'array_invalid' => 'Вы указали невалидный массив',
'baseDirLimitation' => 'Настройка basedir сконфигурирована: это может повлиять на производительность и вызвать некоторые проблемы, отключите её если это возможно!', 'baseDirLimitation' => 'Настройка basedir сконфигурирована: это может повлиять на производительность и вызвать некоторые проблемы, отключите её если это возможно!',
'bool_error' => 'Could not extract boolean', 'bool_error' => 'Невозможно считать boolean',
'botAlreadyRunning' => 'Бот уже запущен!', 'botAlreadyRunning' => 'Бот уже запущен!',
'botapi_conversion_error' => 'Can\'t convert %s to a bot API object', 'botapi_conversion_error' => 'Can\'t convert %s to a bot API object',
'call_already_accepted' => 'Call %s already accepted', 'call_already_accepted' => 'Звонок %s уже был принят',
'call_already_declined' => 'Call %s already declined', 'call_already_declined' => 'Звонок %s уже был отвергнут',
'call_completing' => 'Completing call from %s...', 'call_completing' => 'Финализирую звонок от %s...',
'call_confirming' => 'Confirming call from %s...', 'call_confirming' => 'Подтверждаю звонок от %s...',
'call_discarding' => 'Discarding call %s...', 'call_discarding' => 'Отвергаю звонок %s...',
'call_error_1' => 'Could not find and accept call %s', 'call_error_1' => 'Не смог найти и принять звонок %s',
'call_error_2' => 'Could not find and confirm call %s', 'call_error_2' => 'Невозможно найти и подтвердить звонок %s',
'call_error_3' => 'Could not find and complete call %s', 'call_error_3' => 'Невозможно найти и подтвердить звонок %s',
'cli_need_dl.php_link' => 'Please specify a download script URL when using getDownloadLink via CLI!', 'cli_need_dl.php_link' => 'Please specify a download script URL when using getDownloadLink via CLI!',
'constructor_not_found' => 'Constructor not found for type: ', 'constructor_not_found' => 'Constructor not found for type: ',
'could_not_connect_to_MadelineProto' => 'Could not connect to MadelineProto, please enable proc_open and remove open_basedir restrictions or disable webserver path rewrites to fix! If you already did that, make sure the CLI version of PHP is exactly the same as the web version (same version, extensions, et cetera) and check out the MadelineProto.log file for more info about the error that prevented the IPC server from starting.', 'could_not_connect_to_MadelineProto' => 'Could not connect to MadelineProto, please enable proc_open and remove open_basedir restrictions or disable webserver path rewrites to fix! If you already did that, make sure the CLI version of PHP is exactly the same as the web version (same version, extensions, et cetera) and check out the MadelineProto.log file for more info about the error that prevented the IPC server from starting.',
'could_not_convert_object' => 'Could not convert object of type %s', 'could_not_convert_object' => 'Невозможно сконвертировать объект типа %s',
'deserialization_error' => 'Произошла ошибка при deserialization', 'deserialization_error' => 'Произошла ошибка при deserialization',
'dl.php_check_logs_make_sure_session_running' => 'Either the associated MadelineProto EventHandler bot or the MadelineProto IPC server are offline, please check logs and make sure at least one of them is running!', 'dl.php_check_logs_make_sure_session_running' => 'Either the associated MadelineProto EventHandler bot or the MadelineProto IPC server are offline, please check logs and make sure at least one of them is running!',
'dl.php_powered_by_madelineproto' => 'Telegram file download server (up to 4GB), powered by <a href="https://docs.madelineproto.xyz" target="_blank">MadelineProto</a>!<br>Click <a href="https://docs.madelineproto.xyz/docs/FILES.html#getting-a-download-link" target="_blank">here</a> for more info on how to setup your very own Telegram file download server!', 'dl.php_powered_by_madelineproto' => 'Telegram file download server (up to 4GB), powered by <a href="https://docs.madelineproto.xyz" target="_blank">MadelineProto</a>!<br>Click <a href="https://docs.madelineproto.xyz/docs/FILES.html#getting-a-download-link" target="_blank">here</a> for more info on how to setup your very own Telegram file download server!',
@ -1453,12 +1453,12 @@ If you intentionally deleted this account, ignore this message.',
'extensionRequiredInstallWithApt' => 'Попробуйте запустить sudo apt-get install %s.', 'extensionRequiredInstallWithApt' => 'Попробуйте запустить sudo apt-get install %s.',
'extensionRequiredInstallWithCustomInstructions' => 'Следуйте инструкциям в %s для установки.', 'extensionRequiredInstallWithCustomInstructions' => 'Следуйте инструкциям в %s для установки.',
'file_not_exist' => 'Файл не существует', 'file_not_exist' => 'Файл не существует',
'file_parsing' => 'Parsing %s...', 'file_parsing' => 'Чтение %s...',
'file_type_invalid' => 'Invalid file type detected (%s)', 'file_type_invalid' => 'Invalid file type detected (%s)',
'fingerprint_invalid' => 'Invalid key fingerprint!', 'fingerprint_invalid' => 'Невалидный фингерпринт ключа!',
'go' => 'ОК', 'go' => 'ОК',
'invalid_dl.php_session' => '%s is not a valid download script because its session ID is different (expected %s, got %s)', 'invalid_dl.php_session' => '%s is not a valid download script because its session ID is different (expected %s, got %s)',
'length_too_big' => 'Length is too big', 'length_too_big' => 'Длина слишком большая',
'loginBot' => 'Введите токен бота: ', 'loginBot' => 'Введите токен бота: ',
'loginBotTokenWeb' => 'Токен бота', 'loginBotTokenWeb' => 'Токен бота',
'loginChoosePromptWeb' => 'Авторизоваться как пользователь или как бот?', 'loginChoosePromptWeb' => 'Авторизоваться как пользователь или как бот?',
@ -1484,20 +1484,20 @@ If you intentionally deleted this account, ignore this message.',
'loginWebQr3' => 'Наведите ваш смартфон на этот экран чтобы подтвердить вход', 'loginWebQr3' => 'Наведите ваш смартфон на этот экран чтобы подтвердить вход',
'login_2fa_enabled' => '2FA активно, вам необходимо сначала вызвать функцию complete2falogin...', 'login_2fa_enabled' => '2FA активно, вам необходимо сначала вызвать функцию complete2falogin...',
'login_auth_key' => 'Вход с помощью ключа авторизации...', 'login_auth_key' => 'Вход с помощью ключа авторизации...',
'login_bot' => 'Logging in as a bot...', 'login_bot' => 'Вхожу как бот...',
'login_code_sending' => 'Отправка кода...', 'login_code_sending' => 'Отправка кода...',
'login_code_sent' => 'Код успешно отправлен! Как только Вы получите код Вам нужно использовать функцию completePhoneLogin.', 'login_code_sent' => 'Код успешно отправлен! Как только Вы получите код Вам нужно использовать функцию completePhoneLogin.',
'login_code_uncalled' => 'Я не ожидаю код! Пожалуйста сначала вызовите метод phoneLogin', 'login_code_uncalled' => 'Я не ожидаю код! Пожалуйста сначала вызовите метод phoneLogin',
'login_need_signup' => 'An account has not been created for this number, you will have to call the completeSignup function...', 'login_need_signup' => 'На этот номер телефона не найдена учётная запись Телеграм...',
'login_ok' => 'Мы залогинены!', 'login_ok' => 'Мы залогинены!',
'login_user' => 'Logging in as a normal user...', 'login_user' => 'Вхожу как пользователь...',
'logout_ok' => 'Logout!', 'logout_ok' => 'Logout!',
'long_not_16' => 'Given value is not 16 bytes long', 'long_not_16' => 'Длинна данного значения не равна 16 байтам',
'long_not_32' => 'Given value is not 32 bytes long', 'long_not_32' => 'Длинна данного значения не равна 32 байтам',
'long_not_64' => 'Given value is not 64 bytes long', 'long_not_64' => 'Длинна данного значения не равна 64 байтам',
'madelineproto_ready' => 'MadelineProto готов!', 'madelineproto_ready' => 'MadelineProto готов!',
'manualAdminActionRequired' => '!!!!!!!!! НЕОБХОДИМЫ РУЧНЫЕ ДЕЙСТВИЯ СИСТЕМНОГО АДМИНИСТРАТОРА !!!!!!!!!', 'manualAdminActionRequired' => '!!!!!!!!! НЕОБХОДИМЫ РУЧНЫЕ ДЕЙСТВИЯ СИСТЕМНОГО АДМИНИСТРАТОРА !!!!!!!!!',
'method_not_found' => 'Could not find method: ', 'method_not_found' => 'Невозможно найти метод: ',
'mmapErrorPart1' => 'Превышено максимальное количество маппированных зон памяти (%s, это НЕ потребление памяти, а mmap): пожалуйста увеличьте значение настройки ядра vm.max_map_count до 262144, чтобы исправить проблему.', 'mmapErrorPart1' => 'Превышено максимальное количество маппированных зон памяти (%s, это НЕ потребление памяти, а mmap): пожалуйста увеличьте значение настройки ядра vm.max_map_count до 262144, чтобы исправить проблему.',
'mmapErrorPart2' => 'Чтобы исправить, необходимо запустить эту команду как root: %s', 'mmapErrorPart2' => 'Чтобы исправить, необходимо запустить эту команду как root: %s',
'mmapErrorPart3' => 'Чтобы сохранить настройки даже после перезапуска: %s', 'mmapErrorPart3' => 'Чтобы сохранить настройки даже после перезапуска: %s',
@ -1508,16 +1508,16 @@ If you intentionally deleted this account, ignore this message.',
'noReportPeers' => 'Внимание: не настроен ни один юзер для сообщения ошибок, пожалуйста добавьте этот метод в Event Handler', 'noReportPeers' => 'Внимание: не настроен ни один юзер для сообщения ошибок, пожалуйста добавьте этот метод в Event Handler',
'non_text_conversion' => 'Can\'t convert non text messages yet!', 'non_text_conversion' => 'Can\'t convert non text messages yet!',
'not_loggedIn' => 'Я вошёл в систему!', 'not_loggedIn' => 'Я вошёл в систему!',
'not_numeric' => 'Given value isn\'t numeric', 'not_numeric' => 'Данное значение не цифра',
'params_missing' => 'Missing required parameter', 'params_missing' => 'Не хватает необходимого папаметра',
'peer_not_in_db' => 'This peer is not present in the internal peer database', 'peer_not_in_db' => 'Этот peer не находится во внутренней базе',
'plugin_path_does_not_exist' => 'Plugin path %s does not exist!', 'plugin_path_does_not_exist' => 'Plugin path %s does not exist!',
'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).', 'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).',
'plugins_must_have_exactly_one_class' => 'a plugin must define exactly one class! To define multiple classes, interfaces or traits, create separate files, they will be autoloaded by MadelineProto automatically.', 'plugins_must_have_exactly_one_class' => 'a plugin must define exactly one class! To define multiple classes, interfaces or traits, create separate files, they will be autoloaded by MadelineProto automatically.',
'predicate_not_set' => 'Predicate (value under _) was not set!', 'predicate_not_set' => 'Предикат (значение под ключом _) не был указан!',
'recommend_not_use_filesystem_function' => 'usage of the %s function is not recommended, because accessing the filesystem during update handling will slow down your bot, please see https://docs.madelineproto.xyz/docs/UPDATES.html#avoiding-the-use-of-filesystem-functions for a list of alternative ways to store data that will not slow down your bot!', 'recommend_not_use_filesystem_function' => 'usage of the %s function is not recommended, because accessing the filesystem during update handling will slow down your bot, please see https://docs.madelineproto.xyz/docs/UPDATES.html#avoiding-the-use-of-filesystem-functions for a list of alternative ways to store data that will not slow down your bot!',
'rpc_tg_error' => 'Телеграм возвратил RPC ошибку: %s (%s), из-за %s:%s%sTL trace:', 'rpc_tg_error' => 'Телеграм возвратил RPC ошибку: %s (%s), из-за %s:%s%sTL trace:',
'sec_peer_not_in_db' => 'This secret peer is not present in the internal peer database', 'sec_peer_not_in_db' => 'Этого секретного чата нету во внутренней базе',
'secret_chat_skipping' => 'I do not have the secret chat %s in the database, skipping message...', 'secret_chat_skipping' => 'I do not have the secret chat %s in the database, skipping message...',
'serialization_ofd' => 'Сериализация старая, реконструкция объекта!', 'serialization_ofd' => 'Сериализация старая, реконструкция объекта!',
'session_corrupted' => 'Сессия повреждена!', 'session_corrupted' => 'Сессия повреждена!',
@ -1527,26 +1527,26 @@ If you intentionally deleted this account, ignore this message.',
'signupLastName' => 'Введите вашу фамилию (может быть пустым): ', 'signupLastName' => 'Введите вашу фамилию (может быть пустым): ',
'signupLastNameWeb' => 'Фамилия', 'signupLastNameWeb' => 'Фамилия',
'signupWeb' => 'Зарегистрируйтесь, пожалуйста', 'signupWeb' => 'Зарегистрируйтесь, пожалуйста',
'signup_ok' => 'Signed up in successfully!', 'signup_ok' => 'Запись прошла успешно!',
'signup_uncalled' => 'I\'m not waiting to signup! Please call the phoneLogin and the completePhoneLogin methods first!', 'signup_uncalled' => 'Я не в процессе записи! Пожалуйста, вызовите сначала методы phoneLogin и completePhoneLogin!',
'src_file_invalid' => 'Invalid source file was provided: ', 'src_file_invalid' => 'Невалидный файл: ',
'static_analysis_minor' => 'A minor issue was encountered during static analysis of %s: %s', 'static_analysis_minor' => 'A minor issue was encountered during static analysis of %s: %s',
'static_analysis_severe' => 'A severe issue was encountered during static analysis of %s: %s', 'static_analysis_severe' => 'A severe issue was encountered during static analysis of %s: %s',
'stream_handle_invalid' => 'An invalid stream handle was provided.', 'stream_handle_invalid' => 'Использован невалидный стрим.',
'string_required' => 'A string was expected!', 'string_required' => 'Ожидана string!',
'translate_madelineproto_cli' => 'MadelineProto can be translated in your language (current translation progress: %d%%), go to https://weblate.madelineproto.xyz to contribute with the translation!', 'translate_madelineproto_cli' => 'MadelineProto можно локализировать на ваш язык (на данный момент переведено: %d%%), откройте https://weblate.madelineproto.xyz чтобы помочь с переводом!',
'translate_madelineproto_web' => 'MadelineProto can be translated in your language (current translation progress: %d%%), click <a href="https://weblate.madelineproto.xyz" target="_blank">here to contribute with the translation!</a>', 'translate_madelineproto_web' => 'MadelineProto можно локализировать на ваш язык (на данный момент переведено: %d%%), кликните <a href="https://weblate.madelineproto.xyz" target="_blank">сюда чтобы помочь с переводом!</a>',
'type_extract_error' => 'Could not extract type "%s", you should update MadelineProto!', 'type_extract_error' => 'Невозможно распаковать тип "%s", необходимо обновить MadelineProto!',
'type_extract_error_id' => 'Could not extract type: %s with id %s, you should update MadelineProto!', 'type_extract_error_id' => 'Could not extract type: %s with id %s, you should update MadelineProto!',
'update_madelineproto' => 'You\'re running an old version of MadelineProto, an update is required: currently running %s, but the latest version with multiple bugfixes and new features is %s!', 'update_madelineproto' => 'Вы используете старую версию MadelineProto, необходимо обновится: сейчас используется версия %s, но последняя версия со многими поправками и с новым функционалом - %s!',
'value_bigger_than_2147483647' => 'Значение %s больше чем 2147483647', 'value_bigger_than_2147483647' => 'Значение %s больше чем 2147483647',
'value_bigger_than_4294967296' => 'Значение %s больше чем 4294967296', 'value_bigger_than_4294967296' => 'Значение %s больше чем 4294967296',
'value_bigger_than_9223372036854775807' => 'Значение %s больше чем 9223372036854775807', 'value_bigger_than_9223372036854775807' => 'Значение %s больше чем 9223372036854775807',
'value_smaller_than_0' => 'Значение %s меньше нуля', 'value_smaller_than_0' => 'Значение %s меньше нуля',
'value_smaller_than_2147483648' => 'Значение %s меньше чем -2147483648', 'value_smaller_than_2147483648' => 'Значение %s меньше чем -2147483648',
'value_smaller_than_9223372036854775808' => 'Значение %s меньше чем -9223372036854775808', 'value_smaller_than_9223372036854775808' => 'Значение %s меньше чем -9223372036854775808',
'waveform_must_have_100_values' => 'A waveform array must have 100 values!', 'waveform_must_have_100_values' => 'Массив waveform должен иметь 100 значений!',
'waveform_value' => 'A waveform value must be between 0 and 31!', 'waveform_value' => 'Значение waveform должно быть между 0 и 31!',
'windows_warning' => 'For Windows users: please switch to Linux if this fails. You can also try modifying the firewall settings to allow all PHP processes to create sockets (it\'s 100% easier to just switch to Linux, on Linux MadelineProto just works out of the box, no changes needed)', 'windows_warning' => 'For Windows users: please switch to Linux if this fails. You can also try modifying the firewall settings to allow all PHP processes to create sockets (it\'s 100% easier to just switch to Linux, on Linux MadelineProto just works out of the box, no changes needed)',
], ],
'uz' => 'uz' =>

View File

@ -411,6 +411,7 @@ trait ResponseHandler
return static fn () => RPCErrorException::make($response['error_message'], $response['error_code'], $request->constructor); return static fn () => RPCErrorException::make($response['error_message'], $response['error_code'], $request->constructor);
case 420: case 420:
$seconds = (int) preg_replace('/[^0-9]+/', '', $response['error_message']); $seconds = (int) preg_replace('/[^0-9]+/', '', $response['error_message']);
\assert($seconds > 0);
$limit = $request->floodWaitLimit ?? $this->API->settings->getRPC()->getFloodTimeout(); $limit = $request->floodWaitLimit ?? $this->API->settings->getRPC()->getFloodTimeout();
if ($seconds < $limit) { if ($seconds < $limit) {
$this->API->logger("Flood, waiting $seconds seconds before repeating async call of $request...", Logger::NOTICE); $this->API->logger("Flood, waiting $seconds seconds before repeating async call of $request...", Logger::NOTICE);

View File

@ -320,22 +320,26 @@ trait Files
}; };
$resPromises = []; $resPromises = [];
$start = microtime(true); $start = microtime(true);
/** @var ?FloodPremiumWaitError */
$floodWaitError = null;
while ($part_num < $part_total_num || !$size) { while ($part_num < $part_total_num || !$size) {
if ($seekable) { if ($seekable) {
$writeCb = function () use ($method, $callable, $part_num, $cancellation, &$datacenter): WrappedFuture { $writeCb = function () use ($method, $callable, $part_num, $cancellation, &$datacenter, &$floodWaitError): WrappedFuture {
$floodWaitError?->wait($cancellation);
return $this->methodCallAsyncWrite( return $this->methodCallAsyncWrite(
$method, $method,
$callable($part_num) + ['cancellation' => $cancellation], $callable($part_num) + ['cancellation' => $cancellation, 'floodWaitLimit' => 0],
$datacenter $datacenter
); );
}; };
} else { } else {
try { try {
$part = $callable($part_num) + ['cancellation' => $cancellation]; $part = $callable($part_num) + ['cancellation' => $cancellation, 'floodWaitLimit' => 0];
} catch (StreamEof) { } catch (StreamEof) {
break; break;
} }
$writeCb = function () use ($method, $part, &$datacenter): WrappedFuture { $writeCb = function () use ($method, $part, &$datacenter, &$floodWaitError, $cancellation): WrappedFuture {
$floodWaitError?->wait($cancellation);
return $this->methodCallAsyncWrite( return $this->methodCallAsyncWrite(
$method, $method,
$part, $part,
@ -344,11 +348,11 @@ trait Files
}; };
} }
$writePromise = async($writeCb); $writePromise = async($writeCb);
EventLoop::queue(function () use ($writePromise, $cb, $part_num, $size, &$resPromises, $cancellation, $writeCb, &$datacenter): void { EventLoop::queue(function () use ($writePromise, $cb, $part_num, $size, &$resPromises, $cancellation, $writeCb, &$datacenter, &$floodWaitError): void {
do {
$readFuture = $writePromise->await($cancellation);
$d = new DeferredFuture; $d = new DeferredFuture;
$resPromises[] = $d->getFuture(); $resPromises[] = $d->getFuture();
do {
$readFuture = $writePromise->await($cancellation);
try { try {
// Wrote chunk! // Wrote chunk!
if (!$readFuture->await($cancellation)) { if (!$readFuture->await($cancellation)) {
@ -361,19 +365,16 @@ trait Files
$d->complete(); $d->complete();
return; return;
} catch (FloodPremiumWaitError $e) { } catch (FloodPremiumWaitError $e) {
$this->logger("Got {$e->rpc} while uploading $part_num: {$datacenter}, retrying..."); $this->logger("Got {$e->rpc} while uploading part $part_num: {$datacenter}, waiting and retrying...");
$writePromise = async(static function () use ($cancellation, $e, $writeCb): void { $floodWaitError = $e;
$e->wait($cancellation); $writePromise = async($writeCb);
$writeCb();
});
} catch (FileRedirect $e) { } catch (FileRedirect $e) {
$datacenter = $e->dc; $datacenter = $e->dc;
$this->logger("Got redirect while uploading $part_num: {$datacenter}"); $this->logger("Got redirect while uploading part $part_num: {$datacenter}");
$writePromise = async($writeCb); $writePromise = async($writeCb);
} catch (Throwable $e) { } catch (Throwable $e) {
$cancellation?->throwIfRequested(); $cancellation?->throwIfRequested();
$this->logger("Got exception while uploading $part_num: {$e}"); $this->logger("Got exception while uploading part $part_num: {$e}");
$d->error($e);
$writePromise = async($writeCb); $writePromise = async($writeCb);
} }
} while (true); } while (true);
@ -393,6 +394,9 @@ trait Files
} }
await($promises, $cancellation); await($promises, $cancellation);
await($resPromises, $cancellation); await($resPromises, $cancellation);
if ($totalSize === 0) {
throw new AssertionError('You uploaded an empty file!');
}
$time = microtime(true) - $start; $time = microtime(true) - $start;
$speed = (int) ($totalSize * 8 / $time) / 1000000; $speed = (int) ($totalSize * 8 / $time) / 1000000;
if (!$size) { if (!$size) {

View File

@ -50,6 +50,8 @@ use danog\MadelineProto\EventHandler\InlineQuery;
use danog\MadelineProto\EventHandler\Message; use danog\MadelineProto\EventHandler\Message;
use danog\MadelineProto\EventHandler\Message\ChannelMessage; use danog\MadelineProto\EventHandler\Message\ChannelMessage;
use danog\MadelineProto\EventHandler\Message\CommentReply; use danog\MadelineProto\EventHandler\Message\CommentReply;
use danog\MadelineProto\EventHandler\Message\Entities\MessageEntity;
use danog\MadelineProto\EventHandler\Message\Entities\TextWithEntities;
use danog\MadelineProto\EventHandler\Message\GroupMessage; use danog\MadelineProto\EventHandler\Message\GroupMessage;
use danog\MadelineProto\EventHandler\Message\PrivateMessage; use danog\MadelineProto\EventHandler\Message\PrivateMessage;
use danog\MadelineProto\EventHandler\Message\SecretMessage; use danog\MadelineProto\EventHandler\Message\SecretMessage;
@ -80,11 +82,14 @@ use danog\MadelineProto\EventHandler\Message\Service\DialogScreenshotTaken;
use danog\MadelineProto\EventHandler\Message\Service\DialogSetChatTheme; use danog\MadelineProto\EventHandler\Message\Service\DialogSetChatTheme;
use danog\MadelineProto\EventHandler\Message\Service\DialogSetChatWallPaper; use danog\MadelineProto\EventHandler\Message\Service\DialogSetChatWallPaper;
use danog\MadelineProto\EventHandler\Message\Service\DialogSetTTL; use danog\MadelineProto\EventHandler\Message\Service\DialogSetTTL;
use danog\MadelineProto\EventHandler\Message\Service\DialogStarGift;
use danog\MadelineProto\EventHandler\Message\Service\DialogSuggestProfilePhoto; use danog\MadelineProto\EventHandler\Message\Service\DialogSuggestProfilePhoto;
use danog\MadelineProto\EventHandler\Message\Service\DialogTitleChanged; use danog\MadelineProto\EventHandler\Message\Service\DialogTitleChanged;
use danog\MadelineProto\EventHandler\Message\Service\DialogTopicCreated; use danog\MadelineProto\EventHandler\Message\Service\DialogTopicCreated;
use danog\MadelineProto\EventHandler\Message\Service\DialogTopicEdited; use danog\MadelineProto\EventHandler\Message\Service\DialogTopicEdited;
use danog\MadelineProto\EventHandler\Message\Service\DialogWebView; use danog\MadelineProto\EventHandler\Message\Service\DialogWebView;
use danog\MadelineProto\EventHandler\Payments\Payment;
use danog\MadelineProto\EventHandler\Payments\StarGift;
use danog\MadelineProto\EventHandler\Pinned; use danog\MadelineProto\EventHandler\Pinned;
use danog\MadelineProto\EventHandler\Pinned\PinnedChannelMessages; use danog\MadelineProto\EventHandler\Pinned\PinnedChannelMessages;
use danog\MadelineProto\EventHandler\Pinned\PinnedGroupMessages; use danog\MadelineProto\EventHandler\Pinned\PinnedGroupMessages;
@ -128,6 +133,7 @@ use danog\MadelineProto\TL\Types\Button;
use danog\MadelineProto\UpdateHandlerType; use danog\MadelineProto\UpdateHandlerType;
use danog\MadelineProto\VoIP\DiscardReason; use danog\MadelineProto\VoIP\DiscardReason;
use danog\MadelineProto\VoIPController; use danog\MadelineProto\VoIPController;
use DialogGiftStars;
use Revolt\EventLoop; use Revolt\EventLoop;
use SplQueue; use SplQueue;
use Throwable; use Throwable;
@ -490,6 +496,7 @@ trait UpdateHandler
'updatePendingJoinRequests' => new PendingJoinRequests($this, $update), 'updatePendingJoinRequests' => new PendingJoinRequests($this, $update),
'updateBotChatInviteRequester' => new BotChatInviteRequest($this, $update), 'updateBotChatInviteRequester' => new BotChatInviteRequest($this, $update),
'updateBotCommands' => new BotCommands($this, $update), 'updateBotCommands' => new BotCommands($this, $update),
'updateBotPrecheckoutQuery' => new Payment($this, $update),
default => null default => null
}; };
} catch (\Throwable $e) { } catch (\Throwable $e) {
@ -684,6 +691,37 @@ trait UpdateHandler
$message['action']['text'], $message['action']['text'],
null null
), ),
'messageActionGiftStars' => new DialogGiftStars(
$this,
$message,
$info,
$message['action']['currency'],
$message['action']['amount'],
$message['action']['stars'],
$message['action']['crypto_currency'] ?? null,
$message['action']['crypto_amount'] ?? null,
$message['action']['transaction_id'],
),
'messageActionStarGift' => new DialogStarGift(
$this,
$message,
$info,
$message['action']['name_hidden'] ?? null,
$message['action']['saved'] ?? null,
$message['action']['converted'] ?? null,
new StarGift(
$this,
$message['action']['gift']
),
isset($message['action']['message']) ? new TextWithEntities(
$message['action']['message']['text'],
MessageEntity::fromRawEntities($message['action']['message']['entities']),
isset($message['action']['message']['parse_mode']) ?
ParseMode::from($message['action']['message']['parse_mode'])
: null
) : null,
$message['action']['convert_stars'],
),
'messageActionGiftPremium' => new DialogGiftPremium( 'messageActionGiftPremium' => new DialogGiftPremium(
$this, $this,
$message, $message,

View File

@ -137,23 +137,23 @@ interface Account
/** /**
* Get privacy settings of current account. * Get privacy settings of current account.
* *
* @param array{_: 'inputPrivacyKeyStatusTimestamp'}|array{_: 'inputPrivacyKeyChatInvite'}|array{_: 'inputPrivacyKeyPhoneCall'}|array{_: 'inputPrivacyKeyPhoneP2P'}|array{_: 'inputPrivacyKeyForwards'}|array{_: 'inputPrivacyKeyProfilePhoto'}|array{_: 'inputPrivacyKeyPhoneNumber'}|array{_: 'inputPrivacyKeyAddedByPhone'}|array{_: 'inputPrivacyKeyVoiceMessages'}|array{_: 'inputPrivacyKeyAbout'}|array{_: 'inputPrivacyKeyBirthday'} $key Peer category whose privacy settings should be fetched @see https://docs.madelineproto.xyz/API_docs/types/InputPrivacyKey.html * @param array{_: 'inputPrivacyKeyStatusTimestamp'}|array{_: 'inputPrivacyKeyChatInvite'}|array{_: 'inputPrivacyKeyPhoneCall'}|array{_: 'inputPrivacyKeyPhoneP2P'}|array{_: 'inputPrivacyKeyForwards'}|array{_: 'inputPrivacyKeyProfilePhoto'}|array{_: 'inputPrivacyKeyPhoneNumber'}|array{_: 'inputPrivacyKeyAddedByPhone'}|array{_: 'inputPrivacyKeyVoiceMessages'}|array{_: 'inputPrivacyKeyAbout'}|array{_: 'inputPrivacyKeyBirthday'}|array{_: 'inputPrivacyKeyStarGiftsAutoSave'} $key Peer category whose privacy settings should be fetched @see https://docs.madelineproto.xyz/API_docs/types/InputPrivacyKey.html
* @param ?int $floodWaitLimit Can be used to specify a custom flood wait limit: if a FLOOD_WAIT_ rate limiting error is received with a waiting period bigger than this integer, an RPCErrorException will be thrown; otherwise, MadelineProto will simply wait for the specified amount of time. Defaults to the value specified in the settings: https://docs.madelineproto.xyz/PHP/danog/MadelineProto/Settings/RPC.html#setfloodtimeout-int-floodtimeout-self * @param ?int $floodWaitLimit Can be used to specify a custom flood wait limit: if a FLOOD_WAIT_ rate limiting error is received with a waiting period bigger than this integer, an RPCErrorException will be thrown; otherwise, MadelineProto will simply wait for the specified amount of time. Defaults to the value specified in the settings: https://docs.madelineproto.xyz/PHP/danog/MadelineProto/Settings/RPC.html#setfloodtimeout-int-floodtimeout-self
* @param ?string $queueId If specified, ensures strict server-side execution order of concurrent calls with the same queue ID. * @param ?string $queueId If specified, ensures strict server-side execution order of concurrent calls with the same queue ID.
* @param ?\Amp\Cancellation $cancellation Cancellation * @param ?\Amp\Cancellation $cancellation Cancellation
* @return array{_: 'account.privacyRules', rules: list<array{_: 'privacyValueAllowContacts'}|array{_: 'privacyValueAllowAll'}|array{_: 'privacyValueAllowUsers', users: list<int>}|array{_: 'privacyValueDisallowContacts'}|array{_: 'privacyValueDisallowAll'}|array{_: 'privacyValueDisallowUsers', users: list<int>}|array{_: 'privacyValueAllowChatParticipants', chats: list<int>}|array{_: 'privacyValueDisallowChatParticipants', chats: list<int>}|array{_: 'privacyValueAllowCloseFriends'}|array{_: 'privacyValueAllowPremium'}>, chats: list<array|int|string>, users: list<array|int|string>} @see https://docs.madelineproto.xyz/API_docs/types/account.PrivacyRules.html * @return array{_: 'account.privacyRules', rules: list<array{_: 'privacyValueAllowContacts'}|array{_: 'privacyValueAllowAll'}|array{_: 'privacyValueAllowUsers', users: list<int>}|array{_: 'privacyValueDisallowContacts'}|array{_: 'privacyValueDisallowAll'}|array{_: 'privacyValueDisallowUsers', users: list<int>}|array{_: 'privacyValueAllowChatParticipants', chats: list<int>}|array{_: 'privacyValueDisallowChatParticipants', chats: list<int>}|array{_: 'privacyValueAllowCloseFriends'}|array{_: 'privacyValueAllowPremium'}|array{_: 'privacyValueAllowBots'}|array{_: 'privacyValueDisallowBots'}>, chats: list<array|int|string>, users: list<array|int|string>} @see https://docs.madelineproto.xyz/API_docs/types/account.PrivacyRules.html
*/ */
public function getPrivacy(array $key, ?int $floodWaitLimit = null, ?string $queueId = null, ?\Amp\Cancellation $cancellation = null): array; public function getPrivacy(array $key, ?int $floodWaitLimit = null, ?string $queueId = null, ?\Amp\Cancellation $cancellation = null): array;
/** /**
* Change privacy settings of current account. * Change privacy settings of current account.
* *
* @param array{_: 'inputPrivacyKeyStatusTimestamp'}|array{_: 'inputPrivacyKeyChatInvite'}|array{_: 'inputPrivacyKeyPhoneCall'}|array{_: 'inputPrivacyKeyPhoneP2P'}|array{_: 'inputPrivacyKeyForwards'}|array{_: 'inputPrivacyKeyProfilePhoto'}|array{_: 'inputPrivacyKeyPhoneNumber'}|array{_: 'inputPrivacyKeyAddedByPhone'}|array{_: 'inputPrivacyKeyVoiceMessages'}|array{_: 'inputPrivacyKeyAbout'}|array{_: 'inputPrivacyKeyBirthday'} $key New privacy rule @see https://docs.madelineproto.xyz/API_docs/types/InputPrivacyKey.html * @param array{_: 'inputPrivacyKeyStatusTimestamp'}|array{_: 'inputPrivacyKeyChatInvite'}|array{_: 'inputPrivacyKeyPhoneCall'}|array{_: 'inputPrivacyKeyPhoneP2P'}|array{_: 'inputPrivacyKeyForwards'}|array{_: 'inputPrivacyKeyProfilePhoto'}|array{_: 'inputPrivacyKeyPhoneNumber'}|array{_: 'inputPrivacyKeyAddedByPhone'}|array{_: 'inputPrivacyKeyVoiceMessages'}|array{_: 'inputPrivacyKeyAbout'}|array{_: 'inputPrivacyKeyBirthday'}|array{_: 'inputPrivacyKeyStarGiftsAutoSave'} $key New privacy rule @see https://docs.madelineproto.xyz/API_docs/types/InputPrivacyKey.html
* @param list<array{_: 'inputPrivacyValueAllowContacts'}|array{_: 'inputPrivacyValueAllowAll'}|array{_: 'inputPrivacyValueAllowUsers', users?: list<array|int|string>}|array{_: 'inputPrivacyValueDisallowContacts'}|array{_: 'inputPrivacyValueDisallowAll'}|array{_: 'inputPrivacyValueDisallowUsers', users?: list<array|int|string>}|array{_: 'inputPrivacyValueAllowChatParticipants', chats?: list<int>}|array{_: 'inputPrivacyValueDisallowChatParticipants', chats?: list<int>}|array{_: 'inputPrivacyValueAllowCloseFriends'}|array{_: 'inputPrivacyValueAllowPremium'}>|array<never, never> $rules Array of Peers to which the privacy rule will apply. @see https://docs.madelineproto.xyz/API_docs/types/InputPrivacyRule.html * @param list<array{_: 'inputPrivacyValueAllowContacts'}|array{_: 'inputPrivacyValueAllowAll'}|array{_: 'inputPrivacyValueAllowUsers', users?: list<array|int|string>}|array{_: 'inputPrivacyValueDisallowContacts'}|array{_: 'inputPrivacyValueDisallowAll'}|array{_: 'inputPrivacyValueDisallowUsers', users?: list<array|int|string>}|array{_: 'inputPrivacyValueAllowChatParticipants', chats?: list<int>}|array{_: 'inputPrivacyValueDisallowChatParticipants', chats?: list<int>}|array{_: 'inputPrivacyValueAllowCloseFriends'}|array{_: 'inputPrivacyValueAllowPremium'}|array{_: 'inputPrivacyValueAllowBots'}|array{_: 'inputPrivacyValueDisallowBots'}>|array<never, never> $rules Array of Peers to which the privacy rule will apply. @see https://docs.madelineproto.xyz/API_docs/types/InputPrivacyRule.html
* @param ?int $floodWaitLimit Can be used to specify a custom flood wait limit: if a FLOOD_WAIT_ rate limiting error is received with a waiting period bigger than this integer, an RPCErrorException will be thrown; otherwise, MadelineProto will simply wait for the specified amount of time. Defaults to the value specified in the settings: https://docs.madelineproto.xyz/PHP/danog/MadelineProto/Settings/RPC.html#setfloodtimeout-int-floodtimeout-self * @param ?int $floodWaitLimit Can be used to specify a custom flood wait limit: if a FLOOD_WAIT_ rate limiting error is received with a waiting period bigger than this integer, an RPCErrorException will be thrown; otherwise, MadelineProto will simply wait for the specified amount of time. Defaults to the value specified in the settings: https://docs.madelineproto.xyz/PHP/danog/MadelineProto/Settings/RPC.html#setfloodtimeout-int-floodtimeout-self
* @param ?string $queueId If specified, ensures strict server-side execution order of concurrent calls with the same queue ID. * @param ?string $queueId If specified, ensures strict server-side execution order of concurrent calls with the same queue ID.
* @param ?\Amp\Cancellation $cancellation Cancellation * @param ?\Amp\Cancellation $cancellation Cancellation
* @return array{_: 'account.privacyRules', rules: list<array{_: 'privacyValueAllowContacts'}|array{_: 'privacyValueAllowAll'}|array{_: 'privacyValueAllowUsers', users: list<int>}|array{_: 'privacyValueDisallowContacts'}|array{_: 'privacyValueDisallowAll'}|array{_: 'privacyValueDisallowUsers', users: list<int>}|array{_: 'privacyValueAllowChatParticipants', chats: list<int>}|array{_: 'privacyValueDisallowChatParticipants', chats: list<int>}|array{_: 'privacyValueAllowCloseFriends'}|array{_: 'privacyValueAllowPremium'}>, chats: list<array|int|string>, users: list<array|int|string>} @see https://docs.madelineproto.xyz/API_docs/types/account.PrivacyRules.html * @return array{_: 'account.privacyRules', rules: list<array{_: 'privacyValueAllowContacts'}|array{_: 'privacyValueAllowAll'}|array{_: 'privacyValueAllowUsers', users: list<int>}|array{_: 'privacyValueDisallowContacts'}|array{_: 'privacyValueDisallowAll'}|array{_: 'privacyValueDisallowUsers', users: list<int>}|array{_: 'privacyValueAllowChatParticipants', chats: list<int>}|array{_: 'privacyValueDisallowChatParticipants', chats: list<int>}|array{_: 'privacyValueAllowCloseFriends'}|array{_: 'privacyValueAllowPremium'}|array{_: 'privacyValueAllowBots'}|array{_: 'privacyValueDisallowBots'}>, chats: list<array|int|string>, users: list<array|int|string>} @see https://docs.madelineproto.xyz/API_docs/types/account.PrivacyRules.html
*/ */
public function setPrivacy(array $key, array $rules = [], ?int $floodWaitLimit = null, ?string $queueId = null, ?\Amp\Cancellation $cancellation = null): array; public function setPrivacy(array $key, array $rules = [], ?int $floodWaitLimit = null, ?string $queueId = null, ?\Amp\Cancellation $cancellation = null): array;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -29,14 +29,30 @@ use function Amp\delay;
*/ */
class RateLimitError extends RPCErrorException class RateLimitError extends RPCErrorException
{ {
/**
* Indicates the absolute expiration time of the flood wait.
*
* @var positive-int
*/
public readonly int $expires;
/** @internal */ /** @internal */
public function __construct(string $message, public readonly int $waitTime, int $code, string $caller, ?Exception $previous = null) public function __construct(
{ string $message,
/** @var positive-int */
public readonly int $waitTime,
int $code,
string $caller,
?Exception $previous = null
) {
$this->expires = time() + $waitTime;
parent::__construct($message, "A rate limit was encountered, please repeat the method call after $waitTime seconds", $code, $caller, $previous); parent::__construct($message, "A rate limit was encountered, please repeat the method call after $waitTime seconds", $code, $caller, $previous);
} }
/** /**
* Returns the required waiting period in seconds before repeating the RPC call. * Returns the required waiting period in seconds before repeating the RPC call.
*
* @return positive-int
*/ */
public function getWaitTime(): int public function getWaitTime(): int
{ {
@ -44,10 +60,23 @@ class RateLimitError extends RPCErrorException
} }
/** /**
* Waits for the required waiting period. * Returns the remaining waiting period in seconds before repeating the RPC call.
*
* @return int<0, max>
*/
public function getWaitTimeLeft(): int
{
return max(0, $this->expires - time());
}
/**
* Waits for the remaining waiting period.
*/ */
public function wait(?Cancellation $cancellation = null): void public function wait(?Cancellation $cancellation = null): void
{ {
delay($this->waitTime, cancellation: $cancellation); $left = $this->getWaitTimeLeft();
if ($left > 0) {
delay($left, cancellation: $cancellation);
}
} }
} }

View File

@ -27,11 +27,11 @@ final class TLSchema extends SettingsAbstract
/** /**
* TL layer version. * TL layer version.
*/ */
protected int $layer = 190; protected int $layer = 193;
/** /**
* API schema path. * API schema path.
*/ */
protected string $APISchema = __DIR__ . '/../TL_telegram_v190.tl'; protected string $APISchema = __DIR__ . '/../TL_telegram_v193.tl';
/** /**
* MTProto schema path. * MTProto schema path.
*/ */

View File

@ -116,7 +116,7 @@ chatPhotoEmpty#37c1011c = ChatPhoto;
chatPhoto#1c6e1c11 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = ChatPhoto; chatPhoto#1c6e1c11 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = ChatPhoto;
messageEmpty#90a6ca84 flags:# id:int peer_id:flags.0?Peer = Message; messageEmpty#90a6ca84 flags:# id:int peer_id:flags.0?Peer = Message;
message#94345242 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true noforwards:flags.26?true invert_media:flags.27?true flags2:# offline:flags2.1?true id:int from_id:flags.8?Peer from_boosts_applied:flags.29?int peer_id:Peer saved_peer_id:flags.28?Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long via_business_bot_id:flags2.0?long reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long reactions:flags.20?MessageReactions restriction_reason:flags.22?Vector<RestrictionReason> ttl_period:flags.25?int quick_reply_shortcut_id:flags.30?int effect:flags2.2?long factcheck:flags2.3?FactCheck = Message; message#94345242 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true noforwards:flags.26?true invert_media:flags.27?true flags2:# offline:flags2.1?true video_processing_pending:flags2.4?true id:int from_id:flags.8?Peer from_boosts_applied:flags.29?int peer_id:Peer saved_peer_id:flags.28?Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long via_business_bot_id:flags2.0?long reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long reactions:flags.20?MessageReactions restriction_reason:flags.22?Vector<RestrictionReason> ttl_period:flags.25?int quick_reply_shortcut_id:flags.30?int effect:flags2.2?long factcheck:flags2.3?FactCheck = Message;
messageService#2b085862 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction ttl_period:flags.25?int = Message; messageService#2b085862 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction ttl_period:flags.25?int = Message;
messageMediaEmpty#3ded6320 = MessageMedia; messageMediaEmpty#3ded6320 = MessageMedia;
@ -183,7 +183,7 @@ messageActionRequestedPeerSentMe#93b31848 button_id:int peers:Vector<RequestedPe
messageActionPaymentRefunded#41b3e202 flags:# peer:Peer currency:string total_amount:long payload:flags.0?bytes charge:PaymentCharge = MessageAction; messageActionPaymentRefunded#41b3e202 flags:# peer:Peer currency:string total_amount:long payload:flags.0?bytes charge:PaymentCharge = MessageAction;
messageActionGiftStars#45d5b021 flags:# currency:string amount:long stars:long crypto_currency:flags.0?string crypto_amount:flags.0?long transaction_id:flags.1?string = MessageAction; messageActionGiftStars#45d5b021 flags:# currency:string amount:long stars:long crypto_currency:flags.0?string crypto_amount:flags.0?long transaction_id:flags.1?string = MessageAction;
messageActionPrizeStars#b00c47a2 flags:# unclaimed:flags.0?true stars:long transaction_id:string boost_peer:Peer giveaway_msg_id:int = MessageAction; messageActionPrizeStars#b00c47a2 flags:# unclaimed:flags.0?true stars:long transaction_id:string boost_peer:Peer giveaway_msg_id:int = MessageAction;
messageActionStarGift#9bb3ef44 flags:# name_hidden:flags.0?true saved:flags.2?true converted:flags.3?true gift:StarGift message:flags.1?TextWithEntities convert_stars:long = MessageAction; messageActionStarGift#8557637 flags:# name_hidden:flags.0?true saved:flags.2?true converted:flags.3?true gift:StarGift message:flags.1?TextWithEntities convert_stars:flags.4?long = MessageAction;
dialog#d58a08c6 flags:# pinned:flags.2?true unread_mark:flags.3?true view_forum_as_messages:flags.6?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int ttl_period:flags.5?int = Dialog; dialog#d58a08c6 flags:# pinned:flags.2?true unread_mark:flags.3?true view_forum_as_messages:flags.6?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int ttl_period:flags.5?int = Dialog;
dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog; dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog;
@ -235,7 +235,7 @@ inputReportReasonFake#f5ddd6e7 = ReportReason;
inputReportReasonIllegalDrugs#a8eb2be = ReportReason; inputReportReasonIllegalDrugs#a8eb2be = ReportReason;
inputReportReasonPersonalDetails#9ec7863d = ReportReason; inputReportReasonPersonalDetails#9ec7863d = ReportReason;
userFull#1f58e369 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# sponsored_enabled:flags2.7?true id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector<PremiumGiftOption> wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int stargifts_count:flags2.8?int = UserFull; userFull#1f58e369 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# sponsored_enabled:flags2.7?true can_view_revenue:flags2.9?true bot_can_manage_emoji_status:flags2.10?true id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector<PremiumGiftOption> wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int stargifts_count:flags2.8?int = UserFull;
contact#145ade0b user_id:long mutual:Bool = Contact; contact#145ade0b user_id:long mutual:Bool = Contact;
@ -353,7 +353,7 @@ updateFolderPeers#19360dc0 folder_peers:Vector<FolderPeer> pts:int pts_count:int
updatePeerSettings#6a7e7366 peer:Peer settings:PeerSettings = Update; updatePeerSettings#6a7e7366 peer:Peer settings:PeerSettings = Update;
updatePeerLocated#b4afcfb0 peers:Vector<PeerLocated> = Update; updatePeerLocated#b4afcfb0 peers:Vector<PeerLocated> = Update;
updateNewScheduledMessage#39a51dfb message:Message = Update; updateNewScheduledMessage#39a51dfb message:Message = Update;
updateDeleteScheduledMessages#90866cee peer:Peer messages:Vector<int> = Update; updateDeleteScheduledMessages#f2a71983 flags:# peer:Peer messages:Vector<int> sent_messages:flags.0?Vector<int> = Update;
updateTheme#8216fba3 theme:Theme = Update; updateTheme#8216fba3 theme:Theme = Update;
updateGeoLiveViewed#871fb939 peer:Peer msg_id:int = Update; updateGeoLiveViewed#871fb939 peer:Peer msg_id:int = Update;
updateLoginToken#564fe691 = Update; updateLoginToken#564fe691 = Update;
@ -426,6 +426,7 @@ updateBusinessBotCallbackQuery#1ea2fda7 flags:# query_id:long user_id:long conne
updateStarsRevenueStatus#a584b019 peer:Peer status:StarsRevenueStatus = Update; updateStarsRevenueStatus#a584b019 peer:Peer status:StarsRevenueStatus = Update;
updateBotPurchasedPaidMedia#283bd312 user_id:long payload:string qts:int = Update; updateBotPurchasedPaidMedia#283bd312 user_id:long payload:string qts:int = Update;
updatePaidReactionPrivacy#51ca7aec private:Bool = Update; updatePaidReactionPrivacy#51ca7aec private:Bool = Update;
updateBotSubscriptionExpire#2d13c6ee user_id:long payload:string invoice_slug:string until_date:int qts:int = Update;
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
@ -532,6 +533,7 @@ inputPrivacyKeyAddedByPhone#d1219bdd = InputPrivacyKey;
inputPrivacyKeyVoiceMessages#aee69d68 = InputPrivacyKey; inputPrivacyKeyVoiceMessages#aee69d68 = InputPrivacyKey;
inputPrivacyKeyAbout#3823cc40 = InputPrivacyKey; inputPrivacyKeyAbout#3823cc40 = InputPrivacyKey;
inputPrivacyKeyBirthday#d65a11cc = InputPrivacyKey; inputPrivacyKeyBirthday#d65a11cc = InputPrivacyKey;
inputPrivacyKeyStarGiftsAutoSave#e1732341 = InputPrivacyKey;
privacyKeyStatusTimestamp#bc2eab30 = PrivacyKey; privacyKeyStatusTimestamp#bc2eab30 = PrivacyKey;
privacyKeyChatInvite#500e6dfa = PrivacyKey; privacyKeyChatInvite#500e6dfa = PrivacyKey;
@ -544,6 +546,7 @@ privacyKeyAddedByPhone#42ffd42b = PrivacyKey;
privacyKeyVoiceMessages#697f414 = PrivacyKey; privacyKeyVoiceMessages#697f414 = PrivacyKey;
privacyKeyAbout#a486b761 = PrivacyKey; privacyKeyAbout#a486b761 = PrivacyKey;
privacyKeyBirthday#2000a518 = PrivacyKey; privacyKeyBirthday#2000a518 = PrivacyKey;
privacyKeyStarGiftsAutoSave#2ca4fdf8 = PrivacyKey;
inputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule; inputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule;
inputPrivacyValueAllowAll#184b35ce = InputPrivacyRule; inputPrivacyValueAllowAll#184b35ce = InputPrivacyRule;
@ -555,6 +558,8 @@ inputPrivacyValueAllowChatParticipants#840649cf chats:Vector<long> = InputPrivac
inputPrivacyValueDisallowChatParticipants#e94f0f86 chats:Vector<long> = InputPrivacyRule; inputPrivacyValueDisallowChatParticipants#e94f0f86 chats:Vector<long> = InputPrivacyRule;
inputPrivacyValueAllowCloseFriends#2f453e49 = InputPrivacyRule; inputPrivacyValueAllowCloseFriends#2f453e49 = InputPrivacyRule;
inputPrivacyValueAllowPremium#77cdc9f1 = InputPrivacyRule; inputPrivacyValueAllowPremium#77cdc9f1 = InputPrivacyRule;
inputPrivacyValueAllowBots#5a4fcce5 = InputPrivacyRule;
inputPrivacyValueDisallowBots#c4e57915 = InputPrivacyRule;
privacyValueAllowContacts#fffe1bac = PrivacyRule; privacyValueAllowContacts#fffe1bac = PrivacyRule;
privacyValueAllowAll#65427b82 = PrivacyRule; privacyValueAllowAll#65427b82 = PrivacyRule;
@ -566,6 +571,8 @@ privacyValueAllowChatParticipants#6b134e8e chats:Vector<long> = PrivacyRule;
privacyValueDisallowChatParticipants#41c87565 chats:Vector<long> = PrivacyRule; privacyValueDisallowChatParticipants#41c87565 chats:Vector<long> = PrivacyRule;
privacyValueAllowCloseFriends#f7e8d89b = PrivacyRule; privacyValueAllowCloseFriends#f7e8d89b = PrivacyRule;
privacyValueAllowPremium#ece9814b = PrivacyRule; privacyValueAllowPremium#ece9814b = PrivacyRule;
privacyValueAllowBots#21461b5d = PrivacyRule;
privacyValueDisallowBots#f6a5f82f = PrivacyRule;
account.privacyRules#50a04e45 rules:Vector<PrivacyRule> chats:Vector<Chat> users:Vector<User> = account.PrivacyRules; account.privacyRules#50a04e45 rules:Vector<PrivacyRule> chats:Vector<Chat> users:Vector<User> = account.PrivacyRules;
@ -635,7 +642,7 @@ messages.stickerSetNotModified#d3f924eb = messages.StickerSet;
botCommand#c27ac8c7 command:string description:string = BotCommand; botCommand#c27ac8c7 command:string description:string = BotCommand;
botInfo#82437e74 flags:# has_preview_medias:flags.6?true user_id:flags.0?long description:flags.1?string description_photo:flags.4?Photo description_document:flags.5?Document commands:flags.2?Vector<BotCommand> menu_button:flags.3?BotMenuButton privacy_policy_url:flags.7?string = BotInfo; botInfo#36607333 flags:# has_preview_medias:flags.6?true user_id:flags.0?long description:flags.1?string description_photo:flags.4?Photo description_document:flags.5?Document commands:flags.2?Vector<BotCommand> menu_button:flags.3?BotMenuButton privacy_policy_url:flags.7?string app_settings:flags.8?BotAppSettings = BotInfo;
keyboardButton#a2fa4880 text:string = KeyboardButton; keyboardButton#a2fa4880 text:string = KeyboardButton;
keyboardButtonUrl#258aff05 text:string url:string = KeyboardButton; keyboardButtonUrl#258aff05 text:string url:string = KeyboardButton;
@ -893,7 +900,7 @@ dataJSON#7d748d04 data:string = DataJSON;
labeledPrice#cb296bf8 label:string amount:long = LabeledPrice; labeledPrice#cb296bf8 label:string amount:long = LabeledPrice;
invoice#5db95a15 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true recurring:flags.9?true currency:string prices:Vector<LabeledPrice> max_tip_amount:flags.8?long suggested_tip_amounts:flags.8?Vector<long> terms_url:flags.10?string = Invoice; invoice#49ee584 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true recurring:flags.9?true currency:string prices:Vector<LabeledPrice> max_tip_amount:flags.8?long suggested_tip_amounts:flags.8?Vector<long> terms_url:flags.10?string subscription_period:flags.11?int = Invoice;
paymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge; paymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge;
@ -1436,7 +1443,7 @@ attachMenuBots#3c4301c0 hash:long bots:Vector<AttachMenuBot> users:Vector<User>
attachMenuBotsBot#93bf667f bot:AttachMenuBot users:Vector<User> = AttachMenuBotsBot; attachMenuBotsBot#93bf667f bot:AttachMenuBot users:Vector<User> = AttachMenuBotsBot;
webViewResultUrl#4d22ff98 flags:# fullsize:flags.1?true query_id:flags.0?long url:string = WebViewResult; webViewResultUrl#4d22ff98 flags:# fullsize:flags.1?true fullscreen:flags.2?true query_id:flags.0?long url:string = WebViewResult;
webViewMessageSent#c94511c flags:# msg_id:flags.0?InputBotInlineMessageID = WebViewMessageSent; webViewMessageSent#c94511c flags:# msg_id:flags.0?InputBotInlineMessageID = WebViewMessageSent;
@ -1821,10 +1828,11 @@ starsTransactionPeerPremiumBot#250dbaf8 = StarsTransactionPeer;
starsTransactionPeerFragment#e92fd902 = StarsTransactionPeer; starsTransactionPeerFragment#e92fd902 = StarsTransactionPeer;
starsTransactionPeer#d80da15d peer:Peer = StarsTransactionPeer; starsTransactionPeer#d80da15d peer:Peer = StarsTransactionPeer;
starsTransactionPeerAds#60682812 = StarsTransactionPeer; starsTransactionPeerAds#60682812 = StarsTransactionPeer;
starsTransactionPeerAPI#f9677aad = StarsTransactionPeer;
starsTopupOption#bd915c0 flags:# extended:flags.1?true stars:long store_product:flags.0?string currency:string amount:long = StarsTopupOption; starsTopupOption#bd915c0 flags:# extended:flags.1?true stars:long store_product:flags.0?string currency:string amount:long = StarsTopupOption;
starsTransaction#a9ee4c2 flags:# refund:flags.3?true pending:flags.4?true failed:flags.6?true gift:flags.10?true reaction:flags.11?true id:string stars:long date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument transaction_date:flags.5?int transaction_url:flags.5?string bot_payload:flags.7?bytes msg_id:flags.8?int extended_media:flags.9?Vector<MessageMedia> subscription_period:flags.12?int giveaway_post_id:flags.13?int stargift:flags.14?StarGift = StarsTransaction; starsTransaction#35d4f276 flags:# refund:flags.3?true pending:flags.4?true failed:flags.6?true gift:flags.10?true reaction:flags.11?true id:string stars:long date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument transaction_date:flags.5?int transaction_url:flags.5?string bot_payload:flags.7?bytes msg_id:flags.8?int extended_media:flags.9?Vector<MessageMedia> subscription_period:flags.12?int giveaway_post_id:flags.13?int stargift:flags.14?StarGift floodskip_number:flags.15?int = StarsTransaction;
payments.starsStatus#bbfa316c flags:# balance:long subscriptions:flags.1?Vector<StarsSubscription> subscriptions_next_offset:flags.2?string subscriptions_missing_balance:flags.4?long history:flags.3?Vector<StarsTransaction> next_offset:flags.0?string chats:Vector<Chat> users:Vector<User> = payments.StarsStatus; payments.starsStatus#bbfa316c flags:# balance:long subscriptions:flags.1?Vector<StarsSubscription> subscriptions_next_offset:flags.2?string subscriptions_missing_balance:flags.4?long history:flags.3?Vector<StarsTransaction> next_offset:flags.0?string chats:Vector<Chat> users:Vector<User> = payments.StarsStatus;
@ -1854,7 +1862,7 @@ bots.previewInfo#ca71d64 media:Vector<BotPreviewMedia> lang_codes:Vector<string>
starsSubscriptionPricing#5416d58 period:int amount:long = StarsSubscriptionPricing; starsSubscriptionPricing#5416d58 period:int amount:long = StarsSubscriptionPricing;
starsSubscription#538ecf18 flags:# canceled:flags.0?true can_refulfill:flags.1?true missing_balance:flags.2?true id:string peer:Peer until_date:int pricing:StarsSubscriptionPricing chat_invite_hash:flags.3?string = StarsSubscription; starsSubscription#2e6eab1a flags:# canceled:flags.0?true can_refulfill:flags.1?true missing_balance:flags.2?true bot_canceled:flags.7?true id:string peer:Peer until_date:int pricing:StarsSubscriptionPricing chat_invite_hash:flags.3?string title:flags.4?string photo:flags.5?WebDocument invoice_slug:flags.6?string = StarsSubscription;
messageReactor#4ba3a95a flags:# top:flags.0?true my:flags.1?true anonymous:flags.2?true peer_id:flags.3?Peer count:int = MessageReactor; messageReactor#4ba3a95a flags:# top:flags.0?true my:flags.1?true anonymous:flags.2?true peer_id:flags.3?Peer count:int = MessageReactor;
@ -1862,7 +1870,7 @@ starsGiveawayOption#94ce852a flags:# extended:flags.0?true default:flags.1?true
starsGiveawayWinnersOption#54236209 flags:# default:flags.0?true users:int per_user_stars:long = StarsGiveawayWinnersOption; starsGiveawayWinnersOption#54236209 flags:# default:flags.0?true users:int per_user_stars:long = StarsGiveawayWinnersOption;
starGift#aea174ee flags:# limited:flags.0?true id:long sticker:Document stars:long availability_remains:flags.0?int availability_total:flags.0?int convert_stars:long = StarGift; starGift#49c577cd flags:# limited:flags.0?true sold_out:flags.1?true birthday:flags.2?true id:long sticker:Document stars:long availability_remains:flags.0?int availability_total:flags.0?int convert_stars:long first_sale_date:flags.1?int last_sale_date:flags.1?int = StarGift;
payments.starGiftsNotModified#a388a368 = payments.StarGifts; payments.starGiftsNotModified#a388a368 = payments.StarGifts;
payments.starGifts#901689ea hash:int gifts:Vector<StarGift> = payments.StarGifts; payments.starGifts#901689ea hash:int gifts:Vector<StarGift> = payments.StarGifts;
@ -1877,6 +1885,12 @@ reportResultChooseOption#f0e4e0b6 title:string options:Vector<MessageReportOptio
reportResultAddComment#6f09ac31 flags:# optional:flags.0?true option:bytes = ReportResult; reportResultAddComment#6f09ac31 flags:# optional:flags.0?true option:bytes = ReportResult;
reportResultReported#8db33c4b = ReportResult; reportResultReported#8db33c4b = ReportResult;
messages.botPreparedInlineMessage#8ecf0511 id:string expire_date:int = messages.BotPreparedInlineMessage;
messages.preparedInlineMessage#ff57708d query_id:long result:BotInlineResult peer_types:Vector<InlineQueryPeerType> cache_time:int users:Vector<User> = messages.PreparedInlineMessage;
botAppSettings#c99b1950 flags:# placeholder_path:flags.0?bytes background_color:flags.1?int background_dark_color:flags.2?int header_color:flags.3?int header_dark_color:flags.4?int = BotAppSettings;
---functions--- ---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
@ -2068,9 +2082,9 @@ messages.deleteHistory#b08f922a flags:# just_clear:flags.0?true revoke:flags.1?t
messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector<int> = messages.AffectedMessages; messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector<int> = messages.AffectedMessages;
messages.receivedMessages#5a954c0 max_id:int = Vector<ReceivedNotifyMessage>; messages.receivedMessages#5a954c0 max_id:int = Vector<ReceivedNotifyMessage>;
messages.setTyping#58943ee2 flags:# peer:InputPeer top_msg_id:flags.0?int action:SendMessageAction = Bool; messages.setTyping#58943ee2 flags:# peer:InputPeer top_msg_id:flags.0?int action:SendMessageAction = Bool;
messages.sendMessage#983f9745 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true peer:InputPeer reply_to:flags.0?InputReplyTo message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long = Updates; messages.sendMessage#983f9745 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true allow_paid_floodskip:flags.19?true peer:InputPeer reply_to:flags.0?InputReplyTo message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long = Updates;
messages.sendMedia#7852834e flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true peer:InputPeer reply_to:flags.0?InputReplyTo media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long = Updates; messages.sendMedia#7852834e flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true allow_paid_floodskip:flags.19?true peer:InputPeer reply_to:flags.0?InputReplyTo media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long = Updates;
messages.forwardMessages#d5039208 flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true drop_author:flags.11?true drop_media_captions:flags.12?true noforwards:flags.14?true from_peer:InputPeer id:Vector<int> random_id:Vector<long> to_peer:InputPeer top_msg_id:flags.9?int schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut = Updates; messages.forwardMessages#d5039208 flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true drop_author:flags.11?true drop_media_captions:flags.12?true noforwards:flags.14?true allow_paid_floodskip:flags.19?true from_peer:InputPeer id:Vector<int> random_id:Vector<long> to_peer:InputPeer top_msg_id:flags.9?int schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut = Updates;
messages.reportSpam#cf1592db peer:InputPeer = Bool; messages.reportSpam#cf1592db peer:InputPeer = Bool;
messages.getPeerSettings#efd9a6a2 peer:InputPeer = messages.PeerSettings; messages.getPeerSettings#efd9a6a2 peer:InputPeer = messages.PeerSettings;
messages.report#fc78af9b peer:InputPeer id:Vector<int> option:bytes message:string = ReportResult; messages.report#fc78af9b peer:InputPeer id:Vector<int> option:bytes message:string = ReportResult;
@ -2148,7 +2162,7 @@ messages.faveSticker#b9ffc55b id:InputDocument unfave:Bool = Bool;
messages.getUnreadMentions#f107e790 flags:# peer:InputPeer top_msg_id:flags.0?int offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages; messages.getUnreadMentions#f107e790 flags:# peer:InputPeer top_msg_id:flags.0?int offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages;
messages.readMentions#36e5bf4d flags:# peer:InputPeer top_msg_id:flags.0?int = messages.AffectedHistory; messages.readMentions#36e5bf4d flags:# peer:InputPeer top_msg_id:flags.0?int = messages.AffectedHistory;
messages.getRecentLocations#702a40e0 peer:InputPeer limit:int hash:long = messages.Messages; messages.getRecentLocations#702a40e0 peer:InputPeer limit:int hash:long = messages.Messages;
messages.sendMultiMedia#37b74355 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true peer:InputPeer reply_to:flags.0?InputReplyTo multi_media:Vector<InputSingleMedia> schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long = Updates; messages.sendMultiMedia#37b74355 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true allow_paid_floodskip:flags.19?true peer:InputPeer reply_to:flags.0?InputReplyTo multi_media:Vector<InputSingleMedia> schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long = Updates;
messages.uploadEncryptedFile#5057c497 peer:InputEncryptedChat file:InputEncryptedFile = EncryptedFile; messages.uploadEncryptedFile#5057c497 peer:InputEncryptedChat file:InputEncryptedFile = EncryptedFile;
messages.searchStickerSets#35705b8a flags:# exclude_featured:flags.0?true q:string hash:long = messages.FoundStickerSets; messages.searchStickerSets#35705b8a flags:# exclude_featured:flags.0?true q:string hash:long = messages.FoundStickerSets;
messages.getSplitRanges#1cff7e08 = Vector<MessageRange>; messages.getSplitRanges#1cff7e08 = Vector<MessageRange>;
@ -2220,9 +2234,9 @@ messages.searchSentMedia#107e31a0 q:string filter:MessagesFilter limit:int = mes
messages.getAttachMenuBots#16fcc2cb hash:long = AttachMenuBots; messages.getAttachMenuBots#16fcc2cb hash:long = AttachMenuBots;
messages.getAttachMenuBot#77216192 bot:InputUser = AttachMenuBotsBot; messages.getAttachMenuBot#77216192 bot:InputUser = AttachMenuBotsBot;
messages.toggleBotInAttachMenu#69f59d69 flags:# write_allowed:flags.0?true bot:InputUser enabled:Bool = Bool; messages.toggleBotInAttachMenu#69f59d69 flags:# write_allowed:flags.0?true bot:InputUser enabled:Bool = Bool;
messages.requestWebView#269dc2c1 flags:# from_bot_menu:flags.4?true silent:flags.5?true compact:flags.7?true peer:InputPeer bot:InputUser url:flags.1?string start_param:flags.3?string theme_params:flags.2?DataJSON platform:string reply_to:flags.0?InputReplyTo send_as:flags.13?InputPeer = WebViewResult; messages.requestWebView#269dc2c1 flags:# from_bot_menu:flags.4?true silent:flags.5?true compact:flags.7?true fullscreen:flags.8?true peer:InputPeer bot:InputUser url:flags.1?string start_param:flags.3?string theme_params:flags.2?DataJSON platform:string reply_to:flags.0?InputReplyTo send_as:flags.13?InputPeer = WebViewResult;
messages.prolongWebView#b0d81a83 flags:# silent:flags.5?true peer:InputPeer bot:InputUser query_id:long reply_to:flags.0?InputReplyTo send_as:flags.13?InputPeer = Bool; messages.prolongWebView#b0d81a83 flags:# silent:flags.5?true peer:InputPeer bot:InputUser query_id:long reply_to:flags.0?InputReplyTo send_as:flags.13?InputPeer = Bool;
messages.requestSimpleWebView#413a3e73 flags:# from_switch_webview:flags.1?true from_side_menu:flags.2?true compact:flags.7?true bot:InputUser url:flags.3?string start_param:flags.4?string theme_params:flags.0?DataJSON platform:string = WebViewResult; messages.requestSimpleWebView#413a3e73 flags:# from_switch_webview:flags.1?true from_side_menu:flags.2?true compact:flags.7?true fullscreen:flags.8?true bot:InputUser url:flags.3?string start_param:flags.4?string theme_params:flags.0?DataJSON platform:string = WebViewResult;
messages.sendWebViewResultMessage#a4314f5 bot_query_id:string result:InputBotInlineResult = WebViewMessageSent; messages.sendWebViewResultMessage#a4314f5 bot_query_id:string result:InputBotInlineResult = WebViewMessageSent;
messages.sendWebViewData#dc0242c8 bot:InputUser random_id:long button_text:string data:string = Updates; messages.sendWebViewData#dc0242c8 bot:InputUser random_id:long button_text:string data:string = Updates;
messages.transcribeAudio#269e9a49 peer:InputPeer msg_id:int = messages.TranscribedAudio; messages.transcribeAudio#269e9a49 peer:InputPeer msg_id:int = messages.TranscribedAudio;
@ -2244,7 +2258,7 @@ messages.getEmojiProfilePhotoGroups#21a548f3 hash:int = messages.EmojiGroups;
messages.searchCustomEmoji#2c11c0d7 emoticon:string hash:long = EmojiList; messages.searchCustomEmoji#2c11c0d7 emoticon:string hash:long = EmojiList;
messages.togglePeerTranslations#e47cb579 flags:# disabled:flags.0?true peer:InputPeer = Bool; messages.togglePeerTranslations#e47cb579 flags:# disabled:flags.0?true peer:InputPeer = Bool;
messages.getBotApp#34fdc5c3 app:InputBotApp hash:long = messages.BotApp; messages.getBotApp#34fdc5c3 app:InputBotApp hash:long = messages.BotApp;
messages.requestAppWebView#53618bce flags:# write_allowed:flags.0?true compact:flags.7?true peer:InputPeer app:InputBotApp start_param:flags.1?string theme_params:flags.2?DataJSON platform:string = WebViewResult; messages.requestAppWebView#53618bce flags:# write_allowed:flags.0?true compact:flags.7?true fullscreen:flags.8?true peer:InputPeer app:InputBotApp start_param:flags.1?string theme_params:flags.2?DataJSON platform:string = WebViewResult;
messages.setChatWallPaper#8ffacae1 flags:# for_both:flags.3?true revert:flags.4?true peer:InputPeer wallpaper:flags.0?InputWallPaper settings:flags.2?WallPaperSettings id:flags.1?int = Updates; messages.setChatWallPaper#8ffacae1 flags:# for_both:flags.3?true revert:flags.4?true peer:InputPeer wallpaper:flags.0?InputWallPaper settings:flags.2?WallPaperSettings id:flags.1?int = Updates;
messages.searchEmojiStickerSets#92b4494c flags:# exclude_featured:flags.0?true q:string hash:long = messages.FoundStickerSets; messages.searchEmojiStickerSets#92b4494c flags:# exclude_featured:flags.0?true q:string hash:long = messages.FoundStickerSets;
messages.getSavedDialogs#5381d21a flags:# exclude_pinned:flags.0?true offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:long = messages.SavedDialogs; messages.getSavedDialogs#5381d21a flags:# exclude_pinned:flags.0?true offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:long = messages.SavedDialogs;
@ -2272,10 +2286,16 @@ messages.getAvailableEffects#dea20a39 hash:int = messages.AvailableEffects;
messages.editFactCheck#589ee75 peer:InputPeer msg_id:int text:TextWithEntities = Updates; messages.editFactCheck#589ee75 peer:InputPeer msg_id:int text:TextWithEntities = Updates;
messages.deleteFactCheck#d1da940c peer:InputPeer msg_id:int = Updates; messages.deleteFactCheck#d1da940c peer:InputPeer msg_id:int = Updates;
messages.getFactCheck#b9cdc5ee peer:InputPeer msg_id:Vector<int> = Vector<FactCheck>; messages.getFactCheck#b9cdc5ee peer:InputPeer msg_id:Vector<int> = Vector<FactCheck>;
messages.requestMainWebView#c9e01e7b flags:# compact:flags.7?true peer:InputPeer bot:InputUser start_param:flags.1?string theme_params:flags.0?DataJSON platform:string = WebViewResult; messages.requestMainWebView#c9e01e7b flags:# compact:flags.7?true fullscreen:flags.8?true peer:InputPeer bot:InputUser start_param:flags.1?string theme_params:flags.0?DataJSON platform:string = WebViewResult;
messages.sendPaidReaction#9dd6a67b flags:# peer:InputPeer msg_id:int count:int random_id:long private:flags.0?Bool = Updates; messages.sendPaidReaction#9dd6a67b flags:# peer:InputPeer msg_id:int count:int random_id:long private:flags.0?Bool = Updates;
messages.togglePaidReactionPrivacy#849ad397 peer:InputPeer msg_id:int private:Bool = Bool; messages.togglePaidReactionPrivacy#849ad397 peer:InputPeer msg_id:int private:Bool = Bool;
messages.getPaidReactionPrivacy#472455aa = Updates; messages.getPaidReactionPrivacy#472455aa = Updates;
messages.viewSponsoredMessage#673ad8f1 peer:InputPeer random_id:bytes = Bool;
messages.clickSponsoredMessage#f093465 flags:# media:flags.0?true fullscreen:flags.1?true peer:InputPeer random_id:bytes = Bool;
messages.reportSponsoredMessage#1af3dbb8 peer:InputPeer random_id:bytes option:bytes = channels.SponsoredMessageReportResult;
messages.getSponsoredMessages#9bd2f439 peer:InputPeer = messages.SponsoredMessages;
messages.savePreparedInlineMessage#f21f7f2f flags:# result:InputBotInlineResult user_id:InputUser peer_types:flags.0?Vector<InlineQueryPeerType> = messages.BotPreparedInlineMessage;
messages.getPreparedInlineMessage#857ebdb8 bot:InputUser id:string = messages.PreparedInlineMessage;
updates.getState#edd4882a = updates.State; updates.getState#edd4882a = updates.State;
updates.getDifference#19c2f763 flags:# pts:int pts_limit:flags.1?int pts_total_limit:flags.0?int date:int qts:int qts_limit:flags.2?int = updates.Difference; updates.getDifference#19c2f763 flags:# pts:int pts_limit:flags.1?int pts_total_limit:flags.0?int date:int qts:int qts_limit:flags.2?int = updates.Difference;
@ -2357,8 +2377,6 @@ channels.editLocation#58e63f6d channel:InputChannel geo_point:InputGeoPoint addr
channels.toggleSlowMode#edd49ef0 channel:InputChannel seconds:int = Updates; channels.toggleSlowMode#edd49ef0 channel:InputChannel seconds:int = Updates;
channels.getInactiveChannels#11e831ee = messages.InactiveChats; channels.getInactiveChannels#11e831ee = messages.InactiveChats;
channels.convertToGigagroup#b290c69 channel:InputChannel = Updates; channels.convertToGigagroup#b290c69 channel:InputChannel = Updates;
channels.viewSponsoredMessage#beaedb94 channel:InputChannel random_id:bytes = Bool;
channels.getSponsoredMessages#ec210fbf channel:InputChannel = messages.SponsoredMessages;
channels.getSendAs#dc770ee peer:InputPeer = channels.SendAsPeers; channels.getSendAs#dc770ee peer:InputPeer = channels.SendAsPeers;
channels.deleteParticipantHistory#367544db channel:InputChannel participant:InputPeer = messages.AffectedHistory; channels.deleteParticipantHistory#367544db channel:InputChannel participant:InputPeer = messages.AffectedHistory;
channels.toggleJoinToSend#e4cb9580 channel:InputChannel enabled:Bool = Updates; channels.toggleJoinToSend#e4cb9580 channel:InputChannel enabled:Bool = Updates;
@ -2377,14 +2395,12 @@ channels.reorderPinnedForumTopics#2950a18f flags:# force:flags.0?true channel:In
channels.toggleAntiSpam#68f3e4eb channel:InputChannel enabled:Bool = Updates; channels.toggleAntiSpam#68f3e4eb channel:InputChannel enabled:Bool = Updates;
channels.reportAntiSpamFalsePositive#a850a693 channel:InputChannel msg_id:int = Bool; channels.reportAntiSpamFalsePositive#a850a693 channel:InputChannel msg_id:int = Bool;
channels.toggleParticipantsHidden#6a6e7854 channel:InputChannel enabled:Bool = Updates; channels.toggleParticipantsHidden#6a6e7854 channel:InputChannel enabled:Bool = Updates;
channels.clickSponsoredMessage#1445d75 flags:# media:flags.0?true fullscreen:flags.1?true channel:InputChannel random_id:bytes = Bool;
channels.updateColor#d8aa3671 flags:# for_profile:flags.1?true channel:InputChannel color:flags.2?int background_emoji_id:flags.0?long = Updates; channels.updateColor#d8aa3671 flags:# for_profile:flags.1?true channel:InputChannel color:flags.2?int background_emoji_id:flags.0?long = Updates;
channels.toggleViewForumAsMessages#9738bb15 channel:InputChannel enabled:Bool = Updates; channels.toggleViewForumAsMessages#9738bb15 channel:InputChannel enabled:Bool = Updates;
channels.getChannelRecommendations#25a71742 flags:# channel:flags.0?InputChannel = messages.Chats; channels.getChannelRecommendations#25a71742 flags:# channel:flags.0?InputChannel = messages.Chats;
channels.updateEmojiStatus#f0d3e6a8 channel:InputChannel emoji_status:EmojiStatus = Updates; channels.updateEmojiStatus#f0d3e6a8 channel:InputChannel emoji_status:EmojiStatus = Updates;
channels.setBoostsToUnblockRestrictions#ad399cee channel:InputChannel boosts:int = Updates; channels.setBoostsToUnblockRestrictions#ad399cee channel:InputChannel boosts:int = Updates;
channels.setEmojiStickers#3cd930b7 channel:InputChannel stickerset:InputStickerSet = Bool; channels.setEmojiStickers#3cd930b7 channel:InputChannel stickerset:InputStickerSet = Bool;
channels.reportSponsoredMessage#af8ff6b9 channel:InputChannel random_id:bytes option:bytes = channels.SponsoredMessageReportResult;
channels.restrictSponsoredMessages#9ae91519 channel:InputChannel restricted:Bool = Updates; channels.restrictSponsoredMessages#9ae91519 channel:InputChannel restricted:Bool = Updates;
channels.searchPosts#d19f987b hashtag:string offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; channels.searchPosts#d19f987b hashtag:string offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;
@ -2411,6 +2427,9 @@ bots.deletePreviewMedia#2d0135b3 bot:InputUser lang_code:string media:Vector<Inp
bots.reorderPreviewMedias#b627f3aa bot:InputUser lang_code:string order:Vector<InputMedia> = Bool; bots.reorderPreviewMedias#b627f3aa bot:InputUser lang_code:string order:Vector<InputMedia> = Bool;
bots.getPreviewInfo#423ab3ad bot:InputUser lang_code:string = bots.PreviewInfo; bots.getPreviewInfo#423ab3ad bot:InputUser lang_code:string = bots.PreviewInfo;
bots.getPreviewMedias#a2a5594d bot:InputUser = Vector<BotPreviewMedia>; bots.getPreviewMedias#a2a5594d bot:InputUser = Vector<BotPreviewMedia>;
bots.updateUserEmojiStatus#ed9f30c5 user_id:InputUser emoji_status:EmojiStatus = Bool;
bots.toggleUserEmojiStatusPermission#6de6392 bot:InputUser enabled:Bool = Bool;
bots.checkDownloadFileParams#50077589 bot:InputUser file_name:string url:string = Bool;
payments.getPaymentForm#37148dbb flags:# invoice:InputInvoice theme_params:flags.0?DataJSON = payments.PaymentForm; payments.getPaymentForm#37148dbb flags:# invoice:InputInvoice theme_params:flags.0?DataJSON = payments.PaymentForm;
payments.getPaymentReceipt#2478d1cc peer:InputPeer msg_id:int = payments.PaymentReceipt; payments.getPaymentReceipt#2478d1cc peer:InputPeer msg_id:int = payments.PaymentReceipt;
@ -2446,6 +2465,7 @@ payments.getStarGifts#c4563590 hash:int = payments.StarGifts;
payments.getUserStarGifts#5e72c7e1 user_id:InputUser offset:string limit:int = payments.UserStarGifts; payments.getUserStarGifts#5e72c7e1 user_id:InputUser offset:string limit:int = payments.UserStarGifts;
payments.saveStarGift#87acf08e flags:# unsave:flags.0?true user_id:InputUser msg_id:int = Bool; payments.saveStarGift#87acf08e flags:# unsave:flags.0?true user_id:InputUser msg_id:int = Bool;
payments.convertStarGift#421e027 user_id:InputUser msg_id:int = Bool; payments.convertStarGift#421e027 user_id:InputUser msg_id:int = Bool;
payments.botCancelStarsSubscription#57f9ece6 flags:# restore:flags.0?true user_id:InputUser invoice_slug:flags.1?string charge_id:flags.2?string = Bool;
stickers.createStickerSet#9021ab67 flags:# masks:flags.0?true emojis:flags.5?true text_color:flags.6?true user_id:InputUser title:string short_name:string thumb:flags.2?InputDocument stickers:Vector<InputStickerSetItem> software:flags.3?string = messages.StickerSet; stickers.createStickerSet#9021ab67 flags:# masks:flags.0?true emojis:flags.5?true text_color:flags.6?true user_id:InputUser title:string short_name:string thumb:flags.2?InputDocument stickers:Vector<InputStickerSetItem> software:flags.3?string = messages.StickerSet;
stickers.removeStickerFromSet#f7760f51 sticker:InputDocument = messages.StickerSet; stickers.removeStickerFromSet#f7760f51 sticker:InputDocument = messages.StickerSet;
@ -2506,9 +2526,9 @@ stats.getMessagePublicForwards#5f150144 channel:InputChannel msg_id:int offset:s
stats.getMessageStats#b6e0a3f5 flags:# dark:flags.0?true channel:InputChannel msg_id:int = stats.MessageStats; stats.getMessageStats#b6e0a3f5 flags:# dark:flags.0?true channel:InputChannel msg_id:int = stats.MessageStats;
stats.getStoryStats#374fef40 flags:# dark:flags.0?true peer:InputPeer id:int = stats.StoryStats; stats.getStoryStats#374fef40 flags:# dark:flags.0?true peer:InputPeer id:int = stats.StoryStats;
stats.getStoryPublicForwards#a6437ef6 peer:InputPeer id:int offset:string limit:int = stats.PublicForwards; stats.getStoryPublicForwards#a6437ef6 peer:InputPeer id:int offset:string limit:int = stats.PublicForwards;
stats.getBroadcastRevenueStats#75dfb671 flags:# dark:flags.0?true channel:InputChannel = stats.BroadcastRevenueStats; stats.getBroadcastRevenueStats#f788ee19 flags:# dark:flags.0?true peer:InputPeer = stats.BroadcastRevenueStats;
stats.getBroadcastRevenueWithdrawalUrl#2a65ef73 channel:InputChannel password:InputCheckPasswordSRP = stats.BroadcastRevenueWithdrawalUrl; stats.getBroadcastRevenueWithdrawalUrl#9df4faad peer:InputPeer password:InputCheckPasswordSRP = stats.BroadcastRevenueWithdrawalUrl;
stats.getBroadcastRevenueTransactions#69280f channel:InputChannel offset:int limit:int = stats.BroadcastRevenueTransactions; stats.getBroadcastRevenueTransactions#70990b6d peer:InputPeer offset:int limit:int = stats.BroadcastRevenueTransactions;
chatlists.exportChatlistInvite#8472478e chatlist:InputChatlist title:string peers:Vector<InputPeer> = chatlists.ExportedChatlistInvite; chatlists.exportChatlistInvite#8472478e chatlist:InputChatlist title:string peers:Vector<InputPeer> = chatlists.ExportedChatlistInvite;
chatlists.deleteExportedInvite#719c5c5e chatlist:InputChatlist slug:string = Bool; chatlists.deleteExportedInvite#719c5c5e chatlist:InputChatlist slug:string = Bool;
@ -2547,7 +2567,7 @@ stories.getChatsToSend#a56a8b60 = messages.Chats;
stories.togglePeerStoriesHidden#bd0415c4 peer:InputPeer hidden:Bool = Bool; stories.togglePeerStoriesHidden#bd0415c4 peer:InputPeer hidden:Bool = Bool;
stories.getStoryReactionsList#b9b2881f flags:# forwards_first:flags.2?true peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = stories.StoryReactionsList; stories.getStoryReactionsList#b9b2881f flags:# forwards_first:flags.2?true peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = stories.StoryReactionsList;
stories.togglePinnedToTop#b297e9b peer:InputPeer id:Vector<int> = Bool; stories.togglePinnedToTop#b297e9b peer:InputPeer id:Vector<int> = Bool;
stories.searchPosts#6cea116a flags:# hashtag:flags.0?string area:flags.1?MediaArea offset:string limit:int = stories.FoundStories; stories.searchPosts#d1810907 flags:# hashtag:flags.0?string area:flags.1?MediaArea peer:flags.2?InputPeer offset:string limit:int = stories.FoundStories;
premium.getBoostsList#60f67660 flags:# gifts:flags.0?true peer:InputPeer offset:string limit:int = premium.BoostsList; premium.getBoostsList#60f67660 flags:# gifts:flags.0?true peer:InputPeer offset:string limit:int = premium.BoostsList;
premium.getMyBoosts#be77b4a = premium.MyBoosts; premium.getMyBoosts#be77b4a = premium.MyBoosts;
@ -2565,4 +2585,4 @@ smsjobs.finishJob#4f1ebf24 flags:# job_id:string error:flags.0?string = Bool;
fragment.getCollectibleInfo#be1e85ba collectible:InputCollectible = fragment.CollectibleInfo; fragment.getCollectibleInfo#be1e85ba collectible:InputCollectible = fragment.CollectibleInfo;
// LAYER 190 // LAYER 193

View File

@ -1,4 +1,4 @@
FROM php:8.3-fpm-alpine FROM php:8.4-fpm-alpine
RUN apk add --no-cache make g++ && \ RUN apk add --no-cache make g++ && \
curl -sSLf https://github.com/danog/PrimeModule-ext/archive/refs/tags/2.0.tar.gz | tar -xz && \ curl -sSLf https://github.com/danog/PrimeModule-ext/archive/refs/tags/2.0.tar.gz | tar -xz && \