Update Ghostgram features

This commit is contained in:
ichmagmaus 812
2026-03-07 18:15:32 +01:00
parent 1a3303b059
commit 24a7ec39d9
902 changed files with 148295 additions and 62348 deletions
@@ -35,14 +35,14 @@ private func apiInputStorePaymentPurpose(postbox: Postbox, purpose: AppStoreTran
default:
break
}
return .single(.inputStorePaymentPremiumSubscription(flags: flags))
return .single(.inputStorePaymentPremiumSubscription(.init(flags: flags)))
case let .gift(peerId, currency, amount):
return postbox.loadedPeerWithId(peerId)
|> mapToSignal { peer -> Signal<Api.InputStorePaymentPurpose, NoError> in
guard let inputUser = apiInputUser(peer) else {
return .complete()
}
return .single(.inputStorePaymentGiftPremium(userId: inputUser, currency: currency, amount: amount))
return .single(.inputStorePaymentGiftPremium(.init(userId: inputUser, currency: currency, amount: amount)))
}
case let .giftCode(peerIds, boostPeerId, currency, amount, text, entities):
return postbox.transaction { transaction -> Api.InputStorePaymentPurpose in
@@ -64,10 +64,10 @@ private func apiInputStorePaymentPurpose(postbox: Postbox, purpose: AppStoreTran
var message: Api.TextWithEntities?
if let text, !text.isEmpty {
flags |= (1 << 1)
message = .textWithEntities(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? [])
message = .textWithEntities(.init(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? []))
}
return .inputStorePaymentPremiumGiftCode(flags: flags, users: apiInputUsers, boostPeer: apiBoostPeer, currency: currency, amount: amount, message: message)
return .inputStorePaymentPremiumGiftCode(.init(flags: flags, users: apiInputUsers, boostPeer: apiBoostPeer, currency: currency, amount: amount, message: message))
}
case let .giveaway(boostPeerId, additionalPeerIds, countries, onlyNewSubscribers, showWinners, prizeDescription, randomId, untilDate, currency, amount):
return postbox.transaction { transaction -> Signal<Api.InputStorePaymentPurpose, NoError> in
@@ -96,7 +96,7 @@ private func apiInputStorePaymentPurpose(postbox: Postbox, purpose: AppStoreTran
if let _ = prizeDescription {
flags |= (1 << 4)
}
return .single(.inputStorePaymentPremiumGiveaway(flags: flags, boostPeer: apiBoostPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: currency, amount: amount))
return .single(.inputStorePaymentPremiumGiveaway(.init(flags: flags, boostPeer: apiBoostPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: currency, amount: amount)))
}
|> switchToLatest
case let .stars(count, currency, amount, peerId):
@@ -115,7 +115,7 @@ private func apiInputStorePaymentPurpose(postbox: Postbox, purpose: AppStoreTran
if let _ = spendPurposePeer {
flags |= (1 << 0)
}
return .inputStorePaymentStarsTopup(flags: flags, stars: count, currency: currency, amount: amount, spendPurposePeer: spendPurposePeer)
return .inputStorePaymentStarsTopup(.init(flags: flags, stars: count, currency: currency, amount: amount, spendPurposePeer: spendPurposePeer))
}
case let .starsGift(peerId, count, currency, amount):
return postbox.loadedPeerWithId(peerId)
@@ -123,7 +123,7 @@ private func apiInputStorePaymentPurpose(postbox: Postbox, purpose: AppStoreTran
guard let inputUser = apiInputUser(peer) else {
return .complete()
}
return .single(.inputStorePaymentStarsGift(userId: inputUser, stars: count, currency: currency, amount: amount))
return .single(.inputStorePaymentStarsGift(.init(userId: inputUser, stars: count, currency: currency, amount: amount)))
}
case let .starsGiveaway(stars, boostPeerId, additionalPeerIds, countries, onlyNewSubscribers, showWinners, prizeDescription, randomId, untilDate, currency, amount, users):
return postbox.transaction { transaction -> Signal<Api.InputStorePaymentPurpose, NoError> in
@@ -152,7 +152,7 @@ private func apiInputStorePaymentPurpose(postbox: Postbox, purpose: AppStoreTran
if let _ = prizeDescription {
flags |= (1 << 4)
}
return .single(.inputStorePaymentStarsGiveaway(flags: flags, stars: stars, boostPeer: apiBoostPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: currency, amount: amount, users: users))
return .single(.inputStorePaymentStarsGiveaway(.init(flags: flags, stars: stars, boostPeer: apiBoostPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: currency, amount: amount, users: users)))
}
|> switchToLatest
case let .authCode(restore, phoneNumber, phoneCodeHash, currency, amount):
@@ -160,7 +160,7 @@ private func apiInputStorePaymentPurpose(postbox: Postbox, purpose: AppStoreTran
if restore {
flags |= (1 << 0)
}
return .single(.inputStorePaymentAuthCode(flags: flags, phoneNumber: phoneNumber, phoneCodeHash: phoneCodeHash, currency: currency, amount: amount))
return .single(.inputStorePaymentAuthCode(.init(flags: flags, phoneNumber: phoneNumber, phoneCodeHash: phoneCodeHash, currency: currency, amount: amount)))
}
}
@@ -40,7 +40,8 @@ public struct BankCardInfo {
extension BankCardUrl {
init(apiBankCardOpenUrl: Api.BankCardOpenUrl) {
switch apiBankCardOpenUrl {
case let .bankCardOpenUrl(url, name):
case let .bankCardOpenUrl(bankCardOpenUrlData):
let (url, name) = (bankCardOpenUrlData.url, bankCardOpenUrlData.name)
self.title = name
self.url = url
}
@@ -50,7 +51,8 @@ extension BankCardUrl {
extension BankCardInfo {
init(apiBankCardData: Api.payments.BankCardData) {
switch apiBankCardData {
case let .bankCardData(title, urls):
case let .bankCardData(bankCardDataData):
let (title, urls) = (bankCardDataData.title, bankCardDataData.openUrls)
self.title = title
self.urls = urls.map { BankCardUrl(apiBankCardOpenUrl: $0) }
}
@@ -171,7 +171,8 @@ public struct BotPaymentMethod: Equatable {
extension BotPaymentMethod {
init(apiPaymentFormMethod: Api.PaymentFormMethod) {
switch apiPaymentFormMethod {
case let .paymentFormMethod(url, title):
case let .paymentFormMethod(paymentFormMethodData):
let (url, title) = (paymentFormMethodData.url, paymentFormMethodData.title)
self.init(url: url, title: title)
}
}
@@ -189,7 +190,8 @@ public enum BotPaymentFormRequestError {
extension BotPaymentInvoice {
init(apiInvoice: Api.Invoice) {
switch apiInvoice {
case let .invoice(flags, currency, prices, maxTipAmount, suggestedTipAmounts, termsUrl, subscriptionPeriod):
case let .invoice(invoiceData):
let (flags, currency, prices, maxTipAmount, suggestedTipAmounts, termsUrl, subscriptionPeriod) = (invoiceData.flags, invoiceData.currency, invoiceData.prices, invoiceData.maxTipAmount, invoiceData.suggestedTipAmounts, invoiceData.termsUrl, invoiceData.subscriptionPeriod)
var fields = BotPaymentInvoiceFields()
if (flags & (1 << 1)) != 0 {
fields.insert(.name)
@@ -223,7 +225,8 @@ extension BotPaymentInvoice {
}
self.init(isTest: (flags & (1 << 0)) != 0, requestedFields: fields, currency: currency, prices: prices.map {
switch $0 {
case let .labeledPrice(label, amount):
case let .labeledPrice(labeledPriceData):
let (label, amount) = (labeledPriceData.label, labeledPriceData.amount)
return BotPaymentPrice(label: label, amount: amount)
}
}, tip: parsedTip, termsInfo: termsInfo, subscriptionPeriod: subscriptionPeriod)
@@ -234,11 +237,13 @@ extension BotPaymentInvoice {
extension BotPaymentRequestedInfo {
init(apiInfo: Api.PaymentRequestedInfo) {
switch apiInfo {
case let .paymentRequestedInfo(_, name, phone, email, shippingAddress):
case let .paymentRequestedInfo(paymentRequestedInfoData):
let (name, phone, email, shippingAddress) = (paymentRequestedInfoData.name, paymentRequestedInfoData.phone, paymentRequestedInfoData.email, paymentRequestedInfoData.shippingAddress)
var parsedShippingAddress: BotPaymentShippingAddress?
if let shippingAddress = shippingAddress {
switch shippingAddress {
case let .postAddress(streetLine1, streetLine2, city, state, countryIso2, postCode):
case let .postAddress(postAddressData):
let (streetLine1, streetLine2, city, state, countryIso2, postCode) = (postAddressData.streetLine1, postAddressData.streetLine2, postAddressData.city, postAddressData.state, postAddressData.countryIso2, postAddressData.postCode)
parsedShippingAddress = BotPaymentShippingAddress(streetLine1: streetLine1, streetLine2: streetLine2, city: city, state: state, countryIso2: countryIso2, postCode: postCode)
}
}
@@ -253,9 +258,9 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
guard let inputPeer = transaction.getPeer(messageId.peerId).flatMap(apiInputPeer) else {
return nil
}
return .inputInvoiceMessage(peer: inputPeer, msgId: messageId.id)
return .inputInvoiceMessage(.init(peer: inputPeer, msgId: messageId.id))
case let .slug(slug):
return .inputInvoiceSlug(slug: slug)
return .inputInvoiceSlug(.init(slug: slug))
case let .premiumGiveaway(boostPeerId, additionalPeerIds, countries, onlyNewSubscribers, showWinners, prizeDescription, randomId, untilDate, currency, amount, option):
guard let peer = transaction.getPeer(boostPeerId), let apiBoostPeer = apiInputPeer(peer) else {
return nil
@@ -283,7 +288,7 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
flags |= (1 << 4)
}
let inputPurpose: Api.InputStorePaymentPurpose = .inputStorePaymentPremiumGiveaway(flags: flags, boostPeer: apiBoostPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: currency, amount: amount)
let inputPurpose: Api.InputStorePaymentPurpose = .inputStorePaymentPremiumGiveaway(.init(flags: flags, boostPeer: apiBoostPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: currency, amount: amount))
flags = 0
@@ -294,9 +299,9 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
flags |= (1 << 1)
}
let option: Api.PremiumGiftCodeOption = .premiumGiftCodeOption(flags: flags, users: option.users, months: option.months, storeProduct: option.storeProductId, storeQuantity: option.storeQuantity, currency: option.currency, amount: option.amount)
let option: Api.PremiumGiftCodeOption = .premiumGiftCodeOption(.init(flags: flags, users: option.users, months: option.months, storeProduct: option.storeProductId, storeQuantity: option.storeQuantity, currency: option.currency, amount: option.amount))
return .inputInvoicePremiumGiftCode(purpose: inputPurpose, option: option)
return .inputInvoicePremiumGiftCode(.init(purpose: inputPurpose, option: option))
case let .giftCode(users, currency, amount, option, text, entities):
var inputUsers: [Api.InputUser] = []
if !users.isEmpty {
@@ -311,10 +316,10 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
var message: Api.TextWithEntities?
if let text, !text.isEmpty {
inputPurposeFlags |= (1 << 1)
message = .textWithEntities(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? [])
message = .textWithEntities(.init(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? []))
}
let inputPurpose: Api.InputStorePaymentPurpose = .inputStorePaymentPremiumGiftCode(flags: inputPurposeFlags, users: inputUsers, boostPeer: nil, currency: currency, amount: amount, message: message)
let inputPurpose: Api.InputStorePaymentPurpose = .inputStorePaymentPremiumGiftCode(.init(flags: inputPurposeFlags, users: inputUsers, boostPeer: nil, currency: currency, amount: amount, message: message))
var flags: Int32 = 0
if let _ = option.storeProductId {
@@ -324,9 +329,9 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
flags |= (1 << 1)
}
let option: Api.PremiumGiftCodeOption = .premiumGiftCodeOption(flags: flags, users: option.users, months: option.months, storeProduct: option.storeProductId, storeQuantity: option.storeQuantity, currency: option.currency, amount: option.amount)
let option: Api.PremiumGiftCodeOption = .premiumGiftCodeOption(.init(flags: flags, users: option.users, months: option.months, storeProduct: option.storeProductId, storeQuantity: option.storeQuantity, currency: option.currency, amount: option.amount))
return .inputInvoicePremiumGiftCode(purpose: inputPurpose, option: option)
return .inputInvoicePremiumGiftCode(.init(purpose: inputPurpose, option: option))
case let .stars(option, peerId):
var flags: Int32 = 0
var spendPurposePeer: Api.InputPeer?
@@ -334,14 +339,14 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
flags |= (1 << 0)
spendPurposePeer = inputPeer
}
return .inputInvoiceStars(purpose: .inputStorePaymentStarsTopup(flags: flags, stars: option.count, currency: option.currency, amount: option.amount, spendPurposePeer: spendPurposePeer))
return .inputInvoiceStars(.init(purpose: .inputStorePaymentStarsTopup(.init(flags: flags, stars: option.count, currency: option.currency, amount: option.amount, spendPurposePeer: spendPurposePeer))))
case let .starsGift(peerId, count, currency, amount):
guard let peer = transaction.getPeer(peerId), let inputUser = apiInputUser(peer) else {
return nil
}
return .inputInvoiceStars(purpose: .inputStorePaymentStarsGift(userId: inputUser, stars: count, currency: currency, amount: amount))
return .inputInvoiceStars(.init(purpose: .inputStorePaymentStarsGift(.init(userId: inputUser, stars: count, currency: currency, amount: amount))))
case let .starsChatSubscription(hash):
return .inputInvoiceChatInviteSubscription(hash: hash)
return .inputInvoiceChatInviteSubscription(.init(hash: hash))
case let .starsGiveaway(stars, boostPeerId, additionalPeerIds, countries, onlyNewSubscribers, showWinners, prizeDescription, randomId, untilDate, currency, amount, users):
guard let peer = transaction.getPeer(boostPeerId), let apiBoostPeer = apiInputPeer(peer) else {
return nil
@@ -368,7 +373,7 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
if let _ = prizeDescription {
flags |= (1 << 4)
}
return .inputInvoiceStars(purpose: .inputStorePaymentStarsGiveaway(flags: flags, stars: stars, boostPeer: apiBoostPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: currency, amount: amount, users: users))
return .inputInvoiceStars(.init(purpose: .inputStorePaymentStarsGiveaway(.init(flags: flags, stars: stars, boostPeer: apiBoostPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: currency, amount: amount, users: users))))
case let .starGift(hideName, includeUpgrade, peerId, giftId, text, entities):
guard let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) else {
return nil
@@ -383,20 +388,20 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
var message: Api.TextWithEntities?
if let text, !text.isEmpty {
flags |= (1 << 1)
message = .textWithEntities(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? [])
message = .textWithEntities(.init(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? []))
}
return .inputInvoiceStarGift(flags: flags, peer: inputPeer, giftId: giftId, message: message)
return .inputInvoiceStarGift(.init(flags: flags, peer: inputPeer, giftId: giftId, message: message))
case let .starGiftUpgrade(keepOriginalInfo, reference):
var flags: Int32 = 0
if keepOriginalInfo {
flags |= (1 << 0)
}
return reference.apiStarGiftReference(transaction: transaction).flatMap { .inputInvoiceStarGiftUpgrade(flags: flags, stargift: $0) }
return reference.apiStarGiftReference(transaction: transaction).flatMap { .inputInvoiceStarGiftUpgrade(.init(flags: flags, stargift: $0)) }
case let .starGiftTransfer(reference, toPeerId):
guard let peer = transaction.getPeer(toPeerId), let inputPeer = apiInputPeer(peer) else {
return nil
}
return reference.apiStarGiftReference(transaction: transaction).flatMap { .inputInvoiceStarGiftTransfer(stargift: $0, toId: inputPeer) }
return reference.apiStarGiftReference(transaction: transaction).flatMap { .inputInvoiceStarGiftTransfer(.init(stargift: $0, toId: inputPeer)) }
case let .premiumGift(peerId, option, text, entities):
guard let peer = transaction.getPeer(peerId), let inputUser = apiInputUser(peer) else {
return nil
@@ -405,9 +410,9 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
var message: Api.TextWithEntities?
if let text, !text.isEmpty {
flags |= (1 << 0)
message = .textWithEntities(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? [])
message = .textWithEntities(.init(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? []))
}
return .inputInvoicePremiumGiftStars(flags: flags, userId: inputUser, months: option.months, message: message)
return .inputInvoicePremiumGiftStars(.init(flags: flags, userId: inputUser, months: option.months, message: message))
case let .starGiftResale(slug, toPeerId, ton):
guard let peer = transaction.getPeer(toPeerId), let inputPeer = apiInputPeer(peer) else {
return nil
@@ -416,14 +421,14 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
if ton {
flags |= 1 << 0
}
return .inputInvoiceStarGiftResale(flags: flags, slug: slug, toId: inputPeer)
return .inputInvoiceStarGiftResale(.init(flags: flags, slug: slug, toId: inputPeer))
case let .starGiftPrepaidUpgrade(peerId, hash):
guard let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) else {
return nil
}
return .inputInvoiceStarGiftPrepaidUpgrade(peer: inputPeer, hash: hash)
return .inputInvoiceStarGiftPrepaidUpgrade(.init(peer: inputPeer, hash: hash))
case let .starGiftDropOriginalDetails(reference):
return reference.apiStarGiftReference(transaction: transaction).flatMap { .inputInvoiceStarGiftDropOriginalDetails(stargift: $0) }
return reference.apiStarGiftReference(transaction: transaction).flatMap { .inputInvoiceStarGiftDropOriginalDetails(.init(stargift: $0)) }
case let .starGiftAuctionBid(update, hideName, peerId, giftId, bidAmount, text, entities):
var flags: Int32 = 0
@@ -445,10 +450,10 @@ func _internal_parseInputInvoice(transaction: Transaction, source: BotPaymentInv
if let text, !text.isEmpty {
flags |= (1 << 1)
message = .textWithEntities(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? [])
message = .textWithEntities(.init(text: text, entities: entities.flatMap { apiEntitiesFromMessageTextEntities($0, associatedPeers: SimpleDictionary()) } ?? []))
}
}
return .inputInvoiceStarGiftAuctionBid(flags: flags, peer: inputPeer, giftId: giftId, bidAmount: bidAmount, message: message)
return .inputInvoiceStarGiftAuctionBid(.init(flags: flags, peer: inputPeer, giftId: giftId, bidAmount: bidAmount, message: message))
}
}
@@ -475,7 +480,8 @@ func _internal_fetchBotPaymentInvoice(postbox: Postbox, network: Network, source
|> mapToSignal { result -> Signal<TelegramMediaInvoice, BotPaymentFormRequestError> in
return postbox.transaction { transaction -> TelegramMediaInvoice in
switch result {
case let .paymentForm(_, _, _, title, description, photo, invoice, _, _, _, _, _, _, _, _):
case let .paymentForm(paymentFormData):
let (title, description, photo, invoice) = (paymentFormData.title, paymentFormData.description, paymentFormData.photo, paymentFormData.invoice)
let parsedInvoice = BotPaymentInvoice(apiInvoice: invoice)
var parsedFlags = TelegramMediaInvoiceFlags()
@@ -487,10 +493,12 @@ func _internal_fetchBotPaymentInvoice(postbox: Postbox, network: Network, source
}
return TelegramMediaInvoice(title: title, description: description, photo: photo.flatMap(TelegramMediaWebFile.init), receiptMessageId: nil, currency: parsedInvoice.currency, totalAmount: 0, startParam: "", extendedMedia: nil, subscriptionPeriod: parsedInvoice.subscriptionPeriod, flags: parsedFlags, version: TelegramMediaInvoice.lastVersion)
case let .paymentFormStars(_, _, _, title, description, photo, invoice, _):
case let .paymentFormStars(paymentFormStarsData):
let (title, description, photo, invoice) = (paymentFormStarsData.title, paymentFormStarsData.description, paymentFormStarsData.photo, paymentFormStarsData.invoice)
let parsedInvoice = BotPaymentInvoice(apiInvoice: invoice)
return TelegramMediaInvoice(title: title, description: description, photo: photo.flatMap(TelegramMediaWebFile.init), receiptMessageId: nil, currency: parsedInvoice.currency, totalAmount: parsedInvoice.prices.reduce(0, { $0 + $1.amount }), startParam: "", extendedMedia: nil, subscriptionPeriod: parsedInvoice.subscriptionPeriod, flags: [], version: TelegramMediaInvoice.lastVersion)
case let .paymentFormStarGift(_, invoice):
case let .paymentFormStarGift(paymentFormStarGiftData):
let invoice = paymentFormStarGiftData.invoice
let parsedInvoice = BotPaymentInvoice(apiInvoice: invoice)
return TelegramMediaInvoice(title: "", description: "", photo: nil, receiptMessageId: nil, currency: parsedInvoice.currency, totalAmount: parsedInvoice.prices.reduce(0, { $0 + $1.amount }), startParam: "", extendedMedia: nil, subscriptionPeriod: parsedInvoice.subscriptionPeriod, flags: [], version: TelegramMediaInvoice.lastVersion)
}
@@ -513,7 +521,7 @@ func _internal_fetchBotPaymentForm(accountPeerId: PeerId, postbox: Postbox, netw
var flags: Int32 = 0
var serializedThemeParams: Api.DataJSON?
if let themeParams = themeParams, let data = try? JSONSerialization.data(withJSONObject: themeParams, options: []), let dataString = String(data: data, encoding: .utf8) {
serializedThemeParams = Api.DataJSON.dataJSON(data: dataString)
serializedThemeParams = Api.DataJSON.dataJSON(.init(data: dataString))
}
if serializedThemeParams != nil {
flags |= 1 << 0
@@ -538,11 +546,12 @@ func _internal_fetchBotPaymentForm(accountPeerId: PeerId, postbox: Postbox, netw
|> mapToSignal { result -> Signal<BotPaymentForm, BotPaymentFormRequestError> in
return postbox.transaction { transaction -> BotPaymentForm in
switch result {
case let .paymentForm(flags, id, botId, title, description, photo, invoice, providerId, url, nativeProvider, nativeParams, additionalMethods, savedInfo, savedCredentials, apiUsers):
case let .paymentForm(paymentFormData):
let (flags, id, botId, title, description, photo, invoice, providerId, url, nativeProvider, nativeParams, additionalMethods, savedInfo, savedCredentials, apiUsers) = (paymentFormData.flags, paymentFormData.formId, paymentFormData.botId, paymentFormData.title, paymentFormData.description, paymentFormData.photo, paymentFormData.invoice, paymentFormData.providerId, paymentFormData.url, paymentFormData.nativeProvider, paymentFormData.nativeParams, paymentFormData.additionalMethods, paymentFormData.savedInfo, paymentFormData.savedCredentials, paymentFormData.users)
let _ = title
let _ = description
let _ = photo
let parsedPeers = AccumulatedPeers(users: apiUsers)
updatePeers(transaction: transaction, accountPeerId: accountPeerId, peers: parsedPeers)
@@ -550,33 +559,37 @@ func _internal_fetchBotPaymentForm(accountPeerId: PeerId, postbox: Postbox, netw
var parsedNativeProvider: BotPaymentNativeProvider?
if let nativeProvider = nativeProvider, let nativeParams = nativeParams {
switch nativeParams {
case let .dataJSON(data):
case let .dataJSON(dataJSONData):
let data = dataJSONData.data
parsedNativeProvider = BotPaymentNativeProvider(name: nativeProvider, params: data)
}
}
let parsedSavedInfo = savedInfo.flatMap(BotPaymentRequestedInfo.init)
let parsedSavedCredentials = savedCredentials?.map({ savedCredentials -> BotPaymentSavedCredentials in
switch savedCredentials {
case let .paymentSavedCredentialsCard(id, title):
case let .paymentSavedCredentialsCard(paymentSavedCredentialsCardData):
let (id, title) = (paymentSavedCredentialsCardData.id, paymentSavedCredentialsCardData.title)
return .card(id: id, title: title)
}
}) ?? []
let additionalPaymentMethods = additionalMethods?.map({ BotPaymentMethod(apiPaymentFormMethod: $0) }) ?? []
return BotPaymentForm(id: id, canSaveCredentials: (flags & (1 << 2)) != 0, passwordMissing: (flags & (1 << 3)) != 0, invoice: parsedInvoice, paymentBotId: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(botId)), providerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(providerId)), url: url, nativeProvider: parsedNativeProvider, savedInfo: parsedSavedInfo, savedCredentials: parsedSavedCredentials, additionalPaymentMethods: additionalPaymentMethods)
case let .paymentFormStars(flags, id, botId, title, description, photo, invoice, apiUsers):
case let .paymentFormStars(paymentFormStarsData):
let (flags, id, botId, title, description, photo, invoice, apiUsers) = (paymentFormStarsData.flags, paymentFormStarsData.formId, paymentFormStarsData.botId, paymentFormStarsData.title, paymentFormStarsData.description, paymentFormStarsData.photo, paymentFormStarsData.invoice, paymentFormStarsData.users)
let _ = flags
let _ = title
let _ = description
let _ = photo
let parsedPeers = AccumulatedPeers(users: apiUsers)
updatePeers(transaction: transaction, accountPeerId: accountPeerId, peers: parsedPeers)
let parsedInvoice = BotPaymentInvoice(apiInvoice: invoice)
return BotPaymentForm(id: id, canSaveCredentials: false, passwordMissing: false, invoice: parsedInvoice, paymentBotId: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(botId)), providerId: nil, url: nil, nativeProvider: nil, savedInfo: nil, savedCredentials: [], additionalPaymentMethods: [])
case let .paymentFormStarGift(id, invoice):
case let .paymentFormStarGift(paymentFormStarGiftData):
let (id, invoice) = (paymentFormStarGiftData.formId, paymentFormStarGiftData.invoice)
let parsedInvoice = BotPaymentInvoice(apiInvoice: invoice)
return BotPaymentForm(id: id, canSaveCredentials: false, passwordMissing: false, invoice: parsedInvoice, paymentBotId: nil, providerId: nil, url: nil, nativeProvider: nil, savedInfo: nil, savedCredentials: [], additionalPaymentMethods: [])
}
@@ -611,10 +624,12 @@ public struct BotPaymentValidatedFormInfo : Equatable {
extension BotPaymentShippingOption {
init(apiOption: Api.ShippingOption) {
switch apiOption {
case let .shippingOption(id, title, prices):
case let .shippingOption(shippingOptionData):
let (id, title, prices) = (shippingOptionData.id, shippingOptionData.title, shippingOptionData.prices)
self.init(id: id, title: title, prices: prices.map {
switch $0 {
case let .labeledPrice(label, amount):
case let .labeledPrice(labeledPriceData):
let (label, amount) = (labeledPriceData.label, labeledPriceData.amount)
return BotPaymentPrice(label: label, amount: amount)
}
})
@@ -649,9 +664,9 @@ func _internal_validateBotPaymentForm(account: Account, saveInfo: Bool, source:
var apiShippingAddress: Api.PostAddress?
if let address = formInfo.shippingAddress {
infoFlags |= (1 << 3)
apiShippingAddress = .postAddress(streetLine1: address.streetLine1, streetLine2: address.streetLine2, city: address.city, state: address.state, countryIso2: address.countryIso2, postCode: address.postCode)
apiShippingAddress = .postAddress(.init(streetLine1: address.streetLine1, streetLine2: address.streetLine2, city: address.city, state: address.state, countryIso2: address.countryIso2, postCode: address.postCode))
}
return account.network.request(Api.functions.payments.validateRequestedInfo(flags: flags, invoice: invoice, info: .paymentRequestedInfo(flags: infoFlags, name: formInfo.name, phone: formInfo.phone, email: formInfo.email, shippingAddress: apiShippingAddress)))
return account.network.request(Api.functions.payments.validateRequestedInfo(flags: flags, invoice: invoice, info: .paymentRequestedInfo(.init(flags: infoFlags, name: formInfo.name, phone: formInfo.phone, email: formInfo.email, shippingAddress: apiShippingAddress))))
|> mapError { error -> ValidateBotPaymentFormError in
if error.errorDescription == "SHIPPING_NOT_AVAILABLE" {
return .shippingNotAvailable
@@ -673,7 +688,8 @@ func _internal_validateBotPaymentForm(account: Account, saveInfo: Bool, source:
}
|> map { result -> BotPaymentValidatedFormInfo in
switch result {
case let .validatedRequestedInfo(_, id, shippingOptions):
case let .validatedRequestedInfo(validatedRequestedInfoData):
let (id, shippingOptions) = (validatedRequestedInfoData.id, validatedRequestedInfoData.shippingOptions)
return BotPaymentValidatedFormInfo(id: id, shippingOptions: shippingOptions.flatMap {
return $0.map(BotPaymentShippingOption.init)
})
@@ -721,11 +737,11 @@ func _internal_sendBotPaymentForm(account: Account, formId: Int64, source: BotPa
if saveOnServer {
credentialsFlags |= (1 << 0)
}
apiCredentials = .inputPaymentCredentials(flags: credentialsFlags, data: .dataJSON(data: data))
apiCredentials = .inputPaymentCredentials(.init(flags: credentialsFlags, data: .dataJSON(.init(data: data))))
case let .saved(id, tempPassword):
apiCredentials = .inputPaymentCredentialsSaved(id: id, tmpPassword: Buffer(data: tempPassword))
apiCredentials = .inputPaymentCredentialsSaved(.init(id: id, tmpPassword: Buffer(data: tempPassword)))
case let .applePay(data):
apiCredentials = .inputPaymentCredentialsApplePay(paymentData: .dataJSON(data: data))
apiCredentials = .inputPaymentCredentialsApplePay(.init(paymentData: .dataJSON(.init(data: data))))
}
var flags: Int32 = 0
if validatedInfoId != nil {
@@ -741,7 +757,8 @@ func _internal_sendBotPaymentForm(account: Account, formId: Int64, source: BotPa
return account.network.request(Api.functions.payments.sendPaymentForm(flags: flags, formId: formId, invoice: invoice, requestedInfoId: validatedInfoId, shippingOptionId: shippingOptionId, credentials: apiCredentials, tipAmount: tipAmount))
|> map { result -> SendBotPaymentResult in
switch result {
case let .paymentResult(updates):
case let .paymentResult(paymentResultData):
let updates = paymentResultData.updates
account.stateManager.addUpdates(updates)
var receiptMessageId: MessageId?
@@ -800,7 +817,8 @@ func _internal_sendBotPaymentForm(account: Account, formId: Int64, source: BotPa
}
}
return .done(receiptMessageId: receiptMessageId, subscriptionPeerId: nil, uniqueStarGift: nil)
case let .paymentVerificationNeeded(url):
case let .paymentVerificationNeeded(paymentVerificationNeededData):
let url = paymentVerificationNeededData.url
return .externalVerificationRequired(url: url)
}
}
@@ -882,7 +900,8 @@ func _internal_requestBotPaymentReceipt(account: Account, messageId: MessageId)
|> mapToSignal { result -> Signal<BotPaymentReceipt, RequestBotPaymentReceiptError> in
return account.postbox.transaction { transaction -> BotPaymentReceipt in
switch result {
case let .paymentReceipt(_, date, botId, _, title, description, photo, invoice, info, shipping, tipAmount, currency, totalAmount, credentialsTitle, users):
case let .paymentReceipt(paymentReceiptData):
let (date, botId, title, description, photo, invoice, info, shipping, tipAmount, currency, totalAmount, credentialsTitle, users) = (paymentReceiptData.date, paymentReceiptData.botId, paymentReceiptData.title, paymentReceiptData.description, paymentReceiptData.photo, paymentReceiptData.invoice, paymentReceiptData.info, paymentReceiptData.shipping, paymentReceiptData.tipAmount, paymentReceiptData.currency, paymentReceiptData.totalAmount, paymentReceiptData.credentialsTitle, paymentReceiptData.users)
let parsedPeers = AccumulatedPeers(transaction: transaction, chats: [], users: users)
updatePeers(transaction: transaction, accountPeerId: accountPeerId, peers: parsedPeers)
@@ -903,16 +922,17 @@ func _internal_requestBotPaymentReceipt(account: Account, messageId: MessageId)
flags: [],
version: TelegramMediaInvoice.lastVersion
)
let botPaymentId = PeerId.init(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(botId))
return BotPaymentReceipt(invoice: parsedInvoice, date: date, info: parsedInfo, shippingOption: shippingOption, credentialsTitle: credentialsTitle, invoiceMedia: invoiceMedia, tipAmount: tipAmount, botPaymentId: botPaymentId, transactionId: nil)
case let .paymentReceiptStars(_, date, botId, title, description, photo, invoice, currency, totalAmount, transactionId, users):
case let .paymentReceiptStars(paymentReceiptStarsData):
let (date, botId, title, description, photo, invoice, currency, totalAmount, transactionId, users) = (paymentReceiptStarsData.date, paymentReceiptStarsData.botId, paymentReceiptStarsData.title, paymentReceiptStarsData.description, paymentReceiptStarsData.photo, paymentReceiptStarsData.invoice, paymentReceiptStarsData.currency, paymentReceiptStarsData.totalAmount, paymentReceiptStarsData.transactionId, paymentReceiptStarsData.users)
let parsedPeers = AccumulatedPeers(transaction: transaction, chats: [], users: users)
updatePeers(transaction: transaction, accountPeerId: accountPeerId, peers: parsedPeers)
let parsedInvoice = BotPaymentInvoice(apiInvoice: invoice)
let invoiceMedia = TelegramMediaInvoice(
title: title,
description: description,
@@ -926,7 +946,7 @@ func _internal_requestBotPaymentReceipt(account: Account, messageId: MessageId)
flags: [],
version: TelegramMediaInvoice.lastVersion
)
let botPaymentId = PeerId.init(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(botId))
return BotPaymentReceipt(invoice: parsedInvoice, date: date, info: nil, shippingOption: nil, credentialsTitle: "", invoiceMedia: invoiceMedia, tipAmount: nil, botPaymentId: botPaymentId, transactionId: transactionId)
}
@@ -114,7 +114,8 @@ func _internal_getPremiumGiveawayInfo(account: Account, peerId: EnginePeer.Id, m
|> map { result -> PremiumGiveawayInfo? in
if let result = result {
switch result {
case let .giveawayInfo(flags, startDate, joinedTooEarlyDate, adminDisallowedChatId, disallowedCountry):
case let .giveawayInfo(giveawayInfoData):
let (flags, startDate, joinedTooEarlyDate, adminDisallowedChatId, disallowedCountry) = (giveawayInfoData.flags, giveawayInfoData.startDate, giveawayInfoData.joinedTooEarlyDate, giveawayInfoData.adminDisallowedChatId, giveawayInfoData.disallowedCountry)
if (flags & (1 << 3)) != 0 {
return .ongoing(startDate: startDate, status: .almostOver)
} else if (flags & (1 << 0)) != 0 {
@@ -128,7 +129,8 @@ func _internal_getPremiumGiveawayInfo(account: Account, peerId: EnginePeer.Id, m
} else {
return .ongoing(startDate: startDate, status: .notQualified)
}
case let .giveawayInfoResults(flags, startDate, giftCodeSlug, stars, finishDate, winnersCount, activatedCount):
case let .giveawayInfoResults(giveawayInfoResultsData):
let (flags, startDate, giftCodeSlug, stars, finishDate, winnersCount, activatedCount) = (giveawayInfoResultsData.flags, giveawayInfoResultsData.startDate, giveawayInfoResultsData.giftCodeSlug, giveawayInfoResultsData.starsPrize, giveawayInfoResultsData.finishDate, giveawayInfoResultsData.winnersCount, giveawayInfoResultsData.activatedCount)
let status: PremiumGiveawayInfo.ResultStatus
if (flags & (1 << 1)) != 0 {
status = .refunded
@@ -270,7 +272,8 @@ func _internal_checkPremiumGiftCode(account: Account, slug: String) -> Signal<Pr
|> mapToSignal { result -> Signal<PremiumGiftCodeInfo?, NoError> in
if let result = result {
switch result {
case let .checkedGiftCode(_, _, _, _, _, _, _, chats, users):
case let .checkedGiftCode(checkedGiftCodeData):
let (chats, users) = (checkedGiftCodeData.chats, checkedGiftCodeData.users)
return account.postbox.transaction { transaction in
let parsedPeers = AccumulatedPeers(transaction: transaction, chats: chats, users: users)
updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: parsedPeers)
@@ -349,9 +352,9 @@ func _internal_launchPrepaidGiveaway(account: Account, peerId: EnginePeer.Id, pu
let inputPurpose: Api.InputStorePaymentPurpose
switch purpose {
case let .stars(stars, users):
inputPurpose = .inputStorePaymentStarsGiveaway(flags: flags, stars: stars, boostPeer: inputPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: "", amount: 0, users: users)
inputPurpose = .inputStorePaymentStarsGiveaway(.init(flags: flags, stars: stars, boostPeer: inputPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: "", amount: 0, users: users))
case .premium:
inputPurpose = .inputStorePaymentPremiumGiveaway(flags: flags, boostPeer: inputPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: "", amount: 0)
inputPurpose = .inputStorePaymentPremiumGiveaway(.init(flags: flags, boostPeer: inputPeer, additionalPeers: additionalPeers, countriesIso2: countries, prizeDescription: prizeDescription, randomId: randomId, untilDate: untilDate, currency: "", amount: 0))
}
return account.network.request(Api.functions.payments.launchPrepaidGiveaway(peer: inputPeer, giveawayId: id, purpose: inputPurpose))
@@ -370,7 +373,8 @@ func _internal_launchPrepaidGiveaway(account: Account, peerId: EnginePeer.Id, pu
extension PremiumGiftCodeOption {
init(apiGiftCodeOption: Api.PremiumGiftCodeOption) {
switch apiGiftCodeOption {
case let .premiumGiftCodeOption(_, users, months, storeProduct, storeQuantity, curreny, amount):
case let .premiumGiftCodeOption(premiumGiftCodeOptionData):
let (_, users, months, storeProduct, storeQuantity, curreny, amount) = (premiumGiftCodeOptionData.flags, premiumGiftCodeOptionData.users, premiumGiftCodeOptionData.months, premiumGiftCodeOptionData.storeProduct, premiumGiftCodeOptionData.storeQuantity, premiumGiftCodeOptionData.currency, premiumGiftCodeOptionData.amount)
self.init(users: users, months: months, storeProductId: storeProduct, storeQuantity: storeQuantity ?? 1, currency: curreny, amount: amount)
}
}
@@ -379,7 +383,8 @@ extension PremiumGiftCodeOption {
extension PremiumGiftCodeInfo {
init(apiCheckedGiftCode: Api.payments.CheckedGiftCode, slug: String) {
switch apiCheckedGiftCode {
case let .checkedGiftCode(flags, fromId, giveawayMsgId, toId, date, months, usedDate, _, _):
case let .checkedGiftCode(checkedGiftCodeData):
let (flags, fromId, giveawayMsgId, toId, date, months, usedDate) = (checkedGiftCodeData.flags, checkedGiftCodeData.fromId, checkedGiftCodeData.giveawayMsgId, checkedGiftCodeData.toId, checkedGiftCodeData.date, checkedGiftCodeData.days, checkedGiftCodeData.usedDate)
self.slug = slug
self.fromPeerId = fromId?.peerId
if let fromId = fromId, let giveawayMsgId = giveawayMsgId {
@@ -405,12 +410,14 @@ public extension PremiumGiftCodeInfo {
extension PrepaidGiveaway {
init(apiPrepaidGiveaway: Api.PrepaidGiveaway) {
switch apiPrepaidGiveaway {
case let .prepaidGiveaway(id, months, quantity, date):
case let .prepaidGiveaway(prepaidGiveawayData):
let (id, months, quantity, date) = (prepaidGiveawayData.id, prepaidGiveawayData.months, prepaidGiveawayData.quantity, prepaidGiveawayData.date)
self.id = id
self.prize = .premium(months: months)
self.quantity = quantity
self.date = date
case let .prepaidStarsGiveaway(id, stars, quantity, boosts, date):
case let .prepaidStarsGiveaway(prepaidStarsGiveawayData):
let (id, stars, quantity, boosts, date) = (prepaidStarsGiveawayData.id, prepaidStarsGiveawayData.stars, prepaidStarsGiveawayData.quantity, prepaidStarsGiveawayData.boosts, prepaidStarsGiveawayData.date)
self.id = id
self.prize = .stars(stars: stars, boosts: boosts)
self.quantity = quantity
File diff suppressed because it is too large Load Diff
@@ -11,9 +11,9 @@ public enum StarGiftAuctionReference: Equatable {
var apiAuction: Api.InputStarGiftAuction {
switch self {
case let .giftId(giftId):
return .inputStarGiftAuction(giftId: giftId)
return .inputStarGiftAuction(.init(giftId: giftId))
case let .slug(slug):
return .inputStarGiftAuctionSlug(slug: slug)
return .inputStarGiftAuctionSlug(.init(slug: slug))
}
}
}
@@ -30,7 +30,8 @@ private func _internal_getStarGiftAuctionState(postbox: Postbox, network: Networ
}
return postbox.transaction { transaction -> (gift: StarGift, state: GiftAuctionContext.State.AuctionState?, myState: GiftAuctionContext.State.MyState, timeout: Int32)? in
switch result {
case let .starGiftAuctionState(apiGift, state, userState, timeout, users, chats):
case let .starGiftAuctionState(starGiftAuctionStateData):
let (apiGift, state, userState, timeout, users, chats) = (starGiftAuctionStateData.gift, starGiftAuctionStateData.state, starGiftAuctionStateData.userState, starGiftAuctionStateData.timeout, starGiftAuctionStateData.users, starGiftAuctionStateData.chats)
updatePeers(transaction: transaction, accountPeerId: accountPeerId, peers: AccumulatedPeers(chats: chats, users: users))
guard let gift = StarGift(apiStarGift: apiGift) else {
return nil
@@ -242,7 +243,8 @@ public final class GiftAuctionContext {
extension GiftAuctionContext.State.BidLevel {
init(apiBidLevel: Api.AuctionBidLevel) {
switch apiBidLevel {
case let .auctionBidLevel(pos, amount, date):
case let .auctionBidLevel(auctionBidLevelData):
let (pos, amount, date) = (auctionBidLevelData.pos, auctionBidLevelData.amount, auctionBidLevelData.date)
self.position = pos
self.amount = amount
self.date = date
@@ -253,7 +255,8 @@ extension GiftAuctionContext.State.BidLevel {
extension GiftAuctionContext.State.AuctionState {
init?(apiAuctionState: Api.StarGiftAuctionState, peers: [PeerId: Peer]) {
switch apiAuctionState {
case let .starGiftAuctionState(version, startDate, endDate, minBidAmount, bidLevels, topBiddersPeerIds, nextRoundAt, lastGiftNumber, giftsLeft, currentRound, totalRounds, apiRounds):
case let .starGiftAuctionState(starGiftAuctionStateData):
let (version, startDate, endDate, minBidAmount, bidLevels, topBiddersPeerIds, nextRoundAt, lastGiftNumber, giftsLeft, currentRound, totalRounds, apiRounds) = (starGiftAuctionStateData.version, starGiftAuctionStateData.startDate, starGiftAuctionStateData.endDate, starGiftAuctionStateData.minBidAmount, starGiftAuctionStateData.bidLevels, starGiftAuctionStateData.topBidders, starGiftAuctionStateData.nextRoundAt, starGiftAuctionStateData.lastGiftNum, starGiftAuctionStateData.giftsLeft, starGiftAuctionStateData.currentRound, starGiftAuctionStateData.totalRounds, starGiftAuctionStateData.rounds)
var topBidders: [EnginePeer] = []
for peerId in topBiddersPeerIds {
if let peer = peers[PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(peerId))] {
@@ -263,9 +266,11 @@ extension GiftAuctionContext.State.AuctionState {
var rounds: [GiftAuctionContext.State.Round] = []
for apiRound in apiRounds {
switch apiRound {
case let .starGiftAuctionRound(num, duration):
case let .starGiftAuctionRound(starGiftAuctionRoundData):
let (num, duration) = (starGiftAuctionRoundData.num, starGiftAuctionRoundData.duration)
rounds.append(.generic(num: num, duration: duration))
case let .starGiftAuctionRoundExtendable(num, duration, extendTop, extendWindow):
case let .starGiftAuctionRoundExtendable(starGiftAuctionRoundExtendableData):
let (num, duration, extendTop, extendWindow) = (starGiftAuctionRoundExtendableData.num, starGiftAuctionRoundExtendableData.duration, starGiftAuctionRoundExtendableData.extendTop, starGiftAuctionRoundExtendableData.extendWindow)
rounds.append(.extendable(num: num, duration: duration, extendTop: extendTop, extendWindow: extendWindow))
}
}
@@ -283,7 +288,8 @@ extension GiftAuctionContext.State.AuctionState {
rounds: rounds,
lastGiftNumber: lastGiftNumber
)
case let .starGiftAuctionStateFinished(_, startDate, endDate, averagePrice, listedCount, fragmentListedCount, fragmentListedUrl):
case let .starGiftAuctionStateFinished(starGiftAuctionStateFinishedData):
let (startDate, endDate, averagePrice, listedCount, fragmentListedCount, fragmentListedUrl) = (starGiftAuctionStateFinishedData.startDate, starGiftAuctionStateFinishedData.endDate, starGiftAuctionStateFinishedData.averagePrice, starGiftAuctionStateFinishedData.listedCount, starGiftAuctionStateFinishedData.fragmentListedCount, starGiftAuctionStateFinishedData.fragmentListedUrl)
self = .finished(
startDate: startDate,
endDate: endDate,
@@ -296,10 +302,11 @@ extension GiftAuctionContext.State.AuctionState {
return nil
}
}
init?(apiAuctionState: Api.StarGiftAuctionState, transaction: Transaction) {
switch apiAuctionState {
case let .starGiftAuctionState(version, startDate, endDate, minBidAmount, bidLevels, topBiddersPeerIds, nextRoundAt, lastGiftNumber, giftsLeft, currentRound, totalRounds, apiRounds):
case let .starGiftAuctionState(starGiftAuctionStateData):
let (version, startDate, endDate, minBidAmount, bidLevels, topBiddersPeerIds, nextRoundAt, lastGiftNumber, giftsLeft, currentRound, totalRounds, apiRounds) = (starGiftAuctionStateData.version, starGiftAuctionStateData.startDate, starGiftAuctionStateData.endDate, starGiftAuctionStateData.minBidAmount, starGiftAuctionStateData.bidLevels, starGiftAuctionStateData.topBidders, starGiftAuctionStateData.nextRoundAt, starGiftAuctionStateData.lastGiftNum, starGiftAuctionStateData.giftsLeft, starGiftAuctionStateData.currentRound, starGiftAuctionStateData.totalRounds, starGiftAuctionStateData.rounds)
var topBidders: [EnginePeer] = []
for peerId in topBiddersPeerIds {
if let peer = transaction.getPeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(peerId))) {
@@ -309,9 +316,11 @@ extension GiftAuctionContext.State.AuctionState {
var rounds: [GiftAuctionContext.State.Round] = []
for apiRound in apiRounds {
switch apiRound {
case let .starGiftAuctionRound(num, duration):
case let .starGiftAuctionRound(starGiftAuctionRoundData):
let (num, duration) = (starGiftAuctionRoundData.num, starGiftAuctionRoundData.duration)
rounds.append(.generic(num: num, duration: duration))
case let .starGiftAuctionRoundExtendable(num, duration, extendTop, extendWindow):
case let .starGiftAuctionRoundExtendable(starGiftAuctionRoundExtendableData):
let (num, duration, extendTop, extendWindow) = (starGiftAuctionRoundExtendableData.num, starGiftAuctionRoundExtendableData.duration, starGiftAuctionRoundExtendableData.extendTop, starGiftAuctionRoundExtendableData.extendWindow)
rounds.append(.extendable(num: num, duration: duration, extendTop: extendTop, extendWindow: extendWindow))
}
}
@@ -329,7 +338,8 @@ extension GiftAuctionContext.State.AuctionState {
rounds: rounds,
lastGiftNumber: lastGiftNumber
)
case let .starGiftAuctionStateFinished(_, startDate, endDate, averagePrice, listedCount, fragmentListedCount, fragmentListedUrl):
case let .starGiftAuctionStateFinished(starGiftAuctionStateFinishedData):
let (startDate, endDate, averagePrice, listedCount, fragmentListedCount, fragmentListedUrl) = (starGiftAuctionStateFinishedData.startDate, starGiftAuctionStateFinishedData.endDate, starGiftAuctionStateFinishedData.averagePrice, starGiftAuctionStateFinishedData.listedCount, starGiftAuctionStateFinishedData.fragmentListedCount, starGiftAuctionStateFinishedData.fragmentListedUrl)
self = .finished(
startDate: startDate,
endDate: endDate,
@@ -347,7 +357,8 @@ extension GiftAuctionContext.State.AuctionState {
extension GiftAuctionContext.State.MyState {
init(apiAuctionUserState: Api.StarGiftAuctionUserState) {
switch apiAuctionUserState {
case let .starGiftAuctionUserState(flags, bidAmount, bidDate, minBidAmount, bidPeerId, acquiredCount):
case let .starGiftAuctionUserState(starGiftAuctionUserStateData):
let (flags, bidAmount, bidDate, minBidAmount, bidPeerId, acquiredCount) = (starGiftAuctionUserStateData.flags, starGiftAuctionUserStateData.bidAmount, starGiftAuctionUserStateData.bidDate, starGiftAuctionUserStateData.minBidAmount, starGiftAuctionUserStateData.bidPeer, starGiftAuctionUserStateData.acquiredCount)
self.isReturned = (flags & (1 << 1)) != 0
self.bidAmount = bidAmount
self.bidDate = bidDate
@@ -382,19 +393,22 @@ func _internal_getGiftAuctionAcquiredGifts(account: Account, giftId: Int64) -> S
}
return account.postbox.transaction { transaction -> [GiftAuctionAcquiredGift] in
switch result {
case let .starGiftAuctionAcquiredGifts(gifts, users, chats):
case let .starGiftAuctionAcquiredGifts(starGiftAuctionAcquiredGiftsData):
let (gifts, users, chats) = (starGiftAuctionAcquiredGiftsData.gifts, starGiftAuctionAcquiredGiftsData.users, starGiftAuctionAcquiredGiftsData.chats)
let parsedPeers = AccumulatedPeers(transaction: transaction, chats: chats, users: users)
updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: parsedPeers)
var mappedGifts: [GiftAuctionAcquiredGift] = []
for gift in gifts {
switch gift {
case let .starGiftAuctionAcquiredGift(flags, peerId, date, bidAmount, round, pos, message, number):
case let .starGiftAuctionAcquiredGift(starGiftAuctionAcquiredGiftData):
let (flags, peerId, date, bidAmount, round, pos, message, number) = (starGiftAuctionAcquiredGiftData.flags, starGiftAuctionAcquiredGiftData.peer, starGiftAuctionAcquiredGiftData.date, starGiftAuctionAcquiredGiftData.bidAmount, starGiftAuctionAcquiredGiftData.round, starGiftAuctionAcquiredGiftData.pos, starGiftAuctionAcquiredGiftData.message, starGiftAuctionAcquiredGiftData.giftNum)
if let peer = transaction.getPeer(peerId.peerId) {
var text: String?
var entities: [MessageTextEntity]?
switch message {
case let .textWithEntities(textValue, entitiesValue):
case let .textWithEntities(textWithEntitiesData):
let (textValue, entitiesValue) = (textWithEntitiesData.text, textWithEntitiesData.entities)
text = textValue
entities = messageTextEntitiesFromApiEntities(entitiesValue)
default:
@@ -426,14 +440,16 @@ func _internal_getActiveGiftAuctions(account: Account, hash: Int64) -> Signal<[G
|> mapToSignal { result in
return account.postbox.transaction { transaction -> [GiftAuctionContext]? in
switch result {
case let .starGiftActiveAuctions(auctions, users, chats):
case let .starGiftActiveAuctions(starGiftActiveAuctionsData):
let (auctions, users, chats) = (starGiftActiveAuctionsData.auctions, starGiftActiveAuctionsData.users, starGiftActiveAuctionsData.chats)
let parsedPeers = AccumulatedPeers(chats: chats, users: users)
updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: parsedPeers)
var auctionContexts: [GiftAuctionContext] = []
for auction in auctions {
switch auction {
case let .starGiftActiveAuctionState(apiGift, auctionState, userState):
case let .starGiftActiveAuctionState(starGiftActiveAuctionStateData):
let (apiGift, auctionState, userState) = (starGiftActiveAuctionStateData.gift, starGiftActiveAuctionStateData.state, starGiftActiveAuctionStateData.userState)
guard let gift = StarGift(apiStarGift: apiGift) else {
continue
}
@@ -42,7 +42,13 @@ public struct StarGiftCollection: Codable, Equatable {
extension StarGiftCollection {
init?(apiStarGiftCollection: Api.StarGiftCollection) {
switch apiStarGiftCollection {
case let .starGiftCollection(_, collectionId, title, icon, giftsCount, hash):
case let .starGiftCollection(starGiftCollectionData):
let _ = starGiftCollectionData.flags
let collectionId = starGiftCollectionData.collectionId
let title = starGiftCollectionData.title
let icon = starGiftCollectionData.icon
let giftsCount = starGiftCollectionData.giftsCount
let hash = starGiftCollectionData.hash
self.id = collectionId
self.title = title
self.icon = icon.flatMap { telegramMediaFileFromApiDocument($0, altDocuments: nil) }
@@ -121,8 +127,9 @@ private func _internal_getStarGiftCollections(postbox: Postbox, network: Network
}
return postbox.transaction { transaction -> [StarGiftCollection]? in
switch result {
case let .starGiftCollections(collections):
let collections = collections.compactMap { StarGiftCollection(apiStarGiftCollection: $0) }
case let .starGiftCollections(starGiftCollectionsData):
let apiCollections = starGiftCollectionsData.collections
let collections = apiCollections.compactMap { StarGiftCollection(apiStarGiftCollection: $0) }
return collections
case .starGiftCollectionsNotModified:
return cachedCollections ?? []
@@ -51,7 +51,8 @@ public struct StarsTopUpOption: Equatable, Codable {
extension StarsTopUpOption {
init(apiStarsTopupOption: Api.StarsTopupOption) {
switch apiStarsTopupOption {
case let .starsTopupOption(flags, stars, storeProduct, currency, amount):
case let .starsTopupOption(starsTopupOptionData):
let (flags, stars, storeProduct, currency, amount) = (starsTopupOptionData.flags, starsTopupOptionData.stars, starsTopupOptionData.storeProduct, starsTopupOptionData.currency, starsTopupOptionData.amount)
self.init(count: stars, storeProductId: storeProduct, currency: currency, amount: amount, isExtended: (flags & (1 << 1)) != 0)
}
}
@@ -117,7 +118,8 @@ public struct StarsGiftOption: Equatable, Codable {
extension StarsGiftOption {
init(apiStarsGiftOption: Api.StarsGiftOption) {
switch apiStarsGiftOption {
case let .starsGiftOption(flags, stars, storeProduct, currency, amount):
case let .starsGiftOption(starsGiftOptionData):
let (flags, stars, storeProduct, currency, amount) = (starsGiftOptionData.flags, starsGiftOptionData.stars, starsGiftOptionData.storeProduct, starsGiftOptionData.currency, starsGiftOptionData.amount)
self.init(count: stars, storeProductId: storeProduct, currency: currency, amount: amount, isExtended: (flags & (1 << 1)) != 0)
}
}
@@ -241,7 +243,8 @@ public struct StarsGiveawayOption: Equatable, Codable {
extension StarsGiveawayOption.Winners {
init(apiStarsGiveawayWinnersOption: Api.StarsGiveawayWinnersOption) {
switch apiStarsGiveawayWinnersOption {
case let .starsGiveawayWinnersOption(flags, users, starsPerUser):
case let .starsGiveawayWinnersOption(starsGiveawayWinnersOptionData):
let (flags, users, starsPerUser) = (starsGiveawayWinnersOptionData.flags, starsGiveawayWinnersOptionData.users, starsGiveawayWinnersOptionData.perUserStars)
self.init(users: users, starsPerUser: starsPerUser, isDefault: (flags & (1 << 0)) != 0)
}
}
@@ -250,7 +253,8 @@ extension StarsGiveawayOption.Winners {
extension StarsGiveawayOption {
init(apiStarsGiveawayOption: Api.StarsGiveawayOption) {
switch apiStarsGiveawayOption {
case let .starsGiveawayOption(flags, stars, yearlyBoosts, storeProduct, currency, amount, winners):
case let .starsGiveawayOption(starsGiveawayOptionData):
let (flags, stars, yearlyBoosts, storeProduct, currency, amount, winners) = (starsGiveawayOptionData.flags, starsGiveawayOptionData.stars, starsGiveawayOptionData.yearlyBoosts, starsGiveawayOptionData.storeProduct, starsGiveawayOptionData.currency, starsGiveawayOptionData.amount, starsGiveawayOptionData.winners)
self.init(count: stars, yearlyBoosts: yearlyBoosts, storeProductId: storeProduct, currency: currency, amount: amount, winners: winners.map { StarsGiveawayOption.Winners(apiStarsGiveawayWinnersOption: $0) }, isExtended: (flags & (1 << 0)) != 0, isDefault: (flags & (1 << 1)) != 0)
}
}
@@ -346,9 +350,11 @@ public struct StarsAmount: Equatable, Comparable, Hashable, Codable, CustomStrin
extension StarsAmount {
init(apiAmount: Api.StarsAmount) {
switch apiAmount {
case let .starsAmount(amount, nanos):
case let .starsAmount(starsAmountData):
let (amount, nanos) = (starsAmountData.amount, starsAmountData.nanos)
self.init(value: amount, nanos: nanos)
case let .starsTonAmount(amount):
case let .starsTonAmount(starsTonAmountData):
let amount = starsTonAmountData.amount
self.init(value: amount, nanos: 0)
}
}
@@ -389,9 +395,11 @@ public struct CurrencyAmount: Equatable, Hashable, Codable {
extension CurrencyAmount {
init(apiAmount: Api.StarsAmount) {
switch apiAmount {
case let .starsAmount(amount, nanos):
case let .starsAmount(starsAmountData):
let (amount, nanos) = (starsAmountData.amount, starsAmountData.nanos)
self.init(amount: StarsAmount(value: amount, nanos: nanos), currency: .stars)
case let .starsTonAmount(amount):
case let .starsTonAmount(starsTonAmountData):
let amount = starsTonAmountData.amount
self.init(amount: StarsAmount(value: amount, nanos: 0), currency: .ton)
}
}
@@ -399,10 +407,10 @@ extension CurrencyAmount {
var apiAmount: Api.StarsAmount {
switch self.currency {
case .stars:
return .starsAmount(amount: self.amount.value, nanos: self.amount.nanos)
return .starsAmount(.init(amount: self.amount.value, nanos: self.amount.nanos))
case .ton:
assert(self.amount.nanos == 0)
return .starsTonAmount(amount: self.amount.value)
return .starsTonAmount(.init(amount: self.amount.value))
}
}
}
@@ -462,7 +470,8 @@ private func _internal_requestStarsState(account: Account, peerId: EnginePeer.Id
|> mapToSignal { result -> Signal<InternalStarsStatus, RequestStarsStateError> in
return account.postbox.transaction { transaction -> InternalStarsStatus in
switch result {
case let .starsStatus(_, balance, _, _, subscriptionsMissingBalance, transactions, nextTransactionsOffset, chats, users):
case let .starsStatus(starsStatusData):
let (_, balance, _, _, subscriptionsMissingBalance, transactions, nextTransactionsOffset, chats, users) = (starsStatusData.flags, starsStatusData.balance, starsStatusData.subscriptions, starsStatusData.subscriptionsNextOffset, starsStatusData.subscriptionsMissingBalance, starsStatusData.history, starsStatusData.nextOffset, starsStatusData.chats, starsStatusData.users)
let peers = AccumulatedPeers(chats: chats, users: users)
updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: peers)
@@ -515,10 +524,11 @@ private func _internal_requestStarsSubscriptions(account: Account, peerId: Engin
}
return account.postbox.transaction { transaction -> InternalStarsStatus in
switch result {
case let .starsStatus(_, balance, subscriptions, subscriptionsNextOffset, subscriptionsMissingBalance, _, _, chats, users):
case let .starsStatus(starsStatusData):
let (_, balance, subscriptions, subscriptionsNextOffset, subscriptionsMissingBalance, _, _, chats, users) = (starsStatusData.flags, starsStatusData.balance, starsStatusData.subscriptions, starsStatusData.subscriptionsNextOffset, starsStatusData.subscriptionsMissingBalance, starsStatusData.history, starsStatusData.nextOffset, starsStatusData.chats, starsStatusData.users)
let peers = AccumulatedPeers(chats: chats, users: users)
updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: peers)
var parsedSubscriptions: [StarsContext.State.Subscription] = []
if let subscriptions {
for entry in subscriptions {
@@ -655,11 +665,12 @@ private final class StarsContextImpl {
private extension StarsContext.State.Transaction {
init?(apiTransaction: Api.StarsTransaction, peerId: EnginePeer.Id?, transaction: Transaction) {
switch apiTransaction {
case let .starsTransaction(apiFlags, id, stars, date, transactionPeer, title, description, photo, transactionDate, transactionUrl, _, messageId, extendedMedia, subscriptionPeriod, giveawayPostId, starGift, floodskipNumber, starrefCommissionPermille, starrefPeer, starrefAmount, paidMessageCount, premiumGiftMonths, adsProceedsFromDate, adsProceedsToDate):
case let .starsTransaction(starsTransactionData):
let (apiFlags, id, stars, date, transactionPeer, title, description, photo, transactionDate, transactionUrl, _, messageId, extendedMedia, subscriptionPeriod, giveawayPostId, starGift, floodskipNumber, starrefCommissionPermille, starrefPeer, starrefAmount, paidMessageCount, premiumGiftMonths, adsProceedsFromDate, adsProceedsToDate) = (starsTransactionData.flags, starsTransactionData.id, starsTransactionData.amount, starsTransactionData.date, starsTransactionData.peer, starsTransactionData.title, starsTransactionData.description, starsTransactionData.photo, starsTransactionData.transactionDate, starsTransactionData.transactionUrl, starsTransactionData.botPayload, starsTransactionData.msgId, starsTransactionData.extendedMedia, starsTransactionData.subscriptionPeriod, starsTransactionData.giveawayPostId, starsTransactionData.stargift, starsTransactionData.floodskipNumber, starsTransactionData.starrefCommissionPermille, starsTransactionData.starrefPeer, starsTransactionData.starrefAmount, starsTransactionData.paidMessages, starsTransactionData.premiumGiftMonths, starsTransactionData.adsProceedsFromDate, starsTransactionData.adsProceedsToDate)
let parsedPeer: StarsContext.State.Transaction.Peer
var paidMessageId: MessageId?
var giveawayMessageId: MessageId?
switch transactionPeer {
case .starsTransactionPeerAppStore:
parsedPeer = .appStore
@@ -675,7 +686,8 @@ private extension StarsContext.State.Transaction {
parsedPeer = .apiLimitExtension
case .starsTransactionPeerUnsupported:
parsedPeer = .unsupported
case let .starsTransactionPeer(apiPeer):
case let .starsTransactionPeer(starsTransactionPeerData):
let apiPeer = starsTransactionPeerData.peer
guard let peer = transaction.getPeer(apiPeer.peerId) else {
return nil
}
@@ -749,7 +761,8 @@ private extension StarsContext.State.Transaction {
private extension StarsContext.State.Subscription {
init?(apiSubscription: Api.StarsSubscription, transaction: Transaction) {
switch apiSubscription {
case let .starsSubscription(apiFlags, id, apiPeer, untilDate, pricing, inviteHash, title, photo, invoiceSlug):
case let .starsSubscription(starsSubscriptionData):
let (apiFlags, id, apiPeer, untilDate, pricing, inviteHash, title, photo, invoiceSlug) = (starsSubscriptionData.flags, starsSubscriptionData.id, starsSubscriptionData.peer, starsSubscriptionData.untilDate, starsSubscriptionData.pricing, starsSubscriptionData.chatInviteHash, starsSubscriptionData.title, starsSubscriptionData.photo, starsSubscriptionData.invoiceSlug)
guard let peer = transaction.getPeer(apiPeer.peerId) else {
return nil
}
@@ -1591,7 +1604,8 @@ func _internal_sendStarsPaymentForm(account: Account, formId: Int64, source: Bot
return account.network.request(Api.functions.payments.sendStarsForm(formId: formId, invoice: invoice))
|> map { result -> SendBotPaymentResult in
switch result {
case let .paymentResult(updates):
case let .paymentResult(paymentResultData):
let updates = paymentResultData.updates
account.stateManager.addUpdates(updates)
switch source {
@@ -1644,7 +1658,7 @@ func _internal_sendStarsPaymentForm(account: Account, formId: Int64, source: Bot
case .giftCode, .stars, .starsGift, .starsChatSubscription, .starGift, .starGiftUpgrade, .starGiftTransfer, .premiumGift, .starGiftResale, .starGiftPrepaidUpgrade, .starGiftDropOriginalDetails, .starGiftAuctionBid:
receiptMessageId = nil
}
} else if case let .starGiftUnique(gift, _, _, savedToProfile, canExportDate, transferStars, isRefunded, _, peerId, _, savedId, _, canTransferDate, canResaleDate, dropOriginalDetailsStars, _, _) = action.action, case let .Id(messageId) = message.id {
} else if case let .starGiftUnique(gift, _, _, savedToProfile, canExportDate, transferStars, isRefunded, _, peerId, _, savedId, _, canTransferDate, canResaleDate, dropOriginalDetailsStars, _, _, canCraftAt, _) = action.action, case let .Id(messageId) = message.id {
let reference: StarGiftReference
if let peerId, let savedId {
reference = .peer(peerId: peerId, id: savedId)
@@ -1673,7 +1687,8 @@ func _internal_sendStarsPaymentForm(account: Account, formId: Int64, source: Bot
upgradeSeparate: false,
dropOriginalDetailsStars: dropOriginalDetailsStars,
number: nil,
isRefunded: isRefunded
isRefunded: isRefunded,
canCraftAt: canCraftAt
)
}
}
@@ -1681,7 +1696,8 @@ func _internal_sendStarsPaymentForm(account: Account, formId: Int64, source: Bot
}
}
return .done(receiptMessageId: receiptMessageId, subscriptionPeerId: nil, uniqueStarGift: resultGift)
case let .paymentVerificationNeeded(url):
case let .paymentVerificationNeeded(paymentVerificationNeededData):
let url = paymentVerificationNeededData.url
return .externalVerificationRequired(url: url)
}
}
@@ -1746,7 +1762,7 @@ func _internal_getStarsTransaction(accountPeerId: PeerId, postbox: Postbox, netw
Api.functions.payments.getStarsTransactionsByID(
flags: transactionReference.ton ? 1 << 0 : 0,
peer: inputPeer,
id: [.inputStarsTransaction(flags: transactionReference.isRefund ? (1 << 0) : 0, id: transactionReference.id)]
id: [.inputStarsTransaction(.init(flags: transactionReference.isRefund ? (1 << 0) : 0, id: transactionReference.id))]
)
)
|> map(Optional.init)
@@ -1755,9 +1771,11 @@ func _internal_getStarsTransaction(accountPeerId: PeerId, postbox: Postbox, netw
}
|> mapToSignal { result -> Signal<StarsContext.State.Transaction?, NoError> in
return postbox.transaction { transaction -> StarsContext.State.Transaction? in
guard let result, case let .starsStatus(_, _, _, _, _, transactions, _, chats, users) = result, let matchingTransaction = transactions?.first else {
guard let result, case let .starsStatus(starsStatusData) = result, let matchingTransaction = starsStatusData.history?.first else {
return nil
}
let (_, _, _, _, _, transactions, _, chats, users) = (starsStatusData.flags, starsStatusData.balance, starsStatusData.subscriptions, starsStatusData.subscriptionsNextOffset, starsStatusData.subscriptionsMissingBalance, starsStatusData.history, starsStatusData.nextOffset, starsStatusData.chats, starsStatusData.users)
let _ = transactions
let peers = AccumulatedPeers(chats: chats, users: users)
updatePeers(transaction: transaction, accountPeerId: accountPeerId, peers: peers)
@@ -1808,13 +1826,14 @@ public struct StarsSubscriptionPricing: Codable, Equatable {
extension StarsSubscriptionPricing {
init(apiStarsSubscriptionPricing: Api.StarsSubscriptionPricing) {
switch apiStarsSubscriptionPricing {
case let .starsSubscriptionPricing(period, amount):
case let .starsSubscriptionPricing(starsSubscriptionPricingData):
let (period, amount) = (starsSubscriptionPricingData.period, starsSubscriptionPricingData.amount)
self = .init(period: period, amount: StarsAmount(value: amount, nanos: 0))
}
}
var apiStarsSubscriptionPricing: Api.StarsSubscriptionPricing {
return .starsSubscriptionPricing(period: self.period, amount: self.amount.value)
return .starsSubscriptionPricing(.init(period: self.period, amount: self.amount.value))
}
}
@@ -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)
}