diff --git a/Telegram/SourceFiles/api/api_credits.cpp b/Telegram/SourceFiles/api/api_credits.cpp index 4429de7bf..38fc6bef3 100644 --- a/Telegram/SourceFiles/api/api_credits.cpp +++ b/Telegram/SourceFiles/api/api_credits.cpp @@ -75,6 +75,14 @@ constexpr auto kTransactionsLimit = 100; const auto stargift = tl.data().vstargift(); const auto reaction = tl.data().is_reaction(); const auto amount = Data::FromTL(tl.data().vstars()); + const auto starrefAmount = tl.data().vstarref_amount() + ? Data::FromTL(*tl.data().vstarref_amount()) + : StarsAmount(); + const auto starrefCommission + = tl.data().vstarref_commission_permille().value_or_empty(); + const auto starrefBarePeerId = tl.data().vstarref_peer() + ? peerFromMTP(*tl.data().vstarref_peer()).value + : 0; const auto incoming = (amount >= StarsAmount()); const auto saveActorId = (reaction || !extended.empty()) && incoming; return Data::CreditsHistoryEntry{ @@ -93,6 +101,9 @@ constexpr auto kTransactionsLimit = 100; ? owner->processDocument(stargift->data().vsticker())->id : 0), .bareActorId = saveActorId ? barePeerId : uint64(0), + .starrefAmount = starrefAmount, + .starrefCommission = starrefCommission, + .starrefRecipientId = starrefBarePeerId, .peerType = tl.data().vpeer().match([](const HistoryPeerTL &) { return Data::CreditsHistoryEntry::PeerType::Peer; }, [](const MTPDstarsTransactionPeerPlayMarket &) { diff --git a/Telegram/SourceFiles/boxes/gift_premium_box.cpp b/Telegram/SourceFiles/boxes/gift_premium_box.cpp index 1c0b80dee..cb8723968 100644 --- a/Telegram/SourceFiles/boxes/gift_premium_box.cpp +++ b/Telegram/SourceFiles/boxes/gift_premium_box.cpp @@ -1146,9 +1146,43 @@ void AddCreditsHistoryEntryTable( st::giveawayGiftCodeTableMargin); const auto peerId = PeerId(entry.barePeerId); const auto actorId = PeerId(entry.bareActorId); + const auto starrefRecipientId = PeerId(entry.starrefRecipientId); const auto session = &controller->session(); - if (actorId || peerId) { - auto text = entry.in + if (entry.starrefCommission) { + if (entry.starrefAmount) { + AddTableRow( + table, + tr::lng_star_ref_commission_title(), + rpl::single(TextWithEntities{ + QString::number(entry.starrefCommission / 10.) + '%' })); + } else { + AddTableRow( + table, + tr::lng_gift_link_label_reason(), + tr::lng_credits_box_history_entry_reason_star_ref( + Ui::Text::WithEntities)); + } + } + if (starrefRecipientId && entry.starrefAmount) { + AddTableRow( + table, + tr::lng_credits_box_history_entry_affiliate(), + controller, + starrefRecipientId); + } + if (peerId && entry.starrefCommission) { + AddTableRow( + table, + (entry.starrefAmount + ? tr::lng_credits_box_history_entry_referred + : tr::lng_credits_box_history_entry_miniapp)(), + controller, + peerId); + } + if (actorId || (!entry.starrefCommission && peerId)) { + auto text = entry.starrefCommission + ? tr::lng_credits_box_history_entry_referred() + : entry.in ? tr::lng_credits_box_history_entry_peer_in() : tr::lng_credits_box_history_entry_peer(); AddTableRow( diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index dfe78d20a..5b2b49cda 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -1745,7 +1745,7 @@ void Controller::fillBotAffiliateProgram() { ? user->botInfo->starRefProgram.commission : 0; return commission - ? u"%1%"_q.arg(commission / 10.) + ? Info::BotStarRef::FormatCommission(commission) : tr::lng_manage_peer_bot_star_ref_off(tr::now); }); AddButtonWithCount( diff --git a/Telegram/SourceFiles/data/data_credits.h b/Telegram/SourceFiles/data/data_credits.h index 1efc07d2b..f0cbccad2 100644 --- a/Telegram/SourceFiles/data/data_credits.h +++ b/Telegram/SourceFiles/data/data_credits.h @@ -63,6 +63,9 @@ struct CreditsHistoryEntry final { uint64 bareGiveawayMsgId = 0; uint64 bareGiftStickerId = 0; uint64 bareActorId = 0; + StarsAmount starrefAmount; + int starrefCommission = 0; + uint64 starrefRecipientId = 0; PeerType peerType; QDateTime subscriptionUntil; QDateTime successDate; diff --git a/Telegram/SourceFiles/data/data_credits_earn.h b/Telegram/SourceFiles/data/data_credits_earn.h index dd5a2307a..41c6f9a5a 100644 --- a/Telegram/SourceFiles/data/data_credits_earn.h +++ b/Telegram/SourceFiles/data/data_credits_earn.h @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "core/stars_amount.h" #include "data/data_statistics_chart.h" #include diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_common.cpp b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_common.cpp index b3a5c09e0..ac76363e1 100644 --- a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_common.cpp +++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_common.cpp @@ -53,7 +53,7 @@ void ConnectStarRef( } // namespace -QString FormatStarRefCommission(ushort commission) { +QString FormatCommission(ushort commission) { return QString::number(commission / 10.) + '%'; } @@ -248,7 +248,7 @@ object_ptr StarRefLinkBox( : tr::lng_star_ref_link_about_channel)( lt_amount, rpl::single(Ui::Text::Bold( - FormatStarRefCommission(program.commission))), + FormatCommission(program.commission))), lt_app, rpl::single(Ui::Text::Bold(bot->name())), lt_duration, @@ -341,7 +341,7 @@ object_ptr StarRefLinkBox( rpl::single(Ui::Text::Bold(bot->name())), lt_amount, rpl::single(Ui::Text::Bold( - FormatStarRefCommission(program.commission))), + FormatCommission(program.commission))), lt_duration, FormatProgramDuration(program), Ui::Text::WithEntities), diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_common.h b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_common.h index 22a5f58c6..00e056c09 100644 --- a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_common.h +++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_common.h @@ -38,7 +38,7 @@ struct ConnectedBot { }; using ConnectedBots = std::vector; -[[nodiscard]] QString FormatStarRefCommission(ushort commission); +[[nodiscard]] QString FormatCommission(ushort commission); [[nodiscard]] rpl::producer FormatProgramDuration( StarRefProgram program); diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp index 5b36457b1..e637afe91 100644 --- a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp +++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp @@ -156,8 +156,8 @@ std::unique_ptr ListController::createRow(ConnectedBot bot) { if (bot.state.revoked) { result->setCustomStatus(u"Revoked"_q); } else { - result->setCustomStatus(u"+%1%, %2"_q.arg( - QString::number(program.commission / 10.), + result->setCustomStatus(u"+%1, %2"_q.arg( + FormatCommission(program.commission), duration)); } return result; diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.cpp b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.cpp index d6bae3274..b750273a4 100644 --- a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.cpp +++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.cpp @@ -645,7 +645,7 @@ void InnerWidget::setupCommission() { commission, setCommission, setCommission, - [=](int value) { return FormatStarRefCommission(value); }, + [=](int value) { return FormatCommission(value); }, _state.exists), st::boxRowPadding); _state.program.commission = commission; diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index 54ddf8220..3a55dfbfa 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -35,6 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "history/history_item.h" #include "history/history_item_components.h" // HistoryServicePaymentRefund. +#include "info/bot/starref/info_bot_starref_common.h" #include "info/channel_statistics/boosts/giveaway/boost_badge.h" // InfiniteRadialAnimationWidget. #include "info/settings/info_settings_widget.h" // SectionCustomTopBarData. #include "info/statistics/info_statistics_list_controllers.h" @@ -1012,6 +1013,11 @@ void ReceiptCreditsBox( ? tr::lng_credits_box_history_entry_subscription(tr::now) : !e.title.isEmpty() ? e.title + : e.starrefCommission + ? tr::lng_credits_commission( + tr::now, + lt_amount, + Info::BotStarRef::FormatCommission(e.starrefCommission)) : e.soldOutInfo ? tr::lng_credits_box_history_entry_gift_unavailable(tr::now) : sentStarGift diff --git a/Telegram/SourceFiles/ui/effects/credits_graphics.cpp b/Telegram/SourceFiles/ui/effects/credits_graphics.cpp index 97cf203c8..e48fc5848 100644 --- a/Telegram/SourceFiles/ui/effects/credits_graphics.cpp +++ b/Telegram/SourceFiles/ui/effects/credits_graphics.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_photo_media.h" #include "data/data_session.h" #include "history/view/media/history_view_sticker_player.h" +#include "info/bot/starref/info_bot_starref_common.h" #include "info/userpic/info_userpic_emoji_builder_preview.h" #include "lang/lang_keys.h" #include "main/main_session.h" @@ -545,7 +546,15 @@ Fn)> PaintPreviewCallback( } TextWithEntities GenerateEntryName(const Data::CreditsHistoryEntry &entry) { - return (entry.floodSkip + return (entry.starrefCommission && !entry.starrefAmount) + ? tr::lng_credits_commission( + tr::now, + lt_amount, + TextWithEntities{ + Info::BotStarRef::FormatCommission(entry.starrefCommission) + }, + TextWithEntities::Simple) + : (entry.floodSkip ? tr::lng_credits_box_history_entry_api : entry.reaction ? tr::lng_credits_box_history_entry_reaction_name