diff options
author | Nicolas Werner <nicolas.werner@hotmail.de> | 2021-04-28 20:03:52 +0200 |
---|---|---|
committer | Nicolas Werner <nicolas.werner@hotmail.de> | 2021-04-28 20:03:52 +0200 |
commit | 76a9240076b390d8d4a03f709f91d4a1c08ce258 (patch) | |
tree | 2d003eeea3bcffa81977fcc511f1aff6cf0368c7 /src | |
parent | Add Alt-F to forward messages (diff) | |
download | nheko-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.cpp | 48 |
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 |