summary refs log tree commit diff
path: root/src/timeline
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2022-02-04 18:47:17 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2022-02-04 20:48:14 +0100
commit7b00411dc44d188ec1deab302fbcdb0bd2a399e7 (patch)
tree32934f5fc2c32fc4b4b0f5b6f4134baa78e1a265 /src/timeline
parentMerge pull request #906 from LorenDB/offlineIndicator (diff)
downloadnheko-7b00411dc44d188ec1deab302fbcdb0bd2a399e7.tar.xz
Show widgets as links
Diffstat (limited to 'src/timeline')
-rw-r--r--src/timeline/TimelineModel.cpp64
-rw-r--r--src/timeline/TimelineModel.h5
2 files changed, 69 insertions, 0 deletions
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp

index 6b380f79..d1613d5b 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp
@@ -285,6 +285,9 @@ qml_mtx_events::fromRoomEventType(qml_mtx_events::EventType t) /// m.room.pinned_events case qml_mtx_events::PinnedEvents: return mtx::events::EventType::RoomPinnedEvents; + /// m.widget + case qml_mtx_events::Widget: + return mtx::events::EventType::Widget; // m.sticker case qml_mtx_events::Sticker: return mtx::events::EventType::Sticker; @@ -852,6 +855,8 @@ TimelineModel::syncState(const mtx::responses::State &s) emit roomTopicChanged(); else if (std::holds_alternative<StateEvent<state::PinnedEvents>>(e)) emit pinnedMessagesChanged(); + else if (std::holds_alternative<StateEvent<state::Widget>>(e)) + emit widgetLinksChanged(); else if (std::holds_alternative<StateEvent<state::PowerLevels>>(e)) { permissions_.invalidate(); emit permissionsChanged(); @@ -916,6 +921,8 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline) emit roomTopicChanged(); else if (std::holds_alternative<StateEvent<state::PinnedEvents>>(e)) emit pinnedMessagesChanged(); + else if (std::holds_alternative<StateEvent<state::Widget>>(e)) + emit widgetLinksChanged(); else if (std::holds_alternative<StateEvent<state::PowerLevels>>(e)) { permissions_.invalidate(); emit permissionsChanged(); @@ -2225,6 +2232,63 @@ TimelineModel::pinnedMessages() const return list; } +QStringList +TimelineModel::widgetLinks() const +{ + auto evs = + cache::client()->getStateEventsWithType<mtx::events::state::Widget>(room_id_.toStdString()); + auto evs2 = cache::client()->getStateEventsWithType<mtx::events::state::Widget>( + room_id_.toStdString(), mtx::events::EventType::Widget); + evs.insert( + evs.end(), std::make_move_iterator(evs2.begin()), std::make_move_iterator(evs2.end())); + + if (evs.empty()) + return {}; + + QStringList list; + + auto user = utils::localUser(); + auto av = QUrl::toPercentEncoding(avatarUrl(user)); + auto disp = QUrl::toPercentEncoding(displayName(user)); + auto theme = UserSettings::instance()->theme(); + if (theme == QStringLiteral("system")) + theme.clear(); + user = QUrl::toPercentEncoding(user); + + list.reserve(evs.size()); + for (const auto &p : evs) { + auto url = QString::fromStdString(p.content.url); + for (const auto &[k, v] : p.content.data) + url.replace("$" + QString::fromStdString(k), + QUrl::toPercentEncoding(QString::fromStdString(v))); + + url.replace("$matrix_user_id", user); + url.replace("$matrix_room_id", QUrl::toPercentEncoding(room_id_)); + url.replace("$matrix_display_name", disp); + url.replace("$matrix_avatar_url", av); + + url.replace("$matrix_widget_id", + QUrl::toPercentEncoding(QString::fromStdString(p.content.id))); + + // url.replace("$matrix_client_theme", theme); + url.replace("$org.matrix.msc2873.client_theme", theme); + url.replace("$org.matrix.msc2873.client_id", "im.nheko"); + + // compat with some widgets, i.e. FOSDEM + url.replace("$theme", theme); + + url = QUrl::toPercentEncoding(url, "/:?&@=%"); + + list.push_back( + QLatin1String("<a href='%1'>%2</a>") + .arg(url, + QString::fromStdString(p.content.name.empty() ? p.state_key : p.content.name) + .toHtmlEscaped())); + } + + return list; +} + crypto::Trust TimelineModel::trustlevel() const { diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 556f9f54..b4267e8d 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h
@@ -91,6 +91,8 @@ enum EventType Sticker, // m.tag Tag, + // m.widget + Widget, /// m.room.message AudioMessage, EmoteMessage, @@ -178,6 +180,7 @@ class TimelineModel : public QAbstractListModel Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY roomAvatarUrlChanged) Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY roomTopicChanged) Q_PROPERTY(QStringList pinnedMessages READ pinnedMessages NOTIFY pinnedMessagesChanged) + Q_PROPERTY(QStringList widgetLinks READ widgetLinks NOTIFY widgetLinksChanged) Q_PROPERTY(int roomMemberCount READ roomMemberCount NOTIFY roomMemberCountChanged) Q_PROPERTY(bool isEncrypted READ isEncrypted NOTIFY encryptionChanged) Q_PROPERTY(bool isSpace READ isSpace CONSTANT) @@ -365,6 +368,7 @@ public slots: QString plainRoomName() const; QString roomTopic() const; QStringList pinnedMessages() const; + QStringList widgetLinks() const; InputBar *input() { return &input_; } Permissions *permissions() { return &permissions_; } QString roomAvatarUrl() const; @@ -407,6 +411,7 @@ signals: void plainRoomNameChanged(); void roomTopicChanged(); void pinnedMessagesChanged(); + void widgetLinksChanged(); void roomAvatarUrlChanged(); void roomMemberCountChanged(); void isDirectChanged();