Add peer stars balance caching

This commit is contained in:
Ilya Laktyushin 2024-07-10 17:08:31 +04:00
parent fc364690d0
commit 99203dcc13
2 changed files with 91 additions and 5 deletions

View File

@ -4,13 +4,65 @@ import Postbox
import TelegramApi import TelegramApi
import MtProtoKit import MtProtoKit
public struct StarsRevenueStats: Equatable { public struct StarsRevenueStats: Equatable, Codable {
public struct Balances: Equatable { private enum CodingKeys: String, CodingKey {
case revenueGraph
case balances
case usdRate
}
static func key(peerId: PeerId) -> ValueBoxKey {
let key = ValueBoxKey(length: 8 + 4)
key.setInt64(0, value: peerId.toInt64())
return key
}
public struct Balances: Equatable, Codable {
private enum CodingKeys: String, CodingKey {
case currentBalance
case availableBalance
case overallRevenue
case withdrawEnabled
case nextWithdrawalTimestamp
}
public let currentBalance: Int64 public let currentBalance: Int64
public let availableBalance: Int64 public let availableBalance: Int64
public let overallRevenue: Int64 public let overallRevenue: Int64
public let withdrawEnabled: Bool public let withdrawEnabled: Bool
public let nextWithdrawalTimestamp: Int32? public let nextWithdrawalTimestamp: Int32?
public init(
currentBalance: Int64,
availableBalance: Int64,
overallRevenue: Int64,
withdrawEnabled: Bool,
nextWithdrawalTimestamp: Int32?
) {
self.currentBalance = currentBalance
self.availableBalance = availableBalance
self.overallRevenue = overallRevenue
self.withdrawEnabled = withdrawEnabled
self.nextWithdrawalTimestamp = nextWithdrawalTimestamp
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.currentBalance = try container.decode(Int64.self, forKey: .currentBalance)
self.availableBalance = try container.decode(Int64.self, forKey: .availableBalance)
self.overallRevenue = try container.decode(Int64.self, forKey: .overallRevenue)
self.withdrawEnabled = try container.decode(Bool.self, forKey: .withdrawEnabled)
self.nextWithdrawalTimestamp = try container.decodeIfPresent(Int32.self, forKey: .nextWithdrawalTimestamp)
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.currentBalance, forKey: .currentBalance)
try container.encode(self.availableBalance, forKey: .availableBalance)
try container.encode(self.overallRevenue, forKey: .overallRevenue)
try container.encode(self.withdrawEnabled, forKey: .withdrawEnabled)
try container.encodeIfPresent(self.nextWithdrawalTimestamp, forKey: .nextWithdrawalTimestamp)
}
} }
public let revenueGraph: StatsGraph public let revenueGraph: StatsGraph
@ -23,6 +75,20 @@ public struct StarsRevenueStats: Equatable {
self.usdRate = usdRate self.usdRate = usdRate
} }
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.revenueGraph = try container.decode(StatsGraph.self, forKey: .revenueGraph)
self.balances = try container.decode(Balances.self, forKey: .balances)
self.usdRate = try container.decode(Double.self, forKey: .usdRate)
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.revenueGraph, forKey: .revenueGraph)
try container.encode(self.balances, forKey: .balances)
try container.encode(self.usdRate, forKey: .usdRate)
}
public static func == (lhs: StarsRevenueStats, rhs: StarsRevenueStats) -> Bool { public static func == (lhs: StarsRevenueStats, rhs: StarsRevenueStats) -> Bool {
if lhs.revenueGraph != rhs.revenueGraph { if lhs.revenueGraph != rhs.revenueGraph {
return false return false
@ -121,6 +187,17 @@ private final class StarsRevenueStatsContextImpl {
self._statePromise.set(.single(self._state)) self._statePromise.set(.single(self._state))
self.load() self.load()
let _ = (account.postbox.transaction { transaction -> StarsRevenueStats? in
return transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedStarsRevenueStats, key: StarsRevenueStats.key(peerId: peerId)))?.get(StarsRevenueStats.self)
}
|> deliverOnMainQueue).start(next: { [weak self] cachedResult in
guard let self, let cachedResult else {
return
}
self._state = StarsRevenueStatsContextState(stats: cachedResult)
self._statePromise.set(.single(self._state))
})
} }
deinit { deinit {
@ -163,9 +240,17 @@ private final class StarsRevenueStatsContextImpl {
self.disposable.set((signal self.disposable.set((signal
|> deliverOnMainQueue).start(next: { [weak self] stats in |> deliverOnMainQueue).start(next: { [weak self] stats in
if let strongSelf = self { if let self {
strongSelf._state = StarsRevenueStatsContextState(stats: stats) self._state = StarsRevenueStatsContextState(stats: stats)
strongSelf._statePromise.set(.single(strongSelf._state)) self._statePromise.set(.single(self._state))
if let stats {
let _ = (self.account.postbox.transaction { transaction in
if let entry = CodableEntry(stats) {
transaction.putItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedStarsRevenueStats, key: StarsRevenueStats.key(peerId: peerId)), entry: entry)
}
}).start()
}
} }
})) }))
} }

View File

@ -126,6 +126,7 @@ public struct Namespaces {
public static let savedMessageTags: Int8 = 35 public static let savedMessageTags: Int8 = 35
public static let applicationIcons: Int8 = 36 public static let applicationIcons: Int8 = 36
public static let availableMessageEffects: Int8 = 37 public static let availableMessageEffects: Int8 = 37
public static let cachedStarsRevenueStats: Int8 = 38
} }
public struct UnorderedItemList { public struct UnorderedItemList {