Add experimental event expiration
Currently disabled by default.
2 files changed, 191 insertions, 0 deletions
diff --git a/src/ui/EventExpiry.cpp b/src/ui/EventExpiry.cpp
new file mode 100644
index 00000000..ca149dc3
--- /dev/null
+++ b/src/ui/EventExpiry.cpp
@@ -0,0 +1,124 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "EventExpiry.h"
+
+#include "Cache_p.h"
+#include "MainWindow.h"
+#include "MatrixClient.h"
+#include "timeline/TimelineModel.h"
+
+void
+EventExpiry::load()
+{
+ using namespace mtx::events;
+
+ this->event = {};
+
+ if (auto temp = cache::client()->getAccountData(mtx::events::EventType::NhekoEventExpiry, "")) {
+ auto h = std::get<
+ mtx::events::AccountDataEvent<mtx::events::account_data::nheko_extensions::EventExpiry>>(
+ *temp);
+ this->event = std::move(h.content);
+ }
+
+ if (!roomid_.isEmpty()) {
+ if (auto temp = cache::client()->getAccountData(mtx::events::EventType::NhekoEventExpiry,
+ roomid_.toStdString())) {
+ auto h = std::get<mtx::events::AccountDataEvent<
+ mtx::events::account_data::nheko_extensions::EventExpiry>>(*temp);
+ this->event = std::move(h.content);
+ }
+ }
+
+ emit expireEventsAfterDaysChanged();
+ emit expireEventsAfterCountChanged();
+ emit protectLatestEventsChanged();
+ emit expireStateEventsChanged();
+}
+
+void
+EventExpiry::save()
+{
+ if (roomid_.isEmpty())
+ http::client()->put_account_data(event, [](mtx::http::RequestErr e) {
+ if (e) {
+ nhlog::net()->error("Failed to set hidden events: {}", *e);
+ MainWindow::instance()->showNotification(
+ tr("Failed to set hidden events: %1")
+ .arg(QString::fromStdString(e->matrix_error.error)));
+ }
+ });
+ else
+ http::client()->put_room_account_data(
+ roomid_.toStdString(), event, [](mtx::http::RequestErr e) {
+ if (e) {
+ nhlog::net()->error("Failed to set hidden events: {}", *e);
+ MainWindow::instance()->showNotification(
+ tr("Failed to set hidden events: %1")
+ .arg(QString::fromStdString(e->matrix_error.error)));
+ }
+ });
+}
+
+int
+EventExpiry::expireEventsAfterDays() const
+{
+ return event.expire_after_ms / (1000 * 60 * 60 * 24);
+}
+
+int
+EventExpiry::expireEventsAfterCount() const
+{
+ return event.keep_only_latest;
+}
+
+int
+EventExpiry::protectLatestEvents() const
+{
+ return event.protect_latest;
+}
+
+bool
+EventExpiry::expireStateEvents() const
+{
+ return !event.exclude_state_events;
+}
+
+void
+EventExpiry::setExpireEventsAfterDays(int val)
+{
+ if (val > 0)
+ this->event.expire_after_ms = val * (1000 * 60 * 60 * 24);
+ else
+ this->event.expire_after_ms = 0;
+ emit expireEventsAfterDaysChanged();
+}
+
+void
+EventExpiry::setProtectLatestEvents(int val)
+{
+ if (val > 0)
+ this->event.protect_latest = val;
+ else
+ this->event.expire_after_ms = 0;
+ emit protectLatestEventsChanged();
+}
+
+void
+EventExpiry::setExpireEventsAfterCount(int val)
+{
+ if (val > 0)
+ this->event.keep_only_latest = val;
+ else
+ this->event.keep_only_latest = 0;
+ emit expireEventsAfterCountChanged();
+}
+
+void
+EventExpiry::setExpireStateEvents(bool val)
+{
+ this->event.exclude_state_events = !val;
+ emit expireEventsAfterCountChanged();
+}
diff --git a/src/ui/EventExpiry.h b/src/ui/EventExpiry.h
new file mode 100644
index 00000000..aa144dc3
--- /dev/null
+++ b/src/ui/EventExpiry.h
@@ -0,0 +1,67 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include <QObject>
+#include <QQmlEngine>
+#include <QString>
+#include <QVariantList>
+
+#include <mtx/events/nheko_extensions/event_expiry.hpp>
+
+class EventExpiry : public QObject
+{
+ Q_OBJECT
+ QML_ELEMENT
+ Q_PROPERTY(QString roomid READ roomid WRITE setRoomid NOTIFY roomidChanged REQUIRED)
+ Q_PROPERTY(int expireEventsAfterDays READ expireEventsAfterDays WRITE setExpireEventsAfterDays
+ NOTIFY expireEventsAfterDaysChanged)
+ Q_PROPERTY(bool expireStateEvents READ expireStateEvents WRITE setExpireStateEvents NOTIFY
+ expireStateEventsChanged)
+ Q_PROPERTY(int expireEventsAfterCount READ expireEventsAfterCount WRITE
+ setExpireEventsAfterCount NOTIFY expireEventsAfterCountChanged)
+ Q_PROPERTY(int protectLatestEvents READ protectLatestEvents WRITE setProtectLatestEvents NOTIFY
+ protectLatestEventsChanged)
+public:
+ explicit EventExpiry(QObject *p = nullptr)
+ : QObject(p)
+ {
+ }
+
+ Q_INVOKABLE void save();
+
+ [[nodiscard]] QString roomid() const { return roomid_; }
+ void setRoomid(const QString &r)
+ {
+ roomid_ = r;
+ emit roomidChanged();
+
+ load();
+ }
+
+ [[nodiscard]] int expireEventsAfterDays() const;
+ [[nodiscard]] int expireEventsAfterCount() const;
+ [[nodiscard]] int protectLatestEvents() const;
+ [[nodiscard]] bool expireStateEvents() const;
+ void setExpireEventsAfterDays(int);
+ void setExpireEventsAfterCount(int);
+ void setProtectLatestEvents(int);
+ void setExpireStateEvents(bool);
+
+signals:
+ void roomidChanged();
+
+ void expireEventsAfterDaysChanged();
+ void expireEventsAfterCountChanged();
+ void protectLatestEventsChanged();
+ void expireStateEventsChanged();
+
+private:
+ QString roomid_;
+ mtx::events::account_data::nheko_extensions::EventExpiry event = {};
+
+ void load();
+};
+
|