Fix typing notifications flickering sometimes

This commit is contained in:
Nicolas Werner 2021-01-05 22:10:40 +01:00
parent 5ca043ad87
commit 3a41bb9fff
4 changed files with 66 additions and 34 deletions

View file

@ -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 "")

View file

@ -162,7 +162,7 @@
"name": "mtxclient",
"sources": [
{
"commit": "ce8bc9c3dd6bba432e716f55136133111b0186e7",
"commit": "cad81d1677a4845366b93112f8f2e267ee8c9ae0",
"type": "git",
"url": "https://github.com/Nheko-Reborn/mtxclient.git"
}

View file

@ -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;
}
}

View file

@ -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);
}
}