From 21b1cbd7dda9b31ddc69fc6dd7ac16bee256aa7b Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 16 Nov 2019 17:16:34 +0400 Subject: [PATCH 1/3] Update Wallet --- Telegram-iOS/en.lproj/Localizable.strings | 2 +- Wallet/README.md | 2 +- Wallet/Sources/AppDelegate.swift | 4 +- Wallet/Strings/en.lproj/Localizable.strings | 2 +- .../Sources/PresentationStrings.swift | 640 +++++++++--------- .../Resources/PresentationStrings.mapping | Bin 139353 -> 139353 bytes .../WalletUI/Resources/WalletStrings.mapping | Bin 8384 -> 8384 bytes .../WalletUI/Sources/WalletStrings.swift | 4 +- 8 files changed, 327 insertions(+), 327 deletions(-) diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 78f281f97d..e9b2333b8b 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4814,7 +4814,7 @@ Any member of this group will be able to see messages in the channel."; "Wallet.Receive.CopyInvoiceUrl" = "Copy Invoice URL"; "Wallet.Receive.ShareAddress" = "Share Wallet Address"; "Wallet.Receive.ShareInvoiceUrl" = "Share Invoice URL"; -"Wallet.Receive.ShareUrlInfo" = "Share this link with other Gram wallet owners to receive Grams from them."; +"Wallet.Receive.ShareUrlInfo" = "Share this link with other Gram wallet owners to receive Grams from them. Note: this link won't work for real Grams."; "Wallet.Receive.AmountHeader" = "AMOUNT"; "Wallet.Receive.AmountText" = "Grams to receive"; "Wallet.Receive.AmountInfo" = "You can specify the amount and purpose of the payment to save the sender some time."; diff --git a/Wallet/README.md b/Wallet/README.md index 792e3695d6..fc0c50909a 100644 --- a/Wallet/README.md +++ b/Wallet/README.md @@ -26,7 +26,7 @@ brew install cmake ant ``` mkdir -p $HOME/buck_source -cd tools/buck +cd tools/buck-build sh ./prepare_buck_source.sh $HOME/buck_source ``` diff --git a/Wallet/Sources/AppDelegate.swift b/Wallet/Sources/AppDelegate.swift index 5d00edc19a..ebc8cc17ed 100644 --- a/Wallet/Sources/AppDelegate.swift +++ b/Wallet/Sources/AppDelegate.swift @@ -651,7 +651,7 @@ final class AppDelegate: NSObject, UIApplicationDelegate { print("Starting with \(documentsPath)") #endif - let storage = WalletStorageInterfaceImpl(path: documentsPath + "/data", configurationPath: documentsPath + "/configuration") + let storage = WalletStorageInterfaceImpl(path: documentsPath + "/data", configurationPath: documentsPath + "/configuration_v2") let initialConfigValue = storage.mergedLocalWalletConfiguration() |> take(1) @@ -828,6 +828,6 @@ struct MergedLocalWalletConfiguration: Codable, Equatable { private extension MergedLocalWalletConfiguration { static var `default`: MergedLocalWalletConfiguration { - return MergedLocalWalletConfiguration(configuration: LocalWalletConfiguration(source: .url("https://test.ton.org/config.json"), blockchainName: "testnet"), resolved: nil) + return MergedLocalWalletConfiguration(configuration: LocalWalletConfiguration(source: .url("https://test.ton.org/config.json"), blockchainName: "testnet2"), resolved: nil) } } diff --git a/Wallet/Strings/en.lproj/Localizable.strings b/Wallet/Strings/en.lproj/Localizable.strings index ac579c0e2b..83e12f54a4 100644 --- a/Wallet/Strings/en.lproj/Localizable.strings +++ b/Wallet/Strings/en.lproj/Localizable.strings @@ -39,7 +39,7 @@ "Wallet.Receive.CopyInvoiceUrl" = "Copy Invoice URL"; "Wallet.Receive.ShareAddress" = "Share Wallet Address"; "Wallet.Receive.ShareInvoiceUrl" = "Share Invoice URL"; -"Wallet.Receive.ShareUrlInfo" = "Share this link with other Gram wallet owners to receive Grams from them."; +"Wallet.Receive.ShareUrlInfo" = "Share this link with other Gram wallet owners to receive Grams from them. Note: this link won't work for real Grams."; "Wallet.Receive.AmountHeader" = "AMOUNT"; "Wallet.Receive.AmountText" = "Grams to receive"; "Wallet.Receive.AmountInfo" = "You can specify the amount and purpose of the payment to save the sender some time."; diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 4fd4d06b1d..7a387508f0 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -4561,437 +4561,433 @@ public final class PresentationStrings: Equatable { public var Channel_Setup_TypePublicHelp: String { return self._s[4020]! } public var Passport_Identity_EditInternalPassport: String { return self._s[4021]! } public var PhotoEditor_Skip: String { return self._s[4022]! } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, _0, _1) } - public func Contacts_ImportersCount(_ value: Int32) -> String { + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedContacts(_ value: Int32) -> String { + public func MessageTimer_Weeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { + public func Conversation_StatusMembers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + public func Map_ETAHours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Months(_ value: Int32) -> String { + public func MuteExpires_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Link(_ value: Int32) -> String { + public func Conversation_StatusSubscribers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _1, _2) } - public func InviteText_ContactsCountText(_ value: Int32) -> String { + public func MessageTimer_Years(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Call_Seconds(_ value: Int32) -> String { + public func ForwardedLocations(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortSeconds(_ value: Int32) -> String { + public func Conversation_StatusOnline(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortMinutes(_ value: Int32) -> String { + public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + public func ChatList_DeletedChats(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, _1, _2) + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + public func MuteFor_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { + public func Call_ShortSeconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedAudios(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + public func InviteText_ContactsCountText(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) } - public func QuickSend_Photos(_ value: Int32) -> String { + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Hours(_ value: Int32) -> String { + public func ForwardedVideos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, _1, _2) } public func StickerPack_AddStickerCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) } public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public func MessageTimer_Months(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + public func ForwardedContacts(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusMembers(_ value: Int32) -> String { + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + public func Call_ShortMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedPolls(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeletedChats(_ value: Int32) -> String { + public func ForwardedStickers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) } - public func Passport_Scans(_ value: Int32) -> String { + public func ForwardedVideoMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedLocations(_ value: Int32) -> String { + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) } public func Theme_UsersCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, _0, _1) + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) } public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusOnline(_ value: Int32) -> String { + public func UserCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) @@ -5001,136 +4997,140 @@ public final class PresentationStrings: Equatable { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + public func ForwardedPhotos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_SelectedChats(_ value: Int32) -> String { + public func Passport_Scans(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_ShareItem(_ value: Int32) -> String { + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortHours(_ value: Int32) -> String { + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { + public func MessageTimer_Seconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideos(_ value: Int32) -> String { + public func SharedMedia_Photo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _1, _2) + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Days(_ value: Int32) -> String { + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { + public func MuteExpires_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + public func MessageTimer_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Minutes(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_StickerCount(_ value: Int32) -> String { + public func Media_SharePhoto(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + public func Notification_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) } - public func UserCount(_ value: Int32) -> String { + public func MessagePoll_VotedCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) } - public func Map_ETAMinutes(_ value: Int32) -> String { + public func AttachmentMenu_SendItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, _1, _2) + public func Media_ShareItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedGifs(_ value: Int32) -> String { + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedStickers(_ value: Int32) -> String { + public func MessageTimer_ShortHours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Minutes(_ value: Int32) -> String { + public func MuteFor_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_Exceptions(_ value: Int32) -> String { + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index b01c7bc5d0d446cec7fc518e2e9d5d5a2f63e702..8e23654c3183f4add11340976bfaf46dcdcf2444 100644 GIT binary patch delta 1582 zcmZWp%WoTH5cfA^^JcW6tU32pli@WI{bniYls}sxPdM6Icpu`T4F0@~NX>M_LT<^l!7$|Ts zfH!&|g!e>fZJV=8mTh+9&p}ACL->UZGV8&I3VrpW8iSY|Bxl|9cH1yvl}tB;LI{#l zm=wIIY}GRfkn#%=q%)6uhrOEV(p2o|)65WXWq8GfJhD zPQCSXGw;|1SH-0W9KpvTsCbLwFb)6aKMCI&H^a~>B*{?1`w0+7$BmnAAAKI8x0~jY zRWKd5pG5y_M_zNWU|1L+VC2i&Ogz_U)?m{xYr3wnZZ245vy#d>wpVnI zkcy|h8)}TiM&5IeVk`~=YzTkR;OO+RChXtpvX)JKa)(K=r=vNiRC15+_o{nV{yI(k z1b(hiJ5#77L5-dySP#90qFFXmi!K4ioT}};6u_syvM_F*VI8;~g)ZEYp$$d?SbxSu z%qh@@e+8jac$ti)8v9OanY6CGf_D?3v^U#+3Lk`MMyF8=QyH(~6`6QA8mR4jEq3x8 zmmJFe3=WAj&$C#JK_7b!nF`U?T+#8Ib7;k3h`o;K5QM&pL5uJP#ZvKh5JVh~LI-;j z|A@j#cAg_-xDcq#KMd6_e1CwYv7|wSUBr3}28A&)6Y(lz@>zYH{&NaW+aFq<;aQHI zYA#fUq&^rT{ZZCFyCo#_$tF%O8WppUH4B!J^2sqpiXe?V4Ei+h zLz2CP-|))cuGOV*uWpviyvHqk2Dmf$n?iia;v?c5o5fFp1f9cj0un68iPRciJU?j#_5 zewh$^i1$3TcSykx1E+(}hRgJ^n@E#(@8Y}$(a3wG+OsH)Nbh5x3PbW0(sFL*4A&PrIMVZ_Vi znfI+RRe!>MIX1~OJRyS8k@?u8ewqabKaD_K*dUF}=`T!sX88vG5C@4>@N$TJyF7%V d`A5tnoPU{{myM@TC0Vle>?gH7T`2gg_YZV1m8Spz delta 1774 zcmZWp+iw(Q6yNW_6neq7dzszYD{X0uAX^YnE{fE4yRCNV*6GD7FzkM1$L`K7^GyZf z1)BJ#QOv}gn2_izCcK&WVARz&pX8PJAp8Lm-Zjzl%}$$E9!@g*J7>@B_dDPH*6#bQ z-8VmG-@&o4x1-pPjgzbg?J)E(hO1e~GQhhj7(Trt6bki|P1(*>!>RJ>gl)M-#T7dV z)X0jCz1EzuR_wf9v#*wHhnINc5_g1xy$Kj)9e6Pcd)Y2*sgPv5@h=VHtP>yPs74ol z6@#I}-IOLmrq>LIS4+HV8u=o(xMNm&2$nWs)a!YjS8S^)_TYF763M3smYua-HQRAZ zrnTmB(ThLEsA3;}k$_=Eh9o@pt=dtp*{&V-ZtYC(Do@WX%;^z)lmtzQQbZQlKVxd& zT+=meYr)QkML`3p_-_uh;bqQOMV!2{iiLOW}M z;56P0LlXNmP(TZL_ijh=<_Vhmk1X^-GK9YrS=77NQt(U!x>*XpQ6Y!xF-YO}Q5Zd% zr4)T+^J`{hRp(YU@AocpgoVjUTnOVbUoaco$@~56#Sg+TdU$}Ga^Mo}p>VBfI$Y$Z z?KMXX5-1n8N#m4R=VAyy&p`a-K61#kGuC^iYsd}c0}h7+&$fbo!V&Vs@FHXJd3}_= zFmM{~d>ja+rd%k{WHKaLuK?^6C+S{@}Sal zm%34AT;4c}Z^lT>$MDk}WR&CN)9`T?VrV5`7kduZqY!1!g#qK|H(jZ?B$?|O~N<+G(iq|QF4#u%ugEE#bn5P{B`V9*{;`@ zY`UPrMvT$S7Z%2S!lwv(Lh(y8lZ83G81kAQZ75uWer1|s{hRCZ`Iw=fgZ|vza&Fyh zH0%5o{3#3r>{Yyxh9Nd9&k}pn(7{T0I|&JPP9BAJyj@|AGDxPksz@rhOxQMA%Mrvp z9*RQx$ZLVKYzWb$=OM3G3`^*QO5JTPX4bCwnimVGYA~QJl2g`NsPP8(btnAAF5!_d z5wnbEk}v|Vhww@tM7-Zy9UXI4-LyD9OjFxg{P|ZF$KE(}vA3|6ff40xN;W7}m+9P~ z{2iQ0Lnd*aJiTOF1T4jN!5`hb@xB83MfvDt6@#Kwsm7f}bLA4|R8Uz3AA})#yh<)f z%&Z|?opZX~_A@ws+2#cM&%xIBLK410>mFp6k*PFM4U=)$ub8sLm+LGxAhr5#kag=z z5+q&?dAF{o6d6^=Kcg@-+@N6j?CCDOSKKKZmDPOk?XS)vU;AFhf*dv>on-Q?{g5X8 ykW7}^k_*DF;D-@NjydGmL$=8oEkOtZ String { + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) From 7dc57e0bfad48f0639d798467e0dd54c265bfab8 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 16 Nov 2019 17:19:25 +0400 Subject: [PATCH 2/3] Link WKExtensionManLegacy --- BUCK | 1 + 1 file changed, 1 insertion(+) diff --git a/BUCK b/BUCK index d1d1e3cd0f..aa8a301c7e 100644 --- a/BUCK +++ b/BUCK @@ -466,6 +466,7 @@ apple_binary( linker_flags = [ "-e", "_WKExtensionMain", + "-lWKExtensionMainLegacy", ], configs = watch_extension_binary_configs(), frameworks = [ From b80074c2cf13bfb17bddee8b94e3010e7d468534 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 16 Nov 2019 18:33:32 +0400 Subject: [PATCH 3/3] Delay cached data update until peer becomes available --- .../Sources/AccountViewTracker.swift | 34 +- .../Sources/UpdateCachedPeerData.swift | 813 +++++++++--------- 2 files changed, 452 insertions(+), 395 deletions(-) diff --git a/submodules/TelegramCore/Sources/AccountViewTracker.swift b/submodules/TelegramCore/Sources/AccountViewTracker.swift index 02275089c9..cc330132a9 100644 --- a/submodules/TelegramCore/Sources/AccountViewTracker.swift +++ b/submodules/TelegramCore/Sources/AccountViewTracker.swift @@ -772,9 +772,22 @@ public final class AccountViewTracker { self.cachedDataContexts[peerId] = context } context.timestamp = CFAbsoluteTimeGetCurrent() - if let account = self.account { - context.disposable.set(combineLatest(fetchAndUpdateSupplementalCachedPeerData(peerId: peerId, network: account.network, postbox: account.postbox), fetchAndUpdateCachedPeerData(accountPeerId: account.peerId, peerId: peerId, network: account.network, postbox: account.postbox)).start()) + guard let account = self.account else { + return } + let queue = self.queue + context.disposable.set(combineLatest(fetchAndUpdateSupplementalCachedPeerData(peerId: peerId, network: account.network, postbox: account.postbox), fetchAndUpdateCachedPeerData(accountPeerId: account.peerId, peerId: peerId, network: account.network, postbox: account.postbox)).start(next: { [weak self] supplementalStatus, cachedStatus in + queue.async { + guard let strongSelf = self else { + return + } + if !supplementalStatus || !cachedStatus { + if let existingContext = strongSelf.cachedDataContexts[peerId] { + existingContext.timestamp = nil + } + } + } + })) } } @@ -801,9 +814,22 @@ public final class AccountViewTracker { context.viewIds.insert(viewId) if dataUpdated { - if let account = self.account { - context.disposable.set(combineLatest(fetchAndUpdateSupplementalCachedPeerData(peerId: peerId, network: account.network, postbox: account.postbox), fetchAndUpdateCachedPeerData(accountPeerId: account.peerId, peerId: peerId, network: account.network, postbox: account.postbox)).start()) + guard let account = self.account else { + return } + let queue = self.queue + context.disposable.set(combineLatest(fetchAndUpdateSupplementalCachedPeerData(peerId: peerId, network: account.network, postbox: account.postbox), fetchAndUpdateCachedPeerData(accountPeerId: account.peerId, peerId: peerId, network: account.network, postbox: account.postbox)).start(next: { [weak self] supplementalStatus, cachedStatus in + queue.async { + guard let strongSelf = self else { + return + } + if !supplementalStatus || !cachedStatus { + if let existingContext = strongSelf.cachedDataContexts[peerId] { + existingContext.timestamp = nil + } + } + } + })) } } } diff --git a/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift b/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift index d8318d1860..55620dbdba 100644 --- a/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift @@ -2,149 +2,176 @@ import Foundation import Postbox import TelegramApi import SwiftSignalKit - import SyncCore -func fetchAndUpdateSupplementalCachedPeerData(peerId rawPeerId: PeerId, network: Network, postbox: Postbox) -> Signal { - return postbox.transaction { transaction -> Signal in - guard let rawPeer = transaction.getPeer(rawPeerId) else { +func fetchAndUpdateSupplementalCachedPeerData(peerId rawPeerId: PeerId, network: Network, postbox: Postbox) -> Signal { + return postbox.combinedView(keys: [.basicPeer(rawPeerId)]) + |> mapToSignal { views -> Signal in + guard let view = views.views[.basicPeer(rawPeerId)] as? BasicPeerView else { return .complete() } - - let peer: Peer - if let secretChat = rawPeer as? TelegramSecretChat { - guard let user = transaction.getPeer(secretChat.regularPeerId) else { - return .complete() - } - peer = user - } else { - peer = rawPeer + guard let peer = view.peer else { + return .complete() } + return .single(peer) + } + |> take(1) + |> mapToSignal { _ -> Signal in + return postbox.transaction { transaction -> Signal in + guard let rawPeer = transaction.getPeer(rawPeerId) else { + return .single(false) + } - let cachedData = transaction.getPeerCachedData(peerId: peer.id) - - if let cachedData = cachedData as? CachedUserData { - if cachedData.peerStatusSettings != nil { - return .complete() + let peer: Peer + if let secretChat = rawPeer as? TelegramSecretChat { + guard let user = transaction.getPeer(secretChat.regularPeerId) else { + return .single(false) + } + peer = user + } else { + peer = rawPeer } - } else if let cachedData = cachedData as? CachedGroupData { - if cachedData.peerStatusSettings != nil { - return .complete() + + let cachedData = transaction.getPeerCachedData(peerId: peer.id) + + if let cachedData = cachedData as? CachedUserData { + if cachedData.peerStatusSettings != nil { + return .single(true) + } + } else if let cachedData = cachedData as? CachedGroupData { + if cachedData.peerStatusSettings != nil { + return .single(true) + } + } else if let cachedData = cachedData as? CachedChannelData { + if cachedData.peerStatusSettings != nil { + return .single(true) + } + } else if let cachedData = cachedData as? CachedSecretChatData { + if cachedData.peerStatusSettings != nil { + return .single(true) + } } - } else if let cachedData = cachedData as? CachedChannelData { - if cachedData.peerStatusSettings != nil { - return .complete() - } - } else if let cachedData = cachedData as? CachedSecretChatData { - if cachedData.peerStatusSettings != nil { - return .complete() - } - } - - if peer.id.namespace == Namespaces.Peer.SecretChat { - return postbox.transaction { transaction -> Void in - var peerStatusSettings: PeerStatusSettings - if let peer = transaction.getPeer(peer.id), let associatedPeerId = peer.associatedPeerId, !transaction.isPeerContact(peerId: associatedPeerId) { - if let peer = peer as? TelegramSecretChat, case .creator = peer.role { + + if peer.id.namespace == Namespaces.Peer.SecretChat { + return postbox.transaction { transaction -> Bool in + var peerStatusSettings: PeerStatusSettings + if let peer = transaction.getPeer(peer.id), let associatedPeerId = peer.associatedPeerId, !transaction.isPeerContact(peerId: associatedPeerId) { + if let peer = peer as? TelegramSecretChat, case .creator = peer.role { + peerStatusSettings = PeerStatusSettings() + peerStatusSettings = [] + } else { + peerStatusSettings = PeerStatusSettings() + peerStatusSettings.insert(.canReport) + } + } else { peerStatusSettings = PeerStatusSettings() peerStatusSettings = [] - } else { - peerStatusSettings = PeerStatusSettings() - peerStatusSettings.insert(.canReport) } - } else { - peerStatusSettings = PeerStatusSettings() - peerStatusSettings = [] - } - - transaction.updatePeerCachedData(peerIds: [peer.id], update: { peerId, current in - if let current = current as? CachedSecretChatData { - return current.withUpdatedPeerStatusSettings(peerStatusSettings) - } else { - return CachedSecretChatData(peerStatusSettings: peerStatusSettings) - } - }) - } - } else if let inputPeer = apiInputPeer(peer) { - return network.request(Api.functions.messages.getPeerSettings(peer: inputPeer)) - |> retryRequest - |> mapToSignal { peerSettings -> Signal in - let peerStatusSettings = PeerStatusSettings(apiSettings: peerSettings) - - return postbox.transaction { transaction -> Void in - transaction.updatePeerCachedData(peerIds: Set([peer.id]), update: { _, current in - switch peer.id.namespace { - case Namespaces.Peer.CloudUser: - let previous: CachedUserData - if let current = current as? CachedUserData { - previous = current - } else { - previous = CachedUserData() - } - return previous.withUpdatedPeerStatusSettings(peerStatusSettings) - case Namespaces.Peer.CloudGroup: - let previous: CachedGroupData - if let current = current as? CachedGroupData { - previous = current - } else { - previous = CachedGroupData() - } - return previous.withUpdatedPeerStatusSettings(peerStatusSettings) - case Namespaces.Peer.CloudChannel: - let previous: CachedChannelData - if let current = current as? CachedChannelData { - previous = current - } else { - previous = CachedChannelData() - } - return previous.withUpdatedPeerStatusSettings(peerStatusSettings) - default: - break + + transaction.updatePeerCachedData(peerIds: [peer.id], update: { peerId, current in + if let current = current as? CachedSecretChatData { + return current.withUpdatedPeerStatusSettings(peerStatusSettings) + } else { + return CachedSecretChatData(peerStatusSettings: peerStatusSettings) } - return current }) + + return true } + } else if let inputPeer = apiInputPeer(peer) { + return network.request(Api.functions.messages.getPeerSettings(peer: inputPeer)) + |> retryRequest + |> mapToSignal { peerSettings -> Signal in + let peerStatusSettings = PeerStatusSettings(apiSettings: peerSettings) + + return postbox.transaction { transaction -> Bool in + transaction.updatePeerCachedData(peerIds: Set([peer.id]), update: { _, current in + switch peer.id.namespace { + case Namespaces.Peer.CloudUser: + let previous: CachedUserData + if let current = current as? CachedUserData { + previous = current + } else { + previous = CachedUserData() + } + return previous.withUpdatedPeerStatusSettings(peerStatusSettings) + case Namespaces.Peer.CloudGroup: + let previous: CachedGroupData + if let current = current as? CachedGroupData { + previous = current + } else { + previous = CachedGroupData() + } + return previous.withUpdatedPeerStatusSettings(peerStatusSettings) + case Namespaces.Peer.CloudChannel: + let previous: CachedChannelData + if let current = current as? CachedChannelData { + previous = current + } else { + previous = CachedChannelData() + } + return previous.withUpdatedPeerStatusSettings(peerStatusSettings) + default: + break + } + return current + }) + return true + } + } + } else { + return .single(false) } - } else { - return .complete() } + |> switchToLatest } - |> switchToLatest } -func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerId, network: Network, postbox: Postbox) -> Signal { - return postbox.transaction { transaction -> (Api.InputUser?, Peer?, PeerId) in - guard let rawPeer = transaction.getPeer(rawPeerId) else { +func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerId, network: Network, postbox: Postbox) -> Signal { + return postbox.combinedView(keys: [.basicPeer(rawPeerId)]) + |> mapToSignal { views -> Signal in + guard let view = views.views[.basicPeer(rawPeerId)] as? BasicPeerView else { + return .complete() + } + guard let peer = view.peer else { + return .complete() + } + return .single(peer) + } + |> take(1) + |> mapToSignal { _ -> Signal in + return postbox.transaction { transaction -> (Api.InputUser?, Peer?, PeerId) in + guard let rawPeer = transaction.getPeer(rawPeerId) else { + if rawPeerId == accountPeerId { + return (.inputUserSelf, transaction.getPeer(rawPeerId), rawPeerId) + } else { + return (nil, nil, rawPeerId) + } + } + + let peer: Peer + if let secretChat = rawPeer as? TelegramSecretChat { + guard let user = transaction.getPeer(secretChat.regularPeerId) else { + return (nil, nil, rawPeerId) + } + peer = user + } else { + peer = rawPeer + } + if rawPeerId == accountPeerId { return (.inputUserSelf, transaction.getPeer(rawPeerId), rawPeerId) } else { - return (nil, nil, rawPeerId) + return (apiInputUser(peer), peer, peer.id) } } - - let peer: Peer - if let secretChat = rawPeer as? TelegramSecretChat { - guard let user = transaction.getPeer(secretChat.regularPeerId) else { - return (nil, nil, rawPeerId) - } - peer = user - } else { - peer = rawPeer - } - - if rawPeerId == accountPeerId { - return (.inputUserSelf, transaction.getPeer(rawPeerId), rawPeerId) - } else { - return (apiInputUser(peer), peer, peer.id) - } - } - |> mapToSignal { inputUser, maybePeer, peerId -> Signal in - if let inputUser = inputUser { - return network.request(Api.functions.users.getFullUser(id: inputUser)) - |> retryRequest - |> mapToSignal { result -> Signal in - return postbox.transaction { transaction -> Void in - switch result { + |> mapToSignal { inputUser, maybePeer, peerId -> Signal in + if let inputUser = inputUser { + return network.request(Api.functions.users.getFullUser(id: inputUser)) + |> retryRequest + |> mapToSignal { result -> Signal in + return postbox.transaction { transaction -> Bool in + switch result { case let .userFull(userFull): let telegramUser = TelegramUser(user: userFull.user) updatePeers(transaction: transaction, peers: [telegramUser], update: { _, updated -> Peer in @@ -154,296 +181,300 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerI if let presence = TelegramUserPresence(apiUser: userFull.user) { updatePeerPresences(transaction: transaction, accountPeerId: accountPeerId, peerPresences: [telegramUser.id: presence]) } - } - transaction.updatePeerCachedData(peerIds: [peerId], update: { peerId, current in - let previous: CachedUserData - if let current = current as? CachedUserData { - previous = current - } else { - previous = CachedUserData() } - switch result { - case let .userFull(userFull): - let botInfo = userFull.botInfo.flatMap(BotInfo.init(apiBotInfo:)) - let isBlocked = (userFull.flags & (1 << 0)) != 0 - let callsAvailable = (userFull.flags & (1 << 4)) != 0 - let callsPrivate = (userFull.flags & (1 << 5)) != 0 - let canPinMessages = (userFull.flags & (1 << 7)) != 0 - let pinnedMessageId = userFull.pinnedMsgId.flatMap({ MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: $0) }) - - let peerStatusSettings = PeerStatusSettings(apiSettings: userFull.settings) - - var hasScheduledMessages = false - if (userFull.flags & 1 << 12) != 0 { - hasScheduledMessages = true - } - - return previous.withUpdatedAbout(userFull.about).withUpdatedBotInfo(botInfo).withUpdatedCommonGroupCount(userFull.commonChatsCount).withUpdatedIsBlocked(isBlocked).withUpdatedCallsAvailable(callsAvailable).withUpdatedCallsPrivate(callsPrivate).withUpdatedCanPinMessages(canPinMessages).withUpdatedPeerStatusSettings(peerStatusSettings).withUpdatedPinnedMessageId(pinnedMessageId).withUpdatedHasScheduledMessages(hasScheduledMessages) - } - }) - } - } - } else if peerId.namespace == Namespaces.Peer.CloudGroup { - return network.request(Api.functions.messages.getFullChat(chatId: peerId.id)) - |> retryRequest - |> mapToSignal { result -> Signal in - return postbox.transaction { transaction -> Void in - switch result { - case let .chatFull(fullChat, chats, users): - switch fullChat { - case let .chatFull(chatFull): - transaction.updateCurrentPeerNotificationSettings([peerId: TelegramPeerNotificationSettings(apiSettings: chatFull.notifySettings)]) - case .channelFull: - break + transaction.updatePeerCachedData(peerIds: [peerId], update: { peerId, current in + let previous: CachedUserData + if let current = current as? CachedUserData { + previous = current + } else { + previous = CachedUserData() } - - switch fullChat { - case let .chatFull(chatFull): - var botInfos: [CachedPeerBotInfo] = [] - for botInfo in chatFull.botInfo ?? [] { - switch botInfo { - case let .botInfo(userId, _, _): - let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: userId) - let parsedBotInfo = BotInfo(apiBotInfo: botInfo) - botInfos.append(CachedPeerBotInfo(peerId: peerId, botInfo: parsedBotInfo)) - } - } - let participants = CachedGroupParticipants(apiParticipants: chatFull.participants) - let exportedInvitation = ExportedInvitation(apiExportedInvite: chatFull.exportedInvite) - let pinnedMessageId = chatFull.pinnedMsgId.flatMap({ MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: $0) }) - - var peers: [Peer] = [] - var peerPresences: [PeerId: PeerPresence] = [:] - for chat in chats { - if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) { - peers.append(groupOrChannel) - } - } - for user in users { - let telegramUser = TelegramUser(user: user) - peers.append(telegramUser) - if let presence = TelegramUserPresence(apiUser: user) { - peerPresences[telegramUser.id] = presence - } - } + switch result { + case let .userFull(userFull): + let botInfo = userFull.botInfo.flatMap(BotInfo.init(apiBotInfo:)) + let isBlocked = (userFull.flags & (1 << 0)) != 0 + let callsAvailable = (userFull.flags & (1 << 4)) != 0 + let callsPrivate = (userFull.flags & (1 << 5)) != 0 + let canPinMessages = (userFull.flags & (1 << 7)) != 0 + let pinnedMessageId = userFull.pinnedMsgId.flatMap({ MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: $0) }) - updatePeers(transaction: transaction, peers: peers, update: { _, updated -> Peer in - return updated - }) - - updatePeerPresences(transaction: transaction, accountPeerId: accountPeerId, peerPresences: peerPresences) - - var flags = CachedGroupFlags() - if (chatFull.flags & 1 << 7) != 0 { - flags.insert(.canChangeUsername) - } + let peerStatusSettings = PeerStatusSettings(apiSettings: userFull.settings) var hasScheduledMessages = false - if (chatFull.flags & 1 << 8) != 0 { + if (userFull.flags & 1 << 12) != 0 { hasScheduledMessages = true } - - transaction.updatePeerCachedData(peerIds: [peerId], update: { _, current in - let previous: CachedGroupData - if let current = current as? CachedGroupData { - previous = current - } else { - previous = CachedGroupData() - } - - return previous.withUpdatedParticipants(participants) - .withUpdatedExportedInvitation(exportedInvitation) - .withUpdatedBotInfos(botInfos) - .withUpdatedPinnedMessageId(pinnedMessageId) - .withUpdatedAbout(chatFull.about) - .withUpdatedFlags(flags) - .withUpdatedHasScheduledMessages(hasScheduledMessages) - }) - case .channelFull: - break + + return previous.withUpdatedAbout(userFull.about).withUpdatedBotInfo(botInfo).withUpdatedCommonGroupCount(userFull.commonChatsCount).withUpdatedIsBlocked(isBlocked).withUpdatedCallsAvailable(callsAvailable).withUpdatedCallsPrivate(callsPrivate).withUpdatedCanPinMessages(canPinMessages).withUpdatedPeerStatusSettings(peerStatusSettings).withUpdatedPinnedMessageId(pinnedMessageId).withUpdatedHasScheduledMessages(hasScheduledMessages) } + }) + return true } } - } - } else if let inputChannel = maybePeer.flatMap(apiInputChannel) { - return network.request(Api.functions.channels.getFullChannel(channel: inputChannel)) - |> map(Optional.init) - |> `catch` { error -> Signal in - if error.errorDescription == "CHANNEL_PRIVATE" { - return .single(nil) - } - return .complete() - } - |> mapToSignal { result -> Signal in - return postbox.transaction { transaction -> Void in - if let result = result { + } else if peerId.namespace == Namespaces.Peer.CloudGroup { + return network.request(Api.functions.messages.getFullChat(chatId: peerId.id)) + |> retryRequest + |> mapToSignal { result -> Signal in + return postbox.transaction { transaction -> Bool in switch result { - case let .chatFull(fullChat, chats, users): - switch fullChat { - case let .channelFull(channelFull): - transaction.updateCurrentPeerNotificationSettings([peerId: TelegramPeerNotificationSettings(apiSettings: channelFull.notifySettings)]) - case .chatFull: - break + case let .chatFull(fullChat, chats, users): + switch fullChat { + case let .chatFull(chatFull): + transaction.updateCurrentPeerNotificationSettings([peerId: TelegramPeerNotificationSettings(apiSettings: chatFull.notifySettings)]) + case .channelFull: + break + } + + switch fullChat { + case let .chatFull(chatFull): + var botInfos: [CachedPeerBotInfo] = [] + for botInfo in chatFull.botInfo ?? [] { + switch botInfo { + case let .botInfo(userId, _, _): + let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: userId) + let parsedBotInfo = BotInfo(apiBotInfo: botInfo) + botInfos.append(CachedPeerBotInfo(peerId: peerId, botInfo: parsedBotInfo)) + } + } + let participants = CachedGroupParticipants(apiParticipants: chatFull.participants) + let exportedInvitation = ExportedInvitation(apiExportedInvite: chatFull.exportedInvite) + let pinnedMessageId = chatFull.pinnedMsgId.flatMap({ MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: $0) }) + + var peers: [Peer] = [] + var peerPresences: [PeerId: PeerPresence] = [:] + for chat in chats { + if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) { + peers.append(groupOrChannel) + } + } + for user in users { + let telegramUser = TelegramUser(user: user) + peers.append(telegramUser) + if let presence = TelegramUserPresence(apiUser: user) { + peerPresences[telegramUser.id] = presence + } } - switch fullChat { - case let .channelFull(flags, _, about, participantsCount, adminsCount, kickedCount, bannedCount, _, _, _, _, _, _, apiExportedInvite, apiBotInfos, migratedFromChatId, migratedFromMaxId, pinnedMsgId, stickerSet, minAvailableMsgId, folderId, linkedChatId, location, slowmodeSeconds, slowmodeNextSendDate, pts): - var channelFlags = CachedChannelFlags() - if (flags & (1 << 3)) != 0 { - channelFlags.insert(.canDisplayParticipants) - } - if (flags & (1 << 6)) != 0 { - channelFlags.insert(.canChangeUsername) - } - if (flags & (1 << 10)) == 0 { - channelFlags.insert(.preHistoryEnabled) - } - if (flags & (1 << 12)) != 0 { - channelFlags.insert(.canViewStats) - } - if (flags & (1 << 7)) != 0 { - channelFlags.insert(.canSetStickerSet) - } - if (flags & (1 << 16)) != 0 { - channelFlags.insert(.canChangePeerGeoLocation) - } - - let linkedDiscussionPeerId: PeerId? - if let linkedChatId = linkedChatId, linkedChatId != 0 { - linkedDiscussionPeerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: linkedChatId) - } else { - linkedDiscussionPeerId = nil - } - - let peerGeoLocation: PeerGeoLocation? - if let location = location { - peerGeoLocation = PeerGeoLocation(apiLocation: location) - } else { - peerGeoLocation = nil - } - - var botInfos: [CachedPeerBotInfo] = [] - for botInfo in apiBotInfos { - switch botInfo { - case let .botInfo(userId, _, _): - let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: userId) - let parsedBotInfo = BotInfo(apiBotInfo: botInfo) - botInfos.append(CachedPeerBotInfo(peerId: peerId, botInfo: parsedBotInfo)) - } - } - - var pinnedMessageId: MessageId? - if let pinnedMsgId = pinnedMsgId { - pinnedMessageId = MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: pinnedMsgId) - } - - var minAvailableMessageId: MessageId? - if let minAvailableMsgId = minAvailableMsgId { - minAvailableMessageId = MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: minAvailableMsgId) - - if let pinnedMsgId = pinnedMsgId, pinnedMsgId < minAvailableMsgId { - pinnedMessageId = nil - } - } - - var migrationReference: ChannelMigrationReference? - if let migratedFromChatId = migratedFromChatId, let migratedFromMaxId = migratedFromMaxId { - migrationReference = ChannelMigrationReference(maxMessageId: MessageId(peerId: PeerId(namespace: Namespaces.Peer.CloudGroup, id: migratedFromChatId), namespace: Namespaces.Message.Cloud, id: migratedFromMaxId)) - } - - var peers: [Peer] = [] - var peerPresences: [PeerId: PeerPresence] = [:] - for chat in chats { - if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) { - peers.append(groupOrChannel) - } - } - for user in users { - let telegramUser = TelegramUser(user: user) - peers.append(telegramUser) - if let presence = TelegramUserPresence(apiUser: user) { - peerPresences[telegramUser.id] = presence - } - } - - updatePeers(transaction: transaction, peers: peers, update: { _, updated -> Peer in - return updated - }) - - updatePeerPresences(transaction: transaction, accountPeerId: accountPeerId, peerPresences: peerPresences) - - let stickerPack: StickerPackCollectionInfo? = stickerSet.flatMap { apiSet -> StickerPackCollectionInfo in - let namespace: ItemCollectionId.Namespace - switch apiSet { - case let .stickerSet(flags, _, _, _, _, _, _, _, _, _): - if (flags & (1 << 3)) != 0 { - namespace = Namespaces.ItemCollection.CloudMaskPacks - } else { - namespace = Namespaces.ItemCollection.CloudStickerPacks - } - } - - return StickerPackCollectionInfo(apiSet: apiSet, namespace: namespace) - } - - var hasScheduledMessages = false - if (flags & (1 << 19)) != 0 { - hasScheduledMessages = true - } - - var minAvailableMessageIdUpdated = false - transaction.updatePeerCachedData(peerIds: [peerId], update: { _, current in - var previous: CachedChannelData - if let current = current as? CachedChannelData { - previous = current - } else { - previous = CachedChannelData() - } - - previous = previous.withUpdatedIsNotAccessible(false) - - minAvailableMessageIdUpdated = previous.minAvailableMessageId != minAvailableMessageId - - return previous.withUpdatedFlags(channelFlags) - .withUpdatedAbout(about) - .withUpdatedParticipantsSummary(CachedChannelParticipantsSummary(memberCount: participantsCount, adminCount: adminsCount, bannedCount: bannedCount, kickedCount: kickedCount)) - .withUpdatedExportedInvitation(ExportedInvitation(apiExportedInvite: apiExportedInvite)) - .withUpdatedBotInfos(botInfos) - .withUpdatedPinnedMessageId(pinnedMessageId) - .withUpdatedStickerPack(stickerPack) - .withUpdatedMinAvailableMessageId(minAvailableMessageId) - .withUpdatedMigrationReference(migrationReference) - .withUpdatedLinkedDiscussionPeerId(linkedDiscussionPeerId) - .withUpdatedPeerGeoLocation(peerGeoLocation) - .withUpdatedSlowModeTimeout(slowmodeSeconds) - .withUpdatedSlowModeValidUntilTimestamp(slowmodeNextSendDate) - .withUpdatedHasScheduledMessages(hasScheduledMessages) - }) - - if let minAvailableMessageId = minAvailableMessageId, minAvailableMessageIdUpdated { - var resourceIds: [WrappedMediaResourceId] = [] - transaction.deleteMessagesInRange(peerId: peerId, namespace: minAvailableMessageId.namespace, minId: 1, maxId: minAvailableMessageId.id, forEachMedia: { media in - addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds) - }) - if !resourceIds.isEmpty { - let _ = postbox.mediaBox.removeCachedResources(Set(resourceIds)).start() - } - } - case .chatFull: - break + updatePeers(transaction: transaction, peers: peers, update: { _, updated -> Peer in + return updated + }) + + updatePeerPresences(transaction: transaction, accountPeerId: accountPeerId, peerPresences: peerPresences) + + var flags = CachedGroupFlags() + if (chatFull.flags & 1 << 7) != 0 { + flags.insert(.canChangeUsername) } + + var hasScheduledMessages = false + if (chatFull.flags & 1 << 8) != 0 { + hasScheduledMessages = true + } + + transaction.updatePeerCachedData(peerIds: [peerId], update: { _, current in + let previous: CachedGroupData + if let current = current as? CachedGroupData { + previous = current + } else { + previous = CachedGroupData() + } + + return previous.withUpdatedParticipants(participants) + .withUpdatedExportedInvitation(exportedInvitation) + .withUpdatedBotInfos(botInfos) + .withUpdatedPinnedMessageId(pinnedMessageId) + .withUpdatedAbout(chatFull.about) + .withUpdatedFlags(flags) + .withUpdatedHasScheduledMessages(hasScheduledMessages) + }) + case .channelFull: + break + } } - } else { - transaction.updatePeerCachedData(peerIds: [peerId], update: { _, _ in - var updated = CachedChannelData() - updated = updated.withUpdatedIsNotAccessible(true) - return updated - }) + return true } } + } else if let inputChannel = maybePeer.flatMap(apiInputChannel) { + return network.request(Api.functions.channels.getFullChannel(channel: inputChannel)) + |> map(Optional.init) + |> `catch` { error -> Signal in + if error.errorDescription == "CHANNEL_PRIVATE" { + return .single(nil) + } + return .single(nil) + } + |> mapToSignal { result -> Signal in + return postbox.transaction { transaction -> Bool in + if let result = result { + switch result { + case let .chatFull(fullChat, chats, users): + switch fullChat { + case let .channelFull(channelFull): + transaction.updateCurrentPeerNotificationSettings([peerId: TelegramPeerNotificationSettings(apiSettings: channelFull.notifySettings)]) + case .chatFull: + break + } + + switch fullChat { + case let .channelFull(flags, _, about, participantsCount, adminsCount, kickedCount, bannedCount, _, _, _, _, _, _, apiExportedInvite, apiBotInfos, migratedFromChatId, migratedFromMaxId, pinnedMsgId, stickerSet, minAvailableMsgId, folderId, linkedChatId, location, slowmodeSeconds, slowmodeNextSendDate, pts): + var channelFlags = CachedChannelFlags() + if (flags & (1 << 3)) != 0 { + channelFlags.insert(.canDisplayParticipants) + } + if (flags & (1 << 6)) != 0 { + channelFlags.insert(.canChangeUsername) + } + if (flags & (1 << 10)) == 0 { + channelFlags.insert(.preHistoryEnabled) + } + if (flags & (1 << 12)) != 0 { + channelFlags.insert(.canViewStats) + } + if (flags & (1 << 7)) != 0 { + channelFlags.insert(.canSetStickerSet) + } + if (flags & (1 << 16)) != 0 { + channelFlags.insert(.canChangePeerGeoLocation) + } + + let linkedDiscussionPeerId: PeerId? + if let linkedChatId = linkedChatId, linkedChatId != 0 { + linkedDiscussionPeerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: linkedChatId) + } else { + linkedDiscussionPeerId = nil + } + + let peerGeoLocation: PeerGeoLocation? + if let location = location { + peerGeoLocation = PeerGeoLocation(apiLocation: location) + } else { + peerGeoLocation = nil + } + + var botInfos: [CachedPeerBotInfo] = [] + for botInfo in apiBotInfos { + switch botInfo { + case let .botInfo(userId, _, _): + let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: userId) + let parsedBotInfo = BotInfo(apiBotInfo: botInfo) + botInfos.append(CachedPeerBotInfo(peerId: peerId, botInfo: parsedBotInfo)) + } + } + + var pinnedMessageId: MessageId? + if let pinnedMsgId = pinnedMsgId { + pinnedMessageId = MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: pinnedMsgId) + } + + var minAvailableMessageId: MessageId? + if let minAvailableMsgId = minAvailableMsgId { + minAvailableMessageId = MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: minAvailableMsgId) + + if let pinnedMsgId = pinnedMsgId, pinnedMsgId < minAvailableMsgId { + pinnedMessageId = nil + } + } + + var migrationReference: ChannelMigrationReference? + if let migratedFromChatId = migratedFromChatId, let migratedFromMaxId = migratedFromMaxId { + migrationReference = ChannelMigrationReference(maxMessageId: MessageId(peerId: PeerId(namespace: Namespaces.Peer.CloudGroup, id: migratedFromChatId), namespace: Namespaces.Message.Cloud, id: migratedFromMaxId)) + } + + var peers: [Peer] = [] + var peerPresences: [PeerId: PeerPresence] = [:] + for chat in chats { + if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) { + peers.append(groupOrChannel) + } + } + for user in users { + let telegramUser = TelegramUser(user: user) + peers.append(telegramUser) + if let presence = TelegramUserPresence(apiUser: user) { + peerPresences[telegramUser.id] = presence + } + } + + updatePeers(transaction: transaction, peers: peers, update: { _, updated -> Peer in + return updated + }) + + updatePeerPresences(transaction: transaction, accountPeerId: accountPeerId, peerPresences: peerPresences) + + let stickerPack: StickerPackCollectionInfo? = stickerSet.flatMap { apiSet -> StickerPackCollectionInfo in + let namespace: ItemCollectionId.Namespace + switch apiSet { + case let .stickerSet(flags, _, _, _, _, _, _, _, _, _): + if (flags & (1 << 3)) != 0 { + namespace = Namespaces.ItemCollection.CloudMaskPacks + } else { + namespace = Namespaces.ItemCollection.CloudStickerPacks + } + } + + return StickerPackCollectionInfo(apiSet: apiSet, namespace: namespace) + } + + var hasScheduledMessages = false + if (flags & (1 << 19)) != 0 { + hasScheduledMessages = true + } + + var minAvailableMessageIdUpdated = false + transaction.updatePeerCachedData(peerIds: [peerId], update: { _, current in + var previous: CachedChannelData + if let current = current as? CachedChannelData { + previous = current + } else { + previous = CachedChannelData() + } + + previous = previous.withUpdatedIsNotAccessible(false) + + minAvailableMessageIdUpdated = previous.minAvailableMessageId != minAvailableMessageId + + return previous.withUpdatedFlags(channelFlags) + .withUpdatedAbout(about) + .withUpdatedParticipantsSummary(CachedChannelParticipantsSummary(memberCount: participantsCount, adminCount: adminsCount, bannedCount: bannedCount, kickedCount: kickedCount)) + .withUpdatedExportedInvitation(ExportedInvitation(apiExportedInvite: apiExportedInvite)) + .withUpdatedBotInfos(botInfos) + .withUpdatedPinnedMessageId(pinnedMessageId) + .withUpdatedStickerPack(stickerPack) + .withUpdatedMinAvailableMessageId(minAvailableMessageId) + .withUpdatedMigrationReference(migrationReference) + .withUpdatedLinkedDiscussionPeerId(linkedDiscussionPeerId) + .withUpdatedPeerGeoLocation(peerGeoLocation) + .withUpdatedSlowModeTimeout(slowmodeSeconds) + .withUpdatedSlowModeValidUntilTimestamp(slowmodeNextSendDate) + .withUpdatedHasScheduledMessages(hasScheduledMessages) + }) + + if let minAvailableMessageId = minAvailableMessageId, minAvailableMessageIdUpdated { + var resourceIds: [WrappedMediaResourceId] = [] + transaction.deleteMessagesInRange(peerId: peerId, namespace: minAvailableMessageId.namespace, minId: 1, maxId: minAvailableMessageId.id, forEachMedia: { media in + addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds) + }) + if !resourceIds.isEmpty { + let _ = postbox.mediaBox.removeCachedResources(Set(resourceIds)).start() + } + } + case .chatFull: + break + } + } + } else { + transaction.updatePeerCachedData(peerIds: [peerId], update: { _, _ in + var updated = CachedChannelData() + updated = updated.withUpdatedIsNotAccessible(true) + return updated + }) + } + return true + } + } + } else { + return .single(false) } - } else { - return .complete() } } }