summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2021-04-28 20:03:52 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2021-04-28 20:03:52 +0200
commit76a9240076b390d8d4a03f709f91d4a1c08ce258 (patch)
tree2d003eeea3bcffa81977fcc511f1aff6cf0368c7 /src
parentAdd Alt-F to forward messages (diff)
downloadnheko-76a9240076b390d8d4a03f709f91d4a1c08ce258.tar.xz
Rewrite matrix.to links to matrix uris and handle them the same way
Diffstat (limited to 'src')
-rw-r--r--src/timeline/TimelineViewManager.cpp48
1 files changed, 47 insertions, 1 deletions
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 9d12825f..33af1825 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -451,7 +451,53 @@ TimelineViewManager::openImageOverlayInternal(QString eventId, QImage img)
 void
 TimelineViewManager::openLink(QString link) const
 {
-        QDesktopServices::openUrl(link);
+        QUrl url(link);
+        if (url.scheme() == "https" && url.host() == "matrix.to") {
+                // handle matrix.to links internally
+                QString p = url.fragment(QUrl::FullyDecoded);
+                if (p.startsWith("/"))
+                        p.remove(0, 1);
+
+                auto temp = p.split("?");
+                QString query;
+                if (temp.size() >= 2)
+                        query = temp.takeAt(1);
+
+                temp            = temp.first().split("/");
+                auto identifier = temp.first();
+                QString eventId;
+                if (temp.size() >= 2)
+                        eventId = temp.takeAt(1);
+                if (!identifier.isEmpty()) {
+                        if (identifier.startsWith("@")) {
+                                QByteArray uri =
+                                  "matrix:u/" + QUrl::toPercentEncoding(identifier.remove(0, 1));
+                                if (!query.isEmpty())
+                                        uri.append("?" + query.toUtf8());
+                                ChatPage::instance()->handleMatrixUri(QUrl::fromEncoded(uri));
+                        } else if (identifier.startsWith("#")) {
+                                QByteArray uri =
+                                  "matrix:r/" + QUrl::toPercentEncoding(identifier.remove(0, 1));
+                                if (!eventId.isEmpty())
+                                        uri.append("/e/" +
+                                                   QUrl::toPercentEncoding(eventId.remove(0, 1)));
+                                if (!query.isEmpty())
+                                        uri.append("?" + query.toUtf8());
+                                ChatPage::instance()->handleMatrixUri(QUrl::fromEncoded(uri));
+                        } else if (identifier.startsWith("!")) {
+                                QByteArray uri = "matrix:roomid/" +
+                                                 QUrl::toPercentEncoding(identifier.remove(0, 1));
+                                if (!eventId.isEmpty())
+                                        uri.append("/e/" +
+                                                   QUrl::toPercentEncoding(eventId.remove(0, 1)));
+                                if (!query.isEmpty())
+                                        uri.append("?" + query.toUtf8());
+                                ChatPage::instance()->handleMatrixUri(QUrl::fromEncoded(uri));
+                        }
+                }
+        } else {
+                QDesktopServices::openUrl(url);
+        }
 }
 
 void