# Conflicts:
#	submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaAction.swift
This commit is contained in:
Isaac 2026-01-30 22:40:53 +08:00
commit 47cef684ba
5 changed files with 71 additions and 28 deletions

View file

@ -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):

View file

@ -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")
}
}

View file

@ -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

View file

@ -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<StarGift.UniqueGift?, NoError> {
public enum GetUniqueStarGiftError {
case generic
case burned
}
func _internal_getUniqueStarGift(account: Account, slug: String) -> Signal<StarGift.UniqueGift?, GetUniqueStarGiftError> {
return account.network.request(Api.functions.payments.getUniqueStarGift(slug: slug))
|> map(Optional.init)
|> `catch` { _ -> Signal<Api.payments.UniqueStarGift?, NoError> in
return .single(nil)
|> mapError { error -> GetUniqueStarGiftError in
if error.errorDescription == "STARGIFT_ALREADY_BURNED" {
return .burned
}
return .generic
}
|> mapToSignal { result -> Signal<StarGift.UniqueGift?, NoError> 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<StarGift.UniqueGift?, GetUniqueStarGiftError> 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)
}
}
}

View file

@ -149,7 +149,7 @@ public extension TelegramEngine {
return _internal_checkCanSendStarGift(account: self.account, giftId: giftId)
}
public func getUniqueStarGift(slug: String) -> Signal<StarGift.UniqueGift?, NoError> {
public func getUniqueStarGift(slug: String) -> Signal<StarGift.UniqueGift?, GetUniqueStarGiftError> {
return _internal_getUniqueStarGift(account: self.account, slug: slug)
}