From 032e6c57e958545e42474435e650a0ea2e6df8eb Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 6 Oct 2022 19:11:26 +0400 Subject: [PATCH] Request full album for last topic message. --- .../boxes/peers/edit_forum_topic_box.cpp | 4 +-- .../boxes/peers/edit_peer_info_box.cpp | 2 +- Telegram/SourceFiles/data/data_forum.cpp | 2 +- .../SourceFiles/data/data_forum_topic.cpp | 25 +++++++++++-------- Telegram/SourceFiles/data/data_forum_topic.h | 1 + Telegram/SourceFiles/data/data_groups.cpp | 15 ++++++----- Telegram/SourceFiles/data/data_groups.h | 1 + Telegram/SourceFiles/data/data_histories.cpp | 9 ++++--- Telegram/SourceFiles/data/data_histories.h | 10 +++++++- Telegram/SourceFiles/history/history_item.cpp | 6 +++++ Telegram/SourceFiles/history/history_item.h | 4 +-- .../SourceFiles/history/history_service.cpp | 6 ++--- .../view/history_view_replies_section.cpp | 2 +- .../info/profile/info_profile_widget.cpp | 2 +- Telegram/SourceFiles/mainwidget.cpp | 2 +- .../SourceFiles/window/window_peer_menu.cpp | 2 +- 16 files changed, 58 insertions(+), 35 deletions(-) diff --git a/Telegram/SourceFiles/boxes/peers/edit_forum_topic_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_forum_topic_box.cpp index baa1d72457..771e604ef9 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_forum_topic_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_forum_topic_box.cpp @@ -337,7 +337,7 @@ void EditForumTopicBox( const auto topic = (!creating && forum->peer->forum()) ? forum->peer->forum()->topicFor(rootId) : nullptr; - // #TODO forum lang + // #TODO lang-forum box->setTitle(rpl::single(creating ? u"New topic"_q : u"Edit topic"_q)); box->setMaxHeight(st::editTopicMaxHeight); @@ -365,7 +365,7 @@ void EditForumTopicBox( object_ptr( box, st::defaultInputField, - rpl::single(u"Topic Title"_q), // #TODO forum lang + rpl::single(u"Topic Title"_q), // #TODO lang-forum topic ? topic->title() : QString()), st::editTopicTitleMargin); box->setFocusCallback([=] { diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index e1d973fce0..0f8a548728 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -818,7 +818,7 @@ void Controller::fillForumButton() { AddButtonWithText( _controls.buttonsLayout, - rpl::single(u"Topics"_q), // #TODO forum lang + rpl::single(u"Topics"_q), // #TODO lang-forum rpl::single(QString()), [] {}, { &st::settingsIconGroup, Settings::kIconPurple } diff --git a/Telegram/SourceFiles/data/data_forum.cpp b/Telegram/SourceFiles/data/data_forum.cpp index 31f67f6fba..d15b1a48a8 100644 --- a/Telegram/SourceFiles/data/data_forum.cpp +++ b/Telegram/SourceFiles/data/data_forum.cpp @@ -203,7 +203,7 @@ ForumTopic *Forum::topicFor(MsgId rootId) { return i->second.get(); } } else { - // #TODO forum lang + // #TODO lang-forum applyTopicAdded(rootId, "General! Created.", kGeneralColorId, 0); return _topics.find(rootId)->second.get(); } diff --git a/Telegram/SourceFiles/data/data_forum_topic.cpp b/Telegram/SourceFiles/data/data_forum_topic.cpp index 3d956f9f00..0f0ac17876 100644 --- a/Telegram/SourceFiles/data/data_forum_topic.cpp +++ b/Telegram/SourceFiles/data/data_forum_topic.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_channel.h" #include "data/data_forum.h" +#include "data/data_histories.h" #include "data/data_session.h" #include "data/stickers/data_custom_emoji.h" #include "dialogs/dialogs_main_list.h" @@ -17,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/core_settings.h" #include "history/history.h" #include "history/history_item.h" +#include "history/view/history_view_item_preview.h" #include "ui/painter.h" #include "ui/color_int_conversion.h" #include "styles/style_dialogs.h" @@ -229,6 +231,17 @@ void ForumTopic::applyTopicTopMessage(MsgId topMessageId) { const auto itemId = FullMsgId(_history->peer->id, topMessageId); if (const auto item = owner().message(itemId)) { setLastServerMessage(item); + + // If we set a single album part, request the full album. + if (item->groupId() != MessageGroupId()) { + if (owner().groups().isGroupOfOne(item) + && !item->toPreview({ + .hideSender = true, + .hideCaption = true }).images.empty() + && _requestedGroups.emplace(item->fullId()).second) { + owner().histories().requestGroupAround(item); + } + } } else { setLastServerMessage(nullptr); } @@ -276,16 +289,6 @@ void ForumTopic::setChatListMessage(HistoryItem *item) { } _chatListMessage = item; setChatListTimeId(item->date()); - -#if 0 // #TODO forum - // If we have a single message from a group, request the full album. - if (hasOrphanMediaGroupPart() - && !item->toPreview({ - .hideSender = true, - .hideCaption = true }).images.empty()) { - owner().histories().requestGroupAround(item); - } -#endif } else if (!_chatListMessage || *_chatListMessage) { _chatListMessage = nullptr; updateChatListEntry(); @@ -402,7 +405,7 @@ void ForumTopic::applyTitle(const QString &title) { if (_title == title || (isGeneral() && !_title.isEmpty())) { return; } - _title = isGeneral() ? "General! Topic." : title; // #TODO forum lang + _title = isGeneral() ? "General! Topic." : title; // #TODO lang-forum ++_titleVersion; _defaultIcon = QImage(); indexTitleParts(); diff --git a/Telegram/SourceFiles/data/data_forum_topic.h b/Telegram/SourceFiles/data/data_forum_topic.h index 927af3234e..43333dcdb1 100644 --- a/Telegram/SourceFiles/data/data_forum_topic.h +++ b/Telegram/SourceFiles/data/data_forum_topic.h @@ -147,6 +147,7 @@ private: std::optional _lastMessage; std::optional _lastServerMessage; std::optional _chatListMessage; + base::flat_set _requestedGroups; bool _unreadMark = false; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/data/data_groups.cpp b/Telegram/SourceFiles/data/data_groups.cpp index 64e9f3afa7..e36b6598fa 100644 --- a/Telegram/SourceFiles/data/data_groups.cpp +++ b/Telegram/SourceFiles/data/data_groups.cpp @@ -33,6 +33,14 @@ bool Groups::isGrouped(not_null item) const { return media && media->canBeGrouped(); } +bool Groups::isGroupOfOne(not_null item) const { + if (const auto groupId = item->groupId()) { + const auto i = _groups.find(groupId); + return (i != _groups.end()) && (i->second.items.size() == 1); + } + return false; +} + void Groups::registerMessage(not_null item) { if (!isGrouped(item)) { return; @@ -146,12 +154,7 @@ void Groups::refreshViews(const HistoryItemsList &items) { const auto history = items.front()->history(); for (const auto &item : items) { _data->requestItemViewRefresh(item); - history->lastItemDialogsView.itemInvalidated(item); - if (const auto forum = history->peer->forum()) { - if (const auto topic = forum->topicFor(item)) { - topic->lastItemDialogsView.itemInvalidated(item); - } - } + item->invalidateChatListEntry(); } } diff --git a/Telegram/SourceFiles/data/data_groups.h b/Telegram/SourceFiles/data/data_groups.h index d70c95b1b2..b58c1a551b 100644 --- a/Telegram/SourceFiles/data/data_groups.h +++ b/Telegram/SourceFiles/data/data_groups.h @@ -22,6 +22,7 @@ public: Groups(not_null data); [[nodiscard]] bool isGrouped(not_null item) const; + [[nodiscard]] bool isGroupOfOne(not_null item) const; void registerMessage(not_null item); void unregisterMessage(not_null item); void refreshMessage( diff --git a/Telegram/SourceFiles/data/data_histories.cpp b/Telegram/SourceFiles/data/data_histories.cpp index 22732f6317..0d49f4016b 100644 --- a/Telegram/SourceFiles/data/data_histories.cpp +++ b/Telegram/SourceFiles/data/data_histories.cpp @@ -445,7 +445,8 @@ void Histories::requestFakeChatListMessage( void Histories::requestGroupAround(not_null item) { const auto history = item->history(); const auto id = item->id; - const auto i = _chatListGroupRequests.find(history); + const auto key = GroupRequestKey{ history, item->topicRootId() }; + const auto i = _chatListGroupRequests.find(key); if (i != end(_chatListGroupRequests)) { if (i->second.aroundId == id) { return; @@ -470,18 +471,18 @@ void Histories::requestGroupAround(not_null item) { _owner->processExistingMessages( history->peer->asChannel(), result); - _chatListGroupRequests.remove(history); + _chatListGroupRequests.remove(key); history->migrateToOrMe()->applyChatListGroup( history->peer->id, result); finish(); }).fail([=] { - _chatListGroupRequests.remove(history); + _chatListGroupRequests.remove(key); finish(); }).send(); }); _chatListGroupRequests.emplace( - history, + key, ChatListGroupRequest{ .aroundId = id, .requestId = requestId }); } diff --git a/Telegram/SourceFiles/data/data_histories.h b/Telegram/SourceFiles/data/data_histories.h index d8c67bbf9a..d54f2a3bf7 100644 --- a/Telegram/SourceFiles/data/data_histories.h +++ b/Telegram/SourceFiles/data/data_histories.h @@ -152,6 +152,14 @@ private: Fn fail; int requestId = 0; }; + struct GroupRequestKey { + not_null history; + MsgId rootId = 0; + + friend inline constexpr auto operator<=>( + GroupRequestKey, + GroupRequestKey) = default; + }; template static auto ReplaceReplyTo(Arg arg, MsgId replyTo) { @@ -203,7 +211,7 @@ private: base::flat_set> _fakeChatListRequests; base::flat_map< - not_null, + GroupRequestKey, ChatListGroupRequest> _chatListGroupRequests; base::flat_map< diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index cf734a0313..5771ac7db6 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -47,6 +47,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_messages.h" #include "data/data_media_types.h" #include "data/data_folder.h" +#include "data/data_forum.h" #include "data/data_forum_topic.h" #include "data/data_channel.h" #include "data/data_chat.h" @@ -374,6 +375,11 @@ void HistoryItem::invalidateChatListEntry() { this, Data::MessageUpdate::Flag::DialogRowRefresh); history()->lastItemDialogsView.itemInvalidated(this); + if (const auto forum = history()->peer->forum()) { + if (const auto topic = forum->topicFor(this)) { + topic->lastItemDialogsView.itemInvalidated(this); + } + } } void HistoryItem::customEmojiRepaint() { diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 55b8f8a71e..8da7f3e123 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -138,6 +138,8 @@ public: void clearMainView(); void removeMainView(); + void invalidateChatListEntry(); + void destroy(); [[nodiscard]] bool out() const { return _flags & MessageFlag::Outgoing; @@ -477,8 +479,6 @@ protected: const not_null _from; MessageFlags _flags = 0; - void invalidateChatListEntry(); - void setGroupId(MessageGroupId groupId); void applyTTL(const MTPDmessage &data); diff --git a/Telegram/SourceFiles/history/history_service.cpp b/Telegram/SourceFiles/history/history_service.cpp index 12cac02faa..2808f229bc 100644 --- a/Telegram/SourceFiles/history/history_service.cpp +++ b/Telegram/SourceFiles/history/history_service.cpp @@ -638,15 +638,15 @@ void HistoryService::setMessageByAction(const MTPmessageAction &action) { auto prepareTopicCreate = [&](const MTPDmessageActionTopicCreate &action) { auto result = PreparedText{}; - // #TODO forum lang + // #TODO lang-forum result.text = { "topic created: " + qs(action.vtitle()) }; return result; }; auto prepareTopicEdit = [&](const MTPDmessageActionTopicEdit &action) { auto result = PreparedText{}; - // #TODO forum lang - result.text = { "topic edited: " }; // #TODO forum lang + // #TODO lang-forum + result.text = { "topic edited: " }; if (const auto icon = action.vicon_emoji_id()) { result.text.append(TextWithEntities{ "@", diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 1d274c982a..ae82a97ccf 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -1611,7 +1611,7 @@ bool RepliesWidget::preventsClose(Fn &&continueCallback) const { } }; controller()->show(Ui::MakeConfirmBox({ - .text = rpl::single(u"Sure discard?"_q), // #TODO forum lang + .text = rpl::single(u"Sure discard?"_q), // #TODO lang-forum .confirmed = std::move(sure), .confirmText = tr::lng_record_lock_discard(), .confirmStyle = &st::attentionBoxButton, diff --git a/Telegram/SourceFiles/info/profile/info_profile_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_widget.cpp index 1d51e0a6db..22d836c318 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_widget.cpp @@ -81,7 +81,7 @@ void Widget::setInnerFocus() { rpl::producer Widget::title() { if (const auto topic = controller()->key().topic()) { - return rpl::single(u"Topic Info"_q); // #TODO forum lang + return rpl::single(u"Topic Info"_q); // #TODO lang-forum } const auto peer = controller()->key().peer(); if (const auto user = peer->asUser()) { diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 6e0fa843f6..07a6f1d630 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -1961,7 +1961,7 @@ void MainWidget::windowShown() { void MainWidget::dialogsToUp() { if (_dialogs) { - _dialogs->jumpToTop(); + _dialogs->jumpToTop(true); } } diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 0252734d86..0a25371119 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -751,7 +751,7 @@ void Filler::addManageTopic() { if (!_topic) { return; } - // #TODO forum lang + // #TODO lang-forum const auto history = _topic->history(); const auto rootId = _topic->rootId(); const auto navigation = _controller;