mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-07-16 08:19:23 +00:00
117 lines
3.6 KiB
Swift
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
|
|
}
|
|
}
|