1 files changed, 44 insertions, 0 deletions
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 5a0f9bad..2f7bfdd2 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -9,13 +9,16 @@
#include <type_traits>
#include <QCache>
+#include <QClipboard>
#include <QDesktopServices>
#include <QFileDialog>
+#include <QGuiApplication>
#include <QMimeDatabase>
#include <QRegularExpression>
#include <QSettings>
#include <QStandardPaths>
+#include "Cache_p.h"
#include "ChatPage.h"
#include "Config.h"
#include "EventAccessors.h"
@@ -1336,6 +1339,47 @@ TimelineModel::scrollTimerEvent()
}
}
+void
+TimelineModel::copyLinkToEvent(QString eventId) const
+{
+ QStringList vias;
+
+ auto alias = cache::client()->getRoomAliases(room_id_.toStdString());
+ QString room;
+ if (alias) {
+ room = QString::fromStdString(alias->alias);
+ if (room.isEmpty() && !alias->alt_aliases.empty()) {
+ room = QString::fromStdString(alias->alt_aliases.front());
+ }
+ }
+
+ if (room.isEmpty())
+ room = room_id_;
+
+ vias.push_back(QString("via=%1").arg(QString(
+ QUrl::toPercentEncoding(QString::fromStdString(http::client()->user_id().hostname())))));
+ auto members = cache::getMembers(room_id_.toStdString(), 0, 100);
+ for (const auto &m : members) {
+ if (vias.size() >= 4)
+ break;
+
+ auto user_id =
+ mtx::identifiers::parse<mtx::identifiers::User>(m.user_id.toStdString());
+ QString server = QString("via=%1").arg(
+ QString(QUrl::toPercentEncoding(QString::fromStdString(user_id.hostname()))));
+
+ if (!vias.contains(server))
+ vias.push_back(server);
+ }
+
+ auto link = QString("https://matrix.to/#/%1/%2?%3")
+ .arg(QString(QUrl::toPercentEncoding(room)),
+ QString(QUrl::toPercentEncoding(eventId)),
+ vias.join('&'));
+
+ QGuiApplication::clipboard()->setText(link);
+}
+
QString
TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg)
{
|