mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 01:10:09 +00:00
Update API
This commit is contained in:
parent
bb10525004
commit
065553abd4
@ -58,7 +58,7 @@ private func cachedInternalInstantPage(context: AccountContext, url: String) ->
|
|||||||
if instantPage.isComplete {
|
if instantPage.isComplete {
|
||||||
let _ = updateCachedInstantPage(engine: context.engine, url: cachedUrl, webPage: webPage).start()
|
let _ = updateCachedInstantPage(engine: context.engine, url: cachedUrl, webPage: webPage).start()
|
||||||
} else {
|
} else {
|
||||||
let _ = (actualizedWebpage(postbox: context.account.postbox, network: context.account.network, webpage: webPage)
|
let _ = (actualizedWebpage(account: context.account, webpage: webPage)
|
||||||
|> mapToSignal { webPage -> Signal<Never, NoError> in
|
|> mapToSignal { webPage -> Signal<Never, NoError> in
|
||||||
if case let .Loaded(content) = webPage.content, let instantPage = content.instantPage, instantPage.isComplete {
|
if case let .Loaded(content) = webPage.content, let instantPage = content.instantPage, instantPage.isComplete {
|
||||||
return updateCachedInstantPage(engine: context.engine, url: cachedUrl, webPage: webPage)
|
return updateCachedInstantPage(engine: context.engine, url: cachedUrl, webPage: webPage)
|
||||||
|
|||||||
@ -106,7 +106,7 @@ public final class InstantPageController: ViewController {
|
|||||||
|
|
||||||
self.statusBar.statusBarStyle = .White
|
self.statusBar.statusBarStyle = .White
|
||||||
|
|
||||||
self.webpageDisposable = (actualizedWebpage(postbox: self.context.account.postbox, network: self.context.account.network, webpage: webPage) |> deliverOnMainQueue).start(next: { [weak self] result in
|
self.webpageDisposable = (actualizedWebpage(account: context.account, webpage: webPage) |> deliverOnMainQueue).start(next: { [weak self] result in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.webPage = result
|
strongSelf.webPage = result
|
||||||
if strongSelf.isNodeLoaded {
|
if strongSelf.isNodeLoaded {
|
||||||
|
|||||||
@ -1427,7 +1427,7 @@ private final class LimitSheetContent: CombinedComponent {
|
|||||||
if let link {
|
if let link {
|
||||||
let linkButton = linkButton.update(
|
let linkButton = linkButton.update(
|
||||||
component: SolidRoundedButtonComponent(
|
component: SolidRoundedButtonComponent(
|
||||||
title: link,
|
title: link.replacingOccurrences(of: "https://", with: ""),
|
||||||
theme: SolidRoundedButtonComponent.Theme(
|
theme: SolidRoundedButtonComponent.Theme(
|
||||||
backgroundColor: theme.list.itemBlocksSeparatorColor.withAlphaComponent(0.3),
|
backgroundColor: theme.list.itemBlocksSeparatorColor.withAlphaComponent(0.3),
|
||||||
backgroundColors: [],
|
backgroundColors: [],
|
||||||
@ -1627,7 +1627,7 @@ private final class LimitSheetComponent: CombinedComponent {
|
|||||||
isDisplaying: environment.value.isVisible,
|
isDisplaying: environment.value.isVisible,
|
||||||
isCentered: environment.metrics.widthClass == .regular,
|
isCentered: environment.metrics.widthClass == .regular,
|
||||||
hasInputHeight: !environment.inputHeight.isZero,
|
hasInputHeight: !environment.inputHeight.isZero,
|
||||||
regularMetricsSize: nil,
|
regularMetricsSize: CGSize(width: 430.0, height: 900.0),
|
||||||
dismiss: { animated in
|
dismiss: { animated in
|
||||||
if animated {
|
if animated {
|
||||||
animateOut.invoke(Action { _ in
|
animateOut.invoke(Action { _ in
|
||||||
|
|||||||
@ -665,15 +665,7 @@ private func channelStatsControllerEntries(state: ChannelStatsControllerState, p
|
|||||||
|
|
||||||
entries.append(.boostLinkTitle(presentationData.theme, presentationData.strings.Stats_Boosts_LinkHeader))
|
entries.append(.boostLinkTitle(presentationData.theme, presentationData.strings.Stats_Boosts_LinkHeader))
|
||||||
|
|
||||||
if let peer {
|
entries.append(.boostLink(presentationData.theme, boostData.url))
|
||||||
let link: String
|
|
||||||
if let addressName = peer.addressName, !addressName.isEmpty {
|
|
||||||
link = "t.me/\(addressName)?boost"
|
|
||||||
} else {
|
|
||||||
link = "t.me/c/\(peer.id.id._internalGetInt64Value())?boost"
|
|
||||||
}
|
|
||||||
entries.append(.boostLink(presentationData.theme, link))
|
|
||||||
}
|
|
||||||
|
|
||||||
entries.append(.boostLinkInfo(presentationData.theme, presentationData.strings.Stats_Boosts_LinkInfo))
|
entries.append(.boostLinkInfo(presentationData.theme, presentationData.strings.Stats_Boosts_LinkInfo))
|
||||||
}
|
}
|
||||||
@ -735,13 +727,11 @@ public func channelStatsController(context: AccountContext, updatedPresentationD
|
|||||||
}, contextAction: { messageId, node, gesture in
|
}, contextAction: { messageId, node, gesture in
|
||||||
contextActionImpl?(messageId, node, gesture)
|
contextActionImpl?(messageId, node, gesture)
|
||||||
}, copyBoostLink: { link in
|
}, copyBoostLink: { link in
|
||||||
UIPasteboard.general.string = "https://\(link)"
|
UIPasteboard.general.string = link
|
||||||
|
|
||||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||||
presentImpl?(UndoOverlayController(presentationData: presentationData, content: .linkCopied(text: presentationData.strings.ChannelBoost_BoostLinkCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }))
|
presentImpl?(UndoOverlayController(presentationData: presentationData, content: .linkCopied(text: presentationData.strings.ChannelBoost_BoostLinkCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }))
|
||||||
}, shareBoostLink: { link in
|
}, shareBoostLink: { link in
|
||||||
let link = "https://\(link)"
|
|
||||||
|
|
||||||
let shareController = ShareController(context: context, subject: .url(link), updatedPresentationData: updatedPresentationData)
|
let shareController = ShareController(context: context, subject: .url(link), updatedPresentationData: updatedPresentationData)
|
||||||
shareController.completed = { peerIds in
|
shareController.completed = { peerIds in
|
||||||
let _ = (context.engine.data.get(
|
let _ = (context.engine.data.get(
|
||||||
|
|||||||
@ -1142,6 +1142,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
|||||||
dict[-1821037486] = { return Api.messages.TranscribedAudio.parse_transcribedAudio($0) }
|
dict[-1821037486] = { return Api.messages.TranscribedAudio.parse_transcribedAudio($0) }
|
||||||
dict[870003448] = { return Api.messages.TranslatedText.parse_translateResult($0) }
|
dict[870003448] = { return Api.messages.TranslatedText.parse_translateResult($0) }
|
||||||
dict[1218005070] = { return Api.messages.VotesList.parse_votesList($0) }
|
dict[1218005070] = { return Api.messages.VotesList.parse_votesList($0) }
|
||||||
|
dict[-44166467] = { return Api.messages.WebPage.parse_webPage($0) }
|
||||||
dict[1042605427] = { return Api.payments.BankCardData.parse_bankCardData($0) }
|
dict[1042605427] = { return Api.payments.BankCardData.parse_bankCardData($0) }
|
||||||
dict[-1362048039] = { return Api.payments.ExportedInvoice.parse_exportedInvoice($0) }
|
dict[-1362048039] = { return Api.payments.ExportedInvoice.parse_exportedInvoice($0) }
|
||||||
dict[-1610250415] = { return Api.payments.PaymentForm.parse_paymentForm($0) }
|
dict[-1610250415] = { return Api.payments.PaymentForm.parse_paymentForm($0) }
|
||||||
@ -1177,7 +1178,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
|||||||
dict[1862033025] = { return Api.stories.AllStories.parse_allStories($0) }
|
dict[1862033025] = { return Api.stories.AllStories.parse_allStories($0) }
|
||||||
dict[291044926] = { return Api.stories.AllStories.parse_allStoriesNotModified($0) }
|
dict[291044926] = { return Api.stories.AllStories.parse_allStoriesNotModified($0) }
|
||||||
dict[-203604707] = { return Api.stories.BoostersList.parse_boostersList($0) }
|
dict[-203604707] = { return Api.stories.BoostersList.parse_boostersList($0) }
|
||||||
dict[1726619631] = { return Api.stories.BoostsStatus.parse_boostsStatus($0) }
|
dict[-440292772] = { return Api.stories.BoostsStatus.parse_boostsStatus($0) }
|
||||||
dict[-1021889145] = { return Api.stories.CanApplyBoostResult.parse_canApplyBoostOk($0) }
|
dict[-1021889145] = { return Api.stories.CanApplyBoostResult.parse_canApplyBoostOk($0) }
|
||||||
dict[1898726997] = { return Api.stories.CanApplyBoostResult.parse_canApplyBoostReplace($0) }
|
dict[1898726997] = { return Api.stories.CanApplyBoostResult.parse_canApplyBoostReplace($0) }
|
||||||
dict[-890861720] = { return Api.stories.PeerStories.parse_peerStories($0) }
|
dict[-890861720] = { return Api.stories.PeerStories.parse_peerStories($0) }
|
||||||
@ -2017,6 +2018,8 @@ public extension Api {
|
|||||||
_1.serialize(buffer, boxed)
|
_1.serialize(buffer, boxed)
|
||||||
case let _1 as Api.messages.VotesList:
|
case let _1 as Api.messages.VotesList:
|
||||||
_1.serialize(buffer, boxed)
|
_1.serialize(buffer, boxed)
|
||||||
|
case let _1 as Api.messages.WebPage:
|
||||||
|
_1.serialize(buffer, boxed)
|
||||||
case let _1 as Api.payments.BankCardData:
|
case let _1 as Api.payments.BankCardData:
|
||||||
_1.serialize(buffer, boxed)
|
_1.serialize(buffer, boxed)
|
||||||
case let _1 as Api.payments.ExportedInvoice:
|
case let _1 as Api.payments.ExportedInvoice:
|
||||||
|
|||||||
@ -432,6 +432,64 @@ public extension Api.messages {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public extension Api.messages {
|
||||||
|
enum WebPage: TypeConstructorDescription {
|
||||||
|
case webPage(webpage: Api.WebPage, chats: [Api.Chat], users: [Api.User])
|
||||||
|
|
||||||
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
|
switch self {
|
||||||
|
case .webPage(let webpage, let chats, let users):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(-44166467)
|
||||||
|
}
|
||||||
|
webpage.serialize(buffer, true)
|
||||||
|
buffer.appendInt32(481674261)
|
||||||
|
buffer.appendInt32(Int32(chats.count))
|
||||||
|
for item in chats {
|
||||||
|
item.serialize(buffer, true)
|
||||||
|
}
|
||||||
|
buffer.appendInt32(481674261)
|
||||||
|
buffer.appendInt32(Int32(users.count))
|
||||||
|
for item in users {
|
||||||
|
item.serialize(buffer, true)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
|
switch self {
|
||||||
|
case .webPage(let webpage, let chats, let users):
|
||||||
|
return ("webPage", [("webpage", webpage as Any), ("chats", chats as Any), ("users", users as Any)])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func parse_webPage(_ reader: BufferReader) -> WebPage? {
|
||||||
|
var _1: Api.WebPage?
|
||||||
|
if let signature = reader.readInt32() {
|
||||||
|
_1 = Api.parse(reader, signature: signature) as? Api.WebPage
|
||||||
|
}
|
||||||
|
var _2: [Api.Chat]?
|
||||||
|
if let _ = reader.readInt32() {
|
||||||
|
_2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Chat.self)
|
||||||
|
}
|
||||||
|
var _3: [Api.User]?
|
||||||
|
if let _ = reader.readInt32() {
|
||||||
|
_3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self)
|
||||||
|
}
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
let _c2 = _2 != nil
|
||||||
|
let _c3 = _3 != nil
|
||||||
|
if _c1 && _c2 && _c3 {
|
||||||
|
return Api.messages.WebPage.webPage(webpage: _1!, chats: _2!, users: _3!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
public extension Api.payments {
|
public extension Api.payments {
|
||||||
enum BankCardData: TypeConstructorDescription {
|
enum BankCardData: TypeConstructorDescription {
|
||||||
case bankCardData(title: String, openUrls: [Api.BankCardOpenUrl])
|
case bankCardData(title: String, openUrls: [Api.BankCardOpenUrl])
|
||||||
@ -1678,41 +1736,3 @@ public extension Api.stats {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public extension Api.stats {
|
|
||||||
enum MessageStats: TypeConstructorDescription {
|
|
||||||
case messageStats(viewsGraph: Api.StatsGraph)
|
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
|
||||||
switch self {
|
|
||||||
case .messageStats(let viewsGraph):
|
|
||||||
if boxed {
|
|
||||||
buffer.appendInt32(-1986399595)
|
|
||||||
}
|
|
||||||
viewsGraph.serialize(buffer, true)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func descriptionFields() -> (String, [(String, Any)]) {
|
|
||||||
switch self {
|
|
||||||
case .messageStats(let viewsGraph):
|
|
||||||
return ("messageStats", [("viewsGraph", viewsGraph as Any)])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func parse_messageStats(_ reader: BufferReader) -> MessageStats? {
|
|
||||||
var _1: Api.StatsGraph?
|
|
||||||
if let signature = reader.readInt32() {
|
|
||||||
_1 = Api.parse(reader, signature: signature) as? Api.StatsGraph
|
|
||||||
}
|
|
||||||
let _c1 = _1 != nil
|
|
||||||
if _c1 {
|
|
||||||
return Api.stats.MessageStats.messageStats(viewsGraph: _1!)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -1,3 +1,41 @@
|
|||||||
|
public extension Api.stats {
|
||||||
|
enum MessageStats: TypeConstructorDescription {
|
||||||
|
case messageStats(viewsGraph: Api.StatsGraph)
|
||||||
|
|
||||||
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
|
switch self {
|
||||||
|
case .messageStats(let viewsGraph):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(-1986399595)
|
||||||
|
}
|
||||||
|
viewsGraph.serialize(buffer, true)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
|
switch self {
|
||||||
|
case .messageStats(let viewsGraph):
|
||||||
|
return ("messageStats", [("viewsGraph", viewsGraph as Any)])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func parse_messageStats(_ reader: BufferReader) -> MessageStats? {
|
||||||
|
var _1: Api.StatsGraph?
|
||||||
|
if let signature = reader.readInt32() {
|
||||||
|
_1 = Api.parse(reader, signature: signature) as? Api.StatsGraph
|
||||||
|
}
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
if _c1 {
|
||||||
|
return Api.stats.MessageStats.messageStats(viewsGraph: _1!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
public extension Api.stickers {
|
public extension Api.stickers {
|
||||||
enum SuggestedShortName: TypeConstructorDescription {
|
enum SuggestedShortName: TypeConstructorDescription {
|
||||||
case suggestedShortName(shortName: String)
|
case suggestedShortName(shortName: String)
|
||||||
@ -346,13 +384,13 @@ public extension Api.stories {
|
|||||||
}
|
}
|
||||||
public extension Api.stories {
|
public extension Api.stories {
|
||||||
enum BoostsStatus: TypeConstructorDescription {
|
enum BoostsStatus: TypeConstructorDescription {
|
||||||
case boostsStatus(flags: Int32, level: Int32, currentLevelBoosts: Int32, boosts: Int32, nextLevelBoosts: Int32?, premiumAudience: Api.StatsPercentValue?)
|
case boostsStatus(flags: Int32, level: Int32, currentLevelBoosts: Int32, boosts: Int32, nextLevelBoosts: Int32?, premiumAudience: Api.StatsPercentValue?, boostUrl: String)
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
switch self {
|
switch self {
|
||||||
case .boostsStatus(let flags, let level, let currentLevelBoosts, let boosts, let nextLevelBoosts, let premiumAudience):
|
case .boostsStatus(let flags, let level, let currentLevelBoosts, let boosts, let nextLevelBoosts, let premiumAudience, let boostUrl):
|
||||||
if boxed {
|
if boxed {
|
||||||
buffer.appendInt32(1726619631)
|
buffer.appendInt32(-440292772)
|
||||||
}
|
}
|
||||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||||
serializeInt32(level, buffer: buffer, boxed: false)
|
serializeInt32(level, buffer: buffer, boxed: false)
|
||||||
@ -360,14 +398,15 @@ public extension Api.stories {
|
|||||||
serializeInt32(boosts, buffer: buffer, boxed: false)
|
serializeInt32(boosts, buffer: buffer, boxed: false)
|
||||||
if Int(flags) & Int(1 << 0) != 0 {serializeInt32(nextLevelBoosts!, buffer: buffer, boxed: false)}
|
if Int(flags) & Int(1 << 0) != 0 {serializeInt32(nextLevelBoosts!, buffer: buffer, boxed: false)}
|
||||||
if Int(flags) & Int(1 << 1) != 0 {premiumAudience!.serialize(buffer, true)}
|
if Int(flags) & Int(1 << 1) != 0 {premiumAudience!.serialize(buffer, true)}
|
||||||
|
serializeString(boostUrl, buffer: buffer, boxed: false)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func descriptionFields() -> (String, [(String, Any)]) {
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
switch self {
|
switch self {
|
||||||
case .boostsStatus(let flags, let level, let currentLevelBoosts, let boosts, let nextLevelBoosts, let premiumAudience):
|
case .boostsStatus(let flags, let level, let currentLevelBoosts, let boosts, let nextLevelBoosts, let premiumAudience, let boostUrl):
|
||||||
return ("boostsStatus", [("flags", flags as Any), ("level", level as Any), ("currentLevelBoosts", currentLevelBoosts as Any), ("boosts", boosts as Any), ("nextLevelBoosts", nextLevelBoosts as Any), ("premiumAudience", premiumAudience as Any)])
|
return ("boostsStatus", [("flags", flags as Any), ("level", level as Any), ("currentLevelBoosts", currentLevelBoosts as Any), ("boosts", boosts as Any), ("nextLevelBoosts", nextLevelBoosts as Any), ("premiumAudience", premiumAudience as Any), ("boostUrl", boostUrl as Any)])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,14 +425,17 @@ public extension Api.stories {
|
|||||||
if Int(_1!) & Int(1 << 1) != 0 {if let signature = reader.readInt32() {
|
if Int(_1!) & Int(1 << 1) != 0 {if let signature = reader.readInt32() {
|
||||||
_6 = Api.parse(reader, signature: signature) as? Api.StatsPercentValue
|
_6 = Api.parse(reader, signature: signature) as? Api.StatsPercentValue
|
||||||
} }
|
} }
|
||||||
|
var _7: String?
|
||||||
|
_7 = parseString(reader)
|
||||||
let _c1 = _1 != nil
|
let _c1 = _1 != nil
|
||||||
let _c2 = _2 != nil
|
let _c2 = _2 != nil
|
||||||
let _c3 = _3 != nil
|
let _c3 = _3 != nil
|
||||||
let _c4 = _4 != nil
|
let _c4 = _4 != nil
|
||||||
let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil
|
let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil
|
||||||
let _c6 = (Int(_1!) & Int(1 << 1) == 0) || _6 != nil
|
let _c6 = (Int(_1!) & Int(1 << 1) == 0) || _6 != nil
|
||||||
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 {
|
let _c7 = _7 != nil
|
||||||
return Api.stories.BoostsStatus.boostsStatus(flags: _1!, level: _2!, currentLevelBoosts: _3!, boosts: _4!, nextLevelBoosts: _5, premiumAudience: _6)
|
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 {
|
||||||
|
return Api.stories.BoostsStatus.boostsStatus(flags: _1!, level: _2!, currentLevelBoosts: _3!, boosts: _4!, nextLevelBoosts: _5, premiumAudience: _6, boostUrl: _7!)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return nil
|
return nil
|
||||||
@ -1190,91 +1232,3 @@ public extension Api.upload {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public extension Api.upload {
|
|
||||||
enum File: TypeConstructorDescription {
|
|
||||||
case file(type: Api.storage.FileType, mtime: Int32, bytes: Buffer)
|
|
||||||
case fileCdnRedirect(dcId: Int32, fileToken: Buffer, encryptionKey: Buffer, encryptionIv: Buffer, fileHashes: [Api.FileHash])
|
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
|
||||||
switch self {
|
|
||||||
case .file(let type, let mtime, let bytes):
|
|
||||||
if boxed {
|
|
||||||
buffer.appendInt32(157948117)
|
|
||||||
}
|
|
||||||
type.serialize(buffer, true)
|
|
||||||
serializeInt32(mtime, buffer: buffer, boxed: false)
|
|
||||||
serializeBytes(bytes, buffer: buffer, boxed: false)
|
|
||||||
break
|
|
||||||
case .fileCdnRedirect(let dcId, let fileToken, let encryptionKey, let encryptionIv, let fileHashes):
|
|
||||||
if boxed {
|
|
||||||
buffer.appendInt32(-242427324)
|
|
||||||
}
|
|
||||||
serializeInt32(dcId, buffer: buffer, boxed: false)
|
|
||||||
serializeBytes(fileToken, buffer: buffer, boxed: false)
|
|
||||||
serializeBytes(encryptionKey, buffer: buffer, boxed: false)
|
|
||||||
serializeBytes(encryptionIv, buffer: buffer, boxed: false)
|
|
||||||
buffer.appendInt32(481674261)
|
|
||||||
buffer.appendInt32(Int32(fileHashes.count))
|
|
||||||
for item in fileHashes {
|
|
||||||
item.serialize(buffer, true)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func descriptionFields() -> (String, [(String, Any)]) {
|
|
||||||
switch self {
|
|
||||||
case .file(let type, let mtime, let bytes):
|
|
||||||
return ("file", [("type", type as Any), ("mtime", mtime as Any), ("bytes", bytes as Any)])
|
|
||||||
case .fileCdnRedirect(let dcId, let fileToken, let encryptionKey, let encryptionIv, let fileHashes):
|
|
||||||
return ("fileCdnRedirect", [("dcId", dcId as Any), ("fileToken", fileToken as Any), ("encryptionKey", encryptionKey as Any), ("encryptionIv", encryptionIv as Any), ("fileHashes", fileHashes as Any)])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func parse_file(_ reader: BufferReader) -> File? {
|
|
||||||
var _1: Api.storage.FileType?
|
|
||||||
if let signature = reader.readInt32() {
|
|
||||||
_1 = Api.parse(reader, signature: signature) as? Api.storage.FileType
|
|
||||||
}
|
|
||||||
var _2: Int32?
|
|
||||||
_2 = reader.readInt32()
|
|
||||||
var _3: Buffer?
|
|
||||||
_3 = parseBytes(reader)
|
|
||||||
let _c1 = _1 != nil
|
|
||||||
let _c2 = _2 != nil
|
|
||||||
let _c3 = _3 != nil
|
|
||||||
if _c1 && _c2 && _c3 {
|
|
||||||
return Api.upload.File.file(type: _1!, mtime: _2!, bytes: _3!)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static func parse_fileCdnRedirect(_ reader: BufferReader) -> File? {
|
|
||||||
var _1: Int32?
|
|
||||||
_1 = reader.readInt32()
|
|
||||||
var _2: Buffer?
|
|
||||||
_2 = parseBytes(reader)
|
|
||||||
var _3: Buffer?
|
|
||||||
_3 = parseBytes(reader)
|
|
||||||
var _4: Buffer?
|
|
||||||
_4 = parseBytes(reader)
|
|
||||||
var _5: [Api.FileHash]?
|
|
||||||
if let _ = reader.readInt32() {
|
|
||||||
_5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.FileHash.self)
|
|
||||||
}
|
|
||||||
let _c1 = _1 != nil
|
|
||||||
let _c2 = _2 != nil
|
|
||||||
let _c3 = _3 != nil
|
|
||||||
let _c4 = _4 != nil
|
|
||||||
let _c5 = _5 != nil
|
|
||||||
if _c1 && _c2 && _c3 && _c4 && _c5 {
|
|
||||||
return Api.upload.File.fileCdnRedirect(dcId: _1!, fileToken: _2!, encryptionKey: _3!, encryptionIv: _4!, fileHashes: _5!)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -1,3 +1,91 @@
|
|||||||
|
public extension Api.upload {
|
||||||
|
enum File: TypeConstructorDescription {
|
||||||
|
case file(type: Api.storage.FileType, mtime: Int32, bytes: Buffer)
|
||||||
|
case fileCdnRedirect(dcId: Int32, fileToken: Buffer, encryptionKey: Buffer, encryptionIv: Buffer, fileHashes: [Api.FileHash])
|
||||||
|
|
||||||
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
|
switch self {
|
||||||
|
case .file(let type, let mtime, let bytes):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(157948117)
|
||||||
|
}
|
||||||
|
type.serialize(buffer, true)
|
||||||
|
serializeInt32(mtime, buffer: buffer, boxed: false)
|
||||||
|
serializeBytes(bytes, buffer: buffer, boxed: false)
|
||||||
|
break
|
||||||
|
case .fileCdnRedirect(let dcId, let fileToken, let encryptionKey, let encryptionIv, let fileHashes):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(-242427324)
|
||||||
|
}
|
||||||
|
serializeInt32(dcId, buffer: buffer, boxed: false)
|
||||||
|
serializeBytes(fileToken, buffer: buffer, boxed: false)
|
||||||
|
serializeBytes(encryptionKey, buffer: buffer, boxed: false)
|
||||||
|
serializeBytes(encryptionIv, buffer: buffer, boxed: false)
|
||||||
|
buffer.appendInt32(481674261)
|
||||||
|
buffer.appendInt32(Int32(fileHashes.count))
|
||||||
|
for item in fileHashes {
|
||||||
|
item.serialize(buffer, true)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
|
switch self {
|
||||||
|
case .file(let type, let mtime, let bytes):
|
||||||
|
return ("file", [("type", type as Any), ("mtime", mtime as Any), ("bytes", bytes as Any)])
|
||||||
|
case .fileCdnRedirect(let dcId, let fileToken, let encryptionKey, let encryptionIv, let fileHashes):
|
||||||
|
return ("fileCdnRedirect", [("dcId", dcId as Any), ("fileToken", fileToken as Any), ("encryptionKey", encryptionKey as Any), ("encryptionIv", encryptionIv as Any), ("fileHashes", fileHashes as Any)])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func parse_file(_ reader: BufferReader) -> File? {
|
||||||
|
var _1: Api.storage.FileType?
|
||||||
|
if let signature = reader.readInt32() {
|
||||||
|
_1 = Api.parse(reader, signature: signature) as? Api.storage.FileType
|
||||||
|
}
|
||||||
|
var _2: Int32?
|
||||||
|
_2 = reader.readInt32()
|
||||||
|
var _3: Buffer?
|
||||||
|
_3 = parseBytes(reader)
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
let _c2 = _2 != nil
|
||||||
|
let _c3 = _3 != nil
|
||||||
|
if _c1 && _c2 && _c3 {
|
||||||
|
return Api.upload.File.file(type: _1!, mtime: _2!, bytes: _3!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static func parse_fileCdnRedirect(_ reader: BufferReader) -> File? {
|
||||||
|
var _1: Int32?
|
||||||
|
_1 = reader.readInt32()
|
||||||
|
var _2: Buffer?
|
||||||
|
_2 = parseBytes(reader)
|
||||||
|
var _3: Buffer?
|
||||||
|
_3 = parseBytes(reader)
|
||||||
|
var _4: Buffer?
|
||||||
|
_4 = parseBytes(reader)
|
||||||
|
var _5: [Api.FileHash]?
|
||||||
|
if let _ = reader.readInt32() {
|
||||||
|
_5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.FileHash.self)
|
||||||
|
}
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
let _c2 = _2 != nil
|
||||||
|
let _c3 = _3 != nil
|
||||||
|
let _c4 = _4 != nil
|
||||||
|
let _c5 = _5 != nil
|
||||||
|
if _c1 && _c2 && _c3 && _c4 && _c5 {
|
||||||
|
return Api.upload.File.fileCdnRedirect(dcId: _1!, fileToken: _2!, encryptionKey: _3!, encryptionIv: _4!, fileHashes: _5!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
public extension Api.upload {
|
public extension Api.upload {
|
||||||
enum WebFile: TypeConstructorDescription {
|
enum WebFile: TypeConstructorDescription {
|
||||||
case webFile(size: Int32, mimeType: String, fileType: Api.storage.FileType, mtime: Int32, bytes: Buffer)
|
case webFile(size: Int32, mimeType: String, fileType: Api.storage.FileType, mtime: Int32, bytes: Buffer)
|
||||||
|
|||||||
@ -5868,16 +5868,16 @@ public extension Api.functions.messages {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
public extension Api.functions.messages {
|
public extension Api.functions.messages {
|
||||||
static func getWebPage(url: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.WebPage>) {
|
static func getWebPage(url: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.messages.WebPage>) {
|
||||||
let buffer = Buffer()
|
let buffer = Buffer()
|
||||||
buffer.appendInt32(852135825)
|
buffer.appendInt32(-1919511901)
|
||||||
serializeString(url, buffer: buffer, boxed: false)
|
serializeString(url, buffer: buffer, boxed: false)
|
||||||
serializeInt32(hash, buffer: buffer, boxed: false)
|
serializeInt32(hash, buffer: buffer, boxed: false)
|
||||||
return (FunctionDescription(name: "messages.getWebPage", parameters: [("url", String(describing: url)), ("hash", String(describing: hash))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.WebPage? in
|
return (FunctionDescription(name: "messages.getWebPage", parameters: [("url", String(describing: url)), ("hash", String(describing: hash))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.WebPage? in
|
||||||
let reader = BufferReader(buffer)
|
let reader = BufferReader(buffer)
|
||||||
var result: Api.WebPage?
|
var result: Api.messages.WebPage?
|
||||||
if let signature = reader.readInt32() {
|
if let signature = reader.readInt32() {
|
||||||
result = Api.parse(reader, signature: signature) as? Api.WebPage
|
result = Api.parse(reader, signature: signature) as? Api.messages.WebPage
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
})
|
})
|
||||||
|
|||||||
@ -492,9 +492,9 @@ final class MediaReferenceRevalidationContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func webPage(postbox: Postbox, network: Network, background: Bool, webPage: WebpageReference) -> Signal<TelegramMediaWebpage, RevalidateMediaReferenceError> {
|
func webPage(accountPeerId: EnginePeer.Id, postbox: Postbox, network: Network, background: Bool, webPage: WebpageReference) -> Signal<TelegramMediaWebpage, RevalidateMediaReferenceError> {
|
||||||
return self.genericItem(key: .webPage(webPage: webPage), background: background, request: { next, error in
|
return self.genericItem(key: .webPage(webPage: webPage), background: background, request: { next, error in
|
||||||
return (updatedRemoteWebpage(postbox: postbox, network: network, webPage: webPage)
|
return (updatedRemoteWebpage(postbox: postbox, network: network, accountPeerId: accountPeerId, webPage: webPage)
|
||||||
|> mapError { _ -> RevalidateMediaReferenceError in
|
|> mapError { _ -> RevalidateMediaReferenceError in
|
||||||
}).start(next: { value in
|
}).start(next: { value in
|
||||||
if let value = value {
|
if let value = value {
|
||||||
@ -792,7 +792,7 @@ func revalidateMediaResourceReference(accountPeerId: PeerId, postbox: Postbox, n
|
|||||||
return .fail(.generic)
|
return .fail(.generic)
|
||||||
}
|
}
|
||||||
case let .webPage(webPage, previousMedia):
|
case let .webPage(webPage, previousMedia):
|
||||||
return revalidationContext.webPage(postbox: postbox, network: network, background: info.preferBackgroundReferenceRevalidation, webPage: webPage)
|
return revalidationContext.webPage(accountPeerId: accountPeerId, postbox: postbox, network: network, background: info.preferBackgroundReferenceRevalidation, webPage: webPage)
|
||||||
|> mapToSignal { result -> Signal<RevalidatedMediaResource, RevalidateMediaReferenceError> in
|
|> mapToSignal { result -> Signal<RevalidatedMediaResource, RevalidateMediaReferenceError> in
|
||||||
if let updatedResource = findUpdatedMediaResource(media: result, previousMedia: previousMedia, resource: resource) {
|
if let updatedResource = findUpdatedMediaResource(media: result, previousMedia: previousMedia, resource: resource) {
|
||||||
return .single(RevalidatedMediaResource(updatedResource: updatedResource, updatedReference: nil))
|
return .single(RevalidatedMediaResource(updatedResource: updatedResource, updatedReference: nil))
|
||||||
|
|||||||
@ -9,13 +9,15 @@ public final class ChannelBoostStatus: Equatable {
|
|||||||
public let currentLevelBoosts: Int
|
public let currentLevelBoosts: Int
|
||||||
public let nextLevelBoosts: Int?
|
public let nextLevelBoosts: Int?
|
||||||
public let premiumAudience: StatsPercentValue?
|
public let premiumAudience: StatsPercentValue?
|
||||||
|
public let url: String
|
||||||
|
|
||||||
public init(level: Int, boosts: Int, currentLevelBoosts: Int, nextLevelBoosts: Int?, premiumAudience: StatsPercentValue?) {
|
public init(level: Int, boosts: Int, currentLevelBoosts: Int, nextLevelBoosts: Int?, premiumAudience: StatsPercentValue?, url: String) {
|
||||||
self.level = level
|
self.level = level
|
||||||
self.boosts = boosts
|
self.boosts = boosts
|
||||||
self.currentLevelBoosts = currentLevelBoosts
|
self.currentLevelBoosts = currentLevelBoosts
|
||||||
self.nextLevelBoosts = nextLevelBoosts
|
self.nextLevelBoosts = nextLevelBoosts
|
||||||
self.premiumAudience = premiumAudience
|
self.premiumAudience = premiumAudience
|
||||||
|
self.url = url
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func ==(lhs: ChannelBoostStatus, rhs: ChannelBoostStatus) -> Bool {
|
public static func ==(lhs: ChannelBoostStatus, rhs: ChannelBoostStatus) -> Bool {
|
||||||
@ -34,6 +36,9 @@ public final class ChannelBoostStatus: Equatable {
|
|||||||
if lhs.premiumAudience != rhs.premiumAudience {
|
if lhs.premiumAudience != rhs.premiumAudience {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if lhs.url != rhs.url {
|
||||||
|
return false
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,8 +62,8 @@ func _internal_getChannelBoostStatus(account: Account, peerId: PeerId) -> Signal
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch result {
|
switch result {
|
||||||
case let .boostsStatus(_, level, currentLevelBoosts, boosts, nextLevelBoosts, premiumAudience):
|
case let .boostsStatus(_, level, currentLevelBoosts, boosts, nextLevelBoosts, premiumAudience, url):
|
||||||
return ChannelBoostStatus(level: Int(level), boosts: Int(boosts), currentLevelBoosts: Int(currentLevelBoosts), nextLevelBoosts: nextLevelBoosts.flatMap(Int.init), premiumAudience: premiumAudience.flatMap({ StatsPercentValue(apiPercentValue: $0) }))
|
return ChannelBoostStatus(level: Int(level), boosts: Int(boosts), currentLevelBoosts: Int(currentLevelBoosts), nextLevelBoosts: nextLevelBoosts.flatMap(Int.init), premiumAudience: premiumAudience.flatMap({ StatsPercentValue(apiPercentValue: $0) }), url: url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -210,7 +210,7 @@ public class BoxedMessage: NSObject {
|
|||||||
|
|
||||||
public class Serialization: NSObject, MTSerialization {
|
public class Serialization: NSObject, MTSerialization {
|
||||||
public func currentLayer() -> UInt {
|
public func currentLayer() -> UInt {
|
||||||
return 164
|
return 165
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parseMessage(_ data: Data!) -> Any! {
|
public func parseMessage(_ data: Data!) -> Any! {
|
||||||
|
|||||||
@ -74,45 +74,54 @@ public func webpagePreviewWithProgress(account: Account, url: String, webpageId:
|
|||||||
|> switchToLatest
|
|> switchToLatest
|
||||||
}
|
}
|
||||||
|
|
||||||
public func actualizedWebpage(postbox: Postbox, network: Network, webpage: TelegramMediaWebpage) -> Signal<TelegramMediaWebpage, NoError> {
|
public func actualizedWebpage(account: Account, webpage: TelegramMediaWebpage) -> Signal<TelegramMediaWebpage, NoError> {
|
||||||
if case let .Loaded(content) = webpage.content {
|
if case let .Loaded(content) = webpage.content {
|
||||||
return network.request(Api.functions.messages.getWebPage(url: content.url, hash: content.hash))
|
return account.network.request(Api.functions.messages.getWebPage(url: content.url, hash: content.hash))
|
||||||
|> map(Optional.init)
|
|> map(Optional.init)
|
||||||
|> `catch` { _ -> Signal<Api.WebPage?, NoError> in
|
|> `catch` { _ -> Signal<Api.messages.WebPage?, NoError> in
|
||||||
return .single(nil)
|
return .single(nil)
|
||||||
}
|
}
|
||||||
|> mapToSignal { result -> Signal<TelegramMediaWebpage, NoError> in
|
|> mapToSignal { result -> Signal<TelegramMediaWebpage, NoError> in
|
||||||
if let result = result, let updatedWebpage = telegramMediaWebpageFromApiWebpage(result, url: nil), case .Loaded = updatedWebpage.content, updatedWebpage.webpageId == webpage.webpageId {
|
if let result = result {
|
||||||
return postbox.transaction { transaction -> TelegramMediaWebpage in
|
return account.postbox.transaction { transaction -> Signal<TelegramMediaWebpage, NoError> in
|
||||||
updateMessageMedia(transaction: transaction, id: webpage.webpageId, media: updatedWebpage)
|
switch result {
|
||||||
return updatedWebpage
|
case let .webPage(apiWebpage, chats, users):
|
||||||
|
let parsedPeers = AccumulatedPeers(transaction: transaction, chats: chats, users: users)
|
||||||
|
updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: parsedPeers)
|
||||||
|
|
||||||
|
if let updatedWebpage = telegramMediaWebpageFromApiWebpage(apiWebpage, url: nil), case .Loaded = updatedWebpage.content, updatedWebpage.webpageId == webpage.webpageId {
|
||||||
|
return .single(updatedWebpage)
|
||||||
|
} else if case let .webPageNotModified(_, viewsValue) = apiWebpage, let views = viewsValue, case let .Loaded(content) = webpage.content {
|
||||||
|
let updatedContent: TelegramMediaWebpageContent = .Loaded(TelegramMediaWebpageLoadedContent(url: content.url, displayUrl: content.displayUrl, hash: content.hash, type: content.type, websiteName: content.websiteName, title: content.title, text: content.text, embedUrl: content.embedUrl, embedType: content.embedType, embedSize: content.embedSize, duration: content.duration, author: content.author, image: content.image, file: content.file, story: content.story, attributes: content.attributes, instantPage: content.instantPage.flatMap({ InstantPage(blocks: $0.blocks, media: $0.media, isComplete: $0.isComplete, rtl: $0.rtl, url: $0.url, views: views) })))
|
||||||
|
let updatedWebpage = TelegramMediaWebpage(webpageId: webpage.webpageId, content: updatedContent)
|
||||||
|
updateMessageMedia(transaction: transaction, id: webpage.webpageId, media: updatedWebpage)
|
||||||
|
return .single(updatedWebpage)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if let result = result, case let .webPageNotModified(_, viewsValue) = result, let views = viewsValue, case let .Loaded(content) = webpage.content {
|
|
||||||
let updatedContent: TelegramMediaWebpageContent = .Loaded(TelegramMediaWebpageLoadedContent(url: content.url, displayUrl: content.displayUrl, hash: content.hash, type: content.type, websiteName: content.websiteName, title: content.title, text: content.text, embedUrl: content.embedUrl, embedType: content.embedType, embedSize: content.embedSize, duration: content.duration, author: content.author, image: content.image, file: content.file, story: content.story, attributes: content.attributes, instantPage: content.instantPage.flatMap({ InstantPage(blocks: $0.blocks, media: $0.media, isComplete: $0.isComplete, rtl: $0.rtl, url: $0.url, views: views) })))
|
|
||||||
let updatedWebpage = TelegramMediaWebpage(webpageId: webpage.webpageId, content: updatedContent)
|
|
||||||
return postbox.transaction { transaction -> TelegramMediaWebpage in
|
|
||||||
updateMessageMedia(transaction: transaction, id: webpage.webpageId, media: updatedWebpage)
|
|
||||||
return updatedWebpage
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return .complete()
|
return .complete()
|
||||||
}
|
}
|
||||||
|
|> switchToLatest
|
||||||
|
} else {
|
||||||
|
return .complete()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return .complete()
|
return .complete()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updatedRemoteWebpage(postbox: Postbox, network: Network, webPage: WebpageReference) -> Signal<TelegramMediaWebpage?, NoError> {
|
func updatedRemoteWebpage(postbox: Postbox, network: Network, accountPeerId: EnginePeer.Id, webPage: WebpageReference) -> Signal<TelegramMediaWebpage?, NoError> {
|
||||||
if case let .webPage(id, url) = webPage.content {
|
if case let .webPage(id, url) = webPage.content {
|
||||||
return network.request(Api.functions.messages.getWebPage(url: url, hash: 0))
|
return network.request(Api.functions.messages.getWebPage(url: url, hash: 0))
|
||||||
|> map(Optional.init)
|
|> map(Optional.init)
|
||||||
|> `catch` { _ -> Signal<Api.WebPage?, NoError> in
|
|> `catch` { _ -> Signal<Api.messages.WebPage?, NoError> in
|
||||||
return .single(nil)
|
return .single(nil)
|
||||||
}
|
}
|
||||||
|> mapToSignal { result -> Signal<TelegramMediaWebpage?, NoError> in
|
|> mapToSignal { result -> Signal<TelegramMediaWebpage?, NoError> in
|
||||||
if let result = result, let updatedWebpage = telegramMediaWebpageFromApiWebpage(result, url: nil), case .Loaded = updatedWebpage.content, updatedWebpage.webpageId.id == id {
|
if let result = result, case let .webPage(webpage, chats, users) = result, let updatedWebpage = telegramMediaWebpageFromApiWebpage(webpage, url: nil), case .Loaded = updatedWebpage.content, updatedWebpage.webpageId.id == id {
|
||||||
return postbox.transaction { transaction -> TelegramMediaWebpage? in
|
return postbox.transaction { transaction -> TelegramMediaWebpage? in
|
||||||
|
let parsedPeers = AccumulatedPeers(transaction: transaction, chats: chats, users: users)
|
||||||
|
updatePeers(transaction: transaction, accountPeerId: accountPeerId, peers: parsedPeers)
|
||||||
if transaction.getMedia(updatedWebpage.webpageId) != nil {
|
if transaction.getMedia(updatedWebpage.webpageId) != nil {
|
||||||
updateMessageMedia(transaction: transaction, id: updatedWebpage.webpageId, media: updatedWebpage)
|
updateMessageMedia(transaction: transaction, id: updatedWebpage.webpageId, media: updatedWebpage)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1106,20 +1106,14 @@ final class ShareWithPeersScreenComponent: Component {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let link: String
|
let link = status.url
|
||||||
if let addressName = peer.addressName, !addressName.isEmpty {
|
|
||||||
link = "t.me/\(peer.addressName ?? "")?boost"
|
|
||||||
} else {
|
|
||||||
link = "t.me/c/\(peer.id.id._internalGetInt64Value())?boost"
|
|
||||||
}
|
|
||||||
|
|
||||||
if let navigationController = self.environment?.controller()?.navigationController as? NavigationController {
|
if let navigationController = self.environment?.controller()?.navigationController as? NavigationController {
|
||||||
if let previousController = navigationController.viewControllers.last as? ShareWithPeersScreen {
|
if let previousController = navigationController.viewControllers.last as? ShareWithPeersScreen {
|
||||||
previousController.dismiss()
|
previousController.dismiss()
|
||||||
}
|
}
|
||||||
let presentationData = component.context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = component.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
let controller = component.context.sharedContext.makePremiumLimitController(context: component.context, subject: .storiesChannelBoost(peer: peer, isCurrent: true, level: Int32(status.level), currentLevelBoosts: Int32(status.currentLevelBoosts), nextLevelBoosts: status.nextLevelBoosts.flatMap(Int32.init), link: link, boosted: false), count: Int32(status.boosts), forceDark: true, cancel: {}, action: { [weak navigationController] in
|
let controller = component.context.sharedContext.makePremiumLimitController(context: component.context, subject: .storiesChannelBoost(peer: peer, isCurrent: true, level: Int32(status.level), currentLevelBoosts: Int32(status.currentLevelBoosts), nextLevelBoosts: status.nextLevelBoosts.flatMap(Int32.init), link: link, boosted: false), count: Int32(status.boosts), forceDark: true, cancel: {}, action: { [weak navigationController] in
|
||||||
UIPasteboard.general.string = "https://\(link)"
|
UIPasteboard.general.string = link
|
||||||
|
|
||||||
if let previousController = navigationController?.viewControllers.reversed().first(where: { $0 is ShareWithPeersScreen}) as? ShareWithPeersScreen {
|
if let previousController = navigationController?.viewControllers.reversed().first(where: { $0 is ShareWithPeersScreen}) as? ShareWithPeersScreen {
|
||||||
previousController.dismiss(completion: { [weak navigationController] in
|
previousController.dismiss(completion: { [weak navigationController] in
|
||||||
|
|||||||
@ -8327,19 +8327,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let link: String
|
let link = status.url
|
||||||
if let addressName = peer.addressName, !addressName.isEmpty {
|
|
||||||
link = "t.me/\(peer.addressName ?? "")?boost"
|
|
||||||
} else {
|
|
||||||
link = "t.me/c/\(peer.id.id._internalGetInt64Value())?boost"
|
|
||||||
}
|
|
||||||
|
|
||||||
if let navigationController = self.controller?.navigationController as? NavigationController {
|
if let navigationController = self.controller?.navigationController as? NavigationController {
|
||||||
if let previousController = navigationController.viewControllers.last as? ShareWithPeersScreen {
|
if let previousController = navigationController.viewControllers.last as? ShareWithPeersScreen {
|
||||||
previousController.dismiss()
|
previousController.dismiss()
|
||||||
}
|
}
|
||||||
let controller = PremiumLimitScreen(context: self.context, subject: .storiesChannelBoost(peer: peer, isCurrent: true, level: Int32(status.level), currentLevelBoosts: Int32(status.currentLevelBoosts), nextLevelBoosts: status.nextLevelBoosts.flatMap(Int32.init), link: link, boosted: false), count: Int32(status.boosts), action: { [weak self] in
|
let controller = PremiumLimitScreen(context: self.context, subject: .storiesChannelBoost(peer: peer, isCurrent: true, level: Int32(status.level), currentLevelBoosts: Int32(status.currentLevelBoosts), nextLevelBoosts: status.nextLevelBoosts.flatMap(Int32.init), link: link, boosted: false), count: Int32(status.boosts), action: { [weak self] in
|
||||||
UIPasteboard.general.string = "https://\(link)"
|
UIPasteboard.general.string = link
|
||||||
|
|
||||||
if let self {
|
if let self {
|
||||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .linkCopied(text: self.presentationData.strings.ChannelBoost_BoostLinkCopied), elevatedLayout: false, position: .bottom, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .linkCopied(text: self.presentationData.strings.ChannelBoost_BoostLinkCopied), elevatedLayout: false, position: .bottom, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user