mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-03 21:54:05 +02:00
fix: refactor read all
fix: read mentions and reactions too
This commit is contained in:
parent
d3ab1d60ce
commit
ffd42f043d
6 changed files with 129 additions and 9 deletions
|
@ -8,6 +8,7 @@
|
|||
#include "confirmation_box.h"
|
||||
#include "lang_auto.h"
|
||||
#include "ayu/ayu_settings.h"
|
||||
#include "ayu/utils/telegram_helpers.h"
|
||||
#include "data/data_session.h"
|
||||
#include "main/main_session.h"
|
||||
#include "styles/style_layers.h"
|
||||
|
@ -60,7 +61,7 @@ void ConfirmationBox::ReadAllPeers()
|
|||
settings->set_sendReadMessages(true);
|
||||
|
||||
auto chats = _controller->session().data().chatsList();
|
||||
Window::MarkAsReadChatListHack(chats);
|
||||
MarkAsReadChatList(chats);
|
||||
|
||||
settings->set_sendReadMessages(prev);
|
||||
}
|
||||
|
|
|
@ -11,6 +11,10 @@
|
|||
|
||||
#include "api/api_text_entities.h"
|
||||
|
||||
#include "apiwrap.h"
|
||||
#include "data/data_forum.h"
|
||||
#include "data/data_forum_topic.h"
|
||||
#include "data/data_histories.h"
|
||||
#include "data/data_peer_id.h"
|
||||
|
||||
#include "ayu/sync/models.h"
|
||||
|
@ -18,6 +22,7 @@
|
|||
#include "data/data_session.h"
|
||||
#include "history/history.h"
|
||||
#include "history/history_item.h"
|
||||
#include "history/history_unread_things.h"
|
||||
|
||||
|
||||
Main::Session *getSession(ID userId)
|
||||
|
@ -104,3 +109,118 @@ std::pair<std::string, std::string> serializeTextWithEntities(not_null<HistoryIt
|
|||
|
||||
return std::make_pair(text, std::string(reinterpret_cast<char *>(buff.data()), buff.size()));
|
||||
}
|
||||
|
||||
void MarkAsReadChatList(not_null<Dialogs::MainList *> list)
|
||||
{
|
||||
auto mark = std::vector<not_null<History *>>();
|
||||
for (const auto &row : list->indexed()->all()) {
|
||||
if (const auto history = row->history()) {
|
||||
mark.push_back(history);
|
||||
}
|
||||
}
|
||||
ranges::for_each(mark, MarkAsReadThread);
|
||||
}
|
||||
|
||||
void MarkAsReadThread(not_null<Data::Thread *> thread)
|
||||
{
|
||||
const auto readHistory = [&](not_null<History *> history)
|
||||
{
|
||||
history->owner().histories().readInbox(history);
|
||||
};
|
||||
const auto readMentions = [=](
|
||||
base::weak_ptr<Data::Thread> weakThread,
|
||||
auto resend) -> void
|
||||
{
|
||||
const auto thread = weakThread.get();
|
||||
if (!thread) {
|
||||
return;
|
||||
}
|
||||
const auto peer = thread->peer();
|
||||
const auto topic = thread->asTopic();
|
||||
const auto rootId = topic ? topic->rootId() : 0;
|
||||
using Flag = MTPmessages_ReadMentions::Flag;
|
||||
peer->session().api().request(MTPmessages_ReadMentions(
|
||||
MTP_flags(rootId ? Flag::f_top_msg_id : Flag()),
|
||||
peer->input,
|
||||
MTP_int(rootId)
|
||||
)).done([=](const MTPmessages_AffectedHistory &result)
|
||||
{
|
||||
const auto offset = peer->session().api().applyAffectedHistory(
|
||||
peer,
|
||||
result);
|
||||
if (offset > 0) {
|
||||
resend(weakThread, resend);
|
||||
}
|
||||
else {
|
||||
peer->owner().history(peer)->clearUnreadMentionsFor(rootId);
|
||||
}
|
||||
}).send();
|
||||
};
|
||||
const auto sendReadMentions = [=](
|
||||
not_null<Data::Thread *> thread)
|
||||
{
|
||||
readMentions(base::make_weak(thread), readMentions);
|
||||
};
|
||||
|
||||
const auto readReactions = [=](
|
||||
base::weak_ptr<Data::Thread> weakThread,
|
||||
auto resend) -> void
|
||||
{
|
||||
const auto thread = weakThread.get();
|
||||
if (!thread) {
|
||||
return;
|
||||
}
|
||||
const auto topic = thread->asTopic();
|
||||
const auto peer = thread->peer();
|
||||
const auto rootId = topic ? topic->rootId() : 0;
|
||||
using Flag = MTPmessages_ReadReactions::Flag;
|
||||
peer->session().api().request(MTPmessages_ReadReactions(
|
||||
MTP_flags(rootId ? Flag::f_top_msg_id : Flag(0)),
|
||||
peer->input,
|
||||
MTP_int(rootId)
|
||||
)).done([=](const MTPmessages_AffectedHistory &result)
|
||||
{
|
||||
const auto offset = peer->session().api().applyAffectedHistory(
|
||||
peer,
|
||||
result);
|
||||
if (offset > 0) {
|
||||
resend(weakThread, resend);
|
||||
}
|
||||
else {
|
||||
peer->owner().history(peer)->clearUnreadReactionsFor(rootId);
|
||||
}
|
||||
}).send();
|
||||
};
|
||||
const auto sendReadReactions = [=](
|
||||
not_null<Data::Thread *> thread)
|
||||
{
|
||||
readReactions(base::make_weak(thread), readReactions);
|
||||
};
|
||||
|
||||
if (thread->chatListBadgesState().unread) {
|
||||
if (const auto forum = thread->asForum()) {
|
||||
forum->enumerateTopics([](
|
||||
not_null<Data::ForumTopic *> topic)
|
||||
{
|
||||
MarkAsReadThread(topic);
|
||||
});
|
||||
}
|
||||
else if (const auto history = thread->asHistory()) {
|
||||
readHistory(history);
|
||||
if (const auto migrated = history->migrateSibling()) {
|
||||
readHistory(migrated);
|
||||
}
|
||||
}
|
||||
else if (const auto topic = thread->asTopic()) {
|
||||
topic->readTillEnd();
|
||||
}
|
||||
}
|
||||
|
||||
if (thread->unreadMentions().has()) {
|
||||
sendReadMentions(thread);
|
||||
}
|
||||
|
||||
if (thread->unreadReactions().has()) {
|
||||
sendReadReactions(thread);
|
||||
}
|
||||
}
|
|
@ -12,6 +12,7 @@
|
|||
#include "main/main_account.h"
|
||||
#include "main/main_domain.h"
|
||||
#include "main/main_session.h"
|
||||
#include "dialogs/dialogs_main_list.h"
|
||||
|
||||
Main::Session *getSession(ID userId);
|
||||
bool accountExists(ID userId);
|
||||
|
@ -19,3 +20,6 @@ void dispatchToMainThread(std::function<void()> callback);
|
|||
not_null<History *> getHistoryFromDialogId(ID dialogId, Main::Session *session);
|
||||
ID getDialogIdFromPeer(not_null<PeerData *> peer);
|
||||
std::pair<std::string, std::string> serializeTextWithEntities(not_null<HistoryItem *> item);
|
||||
|
||||
void MarkAsReadChatList(not_null<Dialogs::MainList *> list);
|
||||
void MarkAsReadThread(not_null<Data::Thread*> thread);
|
||||
|
|
|
@ -84,9 +84,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
|
||||
// AyuGram includes
|
||||
#include "ayu/ayu_settings.h"
|
||||
#include "ayu/utils/telegram_helpers.h"
|
||||
#include "ayu/ui/settings/settings_ayu.h"
|
||||
#include "ayu/features/streamer_mode/streamer_mode.h"
|
||||
#include "ayu/ui/boxes/confirmation_box.h"
|
||||
#include "ayu/features/streamer_mode/streamer_mode.h"
|
||||
#include "styles/style_ayu_icons.h"
|
||||
|
||||
|
||||
|
@ -822,7 +823,7 @@ void MainMenu::setupMenu() {
|
|||
settings->set_sendReadMessages(false);
|
||||
|
||||
auto chats = controller->session().data().chatsList();
|
||||
MarkAsReadChatListHack(chats);
|
||||
MarkAsReadChatList(chats);
|
||||
|
||||
settings->set_sendReadMessages(prev);
|
||||
});
|
||||
|
|
|
@ -1287,10 +1287,6 @@ void Filler::fillArchiveActions() {
|
|||
|
||||
} // namespace
|
||||
|
||||
void MarkAsReadChatListHack(not_null<Dialogs::MainList*> list) {
|
||||
MarkAsReadChatList(list);
|
||||
}
|
||||
|
||||
void PeerMenuExportChat(not_null<PeerData*> peer) {
|
||||
Core::App().exportManager().start(peer);
|
||||
}
|
||||
|
|
|
@ -182,6 +182,4 @@ void MarkAsReadThread(not_null<Data::Thread*> thread);
|
|||
|
||||
void AddSeparatorAndShiftUp(const PeerMenuCallback &addAction);
|
||||
|
||||
void MarkAsReadChatListHack(not_null<Dialogs::MainList*> list);
|
||||
|
||||
} // namespace Window
|
||||
|
|
Loading…
Add table
Reference in a new issue