summary refs log tree commit diff
diff options
context:
space:
mode:
authorDeepBlueV7.X <nicolas.werner@hotmail.de>2021-01-05 22:45:40 +0100
committerGitHub <noreply@github.com>2021-01-05 22:45:40 +0100
commit133302d33467f60111ed5f299298fc1a0d8f9cb0 (patch)
tree7dbd7972db923abb964aaedf6d31d7bca238f216
parentlint (diff)
parentFix typing notifications flickering sometimes (diff)
downloadnheko-133302d33467f60111ed5f299298fc1a0d8f9cb0.tar.xz
Merge pull request #365 from Nheko-Reborn/typing
Typing flickering fixes
-rw-r--r--CMakeLists.txt2
-rw-r--r--io.github.NhekoReborn.Nheko.json2
-rw-r--r--resources/qml/MessageView.qml9
-rw-r--r--src/Cache.cpp77
-rw-r--r--src/timeline/TimelineViewManager.cpp19
5 files changed, 75 insertions, 34 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ead1c32b..6ba411ca 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -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 "")
diff --git a/io.github.NhekoReborn.Nheko.json b/io.github.NhekoReborn.Nheko.json
index 352ca648..49e92311 100644
--- a/io.github.NhekoReborn.Nheko.json
+++ b/io.github.NhekoReborn.Nheko.json
@@ -162,7 +162,7 @@
       "name": "mtxclient",
       "sources": [
         {
-          "commit": "ce8bc9c3dd6bba432e716f55136133111b0186e7",
+          "commit": "cad81d1677a4845366b93112f8f2e267ee8c9ae0",
           "type": "git",
           "url": "https://github.com/Nheko-Reborn/mtxclient.git"
         }
diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index 679c1f50..aa222ac5 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -140,6 +140,15 @@ ListView {
 
                 }
 
+                Label {
+                    color: colors.buttonText
+                    text: TimelineManager.userStatus(modelData.userId)
+                    textFormat: Text.PlainText
+                    elide: Text.ElideRight
+                    width: chat.delegateMaxWidth - parent.spacing * 2 - userName.implicitWidth - avatarSize
+                    font.italic: true
+                }
+
             }
 
         }
diff --git a/src/Cache.cpp b/src/Cache.cpp
index dac0b23a..04046346 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -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;
                         }
                 }
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 03eb53fc..f31b5ea5 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -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);
                 }
         }