From e6fc8cdd2044f569476bf256bdfb25edab8c6180 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 12 Dec 2021 17:46:11 +0000 Subject: [PATCH] Update content of files --- data/core.telegram.org/api/bots/games.html | 171 + data/core.telegram.org/api/datacenter.html | 152 + data/core.telegram.org/api/end-to-end.html | 244 - .../api/end-to-end/video-calls.html | 215 - data/core.telegram.org/api/end-to-end_v1.html | 225 - .../api/entities.html | 6 +- .../api/files.html | 6 +- .../api/geochats.html | 6 +- data/core.telegram.org/api/min.html | 142 + data/core.telegram.org/api/optimisation.html | 150 + data/core.telegram.org/api/payments.html | 366 + .../api/qr-login.html | 6 +- .../core.telegram.org/bots/api-changelog.html | 654 - data/core.telegram.org/cdn.html | 210 + data/core.telegram.org/cdn/faq_ir.html | 142 - data/core.telegram.org/cdn/faq_ir/durov.html | 133 - .../constructor/account.authorizationForm | 174 + .../constructor/account.wallPapers | 155 + .../constructor/auth.sentCodeTypeApp | 147 + .../constructor/baseThemeClassic.html | 132 + .../constructor/botCommandScopeChats.html | 135 + .../constructor/botCommandScopePeer.html | 147 + .../constructor/botInfo.html | 157 + .../constructor/botInlineResult.html | 189 + .../constructor/channel.html | 289 + ...elAdminLogEventActionChangeLinkedChat.html | 152 + ...elAdminLogEventActionDiscardGroupCall.html | 147 + ...minLogEventActionExportedInviteDelete.html | 147 + ...nnelAdminLogEventActionToggleSlowMode.html | 155 + .../constructor/channelLocation.html | 152 + .../channelMessagesFilterEmpty.html | 132 + .../channelParticipantCreator.html | 162 + .../constructor/channelParticipantSelf.html | 157 + .../constructor/channels.channelParticipant | 157 + .../constructor/chatBannedRights.html | 216 + .../constructor/chatFull.html | 231 + .../constructor/chatParticipant.html | 157 + .../constructor/chatParticipantAdmin.html | 157 + .../constructor/chatParticipants.html | 157 + .../decryptedMessageActionAcceptKey.html | 160 + .../decryptedMessageActionFlushHistory.html | 133 + ...ryptedMessageActionScreenshotMessages.html | 148 + .../decryptedMessageActionSetMessageTTL.html | 149 + .../decryptedMessageMediaPhoto.html | 191 + .../constructor/decryptedMessageService.html | 156 + .../constructor/dialogFilter.html | 220 + .../constructor/dialogPeerFolder.html | 150 + .../constructor/document.html | 200 + .../constructor/documentAttributeVideo.html | 172 + .../constructor/emojiKeywordsDifference.html | 162 + .../constructor/fileHash.html | 171 + .../{null.html => geoPointEmpty.html} | 18 +- .../constructor/groupCallDiscarded.html | 157 + .../constructor/help.supportName | 147 + .../constructor/inlineQueryPeerTypePM.html | 132 + .../constructor/inputBotInlineResult.html | 189 + .../inputBotInlineResultPhoto.html | 164 + .../inputEncryptedFileUploaded.html | 162 + .../constructor/inputFileLocation.html | 165 + .../constructor/inputGameID.html | 155 + .../constructor/inputGameShortName.html | 152 + .../constructor/inputMediaDocument.html | 162 + .../constructor/inputMediaGame.html | 147 + .../constructor/inputMediaGeoPoint.html | 147 + .../constructor/inputMediaPhoto.html | 157 + .../constructor/inputMediaVenue.html | 172 + .../inputMessagesFilterPhotoVideo.html | 132 + .../inputPhotoLegacyFileLocation.html | 172 + .../constructor/inputPrivacyKeyForwards.html | 132 + .../inputPrivacyKeyProfilePhoto.html | 132 + .../constructor/inputReportReasonOther.html | 132 + .../constructor/inputSecureValue.html | 190 + .../constructor/inputStickerSetThumb.html | 155 + .../constructor/inputThemeSettings.html | 182 + .../{statsURL.html => inputThemeSlug.html} | 22 +- .../constructor/keyboardButtonBuy.html | 147 + .../messageActionContactSignUp.html | 132 + .../constructor/messageEntityCode.html | 152 + .../constructor/messageEntityMention.html | 155 + .../constructor/messageFwdHeader.html | 195 + .../constructor/messageMediaDocument.html | 157 + .../constructor/messageService.html | 212 + .../constructor/messageViews.html | 165 + .../constructor/messages.chatInviteImporters | 157 + .../constructor/messages.chats | 147 + .../messages.featuredStickersNotModified | 147 + .../constructor/messages.sponsoredMessages | 157 + .../constructor/messages.votesList | 170 + .../constructor/notifyBroadcasts.html | 132 + .../constructor/pageBlockDetails.html | 162 + .../constructor/pageBlockEmbedPost.html | 177 + .../constructor/pageBlockList.html | 147 + .../constructor/pageBlockParagraph.html | 147 + .../constructor/pageBlockSlideshow.html | 152 + .../constructor/pageBlockTitle.html | 147 + .../constructor/pageBlockVideo.html | 167 + .../constructor/phoneCallRequested.html | 189 + .../constructor/phoneCallWaiting.html | 187 + data/core.telegram.org/constructor/photo.html | 192 + .../constructor/photoSizeEmpty.html | 150 + .../constructor/pollAnswerVoters.html | 170 + .../constructor/postAddress.html | 172 + .../constructor/privacyKeyAddedByPhone.html | 132 + .../constructor/privacyKeyForwards.html | 132 + .../privacyValueAllowChatParticipants.html | 147 + .../constructor/recentMeUrlStickerSet.html | 152 + .../constructor/restrictionReason.html | 158 + .../constructor/securePlainEmail.html | 150 + .../constructor/secureValueErrorFile.html | 168 + .../constructor/secureValueErrorFiles.html | 168 + .../sendMessageChooseContactAction.html | 132 + .../sendMessageRecordAudioAction.html | 132 + .../constructor/sendMessageTypingAction.html | 132 + .../speakingInGroupCallAction.html | 132 + .../constructor/stickerSet.html | 217 + .../constructor/storage.fileUnknown | 132 + .../constructor/textEmail.html | 152 + .../constructor/textItalic.html | 147 + .../constructor/textStrike.html | 147 + .../constructor/textSubscript.html | 147 + .../constructor/updateBotCallbackQuery.html | 182 + .../constructor/updateBotShippingQuery.html | 162 + .../constructor/updateBotWebhookJSON.html | 147 + .../constructor/updateChannel.html | 147 + .../constructor/updateChannelParticipant.html | 192 + .../updateChatParticipantAdmin.html | 165 + .../constructor/updateEncryption.html | 152 + .../constructor/updateGroupCall.html | 155 + .../constructor/updateMessageID.html | 155 + .../updateNewScheduledMessage.html | 150 + .../constructor/updatePrivacy.html | 152 + .../constructor/updateReadChannelInbox.html | 179 + .../updateReadMessagesContents.html | 160 + .../updates.channelDifferenceTooLong | 190 + .../constructor/updates.differenceEmpty | 152 + data/core.telegram.org/contest300K.html | 237 + .../method/account.cancelPasswordEmail | 138 + .../method/account.deleteSecureValue | 153 + .../method/account.getPasswordSettings | 170 + .../method/account.initTakeoutSession | 204 + .../method/account.resetAuthorization | 175 + .../method/account.saveAutoDownloadSettings | 165 + .../method/account.saveSecureValue | 174 + .../account.setContactSignUpNotification | 150 + .../method/account.updateTheme | 196 + data/core.telegram.org/method/auth.cancelCode | 180 + .../method/auth.checkPhone | 6 +- .../method/auth.sendCall | 6 +- data/core.telegram.org/method/auth.signIn | 219 + data/core.telegram.org/method/auth.signUp | 236 + .../method/channels.editLocation | 180 + .../method/channels.editPhoto | 221 + .../method/channels.updateUsername | 212 + .../method/contacts.deleteByPhones | 150 + .../method/contacts.getSaved | 150 + .../method/contacts.getStatuses | 133 + .../method/help.getAppUpdate | 150 + .../method/invokeWithMessagesRange.html | 154 + .../method/langpack.getLanguages | 165 + .../method/messages.deleteChat | 170 + .../method/messages.deleteExportedChatInvite | 155 + .../method/messages.getAllChats | 150 + .../method/messages.getAttachedStickers | 148 + .../method/messages.getEmojiKeywords | 149 + .../method/messages.getFavedStickers | 153 + .../method/messages.getMessageReactionsList | 6 +- .../method/messages.getRecentLocations | 165 + .../method/messages.getSavedGifs | 153 + .../method/messages.installStickerSet | 172 + .../method/messages.readHistory | 186 + .../method/messages.readMentions | 181 + .../method/messages.readMessageContents | 149 + .../method/messages.receivedQueue | 170 + .../method/messages.reorderPinnedDialogs | 185 + .../method/messages.reportSpam | 180 + .../method/messages.sendMultiMedia | 263 + .../method/messages.sendReaction | 6 +- .../method/messages.sendVote | 220 + .../method/messages.setHistoryTTL | 182 + .../method/payments.getPaymentReceipt | 171 + .../method/phone.checkGroupCall | 154 + .../method/phone.createGroupCall | 200 + .../method/stickers.createStickerSet | 282 + .../method/stickers.removeStickerFromSet | 172 + data/core.telegram.org/mtproto.html | 260 - .../mtproto/TL-combinators.html | 251 + .../mtproto/service_messages.html | 195 + .../service_messages_about_messages.html | 185 + data/core.telegram.org/mtproto_v1.html | 229 - data/core.telegram.org/schema.html | 1800 - .../schema/mtproto-json.html | 1 - data/core.telegram.org/schema/mtproto.html | 204 - .../tdlib/getting-started.html | 198 - .../tdlib/notification-api.html | 210 - data/core.telegram.org/tdlib/options.html | 465 - data/core.telegram.org/techfaq.html | 333 - .../type/{Error.html => BankCardOpenUrl.html} | 20 +- data/core.telegram.org/type/CdnPublicKey.html | 145 + data/core.telegram.org/type/Chat.html | 163 + .../type/ChatInviteImporter.html | 143 + .../type/ChatParticipant.html | 153 + .../type/ChatParticipants.html | 148 + .../type/DialogFilterSuggested.html | 143 + data/core.telegram.org/type/EmojiKeyword.html | 148 + .../type/{Null.html => FolderPeer.html} | 20 +- .../type/InputBotInlineMessage.html | 173 + .../type/InputChatPhoto.html | 153 + .../type/InputFileLocation.html | 188 + data/core.telegram.org/type/InputGame.html | 148 + .../type/InputPeerNotifySettings.html | 143 + .../type/InputStickerSetItem.html | 143 + ...sURL.html => PaymentSavedCredentials.html} | 20 +- data/core.telegram.org/type/Poll.html | 143 + data/core.telegram.org/type/ReplyMarkup.html | 158 + .../type/SecurePlainData.html | 150 + .../type/SecureRequiredType.html | 148 + .../type/SendMessageAction.html | 228 + .../type/TopPeerCategory.html | 178 + .../type/WallPaperSettings.html | 143 + .../type/account.PasswordInputSettings | 146 + .../type/account.SentChangePhoneCode | 6 +- .../type/auth.PasswordRecovery | 165 + data/core.telegram.org/type/auth.SentCode | 183 + data/core.telegram.org/type/contacts.Blocked | 167 + .../type/contacts.Link | 6 +- data/core.telegram.org/type/help.Country | 143 + data/core.telegram.org/type/help.SupportName | 162 + data/core.telegram.org/type/int.html | 118 + .../type/messages.DiscussionMessage | 162 + .../type/messages.FavedStickers | 167 + .../type/messages.FoundGifs | 6 +- .../type/messages.MessageViews | 162 + .../core.telegram.org/type/messages.VotesList | 162 + data/core.telegram.org/widgets/login.html | 404 + .../api/animated-emojis.html | 187 - data/corefork.telegram.org/api/auth.html | 202 - data/corefork.telegram.org/api/bots.html | 142 - .../api/bots/buttons.html | 242 - .../api/bots/commands.html | 140 - .../corefork.telegram.org/api/bots/games.html | 171 + .../api/bots/inline.html | 215 - .../corefork.telegram.org/api/datacenter.html | 148 - .../corefork.telegram.org/api/discussion.html | 151 - .../{account-deletion.html => drafts.html} | 50 +- data/corefork.telegram.org/api/errors.html | 189 + data/corefork.telegram.org/api/import.html | 173 - .../api/live-location.html | 178 - data/corefork.telegram.org/api/mentions.html | 152 - .../api/{pfs.html => obtaining_api_id.html} | 56 +- data/corefork.telegram.org/api/rights.html | 133 - data/corefork.telegram.org/api/updates.html | 226 - .../api/url-authorization.html | 160 - .../corefork.telegram.org/api/web-events.html | 175 - ...emes-interactive-emoji-read-receipts.html} | 78 +- data/corefork.telegram.org/bots/api.html | 9288 ++ .../constructor/account.autoDownloadSettings | 157 + .../constructor/auth.loginTokenMigrateTo | 152 + .../constructor/auth.passwordRecovery | 152 + .../constructor/auth.sentCodeTypeApp | 147 + .../constructor/auth.sentCodeTypeFlashCall | 150 + .../constructor/autoDownloadSettings.html | 187 + .../baseThemeTinted.html} | 20 +- .../constructor/cdnConfig.html | 149 + ...channelAdminLogEventActionChangePhoto.html | 152 + ...agesLinks => channels.channelParticipants} | 48 +- .../constructor/chatParticipant.html | 157 + .../chatParticipantsForbidden.html | 157 + .../constructor/chatPhotoEmpty.html | 132 + .../constructor/contactStatus.html | 152 + ...ges.statedMessageLink => contacts.blocked} | 43 +- .../constructor/contacts.topPeersDisabled | 132 + ...ryptedMessageActionScreenshotMessages.html | 148 + ...decryptedMessageMediaExternalDocument.html | 183 + ...html => decryptedMessageMediaWebPage.html} | 53 +- .../constructor/emojiKeywordsDifference.html | 162 + .../constructor/groupCallParticipant.html | 247 + .../constructor/help.deepLinkInfoEmpty | 132 + .../constructor/help.recentMeUrls | 157 + .../{wallPaperSolid.html => highScore.html} | 37 +- .../inlineQueryPeerTypeSameBotPM.html | 132 + .../constructor/inputBotInlineMessageID.html | 157 + .../inputBotInlineMessageMediaAuto.html | 165 + .../inputBotInlineMessageMediaVenue.html | 182 + .../constructor/inputChannel.html | 155 + ...cked.html => inputChannelFromMessage.html} | 43 +- .../constructor/inputChatUploadedPhoto.html | 165 + .../constructor/inputDialogPeer.html | 147 + .../constructor/inputDialogPeerFolder.html | 150 + .../constructor/inputDocument.html | 162 + .../inputDocumentFileLocation.html | 167 + .../constructor/inputGameID.html | 155 + .../constructor/inputGroupCall.html | 152 + .../inputMediaDocumentExternal.html | 157 + .../inputMediaUploadedDocument.html | 190 + .../constructor/inputMessagesFilterMusic.html | 132 + .../constructor/inputNotifyBroadcasts.html | 135 + .../constructor/inputPeerEmpty.html | 132 + .../constructor/inputPeerSelf.html | 132 + .../constructor/inputPeerUser.html | 155 + .../constructor/inputPhotoFileLocation.html | 171 + .../inputPhotoLegacyFileLocation.html | 172 + .../inputPrivacyKeyStatusTimestamp.html | 132 + .../inputPrivacyValueDisallowAll.html | 132 + .../constructor/inputReportReasonFake.html | 132 + .../constructor/inputReportReasonOther.html | 132 + .../inputReportReasonPornography.html | 132 + .../constructor/inputSecureFileUploaded.html | 169 + .../constructor/inputThemeSettings.html | 182 + .../constructor/inputUserEmpty.html | 132 + .../constructor/inputWallPaper.html | 152 + .../constructor/inputWallPaperSlug.html | 147 + .../constructor/keyboardButton.html | 147 + .../constructor/messageActionChatAddUser.html | 147 + .../messageActionChatDeletePhoto.html | 132 + .../constructor/messageActionPaymentSent.html | 154 + .../messageActionPaymentSentMe.html | 179 + .../messageActionSecureValuesSentMe.html | 154 + ...eCode => messageActionSetMessagesTTL.html} | 50 +- .../constructor/messageEntityBotCommand.html | 152 + .../constructor/messageEntityUnknown.html | 152 + .../constructor/messageMediaPoll.html | 152 + .../messageUserVoteInputOption.html | 155 + .../messages.affectedFoundMessages | 165 + .../messages.exportedChatInviteReplaced | 157 + .../constructor/messages.featuredStickers | 165 + .../constructor/messages.highScores | 152 + .../constructor/messages.recentStickers | 165 + .../constructor/messages.sentEncryptedMessage | 147 + .../constructor/messages.stickers | 155 + .../constructor/notifyPeer.html | 147 + .../constructor/pageBlockAnchor.html | 147 + .../constructor/pageBlockBlockquote.html | 152 + ...geMediaVideo.html => pageBlockKicker.html} | 24 +- ...ages.sentMessageLink => pageBlockMap.html} | 42 +- .../constructor/pageBlockVideo.html | 167 + .../constructor/pageCaption.html | 152 + .../pageListOrderedItemBlocks.html | 152 + .../payments.ValidatedRequestedInfo} | 40 +- .../constructor/payments.paymentResult | 147 + .../constructor/peerBlocked.html | 152 + .../constructor/phone.phoneCall | 152 + .../constructor/photoEmpty.html | 147 + .../constructor/pollResults.html | 184 + .../constructor/privacyKeyChatInvite.html | 132 + .../constructor/privacyKeyPhoneNumber.html | 132 + .../constructor/privacyValueAllowUsers.html | 147 + .../constructor/recentMeUrlChat.html | 152 + .../constructor/secureData.html | 160 + .../constructor/secureValueErrorFiles.html | 168 + .../secureValueTypeInternalPassport.html | 134 + .../secureValueTypePhone.html} | 20 +- .../secureValueTypeRentalAgreement.html | 132 + .../constructor/sendMessageCancelAction.html | 132 + ...l => sendMessageEmojiInteractionSeen.html} | 54 +- .../sendMessageRecordAudioAction.html | 132 + .../sendMessageRecordVideoAction.html | 132 + .../sendMessageUploadRoundAction.html | 147 + .../constructor/stats.messageStats | 147 + .../constructor/statsGraphError.html | 150 + .../constructor/stickerSetCovered.html | 152 + .../constructor/storage.fileGif | 132 + .../constructor/textImage.html | 157 + ...messageMediaAudio.html => textItalic.html} | 24 +- .../constructor/textUnderline.html | 147 + .../constructor/themeSettings.html | 177 + .../topPeerCategoryBotsInline.html | 132 + .../topPeerCategoryCorrespondents.html | 132 + .../constructor/updateBotInlineQuery.html | 177 + .../updateChannelAvailableMessages.html | 155 + .../updateChatParticipantDelete.html | 157 + .../constructor/updateChatParticipants.html | 147 + .../constructor/updateDialogFilters.html | 135 + .../constructor/updateEditMessage.html | 160 + .../updateInlineBotCallbackQuery.html | 177 + .../constructor/updatePeerBlocked.html | 152 + .../constructor/updatePeerHistoryTTL.html | 157 + .../constructor/updatePeerLocated.html | 147 + .../constructor/updatePeerSettings.html | 152 + .../constructor/updatePinnedDialogs.html | 160 + .../constructor/updatePtsChanged.html | 135 + .../constructor/updateSavedGifs.html | 132 + .../constructor/updateUserStatus.html | 152 + .../updates.channelDifferenceEmpty | 165 + .../constructor/updates.differenceEmpty | 152 + .../constructor/updates.differenceTooLong | 150 + .../constructor/upload.cdnFile | 149 + .../constructor/userFull.html | 239 + .../constructor/userStatusOffline.html | 147 + .../constructor/wallPaper.html | 192 + .../{auth.sentAppCode => webDocument.html} | 48 +- .../constructor/webPage.html | 240 + .../method/account.declinePasswordReset | 155 + .../method/account.getAuthorizations | 134 + .../account.getContactSignUpNotification | 135 + .../method/account.getTmpPassword | 176 + data/corefork.telegram.org/method/auth.signUp | 236 + .../method/bots.sendCustomRequest | 177 + .../method/bots.setBotCommands | 188 + .../method/channels.editCreator | 225 + .../method/channels.editTitle | 206 + .../method/channels.getAdminLog | 226 + .../method/channels.getAdminedPublicChannels | 191 + .../method/channels.getSponsoredMessages | 154 + .../method/channels.leaveChannel | 201 + .../method/channels.readMessageContents | 185 + .../method/channels.reportSpam | 192 + .../method/channels.toggleSlowMode | 190 + ...help.getProxyData => contacts.getStatuses} | 19 +- .../method/contacts.getTopPeers | 226 + .../method/contacts.search | 178 + .../method/folders.deleteFolder | 175 + .../method/help.getAppConfig | 142 + .../method/help.getCdnConfig | 154 + .../method/help.getConfig | 192 + .../method/help.getInviteText | 134 + .../method/initConnection.html | 216 + .../method/langpack.getLangPack | 171 + .../method/messages.acceptUrlAuth | 179 + .../messages.deleteRevokedExportedChatInvites | 155 + .../method/messages.editChatAdmin | 195 + .../method/messages.editExportedChatInvite | 193 + .../method/messages.getAdminsWithInvites | 149 + .../method/messages.getBotCallbackAnswer | 226 + .../method/messages.getDialogUnreadMarks | 133 + .../method/messages.getFeaturedStickers | 153 + .../method/messages.getUnreadMentions | 212 + .../method/messages.search | 291 + .../method/messages.searchGlobal | 226 + .../method/messages.setInlineGameScore | 198 + ...roupCallMember => payments.clearSavedInfo} | 55 +- .../method/payments.getPaymentForm | 181 + .../method/phone.checkGroupCall | 154 + .../method/phone.getGroupParticipants | 174 + ...Peers => phone.saveDefaultGroupCallJoinAs} | 32 +- .../method/phone.toggleGroupCallRecord | 180 + .../method/stats.getMessageStats | 189 + ...ges.searchGifs => stickers.checkShortName} | 43 +- .../method/stickers.setStickerSetThumb | 182 + ....getMessagesReactions => updates.getState} | 42 +- .../method/upload.getCdnFileHashes | 178 + .../method/upload.getWebFile | 176 + data/corefork.telegram.org/methods.html | 2306 - .../mtproto/security_guidelines.html | 177 - .../mtproto/security_guidelines_v1.html | 175 - .../schema/end-to-end-json.html | 0 .../schema/end-to-end.html | 225 + data/corefork.telegram.org/schema/json.html | 1 - .../type/Authorization.html | 162 + .../type/ChannelAdminLogEventsFilter.html | 143 + .../type/ChannelMessagesFilter.html | 148 + data/corefork.telegram.org/type/Chat.html | 163 + .../type/ChatAdminWithInvites.html | 143 + .../type/ChatInvite.html | 172 + data/corefork.telegram.org/type/DcOption.html | 143 + .../type/DecryptedMessageMedia.html | 149 + .../type/DialogFilterSuggested.html | 143 + .../type/DisabledFeature.html | 128 - .../type/DocumentAttribute.html | 173 + .../type/GroupCallParticipant.html | 143 + .../type/InlineBotSwitchPM.html | 143 + .../type/InputCheckPasswordSRP.html | 151 + .../type/InputNotifyPeer.html | 158 + .../type/InputPaymentCredentials.html | 158 + .../type/InputPeerNotifySettings.html | 143 + .../type/InputWallPaper.html | 153 + .../type/MessageAction.html | 283 + .../type/MessageMedia.html | 232 + .../type/MessageReactionsList.html | 128 - .../type/MessageReplies.html | 146 + .../type/PageTableCell.html | 143 + .../type/PasswordKdfAlgo.html | 151 + .../type/SecurePlainData.html | 150 + .../type/SecureRequiredType.html | 148 + .../type/ShippingOption.html | 143 + .../type/StickerSetCovered.html | 148 + data/corefork.telegram.org/type/True.html | 145 + data/corefork.telegram.org/type/UserFull.html | 162 + data/corefork.telegram.org/type/Video.html | 128 - .../corefork.telegram.org/type/VideoSize.html | 143 + .../type/WebDocument.html | 148 + data/corefork.telegram.org/type/WebPage.html | 177 + .../type/account.AutoDownloadSettings | 162 + .../type/auth.CheckedPhone | 128 - .../type/contacts.Blocked | 167 + .../type/contacts.Contacts | 167 + .../type/contacts.TopPeers | 172 + data/corefork.telegram.org/type/help.Country | 143 + .../type/help.CountryCode | 143 + .../corefork.telegram.org/type/help.PromoData | 167 + .../type/messages.AffectedMessages | 178 + .../type/messages.SentMessage | 128 - .../type/messages.Stickers | 167 + .../type/stats.BroadcastStats | 162 + .../type/storage.FileType | 188 + .../{method/auth.sendSms => type/string.html} | 81 +- data/desktop.telegram.org/js/main.js | 675 - data/instantview.telegram.org/checklist.html | 624 - data/instantview.telegram.org/templates.html | 92971 ---------------- data/macos.telegram.org.html | 472 - data/macos.telegram.org/css/bootstrap.min.css | 10 - data/macos.telegram.org/css/telegram.css | 4872 - data/macos.telegram.org/js/main.js | 675 - data/promote.telegram.org/basics.html | 205 - .../promote.telegram.org/getting-started.html | 321 - data/promote.telegram.org/guidelines.html | 313 - data/promote.telegram.org/tos.html | 253 - data/telegram.org/android.html | 79 - data/telegram.org/apple_privacy.html | 178 - data/telegram.org/blog.html | 268 - data/telegram.org/blog/200-million.html | 222 - data/telegram.org/blog/admin-revolution.html | 261 - data/telegram.org/blog/android-gif.html | 218 - data/telegram.org/blog/android-streaming.html | 241 - data/telegram.org/blog/android-wear-2-0.html | 224 - data/telegram.org/blog/animated-stickers.html | 261 - data/telegram.org/blog/apple-watch.html | 225 - data/telegram.org/blog/bot-revolution.html | 279 - data/telegram.org/blog/channels-2-0.html | 246 - .../crowdsourcing-a-more-secure-future.html | 212 - data/telegram.org/blog/drafts.html | 242 - data/telegram.org/blog/encrypted-cdns.html | 228 - data/telegram.org/blog/export-and-more.html | 238 - data/telegram.org/blog/files-on-steroids.html | 240 - .../filters-anonymous-admins-comments.html | 261 - data/telegram.org/blog/gif-revolution.html | 224 - .../blog/instant-view-contest-200K.html | 273 - data/telegram.org/blog/instant-view.html | 268 - data/telegram.org/blog/invite-links.html | 217 - data/telegram.org/blog/login.html | 257 - data/telegram.org/blog/move-history.html | 284 - .../blog/new-profiles-people-nearby.html | 263 - data/telegram.org/blog/now-you-see-me.html | 235 - data/telegram.org/blog/passport.html | 233 - data/telegram.org/blog/payments.html | 253 - .../blog/privacy-discussions-web-bots.html | 284 - ...profile-videos-people-nearby-and-more.html | 315 - data/telegram.org/blog/share-preview.html | 269 - data/telegram.org/blog/shared-files.html | 231 - data/telegram.org/blog/shared-links.html | 221 - ...lling-calendar-join-requests-and-more.html | 343 - .../blog/silent-messages-slow-mode.html | 296 - .../blog/stickers-meet-art-and-history.html | 338 - .../blog/stickers-revolution.html | 231 - data/telegram.org/blog/supergroups5k.html | 232 - data/telegram.org/blog/tdlib.html | 228 - .../telegram-me-change-number-and-pfs.html | 228 - data/telegram.org/blog/telegraph.html | 238 - data/telegram.org/blog/themes-accounts.html | 247 - data/telegram.org/blog/translations-iv2.html | 276 - data/telegram.org/blog/unsend-and-usage.html | 273 - data/telegram.org/blog/video-1000.html | 354 - data/telegram.org/blog/video-calls.html | 234 - data/telegram.org/blog/video-editor-gifs.html | 252 - .../blog/video-messages-and-telescope.html | 247 - .../blog/voice-chats-on-steroids.html | 2 +- data/telegram.org/privacy.html | 299 - data/telegram.org/template34.html | 283 - data/telegram.org/tour/channels.html | 294 - .../what-can-you-do-with-Telegram.html | 283 - 559 files changed, 78037 insertions(+), 126437 deletions(-) create mode 100644 data/core.telegram.org/api/bots/games.html create mode 100644 data/core.telegram.org/api/datacenter.html delete mode 100644 data/core.telegram.org/api/end-to-end.html delete mode 100644 data/core.telegram.org/api/end-to-end/video-calls.html delete mode 100644 data/core.telegram.org/api/end-to-end_v1.html rename data/{corefork.telegram.org => core.telegram.org}/api/entities.html (97%) rename data/{corefork.telegram.org => core.telegram.org}/api/files.html (99%) rename data/{corefork.telegram.org => core.telegram.org}/api/geochats.html (96%) create mode 100644 data/core.telegram.org/api/min.html create mode 100644 data/core.telegram.org/api/optimisation.html create mode 100644 data/core.telegram.org/api/payments.html rename data/{corefork.telegram.org => core.telegram.org}/api/qr-login.html (98%) delete mode 100644 data/core.telegram.org/bots/api-changelog.html create mode 100644 data/core.telegram.org/cdn.html delete mode 100644 data/core.telegram.org/cdn/faq_ir.html delete mode 100644 data/core.telegram.org/cdn/faq_ir/durov.html create mode 100644 data/core.telegram.org/constructor/account.authorizationForm create mode 100644 data/core.telegram.org/constructor/account.wallPapers create mode 100644 data/core.telegram.org/constructor/auth.sentCodeTypeApp create mode 100644 data/core.telegram.org/constructor/baseThemeClassic.html create mode 100644 data/core.telegram.org/constructor/botCommandScopeChats.html create mode 100644 data/core.telegram.org/constructor/botCommandScopePeer.html create mode 100644 data/core.telegram.org/constructor/botInfo.html create mode 100644 data/core.telegram.org/constructor/botInlineResult.html create mode 100644 data/core.telegram.org/constructor/channel.html create mode 100644 data/core.telegram.org/constructor/channelAdminLogEventActionChangeLinkedChat.html create mode 100644 data/core.telegram.org/constructor/channelAdminLogEventActionDiscardGroupCall.html create mode 100644 data/core.telegram.org/constructor/channelAdminLogEventActionExportedInviteDelete.html create mode 100644 data/core.telegram.org/constructor/channelAdminLogEventActionToggleSlowMode.html create mode 100644 data/core.telegram.org/constructor/channelLocation.html create mode 100644 data/core.telegram.org/constructor/channelMessagesFilterEmpty.html create mode 100644 data/core.telegram.org/constructor/channelParticipantCreator.html create mode 100644 data/core.telegram.org/constructor/channelParticipantSelf.html create mode 100644 data/core.telegram.org/constructor/channels.channelParticipant create mode 100644 data/core.telegram.org/constructor/chatBannedRights.html create mode 100644 data/core.telegram.org/constructor/chatFull.html create mode 100644 data/core.telegram.org/constructor/chatParticipant.html create mode 100644 data/core.telegram.org/constructor/chatParticipantAdmin.html create mode 100644 data/core.telegram.org/constructor/chatParticipants.html create mode 100644 data/core.telegram.org/constructor/decryptedMessageActionAcceptKey.html create mode 100644 data/core.telegram.org/constructor/decryptedMessageActionFlushHistory.html create mode 100644 data/core.telegram.org/constructor/decryptedMessageActionScreenshotMessages.html create mode 100644 data/core.telegram.org/constructor/decryptedMessageActionSetMessageTTL.html create mode 100644 data/core.telegram.org/constructor/decryptedMessageMediaPhoto.html create mode 100644 data/core.telegram.org/constructor/decryptedMessageService.html create mode 100644 data/core.telegram.org/constructor/dialogFilter.html create mode 100644 data/core.telegram.org/constructor/dialogPeerFolder.html create mode 100644 data/core.telegram.org/constructor/document.html create mode 100644 data/core.telegram.org/constructor/documentAttributeVideo.html create mode 100644 data/core.telegram.org/constructor/emojiKeywordsDifference.html create mode 100644 data/core.telegram.org/constructor/fileHash.html rename data/core.telegram.org/constructor/{null.html => geoPointEmpty.html} (93%) create mode 100644 data/core.telegram.org/constructor/groupCallDiscarded.html create mode 100644 data/core.telegram.org/constructor/help.supportName create mode 100644 data/core.telegram.org/constructor/inlineQueryPeerTypePM.html create mode 100644 data/core.telegram.org/constructor/inputBotInlineResult.html create mode 100644 data/core.telegram.org/constructor/inputBotInlineResultPhoto.html create mode 100644 data/core.telegram.org/constructor/inputEncryptedFileUploaded.html create mode 100644 data/core.telegram.org/constructor/inputFileLocation.html create mode 100644 data/core.telegram.org/constructor/inputGameID.html create mode 100644 data/core.telegram.org/constructor/inputGameShortName.html create mode 100644 data/core.telegram.org/constructor/inputMediaDocument.html create mode 100644 data/core.telegram.org/constructor/inputMediaGame.html create mode 100644 data/core.telegram.org/constructor/inputMediaGeoPoint.html create mode 100644 data/core.telegram.org/constructor/inputMediaPhoto.html create mode 100644 data/core.telegram.org/constructor/inputMediaVenue.html create mode 100644 data/core.telegram.org/constructor/inputMessagesFilterPhotoVideo.html create mode 100644 data/core.telegram.org/constructor/inputPhotoLegacyFileLocation.html create mode 100644 data/core.telegram.org/constructor/inputPrivacyKeyForwards.html create mode 100644 data/core.telegram.org/constructor/inputPrivacyKeyProfilePhoto.html create mode 100644 data/core.telegram.org/constructor/inputReportReasonOther.html create mode 100644 data/core.telegram.org/constructor/inputSecureValue.html create mode 100644 data/core.telegram.org/constructor/inputStickerSetThumb.html create mode 100644 data/core.telegram.org/constructor/inputThemeSettings.html rename data/core.telegram.org/constructor/{statsURL.html => inputThemeSlug.html} (92%) create mode 100644 data/core.telegram.org/constructor/keyboardButtonBuy.html create mode 100644 data/core.telegram.org/constructor/messageActionContactSignUp.html create mode 100644 data/core.telegram.org/constructor/messageEntityCode.html create mode 100644 data/core.telegram.org/constructor/messageEntityMention.html create mode 100644 data/core.telegram.org/constructor/messageFwdHeader.html create mode 100644 data/core.telegram.org/constructor/messageMediaDocument.html create mode 100644 data/core.telegram.org/constructor/messageService.html create mode 100644 data/core.telegram.org/constructor/messageViews.html create mode 100644 data/core.telegram.org/constructor/messages.chatInviteImporters create mode 100644 data/core.telegram.org/constructor/messages.chats create mode 100644 data/core.telegram.org/constructor/messages.featuredStickersNotModified create mode 100644 data/core.telegram.org/constructor/messages.sponsoredMessages create mode 100644 data/core.telegram.org/constructor/messages.votesList create mode 100644 data/core.telegram.org/constructor/notifyBroadcasts.html create mode 100644 data/core.telegram.org/constructor/pageBlockDetails.html create mode 100644 data/core.telegram.org/constructor/pageBlockEmbedPost.html create mode 100644 data/core.telegram.org/constructor/pageBlockList.html create mode 100644 data/core.telegram.org/constructor/pageBlockParagraph.html create mode 100644 data/core.telegram.org/constructor/pageBlockSlideshow.html create mode 100644 data/core.telegram.org/constructor/pageBlockTitle.html create mode 100644 data/core.telegram.org/constructor/pageBlockVideo.html create mode 100644 data/core.telegram.org/constructor/phoneCallRequested.html create mode 100644 data/core.telegram.org/constructor/phoneCallWaiting.html create mode 100644 data/core.telegram.org/constructor/photo.html create mode 100644 data/core.telegram.org/constructor/photoSizeEmpty.html create mode 100644 data/core.telegram.org/constructor/pollAnswerVoters.html create mode 100644 data/core.telegram.org/constructor/postAddress.html create mode 100644 data/core.telegram.org/constructor/privacyKeyAddedByPhone.html create mode 100644 data/core.telegram.org/constructor/privacyKeyForwards.html create mode 100644 data/core.telegram.org/constructor/privacyValueAllowChatParticipants.html create mode 100644 data/core.telegram.org/constructor/recentMeUrlStickerSet.html create mode 100644 data/core.telegram.org/constructor/restrictionReason.html create mode 100644 data/core.telegram.org/constructor/securePlainEmail.html create mode 100644 data/core.telegram.org/constructor/secureValueErrorFile.html create mode 100644 data/core.telegram.org/constructor/secureValueErrorFiles.html create mode 100644 data/core.telegram.org/constructor/sendMessageChooseContactAction.html create mode 100644 data/core.telegram.org/constructor/sendMessageRecordAudioAction.html create mode 100644 data/core.telegram.org/constructor/sendMessageTypingAction.html create mode 100644 data/core.telegram.org/constructor/speakingInGroupCallAction.html create mode 100644 data/core.telegram.org/constructor/stickerSet.html create mode 100644 data/core.telegram.org/constructor/storage.fileUnknown create mode 100644 data/core.telegram.org/constructor/textEmail.html create mode 100644 data/core.telegram.org/constructor/textItalic.html create mode 100644 data/core.telegram.org/constructor/textStrike.html create mode 100644 data/core.telegram.org/constructor/textSubscript.html create mode 100644 data/core.telegram.org/constructor/updateBotCallbackQuery.html create mode 100644 data/core.telegram.org/constructor/updateBotShippingQuery.html create mode 100644 data/core.telegram.org/constructor/updateBotWebhookJSON.html create mode 100644 data/core.telegram.org/constructor/updateChannel.html create mode 100644 data/core.telegram.org/constructor/updateChannelParticipant.html create mode 100644 data/core.telegram.org/constructor/updateChatParticipantAdmin.html create mode 100644 data/core.telegram.org/constructor/updateEncryption.html create mode 100644 data/core.telegram.org/constructor/updateGroupCall.html create mode 100644 data/core.telegram.org/constructor/updateMessageID.html create mode 100644 data/core.telegram.org/constructor/updateNewScheduledMessage.html create mode 100644 data/core.telegram.org/constructor/updatePrivacy.html create mode 100644 data/core.telegram.org/constructor/updateReadChannelInbox.html create mode 100644 data/core.telegram.org/constructor/updateReadMessagesContents.html create mode 100644 data/core.telegram.org/constructor/updates.channelDifferenceTooLong create mode 100644 data/core.telegram.org/constructor/updates.differenceEmpty create mode 100644 data/core.telegram.org/contest300K.html create mode 100644 data/core.telegram.org/method/account.cancelPasswordEmail create mode 100644 data/core.telegram.org/method/account.deleteSecureValue create mode 100644 data/core.telegram.org/method/account.getPasswordSettings create mode 100644 data/core.telegram.org/method/account.initTakeoutSession create mode 100644 data/core.telegram.org/method/account.resetAuthorization create mode 100644 data/core.telegram.org/method/account.saveAutoDownloadSettings create mode 100644 data/core.telegram.org/method/account.saveSecureValue create mode 100644 data/core.telegram.org/method/account.setContactSignUpNotification create mode 100644 data/core.telegram.org/method/account.updateTheme create mode 100644 data/core.telegram.org/method/auth.cancelCode rename data/{corefork.telegram.org => core.telegram.org}/method/auth.checkPhone (98%) rename data/{corefork.telegram.org => core.telegram.org}/method/auth.sendCall (97%) create mode 100644 data/core.telegram.org/method/auth.signIn create mode 100644 data/core.telegram.org/method/auth.signUp create mode 100644 data/core.telegram.org/method/channels.editLocation create mode 100644 data/core.telegram.org/method/channels.editPhoto create mode 100644 data/core.telegram.org/method/channels.updateUsername create mode 100644 data/core.telegram.org/method/contacts.deleteByPhones create mode 100644 data/core.telegram.org/method/contacts.getSaved create mode 100644 data/core.telegram.org/method/contacts.getStatuses create mode 100644 data/core.telegram.org/method/help.getAppUpdate create mode 100644 data/core.telegram.org/method/invokeWithMessagesRange.html create mode 100644 data/core.telegram.org/method/langpack.getLanguages create mode 100644 data/core.telegram.org/method/messages.deleteChat create mode 100644 data/core.telegram.org/method/messages.deleteExportedChatInvite create mode 100644 data/core.telegram.org/method/messages.getAllChats create mode 100644 data/core.telegram.org/method/messages.getAttachedStickers create mode 100644 data/core.telegram.org/method/messages.getEmojiKeywords create mode 100644 data/core.telegram.org/method/messages.getFavedStickers rename data/{corefork.telegram.org => core.telegram.org}/method/messages.getMessageReactionsList (98%) create mode 100644 data/core.telegram.org/method/messages.getRecentLocations create mode 100644 data/core.telegram.org/method/messages.getSavedGifs create mode 100644 data/core.telegram.org/method/messages.installStickerSet create mode 100644 data/core.telegram.org/method/messages.readHistory create mode 100644 data/core.telegram.org/method/messages.readMentions create mode 100644 data/core.telegram.org/method/messages.readMessageContents create mode 100644 data/core.telegram.org/method/messages.receivedQueue create mode 100644 data/core.telegram.org/method/messages.reorderPinnedDialogs create mode 100644 data/core.telegram.org/method/messages.reportSpam create mode 100644 data/core.telegram.org/method/messages.sendMultiMedia rename data/{corefork.telegram.org => core.telegram.org}/method/messages.sendReaction (98%) create mode 100644 data/core.telegram.org/method/messages.sendVote create mode 100644 data/core.telegram.org/method/messages.setHistoryTTL create mode 100644 data/core.telegram.org/method/payments.getPaymentReceipt create mode 100644 data/core.telegram.org/method/phone.checkGroupCall create mode 100644 data/core.telegram.org/method/phone.createGroupCall create mode 100644 data/core.telegram.org/method/stickers.createStickerSet create mode 100644 data/core.telegram.org/method/stickers.removeStickerFromSet delete mode 100644 data/core.telegram.org/mtproto.html create mode 100644 data/core.telegram.org/mtproto/TL-combinators.html create mode 100644 data/core.telegram.org/mtproto/service_messages.html create mode 100644 data/core.telegram.org/mtproto/service_messages_about_messages.html delete mode 100644 data/core.telegram.org/mtproto_v1.html delete mode 100644 data/core.telegram.org/schema.html delete mode 100644 data/core.telegram.org/schema/mtproto-json.html delete mode 100644 data/core.telegram.org/schema/mtproto.html delete mode 100644 data/core.telegram.org/tdlib/getting-started.html delete mode 100644 data/core.telegram.org/tdlib/notification-api.html delete mode 100644 data/core.telegram.org/tdlib/options.html delete mode 100644 data/core.telegram.org/techfaq.html rename data/core.telegram.org/type/{Error.html => BankCardOpenUrl.html} (89%) create mode 100644 data/core.telegram.org/type/CdnPublicKey.html create mode 100644 data/core.telegram.org/type/Chat.html create mode 100644 data/core.telegram.org/type/ChatInviteImporter.html create mode 100644 data/core.telegram.org/type/ChatParticipant.html create mode 100644 data/core.telegram.org/type/ChatParticipants.html create mode 100644 data/core.telegram.org/type/DialogFilterSuggested.html create mode 100644 data/core.telegram.org/type/EmojiKeyword.html rename data/core.telegram.org/type/{Null.html => FolderPeer.html} (91%) create mode 100644 data/core.telegram.org/type/InputBotInlineMessage.html create mode 100644 data/core.telegram.org/type/InputChatPhoto.html create mode 100644 data/core.telegram.org/type/InputFileLocation.html create mode 100644 data/core.telegram.org/type/InputGame.html create mode 100644 data/core.telegram.org/type/InputPeerNotifySettings.html create mode 100644 data/core.telegram.org/type/InputStickerSetItem.html rename data/core.telegram.org/type/{StatsURL.html => PaymentSavedCredentials.html} (89%) create mode 100644 data/core.telegram.org/type/Poll.html create mode 100644 data/core.telegram.org/type/ReplyMarkup.html create mode 100644 data/core.telegram.org/type/SecurePlainData.html create mode 100644 data/core.telegram.org/type/SecureRequiredType.html create mode 100644 data/core.telegram.org/type/SendMessageAction.html create mode 100644 data/core.telegram.org/type/TopPeerCategory.html create mode 100644 data/core.telegram.org/type/WallPaperSettings.html create mode 100644 data/core.telegram.org/type/account.PasswordInputSettings rename data/{corefork.telegram.org => core.telegram.org}/type/account.SentChangePhoneCode (97%) create mode 100644 data/core.telegram.org/type/auth.PasswordRecovery create mode 100644 data/core.telegram.org/type/auth.SentCode create mode 100644 data/core.telegram.org/type/contacts.Blocked rename data/{corefork.telegram.org => core.telegram.org}/type/contacts.Link (97%) create mode 100644 data/core.telegram.org/type/help.Country create mode 100644 data/core.telegram.org/type/help.SupportName create mode 100644 data/core.telegram.org/type/int.html create mode 100644 data/core.telegram.org/type/messages.DiscussionMessage create mode 100644 data/core.telegram.org/type/messages.FavedStickers rename data/{corefork.telegram.org => core.telegram.org}/type/messages.FoundGifs (97%) create mode 100644 data/core.telegram.org/type/messages.MessageViews create mode 100644 data/core.telegram.org/type/messages.VotesList create mode 100644 data/core.telegram.org/widgets/login.html delete mode 100644 data/corefork.telegram.org/api/animated-emojis.html delete mode 100644 data/corefork.telegram.org/api/auth.html delete mode 100644 data/corefork.telegram.org/api/bots.html delete mode 100644 data/corefork.telegram.org/api/bots/buttons.html delete mode 100644 data/corefork.telegram.org/api/bots/commands.html create mode 100644 data/corefork.telegram.org/api/bots/games.html delete mode 100644 data/corefork.telegram.org/api/bots/inline.html delete mode 100644 data/corefork.telegram.org/api/datacenter.html delete mode 100644 data/corefork.telegram.org/api/discussion.html rename data/corefork.telegram.org/api/{account-deletion.html => drafts.html} (59%) create mode 100644 data/corefork.telegram.org/api/errors.html delete mode 100644 data/corefork.telegram.org/api/import.html delete mode 100644 data/corefork.telegram.org/api/live-location.html delete mode 100644 data/corefork.telegram.org/api/mentions.html rename data/corefork.telegram.org/api/{pfs.html => obtaining_api_id.html} (51%) delete mode 100644 data/corefork.telegram.org/api/rights.html delete mode 100644 data/corefork.telegram.org/api/updates.html delete mode 100644 data/corefork.telegram.org/api/url-authorization.html delete mode 100644 data/corefork.telegram.org/api/web-events.html rename data/corefork.telegram.org/{method/messages.forwardMessage => blog/chat-themes-interactive-emoji-read-receipts.html} (62%) create mode 100644 data/corefork.telegram.org/bots/api.html create mode 100644 data/corefork.telegram.org/constructor/account.autoDownloadSettings create mode 100644 data/corefork.telegram.org/constructor/auth.loginTokenMigrateTo create mode 100644 data/corefork.telegram.org/constructor/auth.passwordRecovery create mode 100644 data/corefork.telegram.org/constructor/auth.sentCodeTypeApp create mode 100644 data/corefork.telegram.org/constructor/auth.sentCodeTypeFlashCall create mode 100644 data/corefork.telegram.org/constructor/autoDownloadSettings.html rename data/corefork.telegram.org/{type/Audio.html => constructor/baseThemeTinted.html} (89%) create mode 100644 data/corefork.telegram.org/constructor/cdnConfig.html create mode 100644 data/corefork.telegram.org/constructor/channelAdminLogEventActionChangePhoto.html rename data/corefork.telegram.org/constructor/{messages.statedMessagesLinks => channels.channelParticipants} (85%) create mode 100644 data/corefork.telegram.org/constructor/chatParticipant.html create mode 100644 data/corefork.telegram.org/constructor/chatParticipantsForbidden.html create mode 100644 data/corefork.telegram.org/constructor/chatPhotoEmpty.html create mode 100644 data/corefork.telegram.org/constructor/contactStatus.html rename data/corefork.telegram.org/constructor/{messages.statedMessageLink => contacts.blocked} (85%) create mode 100644 data/corefork.telegram.org/constructor/contacts.topPeersDisabled create mode 100644 data/corefork.telegram.org/constructor/decryptedMessageActionScreenshotMessages.html create mode 100644 data/corefork.telegram.org/constructor/decryptedMessageMediaExternalDocument.html rename data/corefork.telegram.org/constructor/{disabledFeature.html => decryptedMessageMediaWebPage.html} (89%) create mode 100644 data/corefork.telegram.org/constructor/emojiKeywordsDifference.html create mode 100644 data/corefork.telegram.org/constructor/groupCallParticipant.html create mode 100644 data/corefork.telegram.org/constructor/help.deepLinkInfoEmpty create mode 100644 data/corefork.telegram.org/constructor/help.recentMeUrls rename data/corefork.telegram.org/constructor/{wallPaperSolid.html => highScore.html} (89%) create mode 100644 data/corefork.telegram.org/constructor/inlineQueryPeerTypeSameBotPM.html create mode 100644 data/corefork.telegram.org/constructor/inputBotInlineMessageID.html create mode 100644 data/corefork.telegram.org/constructor/inputBotInlineMessageMediaAuto.html create mode 100644 data/corefork.telegram.org/constructor/inputBotInlineMessageMediaVenue.html create mode 100644 data/corefork.telegram.org/constructor/inputChannel.html rename data/corefork.telegram.org/constructor/{updateUserBlocked.html => inputChannelFromMessage.html} (82%) create mode 100644 data/corefork.telegram.org/constructor/inputChatUploadedPhoto.html create mode 100644 data/corefork.telegram.org/constructor/inputDialogPeer.html create mode 100644 data/corefork.telegram.org/constructor/inputDialogPeerFolder.html create mode 100644 data/corefork.telegram.org/constructor/inputDocument.html create mode 100644 data/corefork.telegram.org/constructor/inputDocumentFileLocation.html create mode 100644 data/corefork.telegram.org/constructor/inputGameID.html create mode 100644 data/corefork.telegram.org/constructor/inputGroupCall.html create mode 100644 data/corefork.telegram.org/constructor/inputMediaDocumentExternal.html create mode 100644 data/corefork.telegram.org/constructor/inputMediaUploadedDocument.html create mode 100644 data/corefork.telegram.org/constructor/inputMessagesFilterMusic.html create mode 100644 data/corefork.telegram.org/constructor/inputNotifyBroadcasts.html create mode 100644 data/corefork.telegram.org/constructor/inputPeerEmpty.html create mode 100644 data/corefork.telegram.org/constructor/inputPeerSelf.html create mode 100644 data/corefork.telegram.org/constructor/inputPeerUser.html create mode 100644 data/corefork.telegram.org/constructor/inputPhotoFileLocation.html create mode 100644 data/corefork.telegram.org/constructor/inputPhotoLegacyFileLocation.html create mode 100644 data/corefork.telegram.org/constructor/inputPrivacyKeyStatusTimestamp.html create mode 100644 data/corefork.telegram.org/constructor/inputPrivacyValueDisallowAll.html create mode 100644 data/corefork.telegram.org/constructor/inputReportReasonFake.html create mode 100644 data/corefork.telegram.org/constructor/inputReportReasonOther.html create mode 100644 data/corefork.telegram.org/constructor/inputReportReasonPornography.html create mode 100644 data/corefork.telegram.org/constructor/inputSecureFileUploaded.html create mode 100644 data/corefork.telegram.org/constructor/inputThemeSettings.html create mode 100644 data/corefork.telegram.org/constructor/inputUserEmpty.html create mode 100644 data/corefork.telegram.org/constructor/inputWallPaper.html create mode 100644 data/corefork.telegram.org/constructor/inputWallPaperSlug.html create mode 100644 data/corefork.telegram.org/constructor/keyboardButton.html create mode 100644 data/corefork.telegram.org/constructor/messageActionChatAddUser.html create mode 100644 data/corefork.telegram.org/constructor/messageActionChatDeletePhoto.html create mode 100644 data/corefork.telegram.org/constructor/messageActionPaymentSent.html create mode 100644 data/corefork.telegram.org/constructor/messageActionPaymentSentMe.html create mode 100644 data/corefork.telegram.org/constructor/messageActionSecureValuesSentMe.html rename data/corefork.telegram.org/constructor/{account.sentChangePhoneCode => messageActionSetMessagesTTL.html} (88%) create mode 100644 data/corefork.telegram.org/constructor/messageEntityBotCommand.html create mode 100644 data/corefork.telegram.org/constructor/messageEntityUnknown.html create mode 100644 data/corefork.telegram.org/constructor/messageMediaPoll.html create mode 100644 data/corefork.telegram.org/constructor/messageUserVoteInputOption.html create mode 100644 data/corefork.telegram.org/constructor/messages.affectedFoundMessages create mode 100644 data/corefork.telegram.org/constructor/messages.exportedChatInviteReplaced create mode 100644 data/corefork.telegram.org/constructor/messages.featuredStickers create mode 100644 data/corefork.telegram.org/constructor/messages.highScores create mode 100644 data/corefork.telegram.org/constructor/messages.recentStickers create mode 100644 data/corefork.telegram.org/constructor/messages.sentEncryptedMessage create mode 100644 data/corefork.telegram.org/constructor/messages.stickers create mode 100644 data/corefork.telegram.org/constructor/notifyPeer.html create mode 100644 data/corefork.telegram.org/constructor/pageBlockAnchor.html create mode 100644 data/corefork.telegram.org/constructor/pageBlockBlockquote.html rename data/corefork.telegram.org/constructor/{messageMediaVideo.html => pageBlockKicker.html} (91%) rename data/corefork.telegram.org/constructor/{messages.sentMessageLink => pageBlockMap.html} (86%) create mode 100644 data/corefork.telegram.org/constructor/pageBlockVideo.html create mode 100644 data/corefork.telegram.org/constructor/pageCaption.html create mode 100644 data/corefork.telegram.org/constructor/pageListOrderedItemBlocks.html rename data/corefork.telegram.org/{method/messages.sendBroadcast => constructor/payments.ValidatedRequestedInfo} (73%) create mode 100644 data/corefork.telegram.org/constructor/payments.paymentResult create mode 100644 data/corefork.telegram.org/constructor/peerBlocked.html create mode 100644 data/corefork.telegram.org/constructor/phone.phoneCall create mode 100644 data/corefork.telegram.org/constructor/photoEmpty.html create mode 100644 data/corefork.telegram.org/constructor/pollResults.html create mode 100644 data/corefork.telegram.org/constructor/privacyKeyChatInvite.html create mode 100644 data/corefork.telegram.org/constructor/privacyKeyPhoneNumber.html create mode 100644 data/corefork.telegram.org/constructor/privacyValueAllowUsers.html create mode 100644 data/corefork.telegram.org/constructor/recentMeUrlChat.html create mode 100644 data/corefork.telegram.org/constructor/secureData.html create mode 100644 data/corefork.telegram.org/constructor/secureValueErrorFiles.html create mode 100644 data/corefork.telegram.org/constructor/secureValueTypeInternalPassport.html rename data/corefork.telegram.org/{type/messages.StatedMessages => constructor/secureValueTypePhone.html} (88%) create mode 100644 data/corefork.telegram.org/constructor/secureValueTypeRentalAgreement.html create mode 100644 data/corefork.telegram.org/constructor/sendMessageCancelAction.html rename data/corefork.telegram.org/constructor/{inputMediaUploadedThumbDocument.html => sendMessageEmojiInteractionSeen.html} (83%) create mode 100644 data/corefork.telegram.org/constructor/sendMessageRecordAudioAction.html create mode 100644 data/corefork.telegram.org/constructor/sendMessageRecordVideoAction.html create mode 100644 data/corefork.telegram.org/constructor/sendMessageUploadRoundAction.html create mode 100644 data/corefork.telegram.org/constructor/stats.messageStats create mode 100644 data/corefork.telegram.org/constructor/statsGraphError.html create mode 100644 data/corefork.telegram.org/constructor/stickerSetCovered.html create mode 100644 data/corefork.telegram.org/constructor/storage.fileGif create mode 100644 data/corefork.telegram.org/constructor/textImage.html rename data/corefork.telegram.org/constructor/{messageMediaAudio.html => textItalic.html} (91%) create mode 100644 data/corefork.telegram.org/constructor/textUnderline.html create mode 100644 data/corefork.telegram.org/constructor/themeSettings.html create mode 100644 data/corefork.telegram.org/constructor/topPeerCategoryBotsInline.html create mode 100644 data/corefork.telegram.org/constructor/topPeerCategoryCorrespondents.html create mode 100644 data/corefork.telegram.org/constructor/updateBotInlineQuery.html create mode 100644 data/corefork.telegram.org/constructor/updateChannelAvailableMessages.html create mode 100644 data/corefork.telegram.org/constructor/updateChatParticipantDelete.html create mode 100644 data/corefork.telegram.org/constructor/updateChatParticipants.html create mode 100644 data/corefork.telegram.org/constructor/updateDialogFilters.html create mode 100644 data/corefork.telegram.org/constructor/updateEditMessage.html create mode 100644 data/corefork.telegram.org/constructor/updateInlineBotCallbackQuery.html create mode 100644 data/corefork.telegram.org/constructor/updatePeerBlocked.html create mode 100644 data/corefork.telegram.org/constructor/updatePeerHistoryTTL.html create mode 100644 data/corefork.telegram.org/constructor/updatePeerLocated.html create mode 100644 data/corefork.telegram.org/constructor/updatePeerSettings.html create mode 100644 data/corefork.telegram.org/constructor/updatePinnedDialogs.html create mode 100644 data/corefork.telegram.org/constructor/updatePtsChanged.html create mode 100644 data/corefork.telegram.org/constructor/updateSavedGifs.html create mode 100644 data/corefork.telegram.org/constructor/updateUserStatus.html create mode 100644 data/corefork.telegram.org/constructor/updates.channelDifferenceEmpty create mode 100644 data/corefork.telegram.org/constructor/updates.differenceEmpty create mode 100644 data/corefork.telegram.org/constructor/updates.differenceTooLong create mode 100644 data/corefork.telegram.org/constructor/upload.cdnFile create mode 100644 data/corefork.telegram.org/constructor/userFull.html create mode 100644 data/corefork.telegram.org/constructor/userStatusOffline.html create mode 100644 data/corefork.telegram.org/constructor/wallPaper.html rename data/corefork.telegram.org/constructor/{auth.sentAppCode => webDocument.html} (85%) create mode 100644 data/corefork.telegram.org/constructor/webPage.html create mode 100644 data/corefork.telegram.org/method/account.declinePasswordReset create mode 100644 data/corefork.telegram.org/method/account.getAuthorizations create mode 100644 data/corefork.telegram.org/method/account.getContactSignUpNotification create mode 100644 data/corefork.telegram.org/method/account.getTmpPassword create mode 100644 data/corefork.telegram.org/method/auth.signUp create mode 100644 data/corefork.telegram.org/method/bots.sendCustomRequest create mode 100644 data/corefork.telegram.org/method/bots.setBotCommands create mode 100644 data/corefork.telegram.org/method/channels.editCreator create mode 100644 data/corefork.telegram.org/method/channels.editTitle create mode 100644 data/corefork.telegram.org/method/channels.getAdminLog create mode 100644 data/corefork.telegram.org/method/channels.getAdminedPublicChannels create mode 100644 data/corefork.telegram.org/method/channels.getSponsoredMessages create mode 100644 data/corefork.telegram.org/method/channels.leaveChannel create mode 100644 data/corefork.telegram.org/method/channels.readMessageContents create mode 100644 data/corefork.telegram.org/method/channels.reportSpam create mode 100644 data/corefork.telegram.org/method/channels.toggleSlowMode rename data/corefork.telegram.org/method/{help.getProxyData => contacts.getStatuses} (90%) create mode 100644 data/corefork.telegram.org/method/contacts.getTopPeers create mode 100644 data/corefork.telegram.org/method/contacts.search create mode 100644 data/corefork.telegram.org/method/folders.deleteFolder create mode 100644 data/corefork.telegram.org/method/help.getAppConfig create mode 100644 data/corefork.telegram.org/method/help.getCdnConfig create mode 100644 data/corefork.telegram.org/method/help.getConfig create mode 100644 data/corefork.telegram.org/method/help.getInviteText create mode 100644 data/corefork.telegram.org/method/initConnection.html create mode 100644 data/corefork.telegram.org/method/langpack.getLangPack create mode 100644 data/corefork.telegram.org/method/messages.acceptUrlAuth create mode 100644 data/corefork.telegram.org/method/messages.deleteRevokedExportedChatInvites create mode 100644 data/corefork.telegram.org/method/messages.editChatAdmin create mode 100644 data/corefork.telegram.org/method/messages.editExportedChatInvite create mode 100644 data/corefork.telegram.org/method/messages.getAdminsWithInvites create mode 100644 data/corefork.telegram.org/method/messages.getBotCallbackAnswer create mode 100644 data/corefork.telegram.org/method/messages.getDialogUnreadMarks create mode 100644 data/corefork.telegram.org/method/messages.getFeaturedStickers create mode 100644 data/corefork.telegram.org/method/messages.getUnreadMentions create mode 100644 data/corefork.telegram.org/method/messages.search create mode 100644 data/corefork.telegram.org/method/messages.searchGlobal create mode 100644 data/corefork.telegram.org/method/messages.setInlineGameScore rename data/corefork.telegram.org/method/{phone.editGroupCallMember => payments.clearSavedInfo} (86%) create mode 100644 data/corefork.telegram.org/method/payments.getPaymentForm create mode 100644 data/corefork.telegram.org/method/phone.checkGroupCall create mode 100644 data/corefork.telegram.org/method/phone.getGroupParticipants rename data/corefork.telegram.org/method/{contacts.toggleTopPeers => phone.saveDefaultGroupCallJoinAs} (86%) create mode 100644 data/corefork.telegram.org/method/phone.toggleGroupCallRecord create mode 100644 data/corefork.telegram.org/method/stats.getMessageStats rename data/corefork.telegram.org/method/{messages.searchGifs => stickers.checkShortName} (86%) create mode 100644 data/corefork.telegram.org/method/stickers.setStickerSetThumb rename data/corefork.telegram.org/method/{messages.getMessagesReactions => updates.getState} (88%) create mode 100644 data/corefork.telegram.org/method/upload.getCdnFileHashes create mode 100644 data/corefork.telegram.org/method/upload.getWebFile delete mode 100644 data/corefork.telegram.org/methods.html delete mode 100644 data/corefork.telegram.org/mtproto/security_guidelines.html delete mode 100644 data/corefork.telegram.org/mtproto/security_guidelines_v1.html rename data/{core.telegram.org => corefork.telegram.org}/schema/end-to-end-json.html (100%) create mode 100644 data/corefork.telegram.org/schema/end-to-end.html delete mode 100644 data/corefork.telegram.org/schema/json.html create mode 100644 data/corefork.telegram.org/type/Authorization.html create mode 100644 data/corefork.telegram.org/type/ChannelAdminLogEventsFilter.html create mode 100644 data/corefork.telegram.org/type/ChannelMessagesFilter.html create mode 100644 data/corefork.telegram.org/type/Chat.html create mode 100644 data/corefork.telegram.org/type/ChatAdminWithInvites.html create mode 100644 data/corefork.telegram.org/type/ChatInvite.html create mode 100644 data/corefork.telegram.org/type/DcOption.html create mode 100644 data/corefork.telegram.org/type/DecryptedMessageMedia.html create mode 100644 data/corefork.telegram.org/type/DialogFilterSuggested.html delete mode 100644 data/corefork.telegram.org/type/DisabledFeature.html create mode 100644 data/corefork.telegram.org/type/DocumentAttribute.html create mode 100644 data/corefork.telegram.org/type/GroupCallParticipant.html create mode 100644 data/corefork.telegram.org/type/InlineBotSwitchPM.html create mode 100644 data/corefork.telegram.org/type/InputCheckPasswordSRP.html create mode 100644 data/corefork.telegram.org/type/InputNotifyPeer.html create mode 100644 data/corefork.telegram.org/type/InputPaymentCredentials.html create mode 100644 data/corefork.telegram.org/type/InputPeerNotifySettings.html create mode 100644 data/corefork.telegram.org/type/InputWallPaper.html create mode 100644 data/corefork.telegram.org/type/MessageAction.html create mode 100644 data/corefork.telegram.org/type/MessageMedia.html delete mode 100644 data/corefork.telegram.org/type/MessageReactionsList.html create mode 100644 data/corefork.telegram.org/type/MessageReplies.html create mode 100644 data/corefork.telegram.org/type/PageTableCell.html create mode 100644 data/corefork.telegram.org/type/PasswordKdfAlgo.html create mode 100644 data/corefork.telegram.org/type/SecurePlainData.html create mode 100644 data/corefork.telegram.org/type/SecureRequiredType.html create mode 100644 data/corefork.telegram.org/type/ShippingOption.html create mode 100644 data/corefork.telegram.org/type/StickerSetCovered.html create mode 100644 data/corefork.telegram.org/type/True.html create mode 100644 data/corefork.telegram.org/type/UserFull.html delete mode 100644 data/corefork.telegram.org/type/Video.html create mode 100644 data/corefork.telegram.org/type/VideoSize.html create mode 100644 data/corefork.telegram.org/type/WebDocument.html create mode 100644 data/corefork.telegram.org/type/WebPage.html create mode 100644 data/corefork.telegram.org/type/account.AutoDownloadSettings delete mode 100644 data/corefork.telegram.org/type/auth.CheckedPhone create mode 100644 data/corefork.telegram.org/type/contacts.Blocked create mode 100644 data/corefork.telegram.org/type/contacts.Contacts create mode 100644 data/corefork.telegram.org/type/contacts.TopPeers create mode 100644 data/corefork.telegram.org/type/help.Country create mode 100644 data/corefork.telegram.org/type/help.CountryCode create mode 100644 data/corefork.telegram.org/type/help.PromoData create mode 100644 data/corefork.telegram.org/type/messages.AffectedMessages delete mode 100644 data/corefork.telegram.org/type/messages.SentMessage create mode 100644 data/corefork.telegram.org/type/messages.Stickers create mode 100644 data/corefork.telegram.org/type/stats.BroadcastStats create mode 100644 data/corefork.telegram.org/type/storage.FileType rename data/corefork.telegram.org/{method/auth.sendSms => type/string.html} (61%) delete mode 100644 data/desktop.telegram.org/js/main.js delete mode 100644 data/instantview.telegram.org/checklist.html delete mode 100644 data/instantview.telegram.org/templates.html delete mode 100644 data/macos.telegram.org.html delete mode 100644 data/macos.telegram.org/css/bootstrap.min.css delete mode 100644 data/macos.telegram.org/css/telegram.css delete mode 100644 data/macos.telegram.org/js/main.js delete mode 100644 data/promote.telegram.org/basics.html delete mode 100644 data/promote.telegram.org/getting-started.html delete mode 100644 data/promote.telegram.org/guidelines.html delete mode 100644 data/promote.telegram.org/tos.html delete mode 100644 data/telegram.org/android.html delete mode 100644 data/telegram.org/apple_privacy.html delete mode 100644 data/telegram.org/blog.html delete mode 100644 data/telegram.org/blog/200-million.html delete mode 100644 data/telegram.org/blog/admin-revolution.html delete mode 100644 data/telegram.org/blog/android-gif.html delete mode 100644 data/telegram.org/blog/android-streaming.html delete mode 100644 data/telegram.org/blog/android-wear-2-0.html delete mode 100644 data/telegram.org/blog/animated-stickers.html delete mode 100644 data/telegram.org/blog/apple-watch.html delete mode 100644 data/telegram.org/blog/bot-revolution.html delete mode 100644 data/telegram.org/blog/channels-2-0.html delete mode 100644 data/telegram.org/blog/crowdsourcing-a-more-secure-future.html delete mode 100644 data/telegram.org/blog/drafts.html delete mode 100644 data/telegram.org/blog/encrypted-cdns.html delete mode 100644 data/telegram.org/blog/export-and-more.html delete mode 100644 data/telegram.org/blog/files-on-steroids.html delete mode 100644 data/telegram.org/blog/filters-anonymous-admins-comments.html delete mode 100644 data/telegram.org/blog/gif-revolution.html delete mode 100644 data/telegram.org/blog/instant-view-contest-200K.html delete mode 100644 data/telegram.org/blog/instant-view.html delete mode 100644 data/telegram.org/blog/invite-links.html delete mode 100644 data/telegram.org/blog/login.html delete mode 100644 data/telegram.org/blog/move-history.html delete mode 100644 data/telegram.org/blog/new-profiles-people-nearby.html delete mode 100644 data/telegram.org/blog/now-you-see-me.html delete mode 100644 data/telegram.org/blog/passport.html delete mode 100644 data/telegram.org/blog/payments.html delete mode 100644 data/telegram.org/blog/privacy-discussions-web-bots.html delete mode 100644 data/telegram.org/blog/profile-videos-people-nearby-and-more.html delete mode 100644 data/telegram.org/blog/share-preview.html delete mode 100644 data/telegram.org/blog/shared-files.html delete mode 100644 data/telegram.org/blog/shared-links.html delete mode 100644 data/telegram.org/blog/shared-media-scrolling-calendar-join-requests-and-more.html delete mode 100644 data/telegram.org/blog/silent-messages-slow-mode.html delete mode 100644 data/telegram.org/blog/stickers-meet-art-and-history.html delete mode 100644 data/telegram.org/blog/stickers-revolution.html delete mode 100644 data/telegram.org/blog/supergroups5k.html delete mode 100644 data/telegram.org/blog/tdlib.html delete mode 100644 data/telegram.org/blog/telegram-me-change-number-and-pfs.html delete mode 100644 data/telegram.org/blog/telegraph.html delete mode 100644 data/telegram.org/blog/themes-accounts.html delete mode 100644 data/telegram.org/blog/translations-iv2.html delete mode 100644 data/telegram.org/blog/unsend-and-usage.html delete mode 100644 data/telegram.org/blog/video-1000.html delete mode 100644 data/telegram.org/blog/video-calls.html delete mode 100644 data/telegram.org/blog/video-editor-gifs.html delete mode 100644 data/telegram.org/blog/video-messages-and-telescope.html delete mode 100644 data/telegram.org/privacy.html delete mode 100644 data/telegram.org/template34.html delete mode 100644 data/telegram.org/tour/channels.html delete mode 100644 data/telegram.org/what-can-you-do-with-Telegram.html diff --git a/data/core.telegram.org/api/bots/games.html b/data/core.telegram.org/api/bots/games.html new file mode 100644 index 0000000000..bc7bfcae0f --- /dev/null +++ b/data/core.telegram.org/api/bots/games.html @@ -0,0 +1,171 @@ + + + + + Games + + + + + + + + + + + + + +
+ +
+
+
+ +

Games

+ +
+ +

Bots can offer users HTML5 games to play solo or to compete against each other in groups and one-on-one chats.

+

Sending a game

+
inputUserSelf#f7c1b13f = InputUser;
+
+inputGameID#32c3e77 id:long access_hash:long = InputGame;
+inputGameShortName#c331e80a bot_id:InputUser short_name:string = InputGame;
+
+inputMediaGame#d33f43f3 id:InputGame = InputMedia;
+
+game#bdf9653b flags:# id:long access_hash:long short_name:string title:string description:string photo:Photo document:flags.0?Document = Game;
+messageMediaGame#fdb19008 game:Game = MessageMedia;
+
+---functions---
+
+messages.sendMedia#3491eba9 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> schedule_date:flags.10?int = Updates;
+

Bots can directly send a game using messages.sendMedia, providing:

+
    +
  • The bot's shortname obtained from @BotFather to inputGameShortName.short_name
  • +
  • The current bot's info to inputGameShortName.bot_id
  • +
+

The sent message will contain a messageMediaGame with a game, that can then be used by users to forward the game using sendMedia with inputGameID.

+

Starting a game

+

Games are started clicking on the button, which triggers an callback query that returns the game URL, for more info see here &raquo.
+The game should then be opened in a WebView or in native UI (specified by the native_ui flag), exposing the appropriate HTML5 APIs in order to receive various JS game events directly from the code of the game, as described here ».

+

Setting highscores

+
---functions---
+
+messages.setGameScore#8ef8ecc0 flags:# edit_message:flags.0?true force:flags.1?true peer:InputPeer id:int user_id:InputUser score:int = Updates;
+messages.setInlineGameScore#15ad9f64 flags:# edit_message:flags.0?true force:flags.1?true id:InputBotInlineMessageID user_id:InputUser score:int = Bool;
+

Games are supposed to report back to the MTProto API every time the user looses a game with a new highscore.
+Since games run in the browser, they cannot directly report data to the API using the bot token, which must be kept secret.
+Instead, they should send highscores to an intermediate server, that will then report scores using messages.setGameScore or messages.setInlineGameScore, depending on the source of the game.

+
    +
  • The edit_message flag should be set if the game message should be automatically edited to include the current scoreboard
  • +
  • The force flag should be set if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters.
  • +
+

Getting highscores

+
messageActionGameScore#92a72876 game_id:long score:int = MessageAction;
+
+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;
+
+highScore#73a379eb pos:int user_id:long score:int = HighScore;
+
+messages.highScores#9a3bfd99 scores:Vector<HighScore> users:Vector<User> = messages.HighScores;
+
+---functions---
+
+messages.getGameHighScores#e822649d peer:InputPeer id:int user_id:InputUser = messages.HighScores;
+messages.getInlineGameHighScores#f635e1b id:InputBotInlineMessageID user_id:InputUser = messages.HighScores;
+

Every time a highscore is reached, and the edit_message flag is set when reporting the score, a messageService with a messageActionGameScore is generated, indicating that the highscore of a certain game has changed, thanks to a certain user_id.
+Our own current position of the scoreboard is also reported as pos.

+

When receiving such an update, graphical clients should refetch the scoreboard using messages.getGameHighScores or messages.getInlineGameHighScores.

+ +
+ +
+
+ +
+ + + + + + + + diff --git a/data/core.telegram.org/api/datacenter.html b/data/core.telegram.org/api/datacenter.html new file mode 100644 index 0000000000..0a1c80620e --- /dev/null +++ b/data/core.telegram.org/api/datacenter.html @@ -0,0 +1,152 @@ + + + + + Working with Different Data Centers + + + + + + + + + + + + + +
+ +
+
+
+ +

Working with Different Data Centers

+ +

The servers are divided into several data centers (hereinafter “DCs”) in different parts of the world. +A complete list of proxy access points for these DCs may be obtained using help.getConfig:

+
dcOption#18b7a10d flags:# ipv6:flags.0?true media_only:flags.1?true tcpo_only:flags.2?true cdn:flags.3?true static:flags.4?true id:int ip_address:string port:int secret:flags.10?bytes = DcOption;
+config#330b4067 flags:# phonecalls_enabled:flags.1?true default_p2p_contacts:flags.3?true preload_featured_stickers:flags.4?true ignore_phone_entities:flags.5?true revoke_pm_inbox:flags.6?true blocked_mode:flags.8?true pfs_enabled:flags.13?true date:int expires:int test_mode:Bool this_dc:int dc_options:Vector<DcOption> dc_txt_domain_name:string chat_size_max:int megagroup_size_max:int forwarded_count_max:int online_update_period_ms:int offline_blur_timeout_ms:int offline_idle_timeout_ms:int online_cloud_timeout_ms:int notify_cloud_delay_ms:int notify_default_delay_ms:int push_chat_period_ms:int push_chat_limit:int saved_gifs_limit:int edit_time_limit:int revoke_time_limit:int revoke_pm_time_limit:int rating_e_decay:int stickers_recent_limit:int stickers_faved_limit:int channels_read_media_period:int tmp_sessions:flags.0?int pinned_dialogs_count_max:int pinned_infolder_count_max:int call_receive_timeout_ms:int call_ring_timeout_ms:int call_connect_timeout_ms:int call_packet_timeout_ms:int me_url_prefix:string autoupdate_url_prefix:flags.7?string gif_search_username:flags.9?string venue_search_username:flags.10?string img_search_username:flags.11?string static_maps_provider:flags.12?string caption_length_max:int message_length_max:int webfile_dc_id:int suggested_lang_code:flags.2?string lang_pack_version:flags.2?int base_lang_pack_version:flags.2?int = Config;
+---functions---
+help.getConfig#c4f9186b = Config;
+

In this context, this_dc is the number of the current DC, dc_options is a list of all DCs available at the moment, each of which has an id, ip, and port for establishing a connection. Please note that ip and port may change frequently, based on proxy server load and the user's current location.
+Typically, each DC has at least one IPv4 and one IPv6 endpoint available.

+

To optimize client communication with the API, each client must use the connection to the closest access point for its main queries (sending messages, getting contacts, etc.). Therefore, knowing how to select a DC is required before communicating with the API.

+

Registration/Authorization

+

The auth.sendCode method is the basic entry point when registering a new user or authorizing an existing user. 95% of all redirection cases to a different DC will occure when invoking this method.

+

The client does not yet know which DC it will be associated with; therefore, it establishes an encrypted connection to a random address and sends its query to that address. +Having received a phone_number from a client, we can find out whether or not it is registered in the system. If it is, then, if necessary, instead of sending a text message, we request that it establish a connection with a different DC first (PHONE_MIGRATE_X error). +If we do not yet have a user with this number, we examine its IP-address. We can use it to identify the closest DC. Again, if necessary, we redirect the user to a different DC (NETWORK_MIGRATE_X error).

+

Testing Redirects

+

There are reserved phone number prefixes to test the correctness of the application’s handling of redirects between DCs. Read more in User Authorization article.

+

File Access

+

A file saved by a user with upload.saveFilePart will be available for direct download only from the DC where the query was executed. That is why each file has a dc_id parameter:

+
document#1e87342b flags:# id:long access_hash:long file_reference:bytes date:int mime_type:string size:int thumbs:flags.0?Vector<PhotoSize> video_thumbs:flags.1?Vector<VideoSize> dc_id:int attributes:Vector<DocumentAttribute> = Document;
+photo#fb197a65 flags:# has_stickers:flags.0?true id:long access_hash:long file_reference:bytes date:int sizes:Vector<PhotoSize> video_sizes:flags.1?Vector<VideoSize> dc_id:int = Photo;
+
+encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile;
+
+userProfilePhoto#82d1f706 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = UserProfilePhoto;
+chatPhoto#1c6e1c11 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = ChatPhoto;
+

To download the file, an encrypted connection to DC dc_id must be established and used to execute the upload.getFile query. +If an attempt is made to download the file over a wrong connection, the FILE_MIGRATE_X error will be returned.

+

Please note that encryption keys are not copied between DCs; therefore, the process of establishing an encrypted connection is started from the very beginning for each new DC. An issued auth_key can be associated with the current authorized user by using an authorization transfer.

+

User Migration

+

During the process of working with the API, user information is accumulated in the DC with which the user is associated. This is the reason a user cannot be associated with a different DC by means of the client. However, in the future, during prolonged communication from an unusual location, we may decide that the user’s data must be moved to a different DC. After some time, the data will be copied and the association will be updated. Once this happens, when executing any query transmitted to the old DC, the API will return the USER_MIGRATE_X error. The client will then have to establish a connection with the new DC and repeat the query.

+

Authorization Transfer

+

The following methods can be used to eliminate the need for users to enter the code from a text message every time:

+
auth.exportedAuthorization#b434e2b8 id:long bytes:bytes = auth.ExportedAuthorization;
+auth.authorization#cd050916 flags:# tmp_sessions:flags.0?int user:User = auth.Authorization;
+---functions---
+auth.importAuthorization#a57a7dad id:long bytes:bytes = auth.Authorization;
+auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;
+

auth.exportAuthorization must be executed in the current DC (the DC with which a connection has already been established), passing in dc_id as the value for the new DC. The method should return the user identifier and a long string of random data. An import operation can be performed at the new DC by sending it what was received. Queries requiring authorization can then be successfully executed in the new DC.

+ +
+ +
+
+ +
+ + + + + + diff --git a/data/core.telegram.org/api/end-to-end.html b/data/core.telegram.org/api/end-to-end.html deleted file mode 100644 index 4fa159929c..0000000000 --- a/data/core.telegram.org/api/end-to-end.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - End-to-End Encryption, Secret Chats - - - - - - - - - - - - - -
- -
-
-
- -

End-to-End Encryption, Secret Chats

- -
- -
-

This article on MTProto's End-to-End encryption is meant for advanced users. -If you want to learn more about Secret Chats from a less intimidating source, kindly see our general FAQ.

-
-
-

Note that as of version 4.6, major Telegram clients are using MTProto 2.0. -MTProto v.1.0 is deprecated and is currently being phased out.

-
-
-
Related articles
-

-
-

Secret Chats are one-on-one chats wherein messages are encrypted with a key held only by the chat’s participants. Note that the schema for these end-to-end encrypted Secret Chats is different from what is used for cloud chats:

-
- -
-

A note on MTProto 2.0

-

This article describes the end-to-end encryption layer in the MTProto protocol version 2.0. -The principal differences from version 1.0 (described here for reference) are as follows:

-
    -
  • SHA-256 is used instead of SHA-1;
  • -
  • Padding bytes are involved in the computation of msg_key;
  • -
  • msg_key depends not only on the message to be encrypted, but on a portion of the secret chat key as well;
  • -
  • 12..1024 padding bytes are used instead of 0..15 padding bytes in v.1.0.
  • -
-

See also: MTProto 2.0: Cloud Chats, server-client encryption

-

Key Generation

-

Keys are generated using the Diffie-Hellman protocol.

-

Let us consider the following scenario: User A would like to initiate end-to-end encrypted communication with User B.

-

Sending a Request

-

User A executes messages.getDhConfig to obtain the Diffie-Hellman parameters: a prime p, and a high order element g.

-

Executing this method before each new key generation procedure is of vital importance. It makes sense to cache the values of the parameters together with the version in order to avoid having to receive all of the values every time. If the version stored on the client is still up-to-date, the server will return the constructor messages.dhConfigNotModified.

-

Client is expected to check whether p is a safe 2048-bit prime (meaning that both p and (p-1)/2 are prime, and that 2^2047 < p < 2^2048), and that g generates a cyclic subgroup of prime order (p-1)/2, i.e. is a quadratic residue mod p. Since g is always equal to 2, 3, 4, 5, 6 or 7, this is easily done using quadratic reciprocity law, yielding a simple condition on p mod 4g -- namely, p mod 8 = 7 for g = 2; p mod 3 = 2 for g = 3; no extra condition for g = 4; p mod 5 = 1 or 4 for g = 5; p mod 24 = 19 or 23 for g = 6; and p mod 7 = 3, 5 or 6 for g = 7. After g and p have been checked by the client, it makes sense to cache the result, so as to avoid repeating lengthy computations in future. This cache might be shared with one used for Authorization Key generation.

-

If the client needs additional entropy for the random number generator, it can pass the random_length parameter (random_length> 0) so the server generates its own random sequence random of the appropriate length. -Important: using the server’s random sequence in its raw form may be unsafe, it must be combined with a client sequence.

-

Client A computes a 2048-bit number a (using sufficient entropy or the server’s random; see above) and executes messages.requestEncryption after passing in g_a := pow(g, a) mod dh_prime.

-

User B receives the update updateEncryption for all associated authorization keys (all authorized devices) with the chat constructor encryptedChatRequested. The user must be shown basic information about User A and must be prompted to accept or reject the request.

-

Both clients are to check that g, g_a and g_b are greater than one and smaller than p-1. We recommend checking that g_a and g_b are between 2^{2048-64} and p - 2^{2048-64} as well.

-

Accepting a Request

-

After User B confirms the creation of a secret chat with A in the client interface, Client B also receives up-to-date configuration parameters for the Diffie-Hellman method. Thereafter, it generates a random 2048-bit number, b, using rules similar to those for a.

-

Having received g_a from the update with encryptedChatRequested, it can immediately generate the final shared key: key = (pow(g_a, b) mod dh_prime). If key length < 256 bytes, add several leading zero bytes as padding — so that the key is exactly 256 bytes long. Its fingerprint, key_fingerprint, is equal to the 64 last bits of SHA1 (key).

-

Note 1: in this particular case SHA1 is used here even for MTProto 2.0 secret chats.

-

Note 2: this fingerprint is used as a sanity check for the key exchange procedure to detect bugs when developing client software — it is not connected to the key visualization used on the clients as means of external authentication in secret chats. Key visualizations on the clients are generated using the first 128 bits of SHA1(initial key) followed by the first 160 bits of SHA256(key used when secret chat was updated to layer 46).

-

Client B executes messages.acceptEncryption after passing it g_b := pow(g, b) mod dh_prime and key_fingerprint.

-

For all of Client B’s authorized devices, except the current one, updateEncryption updates are sent with the constructor encryptedChatDiscarded. Thereafter, the only device that will be able to access the secret chat is Device B, which made the call to messages.acceptEncryption.

-

User A will be sent an updateEncryption update with the constructor encryptedChat, for the authorization key that initiated the chat.

-

With g_b from the update, Client A can also compute the shared key key = (pow(g_b, a) mod dh_prime). If key length < 256 bytes, add several leading zero bytes as padding — so that the key is exactly 256 bytes long. If the fingerprint for the received key is identical to the one that was passed to encryptedChat, incoming messages can be sent and processed. Otherwise, messages.discardEncryption must be executed and the user notified.

-

Perfect Forward Secrecy

-

In order to keep past communications safe, official Telegram clients will initiate re-keying once a key has been used to decrypt and encrypt more than 100 messages, or has been in use for more than one week, provided the key has been used to encrypt at least one message. Old keys are then securely discarded and cannot be reconstructed, even with access to the new keys currently in use.

-
-

The re-keying protocol is further described in this article: Perfect Forward Secrecy in Secret Chats.

-
-

Please note that your client must support Forward Secrecy in Secret Chats to be compatible with official Telegram clients.

-

Sending and Receiving Messages in a Secret Chat

-

Serialization and Encryption of Outgoing Messages

-

A TL object of type DecryptedMessage is created and contains the message in plain text. For backward compatibility, the object must be wrapped in the constructor decryptedMessageLayer with an indication of the supported layer (starting with 46).

-
-

The TL-Schema for the contents of end-to-end encrypted messages is available here »

-
-

The resulting construct is serialized as an array of bytes using generic TL rules. The resulting array is prepended by 4 bytes containing the array length not counting these 4 bytes.

-

The byte array is padded with 12 to 1024 random padding bytes to make its length divisible by 16 bytes. (In the older MTProto 1.0 encryption, only 0 to 15 padding bytes were used.)

-

Message key, msg_key, is computed as the 128 middle bits of the SHA256 of the data obtained in the previous step, prepended by 32 bytes from the shared key key. (For the older MTProto 1.0 encryption, msg_key was computed differently, as the 128 lower bits of SHA1 of the data obtained in the previous steps, excluding the padding bytes.)

-

For MTProto 2.0, the AES key aes_key and initialization vector aes_iv are computed ( key is the shared key obtained during Key Generation ) as follows:

-
    -
  • msg_key_large = SHA256 (substr (key, 88+x, 32) + plaintext + random_padding);
  • -
  • msg_key = substr (msg_key_large, 8, 16);
  • -
  • sha256_a = SHA256 (msg_key + substr (key, x, 36));
  • -
  • sha256_b = SHA256 (substr (key, 40+x, 36) + msg_key);
  • -
  • aes_key = substr (sha256_a, 0, 8) + substr (sha256_b, 8, 16) + substr (sha256_a, 24, 8);
  • -
  • aes_iv = substr (sha256_b, 0, 8) + substr (sha256_a, 8, 16) + substr (sha256_b, 24, 8);
  • -
-

For MTProto 2.0, x=0 for messages from the originator of the secret chat, x=8 for the messages in the opposite direction.

-

For the obsolete MTProto 1.0, msg_key, aes_key, and aes_iv were computed differently (see this document for reference).

-

Data is encrypted with a 256-bit key, aes_key, and a 256-bit initialization vector, aes-iv, using AES-256 encryption with infinite garble extension (IGE). Encryption key fingerprint key_fingerprint and the message key msg_key are added at the top of the resulting byte array.

-

Encrypted data is embedded into a messages.sendEncrypted API call and passed to Telegram server for delivery to the other party of the Secret Chat.

-

Upgrading to MTProto 2.0 from MTProto 1.0

-

As soon as both parties in a secret chat are using at least Layer 73, they should only use MTProto 2.0 for all outgoing messages. Some of the first received messages may use MTProto 1.0, if a sufficiently high starting layer has not been negotiated during the creation of the secret chat. After the first message encrypted with MTProto 2.0 (or the first message with Layer 73 or higher) is received, all messages with higher sequence numbers must be encrypted with MTProto 2.0 as well.

-

As long as the current layer is lower than 73, each party should try to decrypt received messages with MTProto 1.0, and if this is not successfull (msg_key does not match), try MTProto 2.0. Once the first MTProto 2.0-encrypted message arrives (or the layer is upgraded to 73), there is no need to try MTProto 1.0 decryption for any of the further messages (unless the client is still waiting for some gaps to be closed).

-

Decrypting an Incoming Message

-

The steps above are performed in reverse order. -When an encrypted message is received, you must check that msg_key is in fact equal to the 128 middle bits of the SHA256 hash of the decrypted message, prepended by 32 bytes taken from the shared key. -If the message layer is greater than the one supported by the client, the user must be notified that the client version is out of date and prompted to update.

-

Sequence numbers

-

It is necessary to interpret all messages in their original order to protect against possible manipulations. Secret chats support a special mechanism for handling seq_no counters independently from the server.

-
-

Proper handling of these counters is further described in this article: Sequence numbers in Secret Chats.

-
-

Please note that your client must support sequence numbers in Secret Chats to be compatible with official Telegram clients.

-

Sending Encrypted Files

-

All files sent to secret chats are encrypted with one-time keys that are in no way related to the chat’s shared key. Before an encrypted file is sent, it is assumed that the encrypted file’s address will be attached to the outside of an encrypted message using the file parameter of the messages.sendEncryptedFile method and that the key for direct decryption will be sent in the body of the message (the key parameter in the constructors decryptedMessageMediaPhoto, decryptedMessageMediaVideo and decryptedMessageMediaFile.

-

Prior to a file being sent to a secret chat, 2 random 256-bit numbers are computed which will serve as the AES key and initialization vector used to encrypt the file. AES-256 encryption with infinite garble extension (IGE) is used in like manner.

-

The key fingerprint is computed as follows:

-
    -
  • digest = md5(key + iv)
  • -
  • fingerprint = substr(digest, 0, 4) XOR substr(digest, 4, 4)
  • -
-

The encrypted contents of a file are stored on the server in much the same way as those of a file in cloud chats: piece by piece using calls to upload.saveFilePart. -A subsequent call to messages.sendEncryptedFile will assign an identifier to the stored file and send the address together with the message. The recipient will receive an update with encryptedMessage, and the file parameter will contain file information.

-

Incoming and outgoing encrypted files can be forwarded to other secret chats using the constructor inputEncryptedFile to avoid saving the same content on the server twice.

-

Working with an Update Box

-

Secret chats are associated with specific devices (or rather with authorization keys), not users. A conventional message box, which uses pts to describe the client’s status, is not suitable, because it is designed for long-term message storage and message access from different devices.

-

An additional temporary message queue is introduced as a solution to this problem. When an update regarding a message from a secret chat is sent, a new value of qts is sent, which helps reconstruct the difference if there has been a long break in the connection or in case of loss of an update.

-

As the number of events increases, the value of qts increases by 1 with each new event. The initial value may not (and will not) be equal to 0.

-

The fact that events from the temporary queue have been received and stored by the client is acknowledged explicitly by a call to the messages.receivedQueue method or implicitly by a call to updates.getDifference (the value of qts passed, not the final state). All messages acknowledged as delivered by the client, as well as any messages older than 7 days, may (and will) be deleted from the server.

-

Upon de-authorization, the event queue of the corresponding device will be forcibly cleared, and the value of qts will become irrelevant.

-

Updating to new layers

-

Your client should always store the maximal layer that is known to be supported by the client on the other side of a secret chat. When the secret chat is first created, this value should be initialized to 46. This remote layer value must always be updated immediately after receiving any packet containing information of an upper layer, i.e.:

-
    -
  • any secret chat message containing layer_no in its decryptedMessageLayer with layer>=46, or
  • -
  • a decryptedMessageActionNotifyLayer service message, wrapped as if it were the decryptedMessageService constructor of the obsolete layer 8 (constructor decryptedMessageService#aa48327d).
  • -
-

Notifying the remote client about your local layer

-

In order to notify the remote client of your local layer, your client must send a message of the decryptedMessageActionNotifyLayer type. This notification must be wrapped in a constructor of an appropriate layer.

-

There are two cases when your client must notify the remote client about its local layer:

-
    -
  1. As soon as a new secret chat has been created, immediately after the secret key has been successfully exchanged.
  2. -
  3. Immediately after the local client has been updated to support a new secret chat layer. In this case notifications must be sent to all currently existing secret chats. Note that this is only necessary when updating to new layers that contain changes in the secret chats implementation (e.g. you don’t need to do this when your client is updated from Layer 46 to Layer 47).
  4. -
- -
- -
-
- -
- - - - - - - - diff --git a/data/core.telegram.org/api/end-to-end/video-calls.html b/data/core.telegram.org/api/end-to-end/video-calls.html deleted file mode 100644 index 7c6e8041bf..0000000000 --- a/data/core.telegram.org/api/end-to-end/video-calls.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - End-to-End Encrypted Voice and Video Calls - - - - - - - - - - - - - -
- -
-
-
- -

End-to-End Encrypted Voice and Video Calls

- -

This article describes the end-to-end encryption used for Telegram voice and video calls.

-
Related Articles
-

- -
-

Establishing Calls

-

Before a call is ready, some preliminary actions have to be performed. The calling party needs to contact the party to be called and check whether it is ready to accept the call. Besides that, the parties have to negotiate the protocols to be used, learn the IP addresses of each other or of the Telegram relay servers to be used (so-called reflectors), and generate a one-time encryption key for this voice call with the aid of Diffie--Hellman key exchange. All of this is accomplished in parallel with the aid of several Telegram API methods and related notifications. This document covers details related to key generation, encryption and security.

-

Key Generation

-

The Diffie-Hellman key exchange, as well as the whole protocol used to create a new voice call, is quite similar to the one used for Secret Chats. We recommend studying the linked article before proceeding.

-

However, we have introduced some important changes to facilitate the key verification process. Below is the entire exchange between the two communicating parties, the Caller (A) and the Callee (B), through the Telegram servers (S).

-
    -
  • A executes messages.getDhConfig to find out the 2048-bit Diffie-Hellman prime p and generator g. The client is expected to check whether p is a safe prime and perform all the security checks necessary for secret chats.
  • -
  • A chooses a random value of a, 1 < a < p-1, and computes g_a:=power(g,a) mod p (a 256-byte number) and g_a_hash:=SHA256(g_a) (32 bytes long).
  • -
  • A invokes (sends to server S) phone.requestCall, which has the field g_a_hash:bytes, among others. For this call, this field is to be filled with g_a_hash, not g_a itself.
  • -
  • The Server S performs privacy checks and sends an updatePhoneCall update with a phoneCallRequested constructor to all of B's active devices. This update, apart from the identity of A and other relevant parameters, contains the g_a_hash field, filled with the value obtained from A.
  • -
  • B accepts the call on one of their devices, stores the received value of g_a_hash for this instance of the voice call creation protocol, chooses a random value of b, 1 < b < p-1, computes g_b:=power(g,b) mod p, performs all the required security checks, and invokes the phone.acceptCall method, which has a g_b:bytes field (among others), to be filled with the value of g_b itself (not its hash).
  • -
  • The Server S sends an updatePhoneCall with the phoneCallDiscarded constructor to all other devices B has authorized, to prevent accepting the same call on any of the other devices. From this point on, the server S works only with that of B's devices which has invoked phone.acceptCall first.
  • -
  • The Server S sends to A an updatePhoneCall update with phoneCallAccepted constructor, containing the value of g_b received from B.
  • -
  • A performs all the usual security checks on g_b and a, computes the Diffie--Hellman key key:=power(g_b,a) mod p and its fingerprint key_fingerprint:long, equal to the lower 64 bits of SHA1(key), the same as with secret chats. Then A invokes the phone.confirmCall method, containing g_a:bytes and key_fingerprint:long.
  • -
  • The Server S sends to B an updatePhoneCall update with the phoneCall constructor, containing the value of g_a in g_a_or_b:bytes field, and key_fingerprint:long
  • -
  • At this point B receives the value of g_a. It checks that SHA256(g_a) is indeed equal to the previously received value of g_a_hash, performs all the usual Diffie-Hellman security checks, and computes the key key:=power(g_a,b) mod p and its fingerprint, equal to the lower 64 bits of SHA1(key). Then it checks that this fingerprint equals the value of key_fingerprint:long received from the other side, as an implementation sanity check.
  • -
-

At this point, the Diffie--Hellman key exchange is complete, and both parties have a 256-byte shared secret key key which is used to encrypt all further exchanges between A and B.

-

It is of paramount importance to accept each update only once for each instance of the key generation protocol, discarding any duplicates or alternative versions of already received and processed messages (updates).

-

Encryption

-
-

This document describes encryption in voice and video calls as implemented in Telegram apps with versions 7.0 and above. See this document for details on encryption used in voice calls in app versions released before August 14, 2020.

-
-

The Telegram Voice and Video Call Library uses an optimized version of MTProto 2.0 to send and receive packets, consisting of one or more end-to-end encrypted messages of various types (ice candidates list, video formats, remote video status, audio stream data, video stream data, message ack or empty).

-

This document describes only the encryption process, leaving out encoding and network-dependent parts.

-

The library starts working with:

-
    -
  • An encryption key key shared between the parties, as generated above.
  • -
  • Information whether the call is outgoing or incoming.
  • -
  • Two data transfer channels: signaling, offered by the Telegram API, and transport based on WebRTC.
  • -
-

Both data transfer channels are unreliable (messages may get lost), but signaling is slower and more reliable.

-

Encrypting Call Data

-

The body of a packet (decrypted_body) consists of several messages and their respective seq numbers concatenated together.

-
    -
  • decrypted_body = message_seq1 + message_body1 + message_seq2 + message_body2
  • -
-

Each decrypted_body is unique because no two seq numbers of the first message can be the same. If only old messages need to be re-sent, an empty message with new unique seq is added to the packet first.

-

The encryption key key is used to compute a 128-bit msg_key and then a 256-bit aes_key and a 128-bit aes_iv:

-
    -
  • msg_key_large = SHA256 (substr(key, 88+x, 32) + decrypted_body);
  • -
  • msg_key = substr (msg_key_large, 8, 16);
  • -
  • sha256_a = SHA256 (msg_key + substr (key, x, 36));
  • -
  • sha256_b = SHA256 (substr (key, 40+x, 36) + msg_key);
  • -
  • aes_key = substr (sha256_a, 0, 8) + substr (sha256_b, 8, 16) + substr (sha256_a, 24, 8);
  • -
  • aes_iv = substr (sha256_b, 0, 4) + substr (sha256_a, 8, 8) + substr (sha256_b, 24, 4);
  • -
-

x depends on whether the call is outgoing or incoming and on the connection type:

-
    -
  • x = 0 for outgoing + transport
  • -
  • x = 8 for incoming + transport
  • -
  • x = 128 for outgoing + signaling
  • -
  • x = 136 for incoming + signaling
  • -
-

This allows apps to decide which packet types will be sent to which connections and work in these connections independently (with each having its own seq counter).

-

The resulting aes_key and aes_iv are used to encrypt decrypted_body:

-
    -
  • encrypted_body = AES_CTR (decrypted_body, aes_key, aes_iv)
  • -
-

The packet that gets sent consists of msg_key and encrypted_body:

-
    -
  • packet_bytes = msg_key + encrypted_body
  • -
-

When received, the packet gets decrypted using key and msg_key, after which msg_key is checked against the relevant SHA256 substring. If the check fails, the packet must be discarded.

-

Protecting Against Replay Attacks

-

Each of the peers maintains its own 32-bit monotonically increasing counter for outgoing messages, seq, starting with 1. This seq counter is prepended to each sent message and increased by 1 for each new message. No two seq numbers of the first message in a packet can be the same. If only old messages need to be re-sent, an empty message with a new unique seq is added to the packet first. When the seq counter reaches 2^30, the call must be aborted. Each peer stores seq values of all the messages it has received (and processed) which are larger than max_received_seq - 64, where max_received_seq is the largest seq number received so far.

-

If a packet is received, the first message of which has a seq that is smaller or equal to max_received_seq - 64 or its seq had already been received, the message is discarded. Otherwise, the seq values of all incoming messages are memorized and max_received_seq is adjusted. This guarantees that no two packets will be processed twice.

-

Key Verification

-

To verify the key, and ensure that no MITM attack is taking place, both parties concatenate the secret key key with the value g_a of the Caller ( A ), compute SHA256 and use it to generate a sequence of emoticons. More precisely, the SHA256 hash is split into four 64-bit integers; each of them is divided by the total number of emoticons used (currently 333), and the remainder is used to select specific emoticons. The specifics of the protocol guarantee that comparing four emoticons out of a set of 333 is sufficient to prevent eavesdropping (MiTM attack on DH) with a probability of 0.9999999999.

-

This is because instead of the standard Diffie-Hellman key exchange which requires only two messages between the parties:

-
    -
  • A->B : (generates a and) sends g_a := g^a
  • -
  • B->A : (generates b and true key (g_a)^b, then) sends g_b := g^b
  • -
  • A : computes key (g_b)^a
  • -
-

we use a three-message modification thereof that works well when both parties are online (which also happens to be a requirement for voice calls):

-
    -
  • A->B : (generates a and) sends g_a_hash := hash(g^a)
  • -
  • B->A : (stores g_a_hash, generates b and) sends g_b := g^b
  • -
  • A->B : (computes key (g_b)^a, then) sends g_a := g^a
  • -
  • B : checks hash(g_a) == g_a_hash, then computes key (g_a)^b
  • -
-

The idea here is that A commits to a specific value of a (and of g_a) without disclosing it to B. B has to choose its value of b and g_b without knowing the true value of g_a, so that it cannot try different values of b to force the final key (g_a)^b to have any specific properties (such as fixed lower 32 bits of SHA256(key)). At this point, B commits to a specific value of g_b without knowing g_a. Then A has to send its value g_a; it cannot change it even though it knows g_b now, because the other party B would accept only a value of g_a that has a hash specified in the very first message of the exchange.

-

If some impostor is pretending to be either A or B and tries to perform a Man-in-the-Middle Attack on this Diffie--Hellman key exchange, the above still holds. Party A will generate a shared key with B -- or whoever pretends to be B -- without having a second chance to change its exponent a depending on the value g_b received from the other side; and the impostor will not have a chance to adapt his value of b depending on g_a, because it has to commit to a value of g_b before learning g_a. The same is valid for the key generation between the impostor and the party B.

-

The use of hash commitment in the DH exchange constrains the attacker to only one guess to generate the correct visualization in their attack, which means that using just over 33 bits of entropy represented by four emoji in the visualization is enough to make a successful attack highly improbable.

-
-

For a slightly more user-friendly explanation of the above see: How are calls authenticated?

-
- -
- -
-
- -
- - - - - - diff --git a/data/core.telegram.org/api/end-to-end_v1.html b/data/core.telegram.org/api/end-to-end_v1.html deleted file mode 100644 index c66007b01f..0000000000 --- a/data/core.telegram.org/api/end-to-end_v1.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - Secret chats, end-to-end encryption (v. 1.0, DEPRECATED) - - - - - - - - - - - - - -
- -
-
-
- -

Secret chats, end-to-end encryption (v. 1.0, DEPRECATED)

- -
-

This document describes end-to-end encrypted Secret Chats in MTProto 1.0, its status is DEPRECATED. -For information on end-to-end encryption used in up-to-date Telegram clients, kindly see this document.

-
-
Related articles
-

-
-

Secret Chats are one-on-one chats wherein messages are encrypted with a key held only by the chat’s participants. Please note that the schema for end-to-end encrypted Secret Chats is different from what is used for cloud chats:

-
- -
-

Key Generation

-

The Diffie-Hellman protocol is used for key generation. For more information, see Wikipedia.

-

Let us consider the following scenario: User A would like to initiate encrypted communication with User B.

-

Sending a Request

-

User A executes messages.getDhConfig to obtain the Diffie-Hellman parameters: a prime p, and a high order element g.

-

Executing this method before each new key generation procedure is of vital importance. It makes sense to cache the values of the parameters together with the version in order to avoid having to receive all of the values every time. If the version stored on the client is still up-to-date, the server will return the constructor messages.dhConfigNotModified.

-

Client is expected to check whether p is a safe 2048-bit prime (meaning that both p and (p-1)/2 are prime, and that 2^2047 < p < 2^2048), and that g generates a cyclic subgroup of prime order (p-1)/2, i.e. is a quadratic residue mod p. Since g is always equal to 2, 3, 4, 5, 6 or 7, this is easily done using quadratic reciprocity law, yielding a simple condition on p mod 4g -- namely, p mod 8 = 7 for g = 2; p mod 3 = 2 for g = 3; no extra condition for g = 4; p mod 5 = 1 or 4 for g = 5; p mod 24 = 19 or 23 for g = 6; and p mod 7 = 3, 5 or 6 for g = 7. After g and p have been checked by the client, it makes sense to cache the result, so as to avoid repeating lengthy computations in future. This cache might be shared with one used for Authorization Key generation.

-

If the client has an inadequate random number generator, it makes sense to pass the random_length parameter (random_length> 0) so the server generates its own random sequence random of the appropriate length. -Important: using the server’s random sequence in its raw form may be unsafe. It must be combined with a client sequence, for example, by generating a client random number of the same length (client_random) and using final_random := random XOR client_random.

-

Client A computes a 2048-bit number a (using sufficient entropy or the server’s random; see above) and executes messages.requestEncryption after passing in g_a := pow(g, a) mod dh_prime.

-

User B receives the update updateEncryption for all associated authorization keys (all authorized devices) with the chat constructor encryptedChatRequested. The user must be shown basic information about User A and must be prompted to accept or reject the request.

-

Both clients are to check that g, g_a and g_b are greater than one and smaller than p-1. We recommend checking that g_a and g_b are between 2^{2048-64} and p - 2^{2048-64} as well.

-

Accepting a Request

-

After User B confirms the creation of a secret chat with A in the client interface, Client B also receives up-to-date configuration parameters for the Diffie-Hellman method. Thereafter, it generates a random 2048-bit number, b, using rules similar to those for a.

-

Having received g_a from the update with encryptedChatRequested, it can immediately generate the final shared key: key = (pow(g_a, b) mod dh_prime). If key length < 256 bytes, add several leading zero bytes as padding — so that the key is exactly 256 bytes long. Its fingerprint, key_fingerprint, is equal to the 64 last bits of SHA1 (key).

-

Note: this fingerprint is used as a sanity check for the key exchange procedure to detect bugs while developing client software — it is not connected to the key visualization used on the clients as means of external authentication in secret chats. Key visualizations on the clients are generated using the first 128 bits of SHA1(initial key) followed by the first 160 bits of SHA256(key used when secret chat was updated to layer 46).

-

Client B executes messages.acceptEncryption after passing it g_b := pow(g, b) mod dh_prime and key_fingerprint.

-

For all of Client B’s authorized devices, except the current one, updateEncryption updates are sent with the constructor encryptedChatDiscarded. Thereafter, the only device that will be able to access the secret chat is Device B, which made the call to messages.acceptEncryption.

-

User A will be sent an updateEncryption update with the constructor encryptedChat, for the authorization key that initiated the chat.

-

With g_b from the update, Client A can also receive the shared key key = (pow(g_b, a) mod dh_prime). If key length < 256 bytes, add several leading zero bytes as padding — so that the key is exactly 256 bytes long. If the fingerprint for the received key is identical to the one that was passed to encryptedChat, incoming messages can be sent and processed. Otherwise, messages.discardEncryption must be executed and the user notified.

-

Perfect Forward Secrecy

-

In order to keep past communications safe, official Telegram clients will initiate re-keying once a key has been used to decrypt and encrypt more than 100 messages, or has been in use for more than one week, provided the key has been used to encrypt at least one message. Old keys are then securely discarded and cannot be reconstructed, even with access to the new keys currently in use.

-
-

The re-keying protocol is further described in this article: Perfect Forward Secrecy in Secret Chats.

-
-

Please note that your client must support Forward Secrecy in Secret Chats to be compatible with official Telegram clients.

-

Sending and Receiving Messages in a Secret Chat

-

Serialization and Encryption of Outgoing Messages

-

A TL object of type DecryptedMessage is created and contains the message in plain text. For backward compatibility, the object must be wrapped in the constructor decryptedMessageLayer with an indication of the supported layer (starting with 8). -The TL-Schema for end-to-end encrypted messages contents is represented here ».

-

The resulting construct is serialized as an array of bytes using generic TL rules. The resulting array is padded at the top with 4 bytes of the array length not counting these 4 bytes. -A message key, msg_key, is computed as the 128 low-order bits of the SHA1 of the data obtained in the previous step. -The byte array is padded with random data until its length is divisible by 16 bytes. -An AES key and an initialization vector are computed ( key is the shared key obtained during Key Generation; in MTProto 1.0, x = 0 ):

-
    -
  • msg_key = substr (SHA1 (plaintext), 4, 16);
  • -
  • sha1_a = SHA1 (msg_key + substr (key, x, 32));
  • -
  • sha1_b = SHA1 (substr (key, 32+x, 16) + msg_key + substr (key, 48+x, 16));
  • -
  • sha1_с = SHA1 (substr (key, 64+x, 32) + msg_key);
  • -
  • sha1_d = SHA1 (msg_key + substr (key, 96+x, 32));
  • -
  • aes_key = substr (sha1_a, 0, 8) + substr (sha1_b, 8, 12) + substr (sha1_c, 4, 12);
  • -
  • aes_iv = substr (sha1_a, 8, 12) + substr (sha1_b, 0, 8) + substr (sha1_c, 16, 4) + substr (sha1_d, 0, 8);
  • -
-

Data is encrypted with a 256-bit key, aes_key, and a 256-bit initialization vector, aes-iv, using AES-256 encryption with infinite garble extension (IGE). Encryption key fingerprint key_fingerprint and the message key msg_key are added at the top of the resulting byte array.

-

Encrypted data is embedded into a messages.sendEncrypted API call and passed to Telegram server for delivery to the other party of the Secret Chat.

-

Decrypting an Incoming Message

-

The steps above are performed in reverse order. -When an encrypted message is received, you must check that msg_key is in fact equal to the 128 low-order bits of the SHA1 hash of the decrypted message. -If the message layer is greater than the one supported by the client, the user must be notified that the client version is out of date and prompted to update.

-

Sequence numbers

-

It is necessary to interpret all messages in their original order to protect against possible manipulations. Secret chats support a special mechanism for handling seq_no counters independently from the server.

-
-

Proper handling of these counters is further described in this article: Sequence numbers in Secret Chats.

-
-

Please note that your client must support sequence numbers in Secret Chats to be compatible with official Telegram clients.

-

Sending Encrypted Files

-

All files sent to secret chats are encrypted with one-time keys that are in no way related to the chat’s shared key. Before an encrypted file is sent, it is assumed that the encrypted file’s address will be attached to the outside of an encrypted message using the file parameter of the messages.sendEncryptedFile method and that the key for direct decryption will be sent in the body of the message (the key parameter in the constructors decryptedMessageMediaPhoto, decryptedMessageMediaVideo and decryptedMessageMediaFile.

-

Prior to a file being sent to a secret chat, 2 random 256-bit numbers are computed which will serve as the AES key and initialization vector used to encrypt the file. AES-256 encryption with infinite garble extension (IGE) is used in like manner.

-

The key fingerprint is computed as follows:

-
    -
  • digest = md5(key + iv)
  • -
  • fingerprint = substr(digest, 0, 4) XOR substr(digest, 4, 4)
  • -
-

The encrypted contents of a file are stored on the server in much the same way as those of a file in cloud chats: piece by piece using calls to upload.saveFilePart. -A subsequent call to messages.sendEncryptedFile will assign an identifier to the stored file and send the address together with the message. The recipient will receive an update with encryptedMessage, and the file parameter will contain file information.

-

Incoming and outgoing encrypted files can be forwarded to other secret chats using the constructor inputEncryptedFile to avoid saving the same content on the server twice.

-

Working with an Update Box

-

Secret chats are associated with specific devices (or rather with authorization keys), not users. A conventional message box, which uses pts to describe the client’s status, is not suitable, because it is designed for long-term message storage and message access from different devices.

-

An additional temporary message queue is introduced as a solution to this problem. When an update regarding a message from a secret chat is sent, a new value of qts is sent, which helps reconstruct the difference if there has been a long break in the connection or in case of loss of an update.

-

As the number of events increases, the value of qts increases monotonically (not always by 1). The initial value may not (and will not) be equal to 0.

-

The fact that events from the temporary queue have been received and stored by the client is acknowledged explicitly by a call to the messages.receivedQueue method or implicitly by a call to updates.getDifference (the value of qts passed, not the final state). All messages acknowledged as delivered by the client, as well as any messages older than 7 days, may (and will) be deleted from the server.

-

Upon de-authorization, the event queue of the corresponding device will be forcibly cleared, and the value of qts will become irrelevant.

-

Updating to new layers

-

Your client should always store the maximal layer that is known to be supported by the client on the other side of a secret chat. When the secret chat is first created, this value should be initialized to 8, the first layer where Secret Chats became available. This remote layer value must always be updated immediately after receiving any packet containing information of an upper layer, i.e.:

-
    -
  • any secret chat message containing layer_no in its decryptedMessageLayer with layer>=17, or
  • -
  • a decryptedMessageActionNotifyLayer service message, wrapped as if it were the decryptedMessageService constructor of the obsolete layer 8 (constructor decryptedMessageService#aa48327d).
  • -
-

Notifying the remote client about your local layer

-

In order to notify the remote client of your local layer, your client must send a message of the decryptedMessageActionNotifyLayer type. This notification must be wrapped in a constructor of an appropriate layer. For instance, if the remote layer for the chat in question is deemed to be lower than 17, the notification must be wrapped as if it were the decryptedMessageService constructor of the obsolete layer 8 (constructor decryptedMessageService#aa48327d), despite the fact that the decryptedMessageActionNotifyLayer constructor is actually not present in Layer 8.

-

There are three cases when your client must notify the remote client about its local layer:

-
    -
  1. As soon as a new secret chat has been created, immediately after the secret key has been successfully exchanged.
  2. -
  3. Immediately after the remote layer value is updated to layer 17 or higher. An exception to this case is when the secret chat in question has been created less than 15 seconds ago. In this case the notification was already sent (see 1).
  4. -
  5. Immediately after the local client has been updated to support a new secret chat layer. In this case notifications must be sent to all currently existing secret chats. Note that this is only necessary when updating to new layers that contain changes in the secret chats implementation (e.g. you don’t need to do this when your client is updated from Layer 17 to Layer 18).
  6. -
-
-

Note that all pending obsolete layer messages must be sent prior to the layer update notification (more on this in Handling Sequence numbers).

-
- -
- -
-
- -
- - - - - - diff --git a/data/corefork.telegram.org/api/entities.html b/data/core.telegram.org/api/entities.html similarity index 97% rename from data/corefork.telegram.org/api/entities.html rename to data/core.telegram.org/api/entities.html index 891ab35c96..365fd7af18 100644 --- a/data/corefork.telegram.org/api/entities.html +++ b/data/core.telegram.org/api/entities.html @@ -100,9 +100,9 @@ code