diff --git a/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift b/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift index 68cedae9d2..3c7cf235bb 100644 --- a/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift +++ b/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift @@ -205,7 +205,7 @@ func telegramMediaActionFromApiAction(_ action: Api.MessageAction) -> TelegramMe text = nil entities = nil } - return TelegramMediaAction(action: .giftCode(slug: slug, fromGiveaway: (flags & (1 << 0)) != 0, isUnclaimed: (flags & (1 << 5)) != 0, boostPeerId: boostPeer?.peerId, days: days, currency: currency, amount: amount, cryptoCurrency: cryptoCurrency, cryptoAmount: cryptoAmount, text: text, entities: entities)) + return TelegramMediaAction(action: .giftCode(slug: slug, fromGiveaway: (flags & (1 << 0)) != 0, isUnclaimed: (flags & (1 << 5)) != 0, boostPeerId: boostPeer?.peerId, months: days, currency: currency, amount: amount, cryptoCurrency: cryptoCurrency, cryptoAmount: cryptoAmount, text: text, entities: entities)) case let .messageActionGiveawayLaunch(messageActionGiveawayLaunchData): return TelegramMediaAction(action: .giveawayLaunched(stars: messageActionGiveawayLaunchData.stars)) case let .messageActionGiveawayResults(messageActionGiveawayResultsData): diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaAction.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaAction.swift index 1f570a0095..4325a21930 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaAction.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaAction.swift @@ -279,7 +279,7 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { case requestedPeer(buttonId: Int32, peerIds: [PeerId]) case setChatWallpaper(wallpaper: TelegramWallpaper, forBoth: Bool) case setSameChatWallpaper(wallpaper: TelegramWallpaper) - case giftCode(slug: String, fromGiveaway: Bool, isUnclaimed: Bool, boostPeerId: PeerId?, days: Int32, currency: String?, amount: Int64?, cryptoCurrency: String?, cryptoAmount: Int64?, text: String?, entities: [MessageTextEntity]?) + case giftCode(slug: String, fromGiveaway: Bool, isUnclaimed: Bool, boostPeerId: PeerId?, months: Int32, currency: String?, amount: Int64?, cryptoCurrency: String?, cryptoAmount: Int64?, text: String?, entities: [MessageTextEntity]?) case giveawayLaunched(stars: Int64?) case joinedChannel case giveawayResults(winners: Int32, unclaimed: Int32, stars: Bool) @@ -302,6 +302,7 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { case starGiftPurchaseOffer(gift: StarGift, amount: CurrencyAmount, expireDate: Int32, isAccepted: Bool, isDeclined: Bool) case starGiftPurchaseOfferDeclined(gift: StarGift, amount: CurrencyAmount, hasExpired: Bool) case groupCreatorChange(GroupCreatorChange) + case starGiftCraftFail public init(decoder: PostboxDecoder) { let rawValue: Int32 = decoder.decodeInt32ForKey("_rawValue", orElse: 0) @@ -407,7 +408,7 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { case 35: self = .botAppAccessGranted(appName: decoder.decodeOptionalStringForKey("app"), type: decoder.decodeOptionalInt32ForKey("atp").flatMap { BotSendMessageAccessGrantedType(rawValue: $0) }) case 36: - self = .giftCode(slug: decoder.decodeStringForKey("slug", orElse: ""), fromGiveaway: decoder.decodeBoolForKey("give", orElse: false), isUnclaimed: decoder.decodeBoolForKey("unclaimed", orElse: false), boostPeerId: decoder.decodeOptionalInt64ForKey("pi").flatMap { PeerId($0) }, days: decoder.decodeInt32ForKey("days", orElse: decoder.decodeInt32ForKey("months", orElse: 0)), currency: decoder.decodeOptionalStringForKey("currency"), amount: decoder.decodeOptionalInt64ForKey("amount"), cryptoCurrency: decoder.decodeOptionalStringForKey("cryptoCurrency"), cryptoAmount: decoder.decodeOptionalInt64ForKey("cryptoAmount"), text: decoder.decodeOptionalStringForKey("text"), entities: decoder.decodeOptionalObjectArrayWithDecoderForKey("entities")) + self = .giftCode(slug: decoder.decodeStringForKey("slug", orElse: ""), fromGiveaway: decoder.decodeBoolForKey("give", orElse: false), isUnclaimed: decoder.decodeBoolForKey("unclaimed", orElse: false), boostPeerId: decoder.decodeOptionalInt64ForKey("pi").flatMap { PeerId($0) }, months: decoder.decodeInt32ForKey("months", orElse: 0), currency: decoder.decodeOptionalStringForKey("currency"), amount: decoder.decodeOptionalInt64ForKey("amount"), cryptoCurrency: decoder.decodeOptionalStringForKey("cryptoCurrency"), cryptoAmount: decoder.decodeOptionalInt64ForKey("cryptoAmount"), text: decoder.decodeOptionalStringForKey("text"), entities: decoder.decodeOptionalObjectArrayWithDecoderForKey("entities")) case 37: self = .giveawayLaunched(stars: decoder.decodeOptionalInt64ForKey("stars")) case 38: @@ -470,10 +471,12 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { case 55: self = .suggestedBirthday(decoder.decodeCodable(TelegramBirthday.self, forKey: "birthday") ?? TelegramBirthday(day: 1, month: 1, year: nil)) case 56: - self = .starGiftPurchaseOffer(gift: decoder.decodeObjectForKey("gift", decoder: { StarGift(decoder: $0) }) as! StarGift, amount: decoder.decodeCodable(CurrencyAmount.self, forKey: "amount")!, expireDate: decoder.decodeInt32ForKey("expireDate", orElse: 0), isAccepted: decoder.decodeBoolForKey("isAccepted", orElse: false), isDeclined: decoder.decodeBoolForKey("isDeclined", orElse: false)) + self = .starGiftPurchaseOffer(gift: decoder.decodeObjectForKey("gift", decoder: { StarGift(decoder: $0) }) as! StarGift, amount: decoder.decodeCodable(CurrencyAmount.self, forKey: "amount") ?? CurrencyAmount(amount: .zero, currency: .stars), expireDate: decoder.decodeInt32ForKey("expireDate", orElse: 0), isAccepted: decoder.decodeBoolForKey("isAccepted", orElse: false), isDeclined: decoder.decodeBoolForKey("isDeclined", orElse: false)) case 57: self = .starGiftPurchaseOfferDeclined(gift: decoder.decodeObjectForKey("gift", decoder: { StarGift(decoder: $0) }) as! StarGift, amount: decoder.decodeCodable(CurrencyAmount.self, forKey: "amount")!, hasExpired: decoder.decodeBoolForKey("hasExpired", orElse: false)) case 58: + self = .starGiftCraftFail + case 59: self = .groupCreatorChange(decoder.decodeCodable(GroupCreatorChange.self, forKey: "d") ?? GroupCreatorChange(kind: .pending, targetPeerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(0)))) default: self = .unknown @@ -667,7 +670,7 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { } else { encoder.encodeNil(forKey: "atp") } - case let .giftCode(slug, fromGiveaway, unclaimed, boostPeerId, days, currency, amount, cryptoCurrency, cryptoAmount, text, entities): + case let .giftCode(slug, fromGiveaway, unclaimed, boostPeerId, months, currency, amount, cryptoCurrency, cryptoAmount, text, entities): encoder.encodeInt32(36, forKey: "_rawValue") encoder.encodeString(slug, forKey: "slug") encoder.encodeBool(fromGiveaway, forKey: "give") @@ -677,7 +680,7 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { } else { encoder.encodeNil(forKey: "pi") } - encoder.encodeInt32(days, forKey: "days") + encoder.encodeInt32(months, forKey: "months") if let currency = currency { encoder.encodeString(currency, forKey: "currency") } else { @@ -966,8 +969,10 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable { encoder.encodeObject(gift, forKey: "gift") encoder.encodeCodable(amount, forKey: "amount") encoder.encodeBool(hasExpired, forKey: "hasExpired") - case let .groupCreatorChange(groupCreatorChange): + case .starGiftCraftFail: encoder.encodeInt32(58, forKey: "_rawValue") + case let .groupCreatorChange(groupCreatorChange): + encoder.encodeInt32(59, forKey: "_rawValue") encoder.encodeCodable(groupCreatorChange, forKey: "d") } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/RequestMessageActionCallback.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/RequestMessageActionCallback.swift index 15e4a1f70b..83c8daf9fe 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/RequestMessageActionCallback.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/RequestMessageActionCallback.swift @@ -180,7 +180,7 @@ public enum MessageActionUrlAuthResult { public static let requestPhoneNumber = Flags(rawValue: 1 << 1) } - public struct ClientData { + public struct ClientData : Equatable { public let browser: String public let platform: String public let ip: String diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift b/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift index de84f8f22b..9dac20fba5 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Payments/StarGifts.swift @@ -426,6 +426,7 @@ public enum StarGift: Equatable, Codable, PostboxCoding { } public static let isThemeAvailable = Flags(rawValue: 1 << 0) + public static let isBurned = Flags(rawValue: 1 << 1) } public enum Attribute: Equatable, Codable, PostboxCoding { @@ -470,6 +471,36 @@ public enum StarGift: Equatable, Codable, PostboxCoding { return 0 } } + + public var isPermille: Bool { + if case .permille = self { + return true + } + return false + } + + public var badgeText: String { + switch self { + case let .permille(value): + if value == 0 { + return "<0.1%" + } + let percent = Double(value) / 10.0 + if percent.truncatingRemainder(dividingBy: 1) == 0 { + return "\(Int(percent))%" + } else { + return String(format: "%.1f%%", percent) + } + case .rare: + return "rare" + case .epic: + return "epic" + case .legendary: + return "legendary" + case .uncommon: + return "uncommon" + } + } } case model(name: String, file: TelegramMediaFile, rarity: Rarity, crafted: Bool) @@ -1278,13 +1309,16 @@ extension StarGift { } else if let ownerName { owner = .name(ownerName) } else { - owner = nil + owner = .none } let resellAmounts = apiResellAmount?.compactMap { CurrencyAmount(apiAmount: $0) } var flags = StarGift.UniqueGift.Flags() if (apiFlags & (1 << 9)) != 0 { flags.insert(.isThemeAvailable) } + if (apiFlags & (1 << 14)) != 0 { + flags.insert(.isBurned) + } var peerCollectibleColor: PeerCollectibleColor? switch peerColor { case let .peerColorCollectible(peerColorCollectibleData): @@ -3559,28 +3593,32 @@ extension StarGift.UniqueGift.Attribute { } -func _internal_getUniqueStarGift(account: Account, slug: String) -> Signal { +public enum GetUniqueStarGiftError { + case generic + case burned +} + +func _internal_getUniqueStarGift(account: Account, slug: String) -> Signal { return account.network.request(Api.functions.payments.getUniqueStarGift(slug: slug)) - |> map(Optional.init) - |> `catch` { _ -> Signal in - return .single(nil) + |> mapError { error -> GetUniqueStarGiftError in + if error.errorDescription == "STARGIFT_ALREADY_BURNED" { + return .burned + } + return .generic } - |> mapToSignal { result -> Signal in - if let result = result { - switch result { - case let .uniqueStarGift(uniqueStarGiftData): - let (gift, chats, users) = (uniqueStarGiftData.gift, uniqueStarGiftData.chats, uniqueStarGiftData.users) - return account.postbox.transaction { transaction in - let parsedPeers = AccumulatedPeers(chats: chats, users: users) - updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: parsedPeers) - guard case let .unique(uniqueGift) = StarGift(apiStarGift: gift) else { - return nil - } - return uniqueGift + |> mapToSignal { result -> Signal in + switch result { + case let .uniqueStarGift(uniqueStarGiftData): + let (gift, chats, users) = (uniqueStarGiftData.gift, uniqueStarGiftData.chats, uniqueStarGiftData.users) + return account.postbox.transaction { transaction in + let parsedPeers = AccumulatedPeers(chats: chats, users: users) + updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: parsedPeers) + guard case let .unique(uniqueGift) = StarGift(apiStarGift: gift) else { + return nil } + return uniqueGift } - } else { - return .single(nil) + |> castError(GetUniqueStarGiftError.self) } } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift b/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift index ec9b54d7c2..ff50d3caf4 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift @@ -149,7 +149,7 @@ public extension TelegramEngine { return _internal_checkCanSendStarGift(account: self.account, giftId: giftId) } - public func getUniqueStarGift(slug: String) -> Signal { + public func getUniqueStarGift(slug: String) -> Signal { return _internal_getUniqueStarGift(account: self.account, slug: slug) }