summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2022-12-03 02:10:45 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2022-12-05 18:39:47 +0100
commit59703d3c255d8809434824838619b2239abe28fe (patch)
treef864ef15b0ad05b3a4eb2f418a9a02539ae47594 /src
parentTranslated using Weblate (Chinese (Simplified)) (diff)
downloadnheko-59703d3c255d8809434824838619b2239abe28fe.tar.xz
Implement MSC3664, pushrules for related events
Diffstat (limited to 'src')
-rw-r--r--src/ChatPage.cpp24
-rw-r--r--src/timeline/TimelineModel.cpp13
2 files changed, 35 insertions, 2 deletions
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp

index 5e0a7b73..1910ce0b 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp
@@ -261,6 +261,10 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent) cache::getEventIndex(room_id, cache::client()->getFullyReadEventId(room_id)); auto ctx = roomModel->pushrulesRoomContext(); + std::vector< + std::pair<mtx::common::Relation, mtx::events::collections::TimelineEvent>> + relatedEvents; + for (const auto &event : room.timeline.events) { mtx::events::collections::TimelineEvent te{event}; std::visit([room_id = room_id](auto &event_) { event_.room_id = room_id; }, @@ -277,7 +281,25 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent) te.data = result.event.value(); } - auto actions = pushrules->evaluate(te, ctx); + relatedEvents.clear(); + for (const auto &r : mtx::accessors::relations(te.data).relations) { + auto related = cache::client()->getEvent(room_id, r.event_id); + if (related) { + relatedEvents.emplace_back(r, *related); + if (auto encryptedEvent = std::get_if< + mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>>( + &related->data); + encryptedEvent && userSettings_->decryptNotifications()) { + MegolmSessionIndex index(room_id, encryptedEvent->content); + + auto result = olm::decryptEvent(index, *encryptedEvent); + if (result.event) + relatedEvents.back().second.data = result.event.value(); + } + } + } + + auto actions = pushrules->evaluate(te, ctx, relatedEvents); if (std::find(actions.begin(), actions.end(), mtx::pushrules::actions::Action{ diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index dedfa197..f61214fd 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp
@@ -742,7 +742,18 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r case Notificationlevel: { const auto &push = ChatPage::instance()->pushruleEvaluator(); if (push) { - auto actions = push->evaluate({event}, pushrulesRoomContext()); + const auto &id = event_id(event); + std::vector<std::pair<mtx::common::Relation, mtx::events::collections::TimelineEvent>> + relatedEvents; + for (const auto &r : mtx::accessors::relations(event).relations) { + auto related = events.get(r.event_id, id); + if (related) { + relatedEvents.emplace_back(r, + mtx::events::collections::TimelineEvent{*related}); + } + } + + auto actions = push->evaluate({event}, pushrulesRoomContext(), relatedEvents); if (std::find(actions.begin(), actions.end(), mtx::pushrules::actions::Action{