Page MenuHomePhorge

matrix-link.cpp
No OneTemporary

Size
2 KB
Referenced Files
None
Subscribers
None

matrix-link.cpp

/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2024 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include <libkazv-config.hpp>
#include <immer/config.hpp> // https://github.com/arximboldi/immer/issues/168
#include <QUrl>
#include <QUrlQuery>
#include <QDebug>
#include "matrix-link.hpp"
std::pair<MatrixLink::Type, QString> parseMatrixToComp(QString comp)
{
comp = QUrl("foo:#" + comp).fragment(QUrl::FullyDecoded);
if (comp.startsWith('@')) {
return {MatrixLink::User, comp};
} else if (comp.startsWith('#')) {
return {MatrixLink::RoomAlias, comp};
} else if (comp.startsWith('!')) {
return {MatrixLink::RoomId, comp};
} else if (comp.startsWith('$')) {
return {MatrixLink::Event, comp};
} else {
return {MatrixLink::None, comp};
}
}
QStringList parseMatrixToQuery(QString query)
{
auto q = QUrlQuery(query);
return q.allQueryItemValues("via");
}
MatrixLink::MatrixLink(const QUrl &url)
{
// matrix.to link
if (url.scheme() == "https"
&& url.host() == "matrix.to") {
auto frag = url.fragment();
auto parts = frag.split('?');
QString ids = parts[0];
QString query = parts.size() > 1 ? parts[1] : "";
auto comps = ids.split('/');
if (comps.empty() || comps[0] != "") {
return;
}
comps.pop_front();
for (auto comp : comps) {
m_identifiers.push_back(parseMatrixToComp(comp));
}
m_routingServers = parseMatrixToQuery(query);
}
}
bool MatrixLink::isValid() const
{
return !m_identifiers.empty()
&& m_identifiers[0].first != None
&& m_identifiers[0].first != Event
&& (m_identifiers.size() == 1 || (
m_identifiers[1].first == Event
&& (m_identifiers[0].first == RoomId
|| m_identifiers[0].first == RoomAlias)));
}
bool MatrixLink::isUser() const
{
return isValid() && m_identifiers[0].first == User;
}
bool MatrixLink::isRoom() const
{
return isValid() && (
m_identifiers[0].first == RoomId
|| m_identifiers[0].first == RoomAlias);
}
bool MatrixLink::isEvent() const
{
return isValid() && m_identifiers.size() == 2;
}
QStringList MatrixLink::identifiers() const
{
QStringList ret;
for (auto [_, id] : m_identifiers) {
ret.push_back(id);
}
return ret;
}
QStringList MatrixLink::routingServers() const
{
return m_routingServers;
}

File Metadata

Mime Type
text/x-c
Expires
Wed, May 14, 7:37 AM (1 d, 18 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
92168
Default Alt Text
matrix-link.cpp (2 KB)

Event Timeline