From ef7efd7796be989c34499aedd95813aa2bfb3237 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 31 Dec 2025 11:48:26 +0300 Subject: [PATCH] Added support of premium requirement for summary feature. --- Telegram/SourceFiles/api/api_transcribes.cpp | 22 +++- Telegram/SourceFiles/api/api_transcribes.h | 6 +- .../history/view/history_view_reply.cpp | 4 +- .../view/history_view_transcribe_button.cpp | 112 +++++++++++------- Telegram/SourceFiles/ui/chat/chat.style | 3 +- 5 files changed, 96 insertions(+), 51 deletions(-) diff --git a/Telegram/SourceFiles/api/api_transcribes.cpp b/Telegram/SourceFiles/api/api_transcribes.cpp index 75c56f08dc..bf00d1ece7 100644 --- a/Telegram/SourceFiles/api/api_transcribes.cpp +++ b/Telegram/SourceFiles/api/api_transcribes.cpp @@ -115,13 +115,19 @@ void Transcribes::toggle(not_null item) { } } -void Transcribes::toggleSummary(not_null item) { +void Transcribes::toggleSummary( + not_null item, + Fn onPremiumRequired) { const auto id = item->fullId(); auto i = _summaries.find(id); if (i == _summaries.end()) { + auto &entry = _summaries.emplace(id).first->second; + entry.onPremiumRequired = std::move(onPremiumRequired); summarize(item); } else if (!i->second.loading) { - i->second.shown = !i->second.shown; + i->second.shown = i->second.premiumRequired + ? false + : !i->second.shown; _session->data().requestItemResize(item); if (i->second.shown) { _session->data().requestItemShowHighlight(item); @@ -252,6 +258,8 @@ void Transcribes::summarize(not_null item) { auto &entry = _summaries[id]; entry.requestId = 0; entry.loading = false; + entry.premiumRequired = false; + entry.onPremiumRequired = nullptr; entry.result = TextWithEntities( qs(data.vtext()), Api::EntitiesFromMTP(_session, data.ventities().v)); @@ -259,10 +267,18 @@ void Transcribes::summarize(not_null item) { _session->data().requestItemResize(item); _session->data().requestItemShowHighlight(item); } - }).fail([=] { + }).fail([=](const MTP::Error &error) { auto &entry = _summaries[id]; + if (error.type() == u"SUMMARY_FLOOD_PREMIUM"_q) { + if (!entry.premiumRequired && entry.onPremiumRequired) { + entry.onPremiumRequired(); + } + entry.premiumRequired = true; + } entry.requestId = 0; + entry.shown = false; entry.loading = false; + entry.onPremiumRequired = nullptr; if (const auto item = _session->data().message(id)) { _session->data().requestItemResize(item); } diff --git a/Telegram/SourceFiles/api/api_transcribes.h b/Telegram/SourceFiles/api/api_transcribes.h index 39c664fe2c..709ea66e28 100644 --- a/Telegram/SourceFiles/api/api_transcribes.h +++ b/Telegram/SourceFiles/api/api_transcribes.h @@ -18,9 +18,11 @@ class Session; namespace Api { struct SummaryEntry { + Fn onPremiumRequired = nullptr; TextWithEntities result; bool shown = false; bool loading = false; + bool premiumRequired = false; mtpRequestId requestId = 0; }; @@ -41,7 +43,9 @@ public: void toggle(not_null item); [[nodiscard]] const Entry &entry(not_null item) const; - void toggleSummary(not_null item); + void toggleSummary( + not_null item, + Fn onPremiumRequired); [[nodiscard]] const SummaryEntry &summary( not_null item) const; void setSummaryFromLang(FullMsgId, QString &&summaryFromLang); diff --git a/Telegram/SourceFiles/history/view/history_view_reply.cpp b/Telegram/SourceFiles/history/view/history_view_reply.cpp index 80cf1a090e..2d2c837750 100644 --- a/Telegram/SourceFiles/history/view/history_view_reply.cpp +++ b/Telegram/SourceFiles/history/view/history_view_reply.cpp @@ -466,7 +466,9 @@ void Reply::updateForSummary(not_null view) { return; } if (const auto i = controller->session().data().message(my.itemId)) { - controller->session().api().transcribes().toggleSummary(i); + controller->session().api().transcribes().toggleSummary( + i, + nullptr); } }); } diff --git a/Telegram/SourceFiles/history/view/history_view_transcribe_button.cpp b/Telegram/SourceFiles/history/view/history_view_transcribe_button.cpp index ee7052334a..8a3a5606fa 100644 --- a/Telegram/SourceFiles/history/view/history_view_transcribe_button.cpp +++ b/Telegram/SourceFiles/history/view/history_view_transcribe_button.cpp @@ -16,6 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "main/main_session.h" #include "lang/lang_keys.h" +#include "settings/settings_premium.h" #include "ui/chat/chat_style.h" #include "ui/effects/radial_animation.h" #include "ui/effects/ripple_animation.h" @@ -129,7 +130,43 @@ void TranscribeButton::paint( p.setBrush(context.st->msgServiceBg()); p.drawEllipse(r); - if (!_loading && hasLock()) { + if (_summarize) { + if (!_particles) { + _particles = std::make_unique( + Ui::StarParticles::Type::RadialInside, + 7, + st::lineWidth * 4); + _particles->setColor(st::msgServiceFg->c); + _particles->setSpeed(0.2); + } + p.setClipRegion(QRegion(r, QRegion::Ellipse)); + const auto paused = context.paused + || (!_summarizeHovered && !_loading) + || On(PowerSaving::kChatEffects); + _particles->paint(p, r, context.now, paused); + p.setClipping(false); + if (hasLock()) { + context.st->historyFastTranscribeLock().paint( + p, + r.topLeft() + st::historyFastSummaryLockPos, + r.width()); + } + if (!paused) { + const auto session = &_item->history()->session(); + Ui::PostponeCall(session, [=, itemId = _item->fullId()] { + if (const auto i = session->data().message(itemId)) { + session->data().requestItemRepaint(i, r); + } + }); + } + (_item->history()->session().api().transcribes().summary( + _item).shown + ? st::mediaviewFullScreenButton.icon + : st::mediaviewFullScreenOutIcon).paintInCenter( + p, + r, + st::msgServiceFg->c); + } else if (!_loading && hasLock()) { ClipPainterForLock(p, true, r); context.st->historyFastTranscribeIcon().paintInCenter(p, r); p.setClipping(false); @@ -138,39 +175,7 @@ void TranscribeButton::paint( r.topLeft() + st::historyFastTranscribeLockPos, r.width()); } else { - if (_summarize) { - if (!_particles) { - _particles = std::make_unique( - Ui::StarParticles::Type::RadialInside, - 7, - st::lineWidth * 4); - _particles->setColor(st::msgServiceFg->c); - _particles->setSpeed(0.2); - } - p.setClipRegion(QRegion(r, QRegion::Ellipse)); - const auto paused = context.paused - || (!_summarizeHovered && !_loading) - || On(PowerSaving::kChatEffects); - _particles->paint(p, r, context.now, paused); - p.setClipping(false); - if (!paused) { - const auto session = &_item->history()->session(); - Ui::PostponeCall(session, [=, itemId = _item->fullId()] { - if (const auto i = session->data().message(itemId)) { - session->data().requestItemRepaint(i, r); - } - }); - } - (_item->history()->session().api().transcribes().summary( - _item).shown - ? st::mediaviewFullScreenButton.icon - : st::mediaviewFullScreenOutIcon).paintInCenter( - p, - r, - st::msgServiceFg->c); - } else { - context.st->historyFastTranscribeIcon().paintInCenter(p, r); - } + context.st->historyFastTranscribeIcon().paintInCenter(p, r); } const auto state = _animation @@ -273,10 +278,14 @@ void TranscribeButton::paint( bool TranscribeButton::hasLock() const { const auto session = &_item->history()->session(); + if (session->premium()) { + return false; + } const auto transcribes = &session->api().transcribes(); - if (session->premium() - || transcribes->freeFor(_item) - || transcribes->trialsCount()) { + if (_summarize) { + return transcribes->summary(_item).premiumRequired; + } + if (transcribes->freeFor(_item) || transcribes->trialsCount()) { return false; } const auto until = transcribes->trialsRefreshAt(); @@ -319,15 +328,19 @@ ClickHandlerPtr TranscribeButton::link() { if (session->premium()) { auto &transcribes = session->api().transcribes(); return summarize - ? transcribes.toggleSummary(item) + ? transcribes.toggleSummary(item, nullptr) : transcribes.toggle(item); } const auto my = context.other.value(); if (hasLock()) { if (const auto controller = my.sessionWindow.get()) { - ShowPremiumPreviewBox( - controller, - PremiumFeature::VoiceToText); + if (summarize) { + Settings::ShowPremium(controller, u"summary"_q); + } else { + ShowPremiumPreviewBox( + controller, + PremiumFeature::VoiceToText); + } } } else { const auto max = session->api().transcribes().trialsMaxLengthMs(); @@ -343,10 +356,19 @@ ClickHandlerPtr TranscribeButton::link() { } } } - auto &transcribes = session->api().transcribes(); - summarize - ? transcribes.toggleSummary(item) - : transcribes.toggle(item); + if (summarize) { + const auto weak = my.sessionWindow; + session->api().transcribes().toggleSummary(item, [=] { + if (const auto strong = weak.get()) { + Settings::ShowPremium(strong, u"summary"_q); + // ShowPremiumPreviewBox( + // strong, + // PremiumFeature::VoiceToText); + } + }); + } else { + session->api().transcribes().toggle(item); + } } }); return _link; diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 7c0f7218d7..b3879db446 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -591,10 +591,11 @@ historyGoToOriginalIcon: icon {{ "filled_go_to_message", msgServiceFg, point(0px historyFastCommentsIcon: icon {{ "fast_comments", msgServiceFg }}; historyFastCloseSize: 30px; historyFastCloseIcon: icon {{ "box_button_close", msgServiceFg }}; -historyFastMoreIcon: icon {{ "title_menu_dots", msgServiceFg, point(0px, -2px) }}; +historyFastMoreIcon: icon {{ "title_menu_dots", msgServiceFg, point(0px, -2px) }}; historyFastTranscribeIcon: icon {{ "chat/voice_to_text", msgServiceFg }}; historyFastTranscribeLock: icon {{ "chat/mini_lock", msgServiceFg }}; historyFastTranscribeLockPos: point(18px, 13px); +historyFastSummaryLockPos: point(13px, 13px); historyFastTranscribeLockOverlayPos: point(21px, 13px); historyFastTranscribeLockOverlaySize: size(6px, 10px);