mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-25 20:48:52 +03:00
Fix typing notifications flickering sometimes
This commit is contained in:
parent
5ca043ad87
commit
3a41bb9fff
4 changed files with 66 additions and 34 deletions
|
@ -356,7 +356,7 @@ if(USE_BUNDLED_MTXCLIENT)
|
|||
FetchContent_Declare(
|
||||
MatrixClient
|
||||
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
|
||||
GIT_TAG ce8bc9c3dd6bba432e716f55136133111b0186e7
|
||||
GIT_TAG cad81d1677a4845366b93112f8f2e267ee8c9ae0
|
||||
)
|
||||
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
|
||||
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
|
||||
|
|
|
@ -162,7 +162,7 @@
|
|||
"name": "mtxclient",
|
||||
"sources": [
|
||||
{
|
||||
"commit": "ce8bc9c3dd6bba432e716f55136133111b0186e7",
|
||||
"commit": "cad81d1677a4845366b93112f8f2e267ee8c9ae0",
|
||||
"type": "git",
|
||||
"url": "https://github.com/Nheko-Reborn/mtxclient.git"
|
||||
}
|
||||
|
|
|
@ -124,17 +124,15 @@ Cache::isHiddenEvent(lmdb::txn &txn,
|
|||
EventType::Reaction, EventType::CallCandidates, EventType::Unsupported};
|
||||
|
||||
if (auto temp = getAccountData(txn, mtx::events::EventType::NhekoHiddenEvents, ""))
|
||||
hiddenEvents = std::move(
|
||||
std::get<
|
||||
mtx::events::Event<mtx::events::account_data::nheko_extensions::HiddenEvents>>(
|
||||
*temp)
|
||||
.content);
|
||||
hiddenEvents =
|
||||
std::move(std::get<mtx::events::AccountDataEvent<
|
||||
mtx::events::account_data::nheko_extensions::HiddenEvents>>(*temp)
|
||||
.content);
|
||||
if (auto temp = getAccountData(txn, mtx::events::EventType::NhekoHiddenEvents, room_id))
|
||||
hiddenEvents = std::move(
|
||||
std::get<
|
||||
mtx::events::Event<mtx::events::account_data::nheko_extensions::HiddenEvents>>(
|
||||
*temp)
|
||||
.content);
|
||||
hiddenEvents =
|
||||
std::move(std::get<mtx::events::AccountDataEvent<
|
||||
mtx::events::account_data::nheko_extensions::HiddenEvents>>(*temp)
|
||||
.content);
|
||||
|
||||
return std::visit(
|
||||
[hiddenEvents](const auto &ev) {
|
||||
|
@ -1197,7 +1195,7 @@ void
|
|||
Cache::saveState(const mtx::responses::Sync &res)
|
||||
{
|
||||
using namespace mtx::events;
|
||||
auto user_id = this->localUserId_.toStdString();
|
||||
auto local_user_id = this->localUserId_.toStdString();
|
||||
|
||||
auto currentBatchToken = nextBatchToken();
|
||||
|
||||
|
@ -1252,13 +1250,19 @@ Cache::saveState(const mtx::responses::Sync &res)
|
|||
evt);
|
||||
|
||||
// for tag events
|
||||
if (std::holds_alternative<Event<account_data::Tags>>(evt)) {
|
||||
auto tags_evt = std::get<Event<account_data::Tags>>(evt);
|
||||
has_new_tags = true;
|
||||
if (std::holds_alternative<AccountDataEvent<account_data::Tags>>(
|
||||
evt)) {
|
||||
auto tags_evt =
|
||||
std::get<AccountDataEvent<account_data::Tags>>(evt);
|
||||
has_new_tags = true;
|
||||
for (const auto &tag : tags_evt.content.tags) {
|
||||
updatedInfo.tags.push_back(tag.first);
|
||||
}
|
||||
}
|
||||
if (auto fr = std::get_if<mtx::events::AccountDataEvent<
|
||||
mtx::events::account_data::FullyRead>>(&evt)) {
|
||||
nhlog::db()->debug("Fully read: {}", fr->content.event_id);
|
||||
}
|
||||
}
|
||||
if (!has_new_tags) {
|
||||
// retrieve the old tags, they haven't changed
|
||||
|
@ -1282,7 +1286,20 @@ Cache::saveState(const mtx::responses::Sync &res)
|
|||
lmdb::dbi_put(
|
||||
txn, roomsDb_, lmdb::val(room.first), lmdb::val(json(updatedInfo).dump()));
|
||||
|
||||
updateReadReceipt(txn, room.first, room.second.ephemeral.receipts);
|
||||
for (const auto &e : room.second.ephemeral.events) {
|
||||
if (auto receiptsEv = std::get_if<
|
||||
mtx::events::EphemeralEvent<mtx::events::ephemeral::Receipt>>(&e)) {
|
||||
Receipts receipts;
|
||||
|
||||
for (const auto &[event_id, userReceipts] :
|
||||
receiptsEv->content.receipts) {
|
||||
for (const auto &[user_id, receipt] : userReceipts.users) {
|
||||
receipts[event_id][user_id] = receipt.ts;
|
||||
}
|
||||
}
|
||||
updateReadReceipt(txn, room.first, receipts);
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up non-valid invites.
|
||||
removeInvite(txn, room.first);
|
||||
|
@ -1302,19 +1319,27 @@ Cache::saveState(const mtx::responses::Sync &res)
|
|||
std::map<QString, bool> readStatus;
|
||||
|
||||
for (const auto &room : res.rooms.join) {
|
||||
if (!room.second.ephemeral.receipts.empty()) {
|
||||
std::vector<QString> receipts;
|
||||
for (const auto &receipt : room.second.ephemeral.receipts) {
|
||||
for (const auto &receiptUsersTs : receipt.second) {
|
||||
if (receiptUsersTs.first != user_id) {
|
||||
receipts.push_back(
|
||||
QString::fromStdString(receipt.first));
|
||||
break;
|
||||
for (const auto &e : room.second.ephemeral.events) {
|
||||
if (auto receiptsEv = std::get_if<
|
||||
mtx::events::EphemeralEvent<mtx::events::ephemeral::Receipt>>(&e)) {
|
||||
std::vector<QString> receipts;
|
||||
|
||||
for (const auto &[event_id, userReceipts] :
|
||||
receiptsEv->content.receipts) {
|
||||
for (const auto &[user_id, receipt] : userReceipts.users) {
|
||||
(void)receipt;
|
||||
|
||||
if (user_id != local_user_id) {
|
||||
receipts.push_back(
|
||||
QString::fromStdString(event_id));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!receipts.empty())
|
||||
emit newReadReceipts(QString::fromStdString(room.first),
|
||||
receipts);
|
||||
}
|
||||
if (!receipts.empty())
|
||||
emit newReadReceipts(QString::fromStdString(room.first), receipts);
|
||||
}
|
||||
readStatus.emplace(QString::fromStdString(room.first),
|
||||
calculateRoomReadStatus(room.first));
|
||||
|
@ -1440,7 +1465,7 @@ Cache::roomsWithTagUpdates(const mtx::responses::Sync &res)
|
|||
for (const auto &room : res.rooms.join) {
|
||||
bool hasUpdates = false;
|
||||
for (const auto &evt : room.second.account_data.events) {
|
||||
if (std::holds_alternative<Event<account_data::Tags>>(evt)) {
|
||||
if (std::holds_alternative<AccountDataEvent<account_data::Tags>>(evt)) {
|
||||
hasUpdates = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -297,13 +297,20 @@ TimelineViewManager::sync(const mtx::responses::Rooms &rooms)
|
|||
&CallManager::syncEvent);
|
||||
|
||||
if (ChatPage::instance()->userSettings()->typingNotifications()) {
|
||||
std::vector<QString> typing;
|
||||
typing.reserve(room.ephemeral.typing.size());
|
||||
for (const auto &user : room.ephemeral.typing) {
|
||||
if (user != http::client()->user_id().to_string())
|
||||
typing.push_back(QString::fromStdString(user));
|
||||
for (const auto &ev : room.ephemeral.events) {
|
||||
if (auto t = std::get_if<
|
||||
mtx::events::EphemeralEvent<mtx::events::ephemeral::Typing>>(
|
||||
&ev)) {
|
||||
std::vector<QString> typing;
|
||||
typing.reserve(t->content.user_ids.size());
|
||||
for (const auto &user : t->content.user_ids) {
|
||||
if (user != http::client()->user_id().to_string())
|
||||
typing.push_back(
|
||||
QString::fromStdString(user));
|
||||
}
|
||||
room_model->updateTypingUsers(typing);
|
||||
}
|
||||
}
|
||||
room_model->updateTypingUsers(typing);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue