diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 2ca7529f3..f18bd0155 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -5229,6 +5229,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_bot_earn_balance_button#other" = "Withdraw {emoji} {count} via Fragment"; "lng_bot_earn_balance_button_all" = "Withdraw all stars via Fragment"; "lng_bot_earn_balance_button_locked" = "Withdraw via Fragment"; +"lng_bot_earn_balance_button_buy_ads" = "Buy Ads"; "lng_bot_earn_learn_credits_out_about" = "You can withdraw Stars using Fragment, or use Stars to advertise your bot. {link}"; "lng_bot_earn_out_ph" = "Enter amount to withdraw"; "lng_bot_earn_balance_password_title" = "Two-step verification"; diff --git a/Telegram/SourceFiles/api/api_credits.cpp b/Telegram/SourceFiles/api/api_credits.cpp index 50544f77e..7e3ebe9b8 100644 --- a/Telegram/SourceFiles/api/api_credits.cpp +++ b/Telegram/SourceFiles/api/api_credits.cpp @@ -237,27 +237,41 @@ rpl::producer CreditsEarnStatistics::request() { return [=](auto consumer) { auto lifetime = rpl::lifetime(); - makeRequest(MTPpayments_GetStarsRevenueStats( - MTP_flags(0), - (_isUser ? user()->input : channel()->input) - )).done([=](const MTPpayments_StarsRevenueStats &result) { - const auto &data = result.data(); - const auto &status = data.vstatus().data(); - _data = Data::CreditsEarnStatistics{ - .revenueGraph = StatisticalGraphFromTL(data.vrevenue_graph()), - .currentBalance = status.vcurrent_balance().v, - .availableBalance = status.vavailable_balance().v, - .overallRevenue = status.voverall_revenue().v, - .usdRate = data.vusd_rate().v, - .isWithdrawalEnabled = status.is_withdrawal_enabled(), - .nextWithdrawalAt = status.vnext_withdrawal_at() - ? base::unixtime::parse(status.vnext_withdrawal_at()->v) - : QDateTime(), - }; + const auto finish = [=](const QString &url) { + makeRequest(MTPpayments_GetStarsRevenueStats( + MTP_flags(0), + (_isUser ? user()->input : channel()->input) + )).done([=](const MTPpayments_StarsRevenueStats &result) { + const auto &data = result.data(); + const auto &status = data.vstatus().data(); + _data = Data::CreditsEarnStatistics{ + .revenueGraph = StatisticalGraphFromTL( + data.vrevenue_graph()), + .currentBalance = status.vcurrent_balance().v, + .availableBalance = status.vavailable_balance().v, + .overallRevenue = status.voverall_revenue().v, + .usdRate = data.vusd_rate().v, + .isWithdrawalEnabled = status.is_withdrawal_enabled(), + .nextWithdrawalAt = status.vnext_withdrawal_at() + ? base::unixtime::parse( + status.vnext_withdrawal_at()->v) + : QDateTime(), + .buyAdsUrl = url, + }; - consumer.put_done(); + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + }; + + makeRequest( + MTPpayments_GetStarsRevenueAdsAccountUrl( + (_isUser ? user()->input : channel()->input)) + ).done([=](const MTPpayments_StarsRevenueAdsAccountUrl &result) { + finish(qs(result.data().vurl())); }).fail([=](const MTP::Error &error) { - consumer.put_error_copy(error.type()); + finish({}); }).send(); return lifetime; diff --git a/Telegram/SourceFiles/data/data_bot_earn.h b/Telegram/SourceFiles/data/data_bot_earn.h index 080feb174..c82d58a74 100644 --- a/Telegram/SourceFiles/data/data_bot_earn.h +++ b/Telegram/SourceFiles/data/data_bot_earn.h @@ -26,6 +26,7 @@ struct CreditsEarnStatistics final { float64 usdRate = 0.; bool isWithdrawalEnabled = false; QDateTime nextWithdrawalAt; + QString buyAdsUrl; }; } // namespace Data diff --git a/Telegram/SourceFiles/info/bot/earn/info_earn_inner_widget.cpp b/Telegram/SourceFiles/info/bot/earn/info_earn_inner_widget.cpp index b6d37dc1e..bc6f90e1d 100644 --- a/Telegram/SourceFiles/info/bot/earn/info_earn_inner_widget.cpp +++ b/Telegram/SourceFiles/info/bot/earn/info_earn_inner_widget.cpp @@ -234,6 +234,13 @@ void InnerWidget::fill() { container, _controller->parentController(), _peer, + rpl::single( + data.buyAdsUrl + ) | rpl::then( + _stateUpdated.events() | rpl::map([=] { + return _state.buyAdsUrl; + }) + ), rpl::duplicate(availableBalanceValue), rpl::duplicate(dateValue), std::move(dateValue) | rpl::map([=](const QDateTime &dt) { diff --git a/Telegram/SourceFiles/info/channel_statistics/earn/info_earn_inner_widget.cpp b/Telegram/SourceFiles/info/channel_statistics/earn/info_earn_inner_widget.cpp index 47a921a89..e58149319 100644 --- a/Telegram/SourceFiles/info/channel_statistics/earn/info_earn_inner_widget.cpp +++ b/Telegram/SourceFiles/info/channel_statistics/earn/info_earn_inner_widget.cpp @@ -935,6 +935,13 @@ void InnerWidget::fill() { container, _controller->parentController(), _peer, + rpl::single( + creditsData.buyAdsUrl + ) | rpl::then( + _stateUpdated.events() | rpl::map([=] { + return _state.creditsEarn.buyAdsUrl; + }) + ), rpl::duplicate(availableBalanceValue), rpl::duplicate(dateValue), std::move(dateValue) | rpl::map([=](const QDateTime &dt) { diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index 4b4e5de00..b5c890309 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/click_handler_types.h" #include "core/ui_integration.h" #include "data/data_file_origin.h" +#include "core/click_handler_types.h" // UrlClickHandler #include "data/data_photo_media.h" #include "data/data_session.h" #include "data/data_user.h" @@ -662,6 +663,7 @@ void AddWithdrawalWidget( not_null container, not_null controller, not_null peer, + rpl::producer secondButtonUrl, rpl::producer availableBalanceValue, rpl::producer dateValue, rpl::producer lockedValue, @@ -712,13 +714,42 @@ void AddWithdrawalWidget( Ui::AddSkip(container); const auto &stButton = st::defaultActiveButton; - const auto button = container->add( - object_ptr( - container, - rpl::never(), - stButton), + const auto buttonsContainer = container->add( + Ui::CreateSkipWidget(container, stButton.height), st::boxRowPadding); + const auto button = Ui::CreateChild( + buttonsContainer, + rpl::never(), + stButton); + + const auto buttonCredits = Ui::CreateChild( + buttonsContainer, + tr::lng_bot_earn_balance_button_buy_ads(), + stButton); + buttonCredits->setTextTransform( + Ui::RoundButton::TextTransform::NoTransform); + + Ui::ToggleChildrenVisibility(buttonsContainer, true); + + rpl::combine( + std::move(secondButtonUrl), + buttonsContainer->sizeValue() + ) | rpl::start_with_next([=](const QString &url, const QSize &size) { + if (url.isEmpty()) { + button->resize(size.width(), size.height()); + buttonCredits->resize(0, 0); + } else { + const auto w = size.width() - st::boxRowPadding.left() / 2; + button->resize(w / 2, size.height()); + buttonCredits->resize(w / 2, size.height()); + buttonCredits->moveToRight(0, 0); + buttonCredits->setClickedCallback([=] { + UrlClickHandler::Open(url); + }); + } + }, buttonsContainer->lifetime()); + rpl::duplicate( lockedValue ) | rpl::start_with_next([=](bool v) { diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.h b/Telegram/SourceFiles/settings/settings_credits_graphics.h index ae256d886..8119213b7 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.h +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.h @@ -43,6 +43,7 @@ void AddWithdrawalWidget( not_null container, not_null controller, not_null peer, + rpl::producer secondButtonUrl, rpl::producer availableBalanceValue, rpl::producer dateValue, rpl::producer lockedValue,