Added earn button to section of bot settings.

This commit is contained in:
23rd 2024-10-27 14:15:03 +03:00
parent 7a2562e5bb
commit 6bc8daaeda
4 changed files with 108 additions and 35 deletions

View file

@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "apiwrap.h" #include "apiwrap.h"
#include "api/api_credits.h" #include "api/api_credits.h"
#include "api/api_peer_photo.h" #include "api/api_peer_photo.h"
#include "api/api_statistics.h"
#include "api/api_user_names.h" #include "api/api_user_names.h"
#include "main/main_session.h" #include "main/main_session.h"
#include "ui/boxes/confirm_box.h" #include "ui/boxes/confirm_box.h"
@ -46,7 +47,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/admin_log/history_admin_log_section.h" #include "history/admin_log/history_admin_log_section.h"
#include "info/bot/earn/info_bot_earn_widget.h" #include "info/bot/earn/info_bot_earn_widget.h"
#include "info/channel_statistics/boosts/info_boosts_widget.h" #include "info/channel_statistics/boosts/info_boosts_widget.h"
#include "info/channel_statistics/earn/earn_format.h"
#include "info/channel_statistics/earn/earn_icons.h" #include "info/channel_statistics/earn/earn_icons.h"
#include "info/channel_statistics/earn/info_channel_earn_widget.h"
#include "info/profile/info_profile_values.h" #include "info/profile/info_profile_values.h"
#include "info/info_memento.h" #include "info/info_memento.h"
#include "lang/lang_keys.h" #include "lang/lang_keys.h"
@ -353,7 +356,8 @@ private:
void fillPendingRequestsButton(); void fillPendingRequestsButton();
void fillBotUsernamesButton(); void fillBotUsernamesButton();
void fillBotBalanceButton(); void fillBotCurrencyButton();
void fillBotCreditsButton();
void fillBotEditIntroButton(); void fillBotEditIntroButton();
void fillBotEditCommandsButton(); void fillBotEditCommandsButton();
void fillBotEditSettingsButton(); void fillBotEditSettingsButton();
@ -1175,7 +1179,8 @@ void Controller::fillManageSection() {
::AddSkip(container, 0); ::AddSkip(container, 0);
fillBotUsernamesButton(); fillBotUsernamesButton();
fillBotBalanceButton(); fillBotCurrencyButton();
fillBotCreditsButton();
fillBotEditIntroButton(); fillBotEditIntroButton();
fillBotEditCommandsButton(); fillBotEditCommandsButton();
fillBotEditSettingsButton(); fillBotEditSettingsButton();
@ -1584,7 +1589,72 @@ void Controller::fillBotUsernamesButton() {
{ &st::menuIconLinks }); { &st::menuIconLinks });
} }
void Controller::fillBotBalanceButton() { void Controller::fillBotCurrencyButton() {
Expects(_isBot);
struct State final {
rpl::variable<QString> balance;
};
auto &lifetime = _controls.buttonsLayout->lifetime();
const auto state = lifetime.make_state<State>();
const auto format = [=](uint64 balance) {
return Info::ChannelEarn::MajorPart(balance)
+ Info::ChannelEarn::MinorPart(balance);
};
const auto was = _peer->session().credits().balanceCurrency(
_peer->id);
if (was) {
state->balance = format(was);
}
const auto wrap = _controls.buttonsLayout->add(
object_ptr<Ui::SlideWrap<Ui::SettingsButton>>(
_controls.buttonsLayout,
EditPeerInfoBox::CreateButton(
_controls.buttonsLayout,
tr::lng_manage_peer_bot_balance_currency(),
state->balance.value(),
[controller = _navigation->parentController(), peer = _peer] {
controller->showSection(Info::ChannelEarn::Make(peer));
},
st::manageGroupButton,
{})));
wrap->toggle(!state->balance.current().isEmpty(), anim::type::instant);
const auto button = wrap->entity();
{
const auto currencyLoad
= button->lifetime().make_state<Api::EarnStatistics>(_peer);
currencyLoad->request(
) | rpl::start_with_error_done([=](const QString &error) {
}, [=] {
const auto balance = currencyLoad->data().currentBalance;
if (balance) {
wrap->toggle(true, anim::type::normal);
}
state->balance = format(balance);
}, button->lifetime());
}
{
const auto icon = Ui::CreateChild<Ui::RpWidget>(button);
icon->resize(st::menuIconLinks.size());
const auto image = Ui::Earn::MenuIconCurrency(icon->size());
icon->paintRequest() | rpl::start_with_next([=] {
auto p = QPainter(icon);
p.drawImage(0, 0, image);
}, icon->lifetime());
button->sizeValue(
) | rpl::start_with_next([=](const QSize &size) {
icon->moveToLeft(
button->st().iconLeft,
(size.height() - icon->height()) / 2);
}, icon->lifetime());
}
}
void Controller::fillBotCreditsButton() {
Expects(_isBot); Expects(_isBot);
struct State final { struct State final {
@ -1602,7 +1672,7 @@ void Controller::fillBotBalanceButton() {
_controls.buttonsLayout, _controls.buttonsLayout,
EditPeerInfoBox::CreateButton( EditPeerInfoBox::CreateButton(
_controls.buttonsLayout, _controls.buttonsLayout,
tr::lng_manage_peer_bot_balance(), tr::lng_manage_peer_bot_balance_credits(),
state->balance.value(), state->balance.value(),
[controller = _navigation->parentController(), peer = _peer] { [controller = _navigation->parentController(), peer = _peer] {
controller->showSection(Info::BotEarn::Make(peer)); controller->showSection(Info::BotEarn::Make(peer));

View file

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/rect.h" #include "ui/rect.h"
#include "styles/style_menu_icons.h" #include "styles/style_menu_icons.h"
#include "styles/style_widgets.h" #include "styles/style_widgets.h"
#include "styles/style_info.h" // infoIconReport.
#include <QFile> #include <QFile>
#include <QtSvg/QSvgRenderer> #include <QtSvg/QSvgRenderer>
@ -62,6 +63,37 @@ QImage IconCurrencyColored(
return image; return image;
} }
QImage MenuIconCurrency(const QSize &size) {
auto image = QImage(
size * style::DevicePixelRatio(),
QImage::Format_ARGB32_Premultiplied);
image.setDevicePixelRatio(style::DevicePixelRatio());
image.fill(Qt::transparent);
auto p = QPainter(&image);
st::infoIconReport.paintInCenter(
p,
Rect(size),
st::infoIconFg->c);
p.setCompositionMode(QPainter::CompositionMode_Clear);
const auto w = st::lineWidth * 6;
p.fillRect(
QRect(
rect::center(Rect(size)).x() - w / 2,
rect::center(Rect(size)).y() - w,
w,
w * 2),
Qt::white);
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
const auto i = IconCurrencyColored(
st::inviteLinkSubscribeBoxTerms.style.font,
st::infoIconFg->c);
p.drawImage(
(size.width() - i.width() / style::DevicePixelRatio()) / 2,
(size.height() - i.height() / style::DevicePixelRatio()) / 2,
i);
return image;
}
QImage MenuIconCredits() { QImage MenuIconCredits() {
constexpr auto kStrokeWidth = 5; constexpr auto kStrokeWidth = 5;
const auto sizeShift = st::lineWidth * 1.5; const auto sizeShift = st::lineWidth * 1.5;

View file

@ -13,6 +13,7 @@ namespace Ui::Earn {
const style::font &font, const style::font &font,
const QColor &c); const QColor &c);
[[nodiscard]] QImage MenuIconCurrency(const QSize &size);
[[nodiscard]] QImage MenuIconCredits(); [[nodiscard]] QImage MenuIconCredits();
} // namespace Ui::Earn } // namespace Ui::Earn

View file

@ -795,39 +795,9 @@ rpl::producer<uint64> AddCurrencyAction(
const auto button = wrapButton->entity(); const auto button = wrapButton->entity();
const auto icon = Ui::CreateChild<Ui::RpWidget>(button); const auto icon = Ui::CreateChild<Ui::RpWidget>(button);
icon->resize(st::infoIconReport.size()); icon->resize(st::infoIconReport.size());
const auto image = [&] { const auto image = Ui::Earn::MenuIconCurrency(icon->size());
auto image = QImage(
icon->size() * style::DevicePixelRatio(),
QImage::Format_ARGB32_Premultiplied);
image.setDevicePixelRatio(style::DevicePixelRatio());
image.fill(Qt::transparent);
auto p = QPainter(&image);
st::infoIconReport.paintInCenter(
p,
icon->rect(),
st::infoIconFg->c);
p.setCompositionMode(QPainter::CompositionMode_Clear);
const auto w = st::lineWidth * 6;
p.fillRect(
QRect(
rect::center(icon->rect()).x() - w / 2,
rect::center(icon->rect()).y() - w,
w,
w * 2),
Qt::white);
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
const auto i = Ui::Earn::IconCurrencyColored(
st::inviteLinkSubscribeBoxTerms.style.font,
st::infoIconFg->c);
p.drawImage(
(icon->width() - i.width() / style::DevicePixelRatio()) / 2,
(icon->height() - i.height() / style::DevicePixelRatio()) / 2,
i);
return image;
}();
icon->paintRequest() | rpl::start_with_next([=] { icon->paintRequest() | rpl::start_with_next([=] {
auto p = QPainter(icon); auto p = QPainter(icon);
auto hq = PainterHighQualityEnabler(p);
p.drawImage(0, 0, image); p.drawImage(0, 0, image);
}, icon->lifetime()); }, icon->lifetime());