From db2ccb7c682c3eee4eceaf59150fa9157f13e3c3 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 28 Dec 2025 10:05:45 +0300 Subject: [PATCH] Added new api support to text summarizing. --- Telegram/SourceFiles/api/api_transcribes.cpp | 47 +++++++++++-------- Telegram/SourceFiles/api/api_transcribes.h | 3 ++ Telegram/SourceFiles/data/data_types.h | 1 + Telegram/SourceFiles/history/history_item.cpp | 6 +++ Telegram/SourceFiles/history/history_item.h | 3 ++ .../history/history_item_helpers.cpp | 3 ++ .../history/view/history_view_message.cpp | 12 ++--- .../view/history_view_translate_bar.cpp | 2 +- 8 files changed, 50 insertions(+), 27 deletions(-) diff --git a/Telegram/SourceFiles/api/api_transcribes.cpp b/Telegram/SourceFiles/api/api_transcribes.cpp index cd16314532..fed9c91e82 100644 --- a/Telegram/SourceFiles/api/api_transcribes.cpp +++ b/Telegram/SourceFiles/api/api_transcribes.cpp @@ -235,27 +235,25 @@ void Transcribes::summarize(not_null item) { } const auto id = item->fullId(); - const auto requestId = _api.request(MTPmessages_TranslateText( - MTP_flags(MTPmessages_TranslateText::Flag::f_peer - | MTPmessages_TranslateText::Flag::f_id), + const auto langSummary = summaryFromLang(id); + const auto requestId = _api.request(MTPmessages_SummarizeText( + langSummary.isEmpty() + ? MTP_flags(0) + : MTP_flags(MTPmessages_summarizeText::Flag::f_to_lang), item->history()->peer->input(), - MTP_vector(1, MTP_int(item->id)), - MTPVector(), - MTP_string("sum") - )).done([=](const MTPmessages_TranslatedText &result) { - const auto &list = result.data().vresult().v; - if (!list.isEmpty()) { - const auto &tl = list.front().data(); - auto &entry = _summaries[id]; - entry.requestId = 0; - entry.loading = false; - entry.result = TextWithEntities( - qs(tl.vtext()), - Api::EntitiesFromMTP(_session, tl.ventities().v)); - if (const auto item = _session->data().message(id)) { - _session->data().requestItemResize(item); - _session->data().requestItemShowHighlight(item); - } + MTP_int(item->id), + langSummary.isEmpty() ? MTPstring() : MTP_string(langSummary) + )).done([=](const MTPTextWithEntities &result) { + const auto &data = result.data(); + auto &entry = _summaries[id]; + entry.requestId = 0; + entry.loading = false; + entry.result = TextWithEntities( + qs(data.vtext()), + Api::EntitiesFromMTP(_session, data.ventities().v)); + if (const auto item = _session->data().message(id)) { + _session->data().requestItemResize(item); + _session->data().requestItemShowHighlight(item); } }).fail([=] { auto &entry = _summaries[id]; @@ -275,4 +273,13 @@ void Transcribes::summarize(not_null item) { _session->data().requestItemResize(item); } +void Transcribes::setSummaryFromLang(FullMsgId id, QString &&text) { + _summariesFromLang[id] = std::move(text); +} + +QString Transcribes::summaryFromLang(FullMsgId id) const { + const auto i = _summariesFromLang.find(id); + return (i != _summariesFromLang.end()) ? i->second : QString(); +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_transcribes.h b/Telegram/SourceFiles/api/api_transcribes.h index 65e62777ac..39c664fe2c 100644 --- a/Telegram/SourceFiles/api/api_transcribes.h +++ b/Telegram/SourceFiles/api/api_transcribes.h @@ -44,6 +44,8 @@ public: void toggleSummary(not_null item); [[nodiscard]] const SummaryEntry &summary( not_null item) const; + void setSummaryFromLang(FullMsgId, QString &&summaryFromLang); + [[nodiscard]] QString summaryFromLang(FullMsgId) const; void apply(const MTPDupdateTranscribedAudio &update); @@ -71,6 +73,7 @@ private: base::flat_map _ids; base::flat_map _summaries; + base::flat_map _summariesFromLang; }; diff --git a/Telegram/SourceFiles/data/data_types.h b/Telegram/SourceFiles/data/data_types.h index a5e14940cb..92c7958f4d 100644 --- a/Telegram/SourceFiles/data/data_types.h +++ b/Telegram/SourceFiles/data/data_types.h @@ -362,6 +362,7 @@ enum class MessageFlag : uint64 { HasHiddenLinks = (1ULL << 56), HasSummaryEntry = (1ULL << 57), + CanBeSummarized = (1ULL << 58), }; inline constexpr bool is_flag_type(MessageFlag) { return true; } using MessageFlags = base::flags; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 2e9fd720c6..3a44cd34c9 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -483,6 +483,12 @@ HistoryItem::HistoryItem( history->owner().histories().reportDelivery(this); } } + + if (const auto summaryFromLang = data.vsummary_from_language()) { + history->session().api().transcribes().setSummaryFromLang( + fullId(), + qs(*summaryFromLang)); + } } HistoryItem::HistoryItem( diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index d7ded94ea9..a2f088f233 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -336,6 +336,9 @@ public: [[nodiscard]] bool showSimilarChannels() const { return _flags & MessageFlag::ShowSimilarChannels; } + [[nodiscard]] bool canBeSummarized() const { + return _flags & MessageFlag::CanBeSummarized; + } [[nodiscard]] bool hasRealFromId() const; [[nodiscard]] bool isPostHidingAuthor() const; [[nodiscard]] bool isPostShowingAuthor() const; diff --git a/Telegram/SourceFiles/history/history_item_helpers.cpp b/Telegram/SourceFiles/history/history_item_helpers.cpp index 5316462b2e..924e643e0b 100644 --- a/Telegram/SourceFiles/history/history_item_helpers.cpp +++ b/Telegram/SourceFiles/history/history_item_helpers.cpp @@ -846,6 +846,9 @@ MessageFlags FlagsFromMTP( ? Flag::TonPaidSuggested : (flags & MTP::f_paid_suggested_post_stars) ? Flag::StarsPaidSuggested + : Flag()) + | ((flags & MTP::f_summary_from_language) + ? Flag::CanBeSummarized : Flag()); } diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 3576b6c7ea..a1adc1b4f5 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -1222,7 +1222,9 @@ void Message::draw(Painter &p, const PaintContext &context) const { st::historyFastShareBottom) : st::historyFastShareBottom; const auto fastShareLeft = hasRightLayout() - ? (g.left() - rightActionWidth - st::historyFastShareLeft) + ? (g.left() + - (_summarize ? 0 : rightActionWidth) + - st::historyFastShareLeft) : (g.left() + g.width() + st::historyFastShareLeft); const auto fastShareTop = g.top() + (data()->isSponsored() ? fastShareSkip @@ -4574,13 +4576,11 @@ const HistoryMessageEdited *Message::displayedEditBadge() const { } void Message::ensureSummarizeButton() const { - const auto item = data(); - if (item->isPost() - && item->originalText().text.size() >= kSummarizeThreshold - /* && item->history()->session().premium()*/) { + if (data()->canBeSummarized() + /*&& item->originalText().text.size() >= kSummarizeThreshold*/) { if (!_summarize) { _summarize - = std::make_unique(item, false, true); + = std::make_unique(data(), false, true); } } else { _summarize = nullptr; diff --git a/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp b/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp index 83d4ab0f08..8c3bc0800b 100644 --- a/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp +++ b/Telegram/SourceFiles/history/view/history_view_translate_bar.cpp @@ -206,7 +206,7 @@ void AddCocoonBoxCover(not_null container) { auto metrics = QFontMetrics(font); const auto text = tr::lng_translate_cocoon_title(tr::now); - const auto textw = metrics.width(text); + const auto textw = metrics.horizontalAdvance(text); const auto left = (width - textw) / 2; auto q = QPainter(&state->gradient);