Evaluate push rules locally
This commit is contained in:
parent
a1dd02d763
commit
37009906bb
10 changed files with 180 additions and 234 deletions
126
src/Cache.cpp
126
src/Cache.cpp
|
|
@ -1518,10 +1518,6 @@ Cache::updateReadReceipt(lmdb::txn &txn, const std::string &room_id, const Recei
|
|||
|
||||
// Append the new ones.
|
||||
for (const auto &[read_by, timestamp] : event_receipts) {
|
||||
if (read_by == user_id) {
|
||||
emit removeNotification(QString::fromStdString(room_id),
|
||||
QString::fromStdString(event_id));
|
||||
}
|
||||
saved_receipts.emplace(read_by, timestamp);
|
||||
}
|
||||
|
||||
|
|
@ -1818,12 +1814,6 @@ Cache::saveState(const mtx::responses::Sync &res)
|
|||
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);
|
||||
emit removeNotification(QString::fromStdString(room.first),
|
||||
QString::fromStdString(fr->content.event_id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2134,27 +2124,6 @@ Cache::roomIds()
|
|||
return rooms;
|
||||
}
|
||||
|
||||
QMap<QString, mtx::responses::Notifications>
|
||||
Cache::getTimelineMentions()
|
||||
{
|
||||
// TODO: Should be read-only, but getMentionsDb will attempt to create a DB
|
||||
// if it doesn't exist, throwing an error.
|
||||
auto txn = lmdb::txn::begin(env_, nullptr);
|
||||
|
||||
QMap<QString, mtx::responses::Notifications> notifs;
|
||||
|
||||
auto room_ids = getRoomIds(txn);
|
||||
|
||||
for (const auto &room_id : room_ids) {
|
||||
auto roomNotifs = getTimelineMentionsForRoom(txn, room_id);
|
||||
notifs[QString::fromStdString(room_id)] = roomNotifs;
|
||||
}
|
||||
|
||||
txn.commit();
|
||||
|
||||
return notifs;
|
||||
}
|
||||
|
||||
std::string
|
||||
Cache::previousBatchToken(const std::string &room_id)
|
||||
{
|
||||
|
|
@ -3587,88 +3556,6 @@ Cache::clearTimeline(const std::string &room_id)
|
|||
txn.commit();
|
||||
}
|
||||
|
||||
mtx::responses::Notifications
|
||||
Cache::getTimelineMentionsForRoom(lmdb::txn &txn, const std::string &room_id)
|
||||
{
|
||||
auto db = getMentionsDb(txn, room_id);
|
||||
|
||||
if (db.size(txn) == 0) {
|
||||
return mtx::responses::Notifications{};
|
||||
}
|
||||
|
||||
mtx::responses::Notifications notif;
|
||||
std::string_view event_id, msg;
|
||||
|
||||
auto cursor = lmdb::cursor::open(txn, db);
|
||||
|
||||
while (cursor.get(event_id, msg, MDB_NEXT)) {
|
||||
auto obj = nlohmann::json::parse(msg);
|
||||
|
||||
if (obj.count("event") == 0)
|
||||
continue;
|
||||
|
||||
mtx::responses::Notification notification;
|
||||
from_json(obj, notification);
|
||||
|
||||
notif.notifications.push_back(notification);
|
||||
}
|
||||
cursor.close();
|
||||
|
||||
std::reverse(notif.notifications.begin(), notif.notifications.end());
|
||||
|
||||
return notif;
|
||||
}
|
||||
|
||||
//! Add all notifications containing a user mention to the db.
|
||||
void
|
||||
Cache::saveTimelineMentions(const mtx::responses::Notifications &res)
|
||||
{
|
||||
QMap<std::string, QList<mtx::responses::Notification>> notifsByRoom;
|
||||
|
||||
// Sort into room-specific 'buckets'
|
||||
for (const auto ¬if : res.notifications) {
|
||||
nlohmann::json val = notif;
|
||||
notifsByRoom[notif.room_id].push_back(notif);
|
||||
}
|
||||
|
||||
auto txn = lmdb::txn::begin(env_);
|
||||
// Insert the entire set of mentions for each room at a time.
|
||||
QMap<std::string, QList<mtx::responses::Notification>>::const_iterator it =
|
||||
notifsByRoom.constBegin();
|
||||
auto end = notifsByRoom.constEnd();
|
||||
while (it != end) {
|
||||
nhlog::db()->debug("Storing notifications for " + it.key());
|
||||
saveTimelineMentions(txn, it.key(), std::move(it.value()));
|
||||
++it;
|
||||
}
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
void
|
||||
Cache::saveTimelineMentions(lmdb::txn &txn,
|
||||
const std::string &room_id,
|
||||
const QList<mtx::responses::Notification> &res)
|
||||
{
|
||||
auto db = getMentionsDb(txn, room_id);
|
||||
|
||||
using namespace mtx::events;
|
||||
using namespace mtx::events::state;
|
||||
|
||||
for (const auto ¬if : res) {
|
||||
const auto event_id = mtx::accessors::event_id(notif.event);
|
||||
|
||||
// double check that we have the correct room_id...
|
||||
if (room_id.compare(notif.room_id) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
nlohmann::json obj = notif;
|
||||
|
||||
db.put(txn, event_id, obj.dump());
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Cache::markSentNotification(const std::string &event_id)
|
||||
{
|
||||
|
|
@ -5299,12 +5186,6 @@ roomIds()
|
|||
return instance_->roomIds();
|
||||
}
|
||||
|
||||
QMap<QString, mtx::responses::Notifications>
|
||||
getTimelineMentions()
|
||||
{
|
||||
return instance_->getTimelineMentions();
|
||||
}
|
||||
|
||||
//! Retrieve all the user ids from a room.
|
||||
std::vector<std::string>
|
||||
roomMembers(const std::string &room_id)
|
||||
|
|
@ -5405,13 +5286,6 @@ isNotificationSent(const std::string &event_id)
|
|||
return instance_->isNotificationSent(event_id);
|
||||
}
|
||||
|
||||
//! Add all notifications containing a user mention to the db.
|
||||
void
|
||||
saveTimelineMentions(const mtx::responses::Notifications &res)
|
||||
{
|
||||
instance_->saveTimelineMentions(res);
|
||||
}
|
||||
|
||||
//! Remove old unused data.
|
||||
void
|
||||
deleteOldMessages()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue