Merge commit '472bf7d3b1169a630e4347f5f33e3b6cb979ffc8'

This commit is contained in:
Isaac 2025-06-21 23:08:16 +02:00
commit 3c31a513e1
30 changed files with 28898 additions and 28679 deletions

View File

@ -1345,6 +1345,7 @@ public protocol AccountContext: AnyObject {
var wallpaperUploadManager: WallpaperUploadManager? { get } var wallpaperUploadManager: WallpaperUploadManager? { get }
var inAppPurchaseManager: InAppPurchaseManager? { get } var inAppPurchaseManager: InAppPurchaseManager? { get }
var starsContext: StarsContext? { get } var starsContext: StarsContext? { get }
var tonContext: StarsContext? { get }
var currentLimitsConfiguration: Atomic<LimitsConfiguration> { get } var currentLimitsConfiguration: Atomic<LimitsConfiguration> { get }
var currentContentSettings: Atomic<ContentSettings> { get } var currentContentSettings: Atomic<ContentSettings> { get }

View File

@ -1896,7 +1896,7 @@ public func channelStatsController(
starsState.set(.single(nil) |> then(starsContext.state |> map(Optional.init))) starsState.set(.single(nil) |> then(starsContext.state |> map(Optional.init)))
let revenueTransactions = RevenueStatsTransactionsContext(account: context.account, peerId: peerId) let revenueTransactions = RevenueStatsTransactionsContext(account: context.account, peerId: peerId)
let starsTransactions = context.engine.payments.peerStarsTransactionsContext(subject: .peer(peerId), mode: .all) let starsTransactions = context.engine.payments.peerStarsTransactionsContext(subject: .peer(peerId: peerId, ton: false), mode: .all)
starsTransactions.loadMore() starsTransactions.loadMore()
var dismissAllTooltipsImpl: (() -> Void)? var dismissAllTooltipsImpl: (() -> Void)?

View File

@ -582,6 +582,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[1456486804] = { return Api.MessageAction.parse_messageActionGiftCode($0) } dict[1456486804] = { return Api.MessageAction.parse_messageActionGiftCode($0) }
dict[1818391802] = { return Api.MessageAction.parse_messageActionGiftPremium($0) } dict[1818391802] = { return Api.MessageAction.parse_messageActionGiftPremium($0) }
dict[1171632161] = { return Api.MessageAction.parse_messageActionGiftStars($0) } dict[1171632161] = { return Api.MessageAction.parse_messageActionGiftStars($0) }
dict[-1465661799] = { return Api.MessageAction.parse_messageActionGiftTon($0) }
dict[-1475391004] = { return Api.MessageAction.parse_messageActionGiveawayLaunch($0) } dict[-1475391004] = { return Api.MessageAction.parse_messageActionGiveawayLaunch($0) }
dict[-2015170219] = { return Api.MessageAction.parse_messageActionGiveawayResults($0) } dict[-2015170219] = { return Api.MessageAction.parse_messageActionGiveawayResults($0) }
dict[2047704898] = { return Api.MessageAction.parse_messageActionGroupCall($0) } dict[2047704898] = { return Api.MessageAction.parse_messageActionGroupCall($0) }
@ -955,6 +956,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[1242965043] = { return Api.StarGiftAttributeId.parse_starGiftAttributeIdPattern($0) } dict[1242965043] = { return Api.StarGiftAttributeId.parse_starGiftAttributeIdPattern($0) }
dict[-586389774] = { return Api.StarRefProgram.parse_starRefProgram($0) } dict[-586389774] = { return Api.StarRefProgram.parse_starRefProgram($0) }
dict[-1145654109] = { return Api.StarsAmount.parse_starsAmount($0) } dict[-1145654109] = { return Api.StarsAmount.parse_starsAmount($0) }
dict[1957618656] = { return Api.StarsAmount.parse_starsTonAmount($0) }
dict[1577421297] = { return Api.StarsGiftOption.parse_starsGiftOption($0) } dict[1577421297] = { return Api.StarsGiftOption.parse_starsGiftOption($0) }
dict[-1798404822] = { return Api.StarsGiveawayOption.parse_starsGiveawayOption($0) } dict[-1798404822] = { return Api.StarsGiveawayOption.parse_starsGiveawayOption($0) }
dict[1411605001] = { return Api.StarsGiveawayWinnersOption.parse_starsGiveawayWinnersOption($0) } dict[1411605001] = { return Api.StarsGiveawayWinnersOption.parse_starsGiveawayWinnersOption($0) }
@ -1149,6 +1151,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-245208620] = { return Api.Update.parse_updateSmsJob($0) } dict[-245208620] = { return Api.Update.parse_updateSmsJob($0) }
dict[1317053305] = { return Api.Update.parse_updateStarsBalance($0) } dict[1317053305] = { return Api.Update.parse_updateStarsBalance($0) }
dict[-1518030823] = { return Api.Update.parse_updateStarsRevenueStatus($0) } dict[-1518030823] = { return Api.Update.parse_updateStarsRevenueStatus($0) }
dict[-1944619808] = { return Api.Update.parse_updateStarsTonBalance($0) }
dict[834816008] = { return Api.Update.parse_updateStickerSets($0) } dict[834816008] = { return Api.Update.parse_updateStickerSets($0) }
dict[196268545] = { return Api.Update.parse_updateStickerSetsOrder($0) } dict[196268545] = { return Api.Update.parse_updateStickerSetsOrder($0) }
dict[738741697] = { return Api.Update.parse_updateStoriesStealthMode($0) } dict[738741697] = { return Api.Update.parse_updateStoriesStealthMode($0) }

View File

@ -370,6 +370,7 @@ public extension Api {
case messageActionGiftCode(flags: Int32, boostPeer: Api.Peer?, months: Int32, slug: String, currency: String?, amount: Int64?, cryptoCurrency: String?, cryptoAmount: Int64?, message: Api.TextWithEntities?) case messageActionGiftCode(flags: Int32, boostPeer: Api.Peer?, months: Int32, slug: String, currency: String?, amount: Int64?, cryptoCurrency: String?, cryptoAmount: Int64?, message: Api.TextWithEntities?)
case messageActionGiftPremium(flags: Int32, currency: String, amount: Int64, months: Int32, cryptoCurrency: String?, cryptoAmount: Int64?, message: Api.TextWithEntities?) case messageActionGiftPremium(flags: Int32, currency: String, amount: Int64, months: Int32, cryptoCurrency: String?, cryptoAmount: Int64?, message: Api.TextWithEntities?)
case messageActionGiftStars(flags: Int32, currency: String, amount: Int64, stars: Int64, cryptoCurrency: String?, cryptoAmount: Int64?, transactionId: String?) case messageActionGiftStars(flags: Int32, currency: String, amount: Int64, stars: Int64, cryptoCurrency: String?, cryptoAmount: Int64?, transactionId: String?)
case messageActionGiftTon(flags: Int32, currency: String, amount: Int64, cryptoCurrency: String, cryptoAmount: Int64, transactionId: String?)
case messageActionGiveawayLaunch(flags: Int32, stars: Int64?) case messageActionGiveawayLaunch(flags: Int32, stars: Int64?)
case messageActionGiveawayResults(flags: Int32, winnersCount: Int32, unclaimedCount: Int32) case messageActionGiveawayResults(flags: Int32, winnersCount: Int32, unclaimedCount: Int32)
case messageActionGroupCall(flags: Int32, call: Api.InputGroupCall, duration: Int32?) case messageActionGroupCall(flags: Int32, call: Api.InputGroupCall, duration: Int32?)
@ -579,6 +580,17 @@ public extension Api {
if Int(flags) & Int(1 << 0) != 0 {serializeInt64(cryptoAmount!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 0) != 0 {serializeInt64(cryptoAmount!, buffer: buffer, boxed: false)}
if Int(flags) & Int(1 << 1) != 0 {serializeString(transactionId!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 1) != 0 {serializeString(transactionId!, buffer: buffer, boxed: false)}
break break
case .messageActionGiftTon(let flags, let currency, let amount, let cryptoCurrency, let cryptoAmount, let transactionId):
if boxed {
buffer.appendInt32(-1465661799)
}
serializeInt32(flags, buffer: buffer, boxed: false)
serializeString(currency, buffer: buffer, boxed: false)
serializeInt64(amount, buffer: buffer, boxed: false)
serializeString(cryptoCurrency, buffer: buffer, boxed: false)
serializeInt64(cryptoAmount, buffer: buffer, boxed: false)
if Int(flags) & Int(1 << 0) != 0 {serializeString(transactionId!, buffer: buffer, boxed: false)}
break
case .messageActionGiveawayLaunch(let flags, let stars): case .messageActionGiveawayLaunch(let flags, let stars):
if boxed { if boxed {
buffer.appendInt32(-1475391004) buffer.appendInt32(-1475391004)
@ -919,6 +931,8 @@ public extension Api {
return ("messageActionGiftPremium", [("flags", flags as Any), ("currency", currency as Any), ("amount", amount as Any), ("months", months as Any), ("cryptoCurrency", cryptoCurrency as Any), ("cryptoAmount", cryptoAmount as Any), ("message", message as Any)]) return ("messageActionGiftPremium", [("flags", flags as Any), ("currency", currency as Any), ("amount", amount as Any), ("months", months as Any), ("cryptoCurrency", cryptoCurrency as Any), ("cryptoAmount", cryptoAmount as Any), ("message", message as Any)])
case .messageActionGiftStars(let flags, let currency, let amount, let stars, let cryptoCurrency, let cryptoAmount, let transactionId): case .messageActionGiftStars(let flags, let currency, let amount, let stars, let cryptoCurrency, let cryptoAmount, let transactionId):
return ("messageActionGiftStars", [("flags", flags as Any), ("currency", currency as Any), ("amount", amount as Any), ("stars", stars as Any), ("cryptoCurrency", cryptoCurrency as Any), ("cryptoAmount", cryptoAmount as Any), ("transactionId", transactionId as Any)]) return ("messageActionGiftStars", [("flags", flags as Any), ("currency", currency as Any), ("amount", amount as Any), ("stars", stars as Any), ("cryptoCurrency", cryptoCurrency as Any), ("cryptoAmount", cryptoAmount as Any), ("transactionId", transactionId as Any)])
case .messageActionGiftTon(let flags, let currency, let amount, let cryptoCurrency, let cryptoAmount, let transactionId):
return ("messageActionGiftTon", [("flags", flags as Any), ("currency", currency as Any), ("amount", amount as Any), ("cryptoCurrency", cryptoCurrency as Any), ("cryptoAmount", cryptoAmount as Any), ("transactionId", transactionId as Any)])
case .messageActionGiveawayLaunch(let flags, let stars): case .messageActionGiveawayLaunch(let flags, let stars):
return ("messageActionGiveawayLaunch", [("flags", flags as Any), ("stars", stars as Any)]) return ("messageActionGiveawayLaunch", [("flags", flags as Any), ("stars", stars as Any)])
case .messageActionGiveawayResults(let flags, let winnersCount, let unclaimedCount): case .messageActionGiveawayResults(let flags, let winnersCount, let unclaimedCount):
@ -1306,6 +1320,32 @@ public extension Api {
return nil return nil
} }
} }
public static func parse_messageActionGiftTon(_ reader: BufferReader) -> MessageAction? {
var _1: Int32?
_1 = reader.readInt32()
var _2: String?
_2 = parseString(reader)
var _3: Int64?
_3 = reader.readInt64()
var _4: String?
_4 = parseString(reader)
var _5: Int64?
_5 = reader.readInt64()
var _6: String?
if Int(_1!) & Int(1 << 0) != 0 {_6 = parseString(reader) }
let _c1 = _1 != nil
let _c2 = _2 != nil
let _c3 = _3 != nil
let _c4 = _4 != nil
let _c5 = _5 != nil
let _c6 = (Int(_1!) & Int(1 << 0) == 0) || _6 != nil
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 {
return Api.MessageAction.messageActionGiftTon(flags: _1!, currency: _2!, amount: _3!, cryptoCurrency: _4!, cryptoAmount: _5!, transactionId: _6)
}
else {
return nil
}
}
public static func parse_messageActionGiveawayLaunch(_ reader: BufferReader) -> MessageAction? { public static func parse_messageActionGiveawayLaunch(_ reader: BufferReader) -> MessageAction? {
var _1: Int32? var _1: Int32?
_1 = reader.readInt32() _1 = reader.readInt32()

View File

@ -59,6 +59,7 @@ public extension Api {
public extension Api { public extension Api {
enum StarsAmount: TypeConstructorDescription { enum StarsAmount: TypeConstructorDescription {
case starsAmount(amount: Int64, nanos: Int32) case starsAmount(amount: Int64, nanos: Int32)
case starsTonAmount(amount: Int64)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self { switch self {
@ -69,6 +70,12 @@ public extension Api {
serializeInt64(amount, buffer: buffer, boxed: false) serializeInt64(amount, buffer: buffer, boxed: false)
serializeInt32(nanos, buffer: buffer, boxed: false) serializeInt32(nanos, buffer: buffer, boxed: false)
break break
case .starsTonAmount(let amount):
if boxed {
buffer.appendInt32(1957618656)
}
serializeInt64(amount, buffer: buffer, boxed: false)
break
} }
} }
@ -76,6 +83,8 @@ public extension Api {
switch self { switch self {
case .starsAmount(let amount, let nanos): case .starsAmount(let amount, let nanos):
return ("starsAmount", [("amount", amount as Any), ("nanos", nanos as Any)]) return ("starsAmount", [("amount", amount as Any), ("nanos", nanos as Any)])
case .starsTonAmount(let amount):
return ("starsTonAmount", [("amount", amount as Any)])
} }
} }
@ -93,6 +102,17 @@ public extension Api {
return nil return nil
} }
} }
public static func parse_starsTonAmount(_ reader: BufferReader) -> StarsAmount? {
var _1: Int64?
_1 = reader.readInt64()
let _c1 = _1 != nil
if _c1 {
return Api.StarsAmount.starsTonAmount(amount: _1!)
}
else {
return nil
}
}
} }
} }
@ -1294,153 +1314,3 @@ public extension Api {
} }
} }
public extension Api {
enum StickerSetCovered: TypeConstructorDescription {
case stickerSetCovered(set: Api.StickerSet, cover: Api.Document)
case stickerSetFullCovered(set: Api.StickerSet, packs: [Api.StickerPack], keywords: [Api.StickerKeyword], documents: [Api.Document])
case stickerSetMultiCovered(set: Api.StickerSet, covers: [Api.Document])
case stickerSetNoCovered(set: Api.StickerSet)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
case .stickerSetCovered(let set, let cover):
if boxed {
buffer.appendInt32(1678812626)
}
set.serialize(buffer, true)
cover.serialize(buffer, true)
break
case .stickerSetFullCovered(let set, let packs, let keywords, let documents):
if boxed {
buffer.appendInt32(1087454222)
}
set.serialize(buffer, true)
buffer.appendInt32(481674261)
buffer.appendInt32(Int32(packs.count))
for item in packs {
item.serialize(buffer, true)
}
buffer.appendInt32(481674261)
buffer.appendInt32(Int32(keywords.count))
for item in keywords {
item.serialize(buffer, true)
}
buffer.appendInt32(481674261)
buffer.appendInt32(Int32(documents.count))
for item in documents {
item.serialize(buffer, true)
}
break
case .stickerSetMultiCovered(let set, let covers):
if boxed {
buffer.appendInt32(872932635)
}
set.serialize(buffer, true)
buffer.appendInt32(481674261)
buffer.appendInt32(Int32(covers.count))
for item in covers {
item.serialize(buffer, true)
}
break
case .stickerSetNoCovered(let set):
if boxed {
buffer.appendInt32(2008112412)
}
set.serialize(buffer, true)
break
}
}
public func descriptionFields() -> (String, [(String, Any)]) {
switch self {
case .stickerSetCovered(let set, let cover):
return ("stickerSetCovered", [("set", set as Any), ("cover", cover as Any)])
case .stickerSetFullCovered(let set, let packs, let keywords, let documents):
return ("stickerSetFullCovered", [("set", set as Any), ("packs", packs as Any), ("keywords", keywords as Any), ("documents", documents as Any)])
case .stickerSetMultiCovered(let set, let covers):
return ("stickerSetMultiCovered", [("set", set as Any), ("covers", covers as Any)])
case .stickerSetNoCovered(let set):
return ("stickerSetNoCovered", [("set", set as Any)])
}
}
public static func parse_stickerSetCovered(_ reader: BufferReader) -> StickerSetCovered? {
var _1: Api.StickerSet?
if let signature = reader.readInt32() {
_1 = Api.parse(reader, signature: signature) as? Api.StickerSet
}
var _2: Api.Document?
if let signature = reader.readInt32() {
_2 = Api.parse(reader, signature: signature) as? Api.Document
}
let _c1 = _1 != nil
let _c2 = _2 != nil
if _c1 && _c2 {
return Api.StickerSetCovered.stickerSetCovered(set: _1!, cover: _2!)
}
else {
return nil
}
}
public static func parse_stickerSetFullCovered(_ reader: BufferReader) -> StickerSetCovered? {
var _1: Api.StickerSet?
if let signature = reader.readInt32() {
_1 = Api.parse(reader, signature: signature) as? Api.StickerSet
}
var _2: [Api.StickerPack]?
if let _ = reader.readInt32() {
_2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.StickerPack.self)
}
var _3: [Api.StickerKeyword]?
if let _ = reader.readInt32() {
_3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.StickerKeyword.self)
}
var _4: [Api.Document]?
if let _ = reader.readInt32() {
_4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Document.self)
}
let _c1 = _1 != nil
let _c2 = _2 != nil
let _c3 = _3 != nil
let _c4 = _4 != nil
if _c1 && _c2 && _c3 && _c4 {
return Api.StickerSetCovered.stickerSetFullCovered(set: _1!, packs: _2!, keywords: _3!, documents: _4!)
}
else {
return nil
}
}
public static func parse_stickerSetMultiCovered(_ reader: BufferReader) -> StickerSetCovered? {
var _1: Api.StickerSet?
if let signature = reader.readInt32() {
_1 = Api.parse(reader, signature: signature) as? Api.StickerSet
}
var _2: [Api.Document]?
if let _ = reader.readInt32() {
_2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Document.self)
}
let _c1 = _1 != nil
let _c2 = _2 != nil
if _c1 && _c2 {
return Api.StickerSetCovered.stickerSetMultiCovered(set: _1!, covers: _2!)
}
else {
return nil
}
}
public static func parse_stickerSetNoCovered(_ reader: BufferReader) -> StickerSetCovered? {
var _1: Api.StickerSet?
if let signature = reader.readInt32() {
_1 = Api.parse(reader, signature: signature) as? Api.StickerSet
}
let _c1 = _1 != nil
if _c1 {
return Api.StickerSetCovered.stickerSetNoCovered(set: _1!)
}
else {
return nil
}
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -130,7 +130,7 @@ enum AccountStateMutationOperation {
case UpdateNewAuthorization(isUnconfirmed: Bool, hash: Int64, date: Int32, device: String, location: String) case UpdateNewAuthorization(isUnconfirmed: Bool, hash: Int64, date: Int32, device: String, location: String)
case UpdateWallpaper(peerId: PeerId, wallpaper: TelegramWallpaper?) case UpdateWallpaper(peerId: PeerId, wallpaper: TelegramWallpaper?)
case UpdateRevenueBalances(peerId: PeerId, balances: RevenueStats.Balances) case UpdateRevenueBalances(peerId: PeerId, balances: RevenueStats.Balances)
case UpdateStarsBalance(peerId: PeerId, balance: Api.StarsAmount) case UpdateStarsBalance(peerId: PeerId, ton: Bool, balance: Api.StarsAmount)
case UpdateStarsRevenueStatus(peerId: PeerId, status: StarsRevenueStats.Balances) case UpdateStarsRevenueStatus(peerId: PeerId, status: StarsRevenueStats.Balances)
case UpdateStarsReactionsDefaultPrivacy(privacy: TelegramPaidReactionPrivacy) case UpdateStarsReactionsDefaultPrivacy(privacy: TelegramPaidReactionPrivacy)
case ReportMessageDelivery([MessageId]) case ReportMessageDelivery([MessageId])
@ -696,8 +696,8 @@ struct AccountMutableState {
self.addOperation(.UpdateRevenueBalances(peerId: peerId, balances: balances)) self.addOperation(.UpdateRevenueBalances(peerId: peerId, balances: balances))
} }
mutating func updateStarsBalance(peerId: PeerId, balance: Api.StarsAmount) { mutating func updateStarsBalance(peerId: PeerId, ton: Bool, balance: Api.StarsAmount) {
self.addOperation(.UpdateStarsBalance(peerId: peerId, balance: balance)) self.addOperation(.UpdateStarsBalance(peerId: peerId, ton: ton, balance: balance))
} }
mutating func updateStarsRevenueStatus(peerId: PeerId, status: StarsRevenueStats.Balances) { mutating func updateStarsRevenueStatus(peerId: PeerId, status: StarsRevenueStats.Balances) {
@ -860,6 +860,7 @@ struct AccountReplayedFinalState {
let isPremiumUpdated: Bool let isPremiumUpdated: Bool
let updatedRevenueBalances: [PeerId: RevenueStats.Balances] let updatedRevenueBalances: [PeerId: RevenueStats.Balances]
let updatedStarsBalance: [PeerId: StarsAmount] let updatedStarsBalance: [PeerId: StarsAmount]
let updatedTonBalance: [PeerId: StarsAmount]
let updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances] let updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances]
let sentScheduledMessageIds: Set<MessageId> let sentScheduledMessageIds: Set<MessageId>
let reportMessageDelivery: Set<MessageId> let reportMessageDelivery: Set<MessageId>
@ -893,15 +894,16 @@ struct AccountFinalStateEvents {
let isPremiumUpdated: Bool let isPremiumUpdated: Bool
let updatedRevenueBalances: [PeerId: RevenueStats.Balances] let updatedRevenueBalances: [PeerId: RevenueStats.Balances]
let updatedStarsBalance: [PeerId: StarsAmount] let updatedStarsBalance: [PeerId: StarsAmount]
let updatedTonBalance: [PeerId: StarsAmount]
let updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances] let updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances]
let reportMessageDelivery: Set<MessageId> let reportMessageDelivery: Set<MessageId>
let addedConferenceInvitationMessagesIds: [MessageId] let addedConferenceInvitationMessagesIds: [MessageId]
var isEmpty: Bool { var isEmpty: Bool {
return self.addedIncomingMessageIds.isEmpty && self.addedReactionEvents.isEmpty && self.wasScheduledMessageIds.isEmpty && self.deletedMessageIds.isEmpty && self.sentScheduledMessageIds.isEmpty && self.updatedTypingActivities.isEmpty && self.updatedWebpages.isEmpty && self.updatedCalls.isEmpty && self.addedCallSignalingData.isEmpty && self.updatedGroupCallParticipants.isEmpty && self.storyUpdates.isEmpty && self.updatedPeersNearby?.isEmpty ?? true && self.isContactUpdates.isEmpty && self.displayAlerts.isEmpty && self.dismissBotWebViews.isEmpty && self.delayNotificatonsUntil == nil && self.updatedMaxMessageId == nil && self.updatedQts == nil && self.externallyUpdatedPeerId.isEmpty && !authorizationListUpdated && self.updatedIncomingThreadReadStates.isEmpty && self.updatedOutgoingThreadReadStates.isEmpty && !self.updateConfig && !self.isPremiumUpdated && self.updatedRevenueBalances.isEmpty && self.updatedStarsBalance.isEmpty && self.updatedStarsRevenueStatus.isEmpty && self.reportMessageDelivery.isEmpty && self.addedConferenceInvitationMessagesIds.isEmpty return self.addedIncomingMessageIds.isEmpty && self.addedReactionEvents.isEmpty && self.wasScheduledMessageIds.isEmpty && self.deletedMessageIds.isEmpty && self.sentScheduledMessageIds.isEmpty && self.updatedTypingActivities.isEmpty && self.updatedWebpages.isEmpty && self.updatedCalls.isEmpty && self.addedCallSignalingData.isEmpty && self.updatedGroupCallParticipants.isEmpty && self.storyUpdates.isEmpty && self.updatedPeersNearby?.isEmpty ?? true && self.isContactUpdates.isEmpty && self.displayAlerts.isEmpty && self.dismissBotWebViews.isEmpty && self.delayNotificatonsUntil == nil && self.updatedMaxMessageId == nil && self.updatedQts == nil && self.externallyUpdatedPeerId.isEmpty && !authorizationListUpdated && self.updatedIncomingThreadReadStates.isEmpty && self.updatedOutgoingThreadReadStates.isEmpty && !self.updateConfig && !self.isPremiumUpdated && self.updatedRevenueBalances.isEmpty && self.updatedStarsBalance.isEmpty && self.updatedTonBalance.isEmpty && self.updatedStarsRevenueStatus.isEmpty && self.reportMessageDelivery.isEmpty && self.addedConferenceInvitationMessagesIds.isEmpty
} }
init(addedIncomingMessageIds: [MessageId] = [], addedReactionEvents: [(reactionAuthor: Peer, reaction: MessageReaction.Reaction, message: Message, timestamp: Int32)] = [], wasScheduledMessageIds: [MessageId] = [], deletedMessageIds: [DeletedMessageId] = [], updatedTypingActivities: [PeerActivitySpace: [PeerId: PeerInputActivity?]] = [:], updatedWebpages: [MediaId: TelegramMediaWebpage] = [:], updatedCalls: [Api.PhoneCall] = [], addedCallSignalingData: [(Int64, Data)] = [], updatedGroupCallParticipants: [(Int64, GroupCallParticipantsContext.Update)] = [], storyUpdates: [InternalStoryUpdate] = [], updatedPeersNearby: [PeerNearby]? = nil, isContactUpdates: [(PeerId, Bool)] = [], displayAlerts: [(text: String, isDropAuth: Bool)] = [], dismissBotWebViews: [Int64] = [], delayNotificatonsUntil: Int32? = nil, updatedMaxMessageId: Int32? = nil, updatedQts: Int32? = nil, externallyUpdatedPeerId: Set<PeerId> = Set(), authorizationListUpdated: Bool = false, updatedIncomingThreadReadStates: [PeerAndBoundThreadId: MessageId.Id] = [:], updatedOutgoingThreadReadStates: [PeerAndBoundThreadId: MessageId.Id] = [:], updateConfig: Bool = false, isPremiumUpdated: Bool = false, updatedRevenueBalances: [PeerId: RevenueStats.Balances] = [:], updatedStarsBalance: [PeerId: StarsAmount] = [:], updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances] = [:], sentScheduledMessageIds: Set<MessageId> = Set(), reportMessageDelivery: Set<MessageId> = Set(), addedConferenceInvitationMessagesIds: [MessageId] = []) { init(addedIncomingMessageIds: [MessageId] = [], addedReactionEvents: [(reactionAuthor: Peer, reaction: MessageReaction.Reaction, message: Message, timestamp: Int32)] = [], wasScheduledMessageIds: [MessageId] = [], deletedMessageIds: [DeletedMessageId] = [], updatedTypingActivities: [PeerActivitySpace: [PeerId: PeerInputActivity?]] = [:], updatedWebpages: [MediaId: TelegramMediaWebpage] = [:], updatedCalls: [Api.PhoneCall] = [], addedCallSignalingData: [(Int64, Data)] = [], updatedGroupCallParticipants: [(Int64, GroupCallParticipantsContext.Update)] = [], storyUpdates: [InternalStoryUpdate] = [], updatedPeersNearby: [PeerNearby]? = nil, isContactUpdates: [(PeerId, Bool)] = [], displayAlerts: [(text: String, isDropAuth: Bool)] = [], dismissBotWebViews: [Int64] = [], delayNotificatonsUntil: Int32? = nil, updatedMaxMessageId: Int32? = nil, updatedQts: Int32? = nil, externallyUpdatedPeerId: Set<PeerId> = Set(), authorizationListUpdated: Bool = false, updatedIncomingThreadReadStates: [PeerAndBoundThreadId: MessageId.Id] = [:], updatedOutgoingThreadReadStates: [PeerAndBoundThreadId: MessageId.Id] = [:], updateConfig: Bool = false, isPremiumUpdated: Bool = false, updatedRevenueBalances: [PeerId: RevenueStats.Balances] = [:], updatedStarsBalance: [PeerId: StarsAmount] = [:], updatedTonBalance: [PeerId: StarsAmount] = [:], updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances] = [:], sentScheduledMessageIds: Set<MessageId> = Set(), reportMessageDelivery: Set<MessageId> = Set(), addedConferenceInvitationMessagesIds: [MessageId] = []) {
self.addedIncomingMessageIds = addedIncomingMessageIds self.addedIncomingMessageIds = addedIncomingMessageIds
self.addedReactionEvents = addedReactionEvents self.addedReactionEvents = addedReactionEvents
self.wasScheduledMessageIds = wasScheduledMessageIds self.wasScheduledMessageIds = wasScheduledMessageIds
@ -927,6 +929,7 @@ struct AccountFinalStateEvents {
self.isPremiumUpdated = isPremiumUpdated self.isPremiumUpdated = isPremiumUpdated
self.updatedRevenueBalances = updatedRevenueBalances self.updatedRevenueBalances = updatedRevenueBalances
self.updatedStarsBalance = updatedStarsBalance self.updatedStarsBalance = updatedStarsBalance
self.updatedTonBalance = updatedTonBalance
self.updatedStarsRevenueStatus = updatedStarsRevenueStatus self.updatedStarsRevenueStatus = updatedStarsRevenueStatus
self.sentScheduledMessageIds = sentScheduledMessageIds self.sentScheduledMessageIds = sentScheduledMessageIds
self.reportMessageDelivery = reportMessageDelivery self.reportMessageDelivery = reportMessageDelivery
@ -959,6 +962,7 @@ struct AccountFinalStateEvents {
self.isPremiumUpdated = state.isPremiumUpdated self.isPremiumUpdated = state.isPremiumUpdated
self.updatedRevenueBalances = state.updatedRevenueBalances self.updatedRevenueBalances = state.updatedRevenueBalances
self.updatedStarsBalance = state.updatedStarsBalance self.updatedStarsBalance = state.updatedStarsBalance
self.updatedTonBalance = state.updatedTonBalance
self.updatedStarsRevenueStatus = state.updatedStarsRevenueStatus self.updatedStarsRevenueStatus = state.updatedStarsRevenueStatus
self.sentScheduledMessageIds = state.sentScheduledMessageIds self.sentScheduledMessageIds = state.sentScheduledMessageIds
self.reportMessageDelivery = state.reportMessageDelivery self.reportMessageDelivery = state.reportMessageDelivery
@ -1025,6 +1029,7 @@ struct AccountFinalStateEvents {
isPremiumUpdated: isPremiumUpdated, isPremiumUpdated: isPremiumUpdated,
updatedRevenueBalances: self.updatedRevenueBalances.merging(other.updatedRevenueBalances, uniquingKeysWith: { lhs, _ in lhs }), updatedRevenueBalances: self.updatedRevenueBalances.merging(other.updatedRevenueBalances, uniquingKeysWith: { lhs, _ in lhs }),
updatedStarsBalance: self.updatedStarsBalance.merging(other.updatedStarsBalance, uniquingKeysWith: { lhs, _ in lhs }), updatedStarsBalance: self.updatedStarsBalance.merging(other.updatedStarsBalance, uniquingKeysWith: { lhs, _ in lhs }),
updatedTonBalance: self.updatedTonBalance.merging(other.updatedTonBalance, uniquingKeysWith: { lhs, _ in lhs }),
updatedStarsRevenueStatus: self.updatedStarsRevenueStatus.merging(other.updatedStarsRevenueStatus, uniquingKeysWith: { lhs, _ in lhs }), updatedStarsRevenueStatus: self.updatedStarsRevenueStatus.merging(other.updatedStarsRevenueStatus, uniquingKeysWith: { lhs, _ in lhs }),
sentScheduledMessageIds: sentScheduledMessageIds, sentScheduledMessageIds: sentScheduledMessageIds,
reportMessageDelivery: reportMessageDelivery, reportMessageDelivery: reportMessageDelivery,

View File

@ -232,7 +232,7 @@ func apiMessagePeerIds(_ message: Api.Message) -> [PeerId] {
} }
switch action { switch action {
case .messageActionChannelCreate, .messageActionChatDeletePhoto, .messageActionChatEditPhoto, .messageActionChatEditTitle, .messageActionEmpty, .messageActionPinMessage, .messageActionHistoryClear, .messageActionGameScore, .messageActionPaymentSent, .messageActionPaymentSentMe, .messageActionPhoneCall, .messageActionScreenshotTaken, .messageActionCustomAction, .messageActionBotAllowed, .messageActionSecureValuesSent, .messageActionSecureValuesSentMe, .messageActionContactSignUp, .messageActionGroupCall, .messageActionSetMessagesTTL, .messageActionGroupCallScheduled, .messageActionSetChatTheme, .messageActionChatJoinedByRequest, .messageActionWebViewDataSent, .messageActionWebViewDataSentMe, .messageActionGiftPremium, .messageActionGiftStars, .messageActionTopicCreate, .messageActionTopicEdit, .messageActionSuggestProfilePhoto, .messageActionSetChatWallPaper, .messageActionGiveawayLaunch, .messageActionGiveawayResults, .messageActionBoostApply, .messageActionRequestedPeerSentMe, .messageActionStarGift, .messageActionStarGiftUnique, .messageActionPaidMessagesRefunded, .messageActionPaidMessagesPrice, .messageActionTodoCompletions, .messageActionTodoAppendTasks, .messageActionSuggestedPostApproval: case .messageActionChannelCreate, .messageActionChatDeletePhoto, .messageActionChatEditPhoto, .messageActionChatEditTitle, .messageActionEmpty, .messageActionPinMessage, .messageActionHistoryClear, .messageActionGameScore, .messageActionPaymentSent, .messageActionPaymentSentMe, .messageActionPhoneCall, .messageActionScreenshotTaken, .messageActionCustomAction, .messageActionBotAllowed, .messageActionSecureValuesSent, .messageActionSecureValuesSentMe, .messageActionContactSignUp, .messageActionGroupCall, .messageActionSetMessagesTTL, .messageActionGroupCallScheduled, .messageActionSetChatTheme, .messageActionChatJoinedByRequest, .messageActionWebViewDataSent, .messageActionWebViewDataSentMe, .messageActionGiftPremium, .messageActionGiftStars, .messageActionTopicCreate, .messageActionTopicEdit, .messageActionSuggestProfilePhoto, .messageActionSetChatWallPaper, .messageActionGiveawayLaunch, .messageActionGiveawayResults, .messageActionBoostApply, .messageActionRequestedPeerSentMe, .messageActionStarGift, .messageActionStarGiftUnique, .messageActionPaidMessagesRefunded, .messageActionPaidMessagesPrice, .messageActionTodoCompletions, .messageActionTodoAppendTasks, .messageActionSuggestedPostApproval, .messageActionGiftTon:
break break
case let .messageActionChannelMigrateFrom(_, chatId): case let .messageActionChannelMigrateFrom(_, chatId):
result.append(PeerId(namespace: Namespaces.Peer.CloudGroup, id: PeerId.Id._internalFromInt64Value(chatId))) result.append(PeerId(namespace: Namespaces.Peer.CloudGroup, id: PeerId.Id._internalFromInt64Value(chatId)))

View File

@ -244,6 +244,8 @@ func telegramMediaActionFromApiAction(_ action: Api.MessageAction) -> TelegramMe
status = .approved(timestamp: scheduleDate, amount: starsAmount ?? 0) status = .approved(timestamp: scheduleDate, amount: starsAmount ?? 0)
} }
return TelegramMediaAction(action: .suggestedPostApprovalStatus(status: status)) return TelegramMediaAction(action: .suggestedPostApprovalStatus(status: status))
case let .messageActionGiftTon(_, currency, amount, cryptoCurrency, cryptoAmount, transactionId):
return TelegramMediaAction(action: .giftTon(currency: currency, amount: amount, cryptoCurrency: cryptoCurrency, cryptoAmount: cryptoAmount, transactionId: transactionId))
} }
} }

View File

@ -1839,7 +1839,9 @@ private func finalStateWithUpdatesAndServerTime(accountPeerId: PeerId, postbox:
case let .updateBroadcastRevenueTransactions(peer, balances): case let .updateBroadcastRevenueTransactions(peer, balances):
updatedState.updateRevenueBalances(peerId: peer.peerId, balances: RevenueStats.Balances(apiRevenueBalances: balances)) updatedState.updateRevenueBalances(peerId: peer.peerId, balances: RevenueStats.Balances(apiRevenueBalances: balances))
case let .updateStarsBalance(balance): case let .updateStarsBalance(balance):
updatedState.updateStarsBalance(peerId: accountPeerId, balance: balance) updatedState.updateStarsBalance(peerId: accountPeerId, ton: false, balance: balance)
case let .updateStarsTonBalance(balance):
updatedState.updateStarsBalance(peerId: accountPeerId, ton: true, balance: balance)
case let .updateStarsRevenueStatus(peer, status): case let .updateStarsRevenueStatus(peer, status):
updatedState.updateStarsRevenueStatus(peerId: peer.peerId, status: StarsRevenueStats.Balances(apiStarsRevenueStatus: status)) updatedState.updateStarsRevenueStatus(peerId: peer.peerId, status: StarsRevenueStats.Balances(apiStarsRevenueStatus: status))
case let .updatePaidReactionPrivacy(privacy): case let .updatePaidReactionPrivacy(privacy):
@ -3717,6 +3719,7 @@ func replayFinalState(
var updateConfig = false var updateConfig = false
var updatedRevenueBalances: [PeerId: RevenueStats.Balances] = [:] var updatedRevenueBalances: [PeerId: RevenueStats.Balances] = [:]
var updatedStarsBalance: [PeerId: StarsAmount] = [:] var updatedStarsBalance: [PeerId: StarsAmount] = [:]
var updatedTonBalance: [PeerId: StarsAmount] = [:]
var updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances] = [:] var updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances] = [:]
var updatedStarsReactionsDefaultPrivacy: TelegramPaidReactionPrivacy? var updatedStarsReactionsDefaultPrivacy: TelegramPaidReactionPrivacy?
var reportMessageDelivery = Set<MessageId>() var reportMessageDelivery = Set<MessageId>()
@ -5169,8 +5172,12 @@ func replayFinalState(
} }
case let .UpdateRevenueBalances(peerId, balances): case let .UpdateRevenueBalances(peerId, balances):
updatedRevenueBalances[peerId] = balances updatedRevenueBalances[peerId] = balances
case let .UpdateStarsBalance(peerId, balance): case let .UpdateStarsBalance(peerId, ton, balance):
updatedStarsBalance[peerId] = StarsAmount(apiAmount: balance) if ton {
updatedTonBalance[peerId] = StarsAmount(apiAmount: balance)
} else {
updatedStarsBalance[peerId] = StarsAmount(apiAmount: balance)
}
case let .UpdateStarsRevenueStatus(peerId, status): case let .UpdateStarsRevenueStatus(peerId, status):
updatedStarsRevenueStatus[peerId] = status updatedStarsRevenueStatus[peerId] = status
case let .UpdateStarsReactionsDefaultPrivacy(value): case let .UpdateStarsReactionsDefaultPrivacy(value):
@ -5697,6 +5704,7 @@ func replayFinalState(
isPremiumUpdated: isPremiumUpdated, isPremiumUpdated: isPremiumUpdated,
updatedRevenueBalances: updatedRevenueBalances, updatedRevenueBalances: updatedRevenueBalances,
updatedStarsBalance: updatedStarsBalance, updatedStarsBalance: updatedStarsBalance,
updatedTonBalance: updatedTonBalance,
updatedStarsRevenueStatus: updatedStarsRevenueStatus, updatedStarsRevenueStatus: updatedStarsRevenueStatus,
sentScheduledMessageIds: finalState.state.sentScheduledMessageIds, sentScheduledMessageIds: finalState.state.sentScheduledMessageIds,
reportMessageDelivery: reportMessageDelivery, reportMessageDelivery: reportMessageDelivery,

View File

@ -355,6 +355,7 @@ public final class AccountStateManager {
private var updatedPeersNearbyContext = UpdatedPeersNearbySubscriberContext() private var updatedPeersNearbyContext = UpdatedPeersNearbySubscriberContext()
private var updatedRevenueBalancesContext = UpdatedRevenueBalancesSubscriberContext() private var updatedRevenueBalancesContext = UpdatedRevenueBalancesSubscriberContext()
private var updatedStarsBalanceContext = UpdatedStarsBalanceSubscriberContext() private var updatedStarsBalanceContext = UpdatedStarsBalanceSubscriberContext()
private var updatedTonBalanceContext = UpdatedStarsBalanceSubscriberContext()
private var updatedStarsRevenueStatusContext = UpdatedStarsRevenueStatusSubscriberContext() private var updatedStarsRevenueStatusContext = UpdatedStarsRevenueStatusSubscriberContext()
private let delayNotificatonsUntil = Atomic<Int32?>(value: nil) private let delayNotificatonsUntil = Atomic<Int32?>(value: nil)
@ -1117,6 +1118,9 @@ public final class AccountStateManager {
if !events.updatedStarsBalance.isEmpty { if !events.updatedStarsBalance.isEmpty {
strongSelf.notifyUpdatedStarsBalance(events.updatedStarsBalance) strongSelf.notifyUpdatedStarsBalance(events.updatedStarsBalance)
} }
if !events.updatedTonBalance.isEmpty {
strongSelf.notifyUpdatedTonBalance(events.updatedTonBalance)
}
if !events.updatedStarsRevenueStatus.isEmpty { if !events.updatedStarsRevenueStatus.isEmpty {
strongSelf.notifyUpdatedStarsRevenueStatus(events.updatedStarsRevenueStatus) strongSelf.notifyUpdatedStarsRevenueStatus(events.updatedStarsRevenueStatus)
} }
@ -1751,12 +1755,39 @@ public final class AccountStateManager {
return disposable return disposable
} }
} }
private func notifyUpdatedStarsBalance(_ updatedStarsBalance: [PeerId: StarsAmount]) { private func notifyUpdatedStarsBalance(_ updatedStarsBalance: [PeerId: StarsAmount]) {
for subscriber in self.updatedStarsBalanceContext.subscribers.copyItems() { for subscriber in self.updatedStarsBalanceContext.subscribers.copyItems() {
subscriber(updatedStarsBalance) subscriber(updatedStarsBalance)
} }
} }
public func updatedTonBalance() -> Signal<[PeerId: StarsAmount], NoError> {
let queue = self.queue
return Signal { [weak self] subscriber in
let disposable = MetaDisposable()
queue.async {
if let strongSelf = self {
let index = strongSelf.updatedTonBalanceContext.subscribers.add({ starsBalance in
subscriber.putNext(starsBalance)
})
disposable.set(ActionDisposable {
if let strongSelf = self {
strongSelf.updatedTonBalanceContext.subscribers.remove(index)
}
})
}
}
return disposable
}
}
private func notifyUpdatedTonBalance(_ updatedTonBalance: [PeerId: StarsAmount]) {
for subscriber in self.updatedTonBalanceContext.subscribers.copyItems() {
subscriber(updatedTonBalance)
}
}
public func updatedStarsRevenueStatus() -> Signal<[PeerId: StarsRevenueStats.Balances], NoError> { public func updatedStarsRevenueStatus() -> Signal<[PeerId: StarsRevenueStats.Balances], NoError> {
let queue = self.queue let queue = self.queue
@ -2007,6 +2038,7 @@ public final class AccountStateManager {
let messagesRemovedContext = MessagesRemovedContext() let messagesRemovedContext = MessagesRemovedContext()
public weak var starsContext: StarsContext? public weak var starsContext: StarsContext?
public weak var tonContext: StarsContext?
init( init(
accountPeerId: PeerId, accountPeerId: PeerId,
@ -2145,6 +2177,12 @@ public final class AccountStateManager {
} }
} }
public func updatedTonBalance() -> Signal<[PeerId: StarsAmount], NoError> {
return self.impl.signalWith { impl, subscriber in
return impl.updatedStarsBalance().start(next: subscriber.putNext, error: subscriber.putError, completed: subscriber.putCompletion)
}
}
public func updatedStarsRevenueStatus() -> Signal<[PeerId: StarsRevenueStats.Balances], NoError> { public func updatedStarsRevenueStatus() -> Signal<[PeerId: StarsRevenueStats.Balances], NoError> {
return self.impl.signalWith { impl, subscriber in return self.impl.signalWith { impl, subscriber in
return impl.updatedStarsRevenueStatus().start(next: subscriber.putNext, error: subscriber.putError, completed: subscriber.putCompletion) return impl.updatedStarsRevenueStatus().start(next: subscriber.putNext, error: subscriber.putError, completed: subscriber.putCompletion)

View File

@ -225,6 +225,7 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable {
case todoCompletions(completed: [Int32], incompleted: [Int32]) case todoCompletions(completed: [Int32], incompleted: [Int32])
case todoAppendTasks([TelegramMediaTodo.Item]) case todoAppendTasks([TelegramMediaTodo.Item])
case suggestedPostApprovalStatus(status: SuggestedPostApprovalStatus) case suggestedPostApprovalStatus(status: SuggestedPostApprovalStatus)
case giftTon(currency: String, amount: Int64, cryptoCurrency: String?, cryptoAmount: Int64?, transactionId: String?)
public init(decoder: PostboxDecoder) { public init(decoder: PostboxDecoder) {
let rawValue: Int32 = decoder.decodeInt32ForKey("_rawValue", orElse: 0) let rawValue: Int32 = decoder.decodeInt32ForKey("_rawValue", orElse: 0)
@ -372,6 +373,8 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable {
case 51: case 51:
let status: SuggestedPostApprovalStatus? = decoder.decodeObjectForKey("st", decoder: { SuggestedPostApprovalStatus(decoder: $0) }) as? SuggestedPostApprovalStatus let status: SuggestedPostApprovalStatus? = decoder.decodeObjectForKey("st", decoder: { SuggestedPostApprovalStatus(decoder: $0) }) as? SuggestedPostApprovalStatus
self = .suggestedPostApprovalStatus(status: status ?? .rejected(reason: .generic, comment: nil)) self = .suggestedPostApprovalStatus(status: status ?? .rejected(reason: .generic, comment: nil))
case 52:
self = .giftTon(currency: decoder.decodeStringForKey("currency", orElse: ""), amount: decoder.decodeInt64ForKey("amount", orElse: 0), cryptoCurrency: decoder.decodeOptionalStringForKey("cryptoCurrency"), cryptoAmount: decoder.decodeOptionalInt64ForKey("cryptoAmount"), transactionId: decoder.decodeOptionalStringForKey("transactionId"))
default: default:
self = .unknown self = .unknown
} }
@ -785,6 +788,22 @@ public enum TelegramMediaActionType: PostboxCoding, Equatable {
case let .suggestedPostApprovalStatus(status): case let .suggestedPostApprovalStatus(status):
encoder.encodeInt32(51, forKey: "_rawValue") encoder.encodeInt32(51, forKey: "_rawValue")
encoder.encodeObject(status, forKey: "st") encoder.encodeObject(status, forKey: "st")
case let .giftTon(currency, amount, cryptoCurrency, cryptoAmount, transactionId):
encoder.encodeInt32(52, forKey: "_rawValue")
encoder.encodeString(currency, forKey: "currency")
encoder.encodeInt64(amount, forKey: "amount")
if let cryptoCurrency = cryptoCurrency, let cryptoAmount = cryptoAmount {
encoder.encodeString(cryptoCurrency, forKey: "cryptoCurrency")
encoder.encodeInt64(cryptoAmount, forKey: "cryptoAmount")
} else {
encoder.encodeNil(forKey: "cryptoCurrency")
encoder.encodeNil(forKey: "cryptoAmount")
}
if let transactionId {
encoder.encodeString(transactionId, forKey: "transactionId")
} else {
encoder.encodeNil(forKey: "transactionId")
}
} }
} }

View File

@ -348,6 +348,8 @@ extension StarsAmount {
switch apiAmount { switch apiAmount {
case let .starsAmount(amount, nanos): case let .starsAmount(amount, nanos):
self.init(value: amount, nanos: nanos) self.init(value: amount, nanos: nanos)
case let .starsTonAmount(amount):
self.init(value: amount, nanos: 0)
} }
} }
} }
@ -397,7 +399,7 @@ private enum RequestStarsStateError {
case generic case generic
} }
private func _internal_requestStarsState(account: Account, peerId: EnginePeer.Id, mode: StarsTransactionsContext.Mode, subscriptionId: String?, offset: String?, limit: Int32) -> Signal<InternalStarsStatus, RequestStarsStateError> { private func _internal_requestStarsState(account: Account, peerId: EnginePeer.Id, ton: Bool, mode: StarsTransactionsContext.Mode, subscriptionId: String?, offset: String?, limit: Int32) -> Signal<InternalStarsStatus, RequestStarsStateError> {
return account.postbox.transaction { transaction -> Peer? in return account.postbox.transaction { transaction -> Peer? in
return transaction.getPeer(peerId) return transaction.getPeer(peerId)
} }
@ -421,9 +423,16 @@ private func _internal_requestStarsState(account: Account, peerId: EnginePeer.Id
if let _ = subscriptionId { if let _ = subscriptionId {
flags = 1 << 3 flags = 1 << 3
} }
if ton {
flags = 1 << 4
}
signal = account.network.request(Api.functions.payments.getStarsTransactions(flags: flags, subscriptionId: subscriptionId, peer: inputPeer, offset: offset, limit: limit)) signal = account.network.request(Api.functions.payments.getStarsTransactions(flags: flags, subscriptionId: subscriptionId, peer: inputPeer, offset: offset, limit: limit))
} else { } else {
signal = account.network.request(Api.functions.payments.getStarsStatus(peer: inputPeer)) var flags: Int32 = 0
if ton {
flags = 1 << 0
}
signal = account.network.request(Api.functions.payments.getStarsStatus(flags: flags, peer: inputPeer))
} }
return signal return signal
@ -517,6 +526,7 @@ private func _internal_requestStarsSubscriptions(account: Account, peerId: Engin
private final class StarsContextImpl { private final class StarsContextImpl {
private let account: Account private let account: Account
fileprivate let peerId: EnginePeer.Id fileprivate let peerId: EnginePeer.Id
fileprivate let ton: Bool
fileprivate var _state: StarsContext.State? fileprivate var _state: StarsContext.State?
private let _statePromise = Promise<StarsContext.State?>() private let _statePromise = Promise<StarsContext.State?>()
@ -527,11 +537,12 @@ private final class StarsContextImpl {
private let disposable = MetaDisposable() private let disposable = MetaDisposable()
private var updateDisposable: Disposable? private var updateDisposable: Disposable?
init(account: Account) { init(account: Account, ton: Bool) {
assert(Queue.mainQueue().isCurrent()) assert(Queue.mainQueue().isCurrent())
self.account = account self.account = account
self.peerId = account.peerId self.peerId = account.peerId
self.ton = ton
self._state = nil self._state = nil
self._statePromise.set(.single(nil)) self._statePromise.set(.single(nil))
@ -564,7 +575,7 @@ private final class StarsContextImpl {
} }
self.previousLoadTimestamp = currentTimestamp self.previousLoadTimestamp = currentTimestamp
self.disposable.set((_internal_requestStarsState(account: self.account, peerId: self.peerId, mode: .all, subscriptionId: nil, offset: nil, limit: 5) self.disposable.set((_internal_requestStarsState(account: self.account, peerId: self.peerId, ton: self.ton, mode: .all, subscriptionId: nil, offset: nil, limit: 5)
|> deliverOnMainQueue).start(next: { [weak self] status in |> deliverOnMainQueue).start(next: { [weak self] status in
guard let self else { guard let self else {
return return
@ -1042,6 +1053,14 @@ public final class StarsContext {
return peerId! return peerId!
} }
var ton: Bool {
var ton = false
self.impl.syncWith { impl in
ton = impl.ton
}
return ton
}
public var currentState: StarsContext.State? { public var currentState: StarsContext.State? {
var state: StarsContext.State? var state: StarsContext.State?
self.impl.syncWith { impl in self.impl.syncWith { impl in
@ -1081,9 +1100,9 @@ public final class StarsContext {
} }
} }
init(account: Account) { init(account: Account, ton: Bool) {
self.impl = QueueLocalObject(queue: Queue.mainQueue(), generate: { self.impl = QueueLocalObject(queue: Queue.mainQueue(), generate: {
return StarsContextImpl(account: account) return StarsContextImpl(account: account, ton: ton)
}) })
} }
} }
@ -1092,6 +1111,7 @@ private final class StarsTransactionsContextImpl {
private let account: Account private let account: Account
private weak var starsContext: StarsContext? private weak var starsContext: StarsContext?
fileprivate let peerId: EnginePeer.Id fileprivate let peerId: EnginePeer.Id
fileprivate let ton: Bool
private let mode: StarsTransactionsContext.Mode private let mode: StarsTransactionsContext.Mode
fileprivate var _state: StarsTransactionsContext.State fileprivate var _state: StarsTransactionsContext.State
@ -1107,20 +1127,22 @@ private final class StarsTransactionsContextImpl {
init(account: Account, subject: StarsTransactionsContext.Subject, mode: StarsTransactionsContext.Mode) { init(account: Account, subject: StarsTransactionsContext.Subject, mode: StarsTransactionsContext.Mode) {
assert(Queue.mainQueue().isCurrent()) assert(Queue.mainQueue().isCurrent())
let currentTransactions: [StarsContext.State.Transaction] let currentTransactions: [StarsContext.State.Transaction]
self.account = account self.account = account
switch subject { switch subject {
case let .starsTransactionsContext(transactionsContext): case let .starsTransactionsContext(transactionsContext):
self.peerId = transactionsContext.peerId self.peerId = transactionsContext.peerId
self.ton = transactionsContext.ton
currentTransactions = transactionsContext.currentState?.transactions ?? [] currentTransactions = transactionsContext.currentState?.transactions ?? []
case let .starsContext(starsContext): case let .starsContext(starsContext):
self.starsContext = starsContext self.starsContext = starsContext
self.peerId = starsContext.peerId self.peerId = starsContext.peerId
self.ton = starsContext.ton
currentTransactions = starsContext.currentState?.transactions ?? [] currentTransactions = starsContext.currentState?.transactions ?? []
case let .peer(peerId): case let .peer(peerId, ton):
self.peerId = peerId self.peerId = peerId
self.ton = ton
currentTransactions = [] currentTransactions = []
} }
self.mode = mode self.mode = mode
@ -1224,7 +1246,7 @@ private final class StarsTransactionsContextImpl {
updatedState.isLoading = true updatedState.isLoading = true
self.updateState(updatedState) self.updateState(updatedState)
self.disposable.set((_internal_requestStarsState(account: self.account, peerId: self.peerId, mode: self.mode, subscriptionId: nil, offset: nextOffset, limit: self.nextOffset == "" ? 25 : 50) self.disposable.set((_internal_requestStarsState(account: self.account, peerId: self.peerId, ton: self.ton, mode: self.mode, subscriptionId: nil, offset: nextOffset, limit: self.nextOffset == "" ? 25 : 50)
|> deliverOnMainQueue).start(next: { [weak self] status in |> deliverOnMainQueue).start(next: { [weak self] status in
guard let self else { guard let self else {
return return
@ -1269,7 +1291,7 @@ public final class StarsTransactionsContext {
public enum Subject { public enum Subject {
case starsTransactionsContext(StarsTransactionsContext) case starsTransactionsContext(StarsTransactionsContext)
case starsContext(StarsContext) case starsContext(StarsContext)
case peer(EnginePeer.Id) case peer(peerId: EnginePeer.Id, ton: Bool)
} }
public enum Mode { public enum Mode {
@ -1323,6 +1345,14 @@ public final class StarsTransactionsContext {
} }
return peerId! return peerId!
} }
var ton: Bool {
var ton = false
self.impl.syncWith { impl in
ton = impl.ton
}
return ton
}
} }
private final class StarsSubscriptionsContextImpl { private final class StarsSubscriptionsContextImpl {

View File

@ -79,7 +79,11 @@ public extension TelegramEngine {
} }
public func peerStarsContext() -> StarsContext { public func peerStarsContext() -> StarsContext {
return StarsContext(account: self.account) return StarsContext(account: self.account, ton: false)
}
public func peerTonContext() -> StarsContext {
return StarsContext(account: self.account, ton: true)
} }
public func peerStarsRevenueContext(peerId: EnginePeer.Id) -> StarsRevenueStatsContext { public func peerStarsRevenueContext(peerId: EnginePeer.Id) -> StarsRevenueStatsContext {

View File

@ -1443,6 +1443,28 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
} }
} }
attributedString = NSAttributedString(string: string, font: titleFont, textColor: primaryTextColor) attributedString = NSAttributedString(string: string, font: titleFont, textColor: primaryTextColor)
case let .giftTon(currency, amount, _, _, _):
let _ = currency
let _ = amount
attributedString = nil
// if !forAdditionalServiceMessage {
// attributedString = NSAttributedString(string: strings.Notification_Gift, font: titleFont, textColor: primaryTextColor)
// } else {
// let price = formatCurrencyAmount(amount, currency: currency)
// if message.author?.id == accountPeerId {
// attributedString = addAttributesToStringWithRanges(strings.Notification_StarsGift_SentYou(price)._tuple, body: bodyAttributes, argumentAttributes: [0: boldAttributes])
// } else {
// var authorName = compactAuthorName
// var peerIds: [(Int, EnginePeer.Id?)] = [(0, message.author?.id)]
// if message.id.peerId.namespace == Namespaces.Peer.CloudUser && message.id.peerId.id._internalGetInt64Value() == 777000 {
// authorName = strings.Notification_StarsGift_UnknownUser
// peerIds = []
// }
// var attributes = peerMentionsAttributes(primaryTextColor: primaryTextColor, peerIds: peerIds)
// attributes[1] = boldAttributes
// attributedString = addAttributesToStringWithRanges(strings.Notification_StarsGift_Sent(authorName, price)._tuple, body: bodyAttributes, argumentAttributes: attributes)
// }
// }
case .unknown: case .unknown:
attributedString = nil attributedString = nil
} }

View File

@ -710,7 +710,7 @@ final class StarsStatisticsScreenComponent: Component {
if let current = self.allTransactionsContext { if let current = self.allTransactionsContext {
allTransactionsContext = current allTransactionsContext = current
} else { } else {
allTransactionsContext = component.context.engine.payments.peerStarsTransactionsContext(subject: .peer(component.peerId), mode: .all) allTransactionsContext = component.context.engine.payments.peerStarsTransactionsContext(subject: .peer(peerId: component.peerId, ton: false), mode: .all)
self.allTransactionsContext = allTransactionsContext self.allTransactionsContext = allTransactionsContext
} }

View File

@ -128,6 +128,7 @@ public final class AccountContextImpl: AccountContext {
private let themeUpdateManager: ThemeUpdateManager? private let themeUpdateManager: ThemeUpdateManager?
public let inAppPurchaseManager: InAppPurchaseManager? public let inAppPurchaseManager: InAppPurchaseManager?
public let starsContext: StarsContext? public let starsContext: StarsContext?
public let tonContext: StarsContext?
public let peerChannelMemberCategoriesContextsManager = PeerChannelMemberCategoriesContextsManager() public let peerChannelMemberCategoriesContextsManager = PeerChannelMemberCategoriesContextsManager()
@ -298,15 +299,18 @@ public final class AccountContextImpl: AccountContext {
self.inAppPurchaseManager = InAppPurchaseManager(engine: .authorized(self.engine)) self.inAppPurchaseManager = InAppPurchaseManager(engine: .authorized(self.engine))
self.starsContext = self.engine.payments.peerStarsContext() self.starsContext = self.engine.payments.peerStarsContext()
self.tonContext = self.engine.payments.peerTonContext()
} else { } else {
self.prefetchManager = nil self.prefetchManager = nil
self.wallpaperUploadManager = nil self.wallpaperUploadManager = nil
self.themeUpdateManager = nil self.themeUpdateManager = nil
self.inAppPurchaseManager = nil self.inAppPurchaseManager = nil
self.starsContext = nil self.starsContext = nil
self.tonContext = nil
} }
self.account.stateManager.starsContext = self.starsContext self.account.stateManager.starsContext = self.starsContext
self.account.stateManager.tonContext = self.starsContext
self.peersNearbyManager = nil self.peersNearbyManager = nil