diff --git a/TelegramCore/Api0.swift b/TelegramCore/Api0.swift index d419375d9f..71f908aad3 100644 --- a/TelegramCore/Api0.swift +++ b/TelegramCore/Api0.swift @@ -84,6 +84,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[55281185] = { return Api.RichText.parse_textMarked($0) } dict[483104362] = { return Api.RichText.parse_textPhone($0) } dict[136105807] = { return Api.RichText.parse_textImage($0) } + dict[894777186] = { return Api.RichText.parse_textAnchor($0) } dict[-1901811583] = { return Api.UserFull.parse_userFull($0) } dict[-292807034] = { return Api.InputChannel.parse_inputChannelEmpty($0) } dict[-1343524562] = { return Api.InputChannel.parse_inputChannel($0) } @@ -408,7 +409,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1182234929] = { return Api.InputUser.parse_inputUserEmpty($0) } dict[-138301121] = { return Api.InputUser.parse_inputUserSelf($0) } dict[-668391402] = { return Api.InputUser.parse_inputUser($0) } - dict[-241590104] = { return Api.Page.parse_page($0) } + dict[-1366746132] = { return Api.Page.parse_page($0) } dict[871426631] = { return Api.SecureCredentialsEncrypted.parse_secureCredentialsEncrypted($0) } dict[157948117] = { return Api.upload.File.parse_file($0) } dict[-242427324] = { return Api.upload.File.parse_fileCdnRedirect($0) } diff --git a/TelegramCore/Api1.swift b/TelegramCore/Api1.swift index c4a83c5ba9..da7492c702 100644 --- a/TelegramCore/Api1.swift +++ b/TelegramCore/Api1.swift @@ -1843,6 +1843,7 @@ extension Api { case textMarked(text: Api.RichText) case textPhone(text: Api.RichText, phone: String) case textImage(documentId: Int64, w: Int32, h: Int32) + case textAnchor(text: Api.RichText, name: String) func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -1946,6 +1947,13 @@ extension Api { serializeInt32(w, buffer: buffer, boxed: false) serializeInt32(h, buffer: buffer, boxed: false) break + case .textAnchor(let text, let name): + if boxed { + buffer.appendInt32(894777186) + } + text.serialize(buffer, true) + serializeString(name, buffer: buffer, boxed: false) + break } } @@ -1981,6 +1989,8 @@ extension Api { return ("textPhone", [("text", text), ("phone", phone)]) case .textImage(let documentId, let w, let h): return ("textImage", [("documentId", documentId), ("w", w), ("h", h)]) + case .textAnchor(let text, let name): + return ("textAnchor", [("text", text), ("name", name)]) } } @@ -2183,6 +2193,22 @@ extension Api { return nil } } + static func parse_textAnchor(_ reader: BufferReader) -> RichText? { + var _1: Api.RichText? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.RichText + } + var _2: String? + _2 = parseString(reader) + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.RichText.textAnchor(text: _1!, name: _2!) + } + else { + return nil + } + } } enum UserFull: TypeConstructorDescription { @@ -10006,15 +10032,16 @@ extension Api { } enum Page: TypeConstructorDescription { - case page(flags: Int32, blocks: [Api.PageBlock], photos: [Api.Photo], documents: [Api.Document]) + case page(flags: Int32, url: String, blocks: [Api.PageBlock], photos: [Api.Photo], documents: [Api.Document]) func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .page(let flags, let blocks, let photos, let documents): + case .page(let flags, let url, let blocks, let photos, let documents): if boxed { - buffer.appendInt32(-241590104) + buffer.appendInt32(-1366746132) } serializeInt32(flags, buffer: buffer, boxed: false) + serializeString(url, buffer: buffer, boxed: false) buffer.appendInt32(481674261) buffer.appendInt32(Int32(blocks.count)) for item in blocks { @@ -10036,32 +10063,35 @@ extension Api { func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .page(let flags, let blocks, let photos, let documents): - return ("page", [("flags", flags), ("blocks", blocks), ("photos", photos), ("documents", documents)]) + case .page(let flags, let url, let blocks, let photos, let documents): + return ("page", [("flags", flags), ("url", url), ("blocks", blocks), ("photos", photos), ("documents", documents)]) } } static func parse_page(_ reader: BufferReader) -> Page? { var _1: Int32? _1 = reader.readInt32() - var _2: [Api.PageBlock]? + var _2: String? + _2 = parseString(reader) + var _3: [Api.PageBlock]? if let _ = reader.readInt32() { - _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PageBlock.self) + _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PageBlock.self) } - var _3: [Api.Photo]? + var _4: [Api.Photo]? if let _ = reader.readInt32() { - _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Photo.self) + _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Photo.self) } - var _4: [Api.Document]? + var _5: [Api.Document]? if let _ = reader.readInt32() { - _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Document.self) + _5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Document.self) } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.Page.page(flags: _1!, blocks: _2!, photos: _3!, documents: _4!) + let _c5 = _5 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 { + return Api.Page.page(flags: _1!, url: _2!, blocks: _3!, photos: _4!, documents: _5!) } else { return nil diff --git a/TelegramCore/Api3.swift b/TelegramCore/Api3.swift index 8f13cded86..17741043b6 100644 --- a/TelegramCore/Api3.swift +++ b/TelegramCore/Api3.swift @@ -4967,6 +4967,20 @@ extension Api { }) } + static func cancelPasswordEmail() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-1043606090) + + return (FunctionDescription(name: "account.cancelPasswordEmail", parameters: []), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + let reader = BufferReader(buffer) + var result: Api.Bool? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Bool + } + return result + }) + } + static func getContactSignUpNotification() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1626880216) diff --git a/TelegramCore/ConfirmTwoStepRecoveryEmail.swift b/TelegramCore/ConfirmTwoStepRecoveryEmail.swift index 3231aeb640..5ff976dbe1 100644 --- a/TelegramCore/ConfirmTwoStepRecoveryEmail.swift +++ b/TelegramCore/ConfirmTwoStepRecoveryEmail.swift @@ -47,3 +47,15 @@ public func resendTwoStepRecoveryEmail(network: Network) -> Signal ignoreValues } + +public enum CancelTwoStepRecoveryEmailError { + case generic +} + +public func cancelTwoStepRecoveryEmail(network: Network) -> Signal { + return network.request(Api.functions.account.cancelPasswordEmail(), automaticFloodWait: false) + |> mapError { _ -> CancelTwoStepRecoveryEmailError in + return .generic + } + |> ignoreValues +} diff --git a/TelegramCore/InstantPage.swift b/TelegramCore/InstantPage.swift index 01e8d2a7e8..a266ba1c57 100644 --- a/TelegramCore/InstantPage.swift +++ b/TelegramCore/InstantPage.swift @@ -848,12 +848,14 @@ public final class InstantPage: PostboxCoding, Equatable { public let media: [MediaId: Media] public let isComplete: Bool public let rtl: Bool + public let url: String - init(blocks: [InstantPageBlock], media: [MediaId: Media], isComplete: Bool, rtl: Bool) { + init(blocks: [InstantPageBlock], media: [MediaId: Media], isComplete: Bool, rtl: Bool, url: String) { self.blocks = blocks self.media = media self.isComplete = isComplete self.rtl = rtl + self.url = url } public init(decoder: PostboxDecoder) { @@ -861,6 +863,7 @@ public final class InstantPage: PostboxCoding, Equatable { self.media = MediaDictionary(decoder: decoder).dict self.isComplete = decoder.decodeInt32ForKey("c", orElse: 0) != 0 self.rtl = decoder.decodeInt32ForKey("r", orElse: 0) != 0 + self.url = decoder.decodeStringForKey("url", orElse: "") } public func encode(_ encoder: PostboxEncoder) { @@ -868,6 +871,7 @@ public final class InstantPage: PostboxCoding, Equatable { MediaDictionary(dict: self.media).encode(encoder) encoder.encodeInt32(self.isComplete ? 1 : 0, forKey: "c") encoder.encodeInt32(self.rtl ? 1 : 0, forKey: "r") + encoder.encodeString(self.url, forKey: "url") } public static func ==(lhs: InstantPage, rhs: InstantPage) -> Bool { @@ -893,6 +897,9 @@ public final class InstantPage: PostboxCoding, Equatable { if lhs.rtl != rhs.rtl { return false } + if lhs.url != rhs.url { + return false + } return true } } @@ -900,8 +907,8 @@ public final class InstantPage: PostboxCoding, Equatable { extension InstantPageCaption { convenience init(apiCaption: Api.PageCaption) { switch apiCaption { - case let .pageCaption(text, credit): - self.init(text: RichText(apiText: text), credit: RichText(apiText: credit)) + case let .pageCaption(text, credit): + self.init(text: RichText(apiText: text), credit: RichText(apiText: credit)) } } } @@ -1063,13 +1070,15 @@ extension InstantPage { let files: [Api.Document] let isComplete: Bool let rtl: Bool + let url: String switch apiPage { - case let .page(flags, apiBlocks, apiPhotos, apiVideos): - blocks = apiBlocks - photos = apiPhotos - files = apiVideos - isComplete = (flags & (1 << 0)) == 0 - rtl = (flags & (1 << 1)) != 0 + case let .page(page): + url = page.url + blocks = page.blocks + photos = page.photos + files = page.documents + isComplete = (page.flags & (1 << 0)) == 0 + rtl = (page.flags & (1 << 1)) != 0 } var media: [MediaId: Media] = [:] for photo in photos { @@ -1082,6 +1091,6 @@ extension InstantPage { media[id] = file } } - self.init(blocks: blocks.map({ InstantPageBlock(apiBlock: $0) }), media: media, isComplete: isComplete, rtl: rtl) + self.init(blocks: blocks.map({ InstantPageBlock(apiBlock: $0) }), media: media, isComplete: isComplete, rtl: rtl, url: url) } } diff --git a/TelegramCore/RichText.swift b/TelegramCore/RichText.swift index f737ff6c7c..2a9f1e0d13 100644 --- a/TelegramCore/RichText.swift +++ b/TelegramCore/RichText.swift @@ -315,6 +315,8 @@ extension RichText { self = .phone(text: RichText(apiText: text), phone: phone) case let .textImage(documentId, w, h): self = .image(id: MediaId(namespace: Namespaces.Media.CloudFile, id: documentId), dimensions: CGSize(width: CGFloat(w), height: CGFloat(h))) + case let .textAnchor(text, name): + self = RichText(apiText: text) } } }