From 15146725e3352fc9eee6508d483981f67e62eefd Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 23 Apr 2025 15:01:49 +0400 Subject: [PATCH] Fix transfer of my gifts from Resale. --- Telegram/SourceFiles/boxes/star_gift_box.cpp | 29 ++++++++++++++++++- .../SourceFiles/boxes/transfer_gift_box.cpp | 28 ++++++++++++------ .../payments/payments_checkout_process.h | 1 + .../settings/settings_credits_graphics.cpp | 5 +++- 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/Telegram/SourceFiles/boxes/star_gift_box.cpp b/Telegram/SourceFiles/boxes/star_gift_box.cpp index 18bdebceb6..6a7eeae47a 100644 --- a/Telegram/SourceFiles/boxes/star_gift_box.cpp +++ b/Telegram/SourceFiles/boxes/star_gift_box.cpp @@ -2628,7 +2628,10 @@ void SendGiftBox( button->setDescriptor(descriptor, GiftButton::Mode::Full); button->setClickedCallback([=] { const auto star = std::get_if(&descriptor); - if (star && star->info.unique && star->mine) { + if (star + && star->info.unique + && star->mine + && !peer->isSelf()) { const auto done = [=] { window->session().credits().load(true); window->showPeerHistory(peer); @@ -3066,6 +3069,28 @@ void GiftResaleBox( }); }, content->lifetime()); + peer->owner().giftUpdates( + ) | rpl::start_with_next([=](const Data::GiftUpdate &update) { + using Action = Data::GiftUpdate::Action; + const auto action = update.action; + if (action != Action::Transfer && action != Action::ResaleChange) { + return; + } + const auto i = ranges::find( + state->data.list, + update.slug, + [](const Data::StarGift &gift) { + return gift.unique ? gift.unique->slug : QString(); + }); + if (i == end(state->data.list)) { + return; + } else if (action == Action::Transfer + || !i->unique->starsForResale) { + state->data.list.erase(i); + } + state->updated.fire({}); + }, box->lifetime()); + content->add(MakeGiftsList(window, peer, rpl::single( rpl::empty ) | rpl::then( @@ -4749,6 +4774,8 @@ void RequestStarsFormAndSubmit( const auto type = error.type(); if (type == u"STARGIFT_EXPORT_IN_PROGRESS"_q) { done(Payments::CheckoutResult::Cancelled, nullptr); + } else if (type == u"NO_PAYMENT_NEEDED"_q) { + done(Payments::CheckoutResult::Free, nullptr); } else { show->showToast(type); done(Payments::CheckoutResult::Failed, nullptr); diff --git a/Telegram/SourceFiles/boxes/transfer_gift_box.cpp b/Telegram/SourceFiles/boxes/transfer_gift_box.cpp index 0eb7150c08..cb6260aa89 100644 --- a/Telegram/SourceFiles/boxes/transfer_gift_box.cpp +++ b/Telegram/SourceFiles/boxes/transfer_gift_box.cpp @@ -422,7 +422,8 @@ void TransferGift( not_null to, std::shared_ptr gift, Data::SavedStarGiftId savedId, - Fn done) { + Fn done, + bool skipPaymentForm = false) { Expects(to->isUser()); const auto session = &window->session(); @@ -430,6 +431,11 @@ void TransferGift( auto formDone = [=]( Payments::CheckoutResult result, const MTPUpdates *updates) { + if (result == Payments::CheckoutResult::Free) { + Assert(!skipPaymentForm); + TransferGift(window, to, gift, savedId, done, true); + return; + } done(result); if (result == Payments::CheckoutResult::Paid) { session->data().notifyGiftUpdate({ @@ -441,7 +447,11 @@ void TransferGift( } } }; - if (gift->starsForTransfer <= 0) { + if (skipPaymentForm) { + // We can't check (gift->starsForTransfer <= 0) here. + // + // Sometimes we don't know the price for transfer. + // Like when we transfer a gift from Resale tab. session->api().request(MTPpayments_TransferStarGift( Api::InputSavedStarGiftId(savedId, gift), to->input @@ -454,14 +464,14 @@ void TransferGift( strong->showToast(error.type()); } }).send(); - return; + } else { + Ui::RequestStarsFormAndSubmit( + window->uiShow(), + MTP_inputInvoiceStarGiftTransfer( + Api::InputSavedStarGiftId(savedId, gift), + to->input), + std::move(formDone)); } - Ui::RequestStarsFormAndSubmit( - window->uiShow(), - MTP_inputInvoiceStarGiftTransfer( - Api::InputSavedStarGiftId(savedId, gift), - to->input), - std::move(formDone)); } void BuyResaleGift( diff --git a/Telegram/SourceFiles/payments/payments_checkout_process.h b/Telegram/SourceFiles/payments/payments_checkout_process.h index d5f6ce945e..2f52caf23f 100644 --- a/Telegram/SourceFiles/payments/payments_checkout_process.h +++ b/Telegram/SourceFiles/payments/payments_checkout_process.h @@ -54,6 +54,7 @@ enum class CheckoutResult { Pending, Cancelled, Failed, + Free, // Gift transfer attempt that doesn't need any payment. }; struct RealFormPresentedNotification { diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index e663b18ebd..dcbe5c3705 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -2108,6 +2108,7 @@ void GlobalStarGiftBox( const Data::StarGift &data, PeerId resaleRecipientId, CreditsEntryBoxStyleOverrides st) { + const auto selfId = show->session().userPeerId(); const auto ownerId = data.unique ? data.unique->ownerId.value : 0; Settings::GenericCreditsEntryBox( box, @@ -2116,7 +2117,9 @@ void GlobalStarGiftBox( .credits = StarsAmount(data.stars), .bareGiftStickerId = data.document->id, .bareGiftOwnerId = ownerId, - .bareGiftResaleRecipientId = resaleRecipientId.value, + .bareGiftResaleRecipientId = ((resaleRecipientId != selfId) + ? resaleRecipientId.value + : 0), .stargiftId = data.id, .uniqueGift = data.unique, .peerType = Data::CreditsHistoryEntry::PeerType::Peer,