Swiftgram/submodules/TelegramCore/Sources/SyncCore/SuggestedPostMessageAttribute.swift
2025-06-24 13:02:37 +02:00

117 lines
3.6 KiB
Swift

import Foundation
import Postbox
import TelegramApi
public final class SuggestedPostMessageAttribute: Equatable, MessageAttribute {
public enum State: Int32 {
case accepted = 0
case rejected = 1
}
public let amount: CurrencyAmount?
public let timestamp: Int32?
public let state: State?
public init(amount: CurrencyAmount?, timestamp: Int32?, state: State?) {
self.amount = amount
self.timestamp = timestamp
self.state = state
}
required public init(decoder: PostboxDecoder) {
self.amount = decoder.decodeCodable(CurrencyAmount.self, forKey: "amt")
self.timestamp = decoder.decodeOptionalInt32ForKey("ts")
self.state = decoder.decodeOptionalInt32ForKey("st").flatMap(State.init(rawValue:))
}
public func encode(_ encoder: PostboxEncoder) {
if let amount = self.amount {
encoder.encodeCodable(amount, forKey: "amt")
} else {
encoder.encodeNil(forKey: "amt")
}
if let timestamp = self.timestamp {
encoder.encodeInt32(timestamp, forKey: "ts")
} else {
encoder.encodeNil(forKey: "ts")
}
if let state = self.state {
encoder.encodeInt32(state.rawValue, forKey: "st")
} else {
encoder.encodeNil(forKey: "st")
}
}
public static func ==(lhs: SuggestedPostMessageAttribute, rhs: SuggestedPostMessageAttribute) -> Bool {
if lhs.amount != rhs.amount {
return false
}
if lhs.timestamp != rhs.timestamp {
return false
}
if lhs.state != rhs.state {
return false
}
return true
}
}
extension SuggestedPostMessageAttribute {
convenience init(apiSuggestedPost: Api.SuggestedPost) {
switch apiSuggestedPost {
case let .suggestedPost(flags, starsAmount, scheduleDate):
var state: State?
if (flags & (1 << 1)) != 0 {
state = .accepted
} else if (flags & (1 << 2)) != 0 {
state = .rejected
}
self.init(amount: starsAmount.flatMap(CurrencyAmount.init(apiAmount:)), timestamp: scheduleDate, state: state)
}
}
func apiSuggestedPost() -> Api.SuggestedPost {
var flags: Int32 = 0
if let state = self.state {
switch state {
case .accepted:
flags |= 1 << 1
case .rejected:
flags |= 1 << 2
}
}
if self.timestamp != nil {
flags |= 1 << 0
}
var price: Api.StarsAmount?
if let amount = self.amount {
flags |= 1 << 3
price = amount.apiAmount
}
return .suggestedPost(flags: flags, price: price, scheduleDate: self.timestamp)
}
}
public final class PublishedSuggestedPostMessageAttribute: Equatable, MessageAttribute {
public let currency: CurrencyAmount.Currency
public init(currency: CurrencyAmount.Currency) {
self.currency = currency
}
public init(decoder: PostboxDecoder) {
self.currency = CurrencyAmount.Currency(rawValue: decoder.decodeInt32ForKey("c", orElse: 0)) ?? .stars
}
public func encode(_ encoder: PostboxEncoder) {
encoder.encodeInt32(self.currency.rawValue, forKey: "c")
}
public static func == (lhs: PublishedSuggestedPostMessageAttribute, rhs: PublishedSuggestedPostMessageAttribute) -> Bool {
if lhs.currency != rhs.currency {
return false
}
return true
}
}