Changeset View
Changeset View
Standalone View
Standalone View
src/matrix-event.cpp
Show All 32 Lines | static Event getEvent(std::variant<Event, LocalEchoDesc> event) | ||||
} | } | ||||
} | } | ||||
MatrixEvent::MatrixEvent(lager::reader<std::variant<Event, LocalEchoDesc>> event, std::optional<Room> room, QObject *parent) | MatrixEvent::MatrixEvent(lager::reader<std::variant<Event, LocalEchoDesc>> event, std::optional<Room> room, QObject *parent) | ||||
: QObject(parent) | : QObject(parent) | ||||
, m_localEcho(event.map(getLocalEcho)) | , m_localEcho(event.map(getLocalEcho)) | ||||
, m_event(event.map(getEvent)) | , m_event(event.map(getEvent)) | ||||
, m_room(room) | , m_room(room) | ||||
, LAGER_QT(eventId)(m_event.xform(zug::map([](Event e) { return e.id(); }) | strToQt)) | , m_eventIdStd(m_event.map(&Event::id)) | ||||
, LAGER_QT(sender)(m_event.xform(zug::map([](Event e) { return e.sender(); }) | strToQt)) | , m_senderStd(m_event.map(&Event::sender)) | ||||
, m_originalContent(m_event.map([](Event e) { return e.content().get().get<QJsonObject>(); })) | |||||
, m_edits(m_room.has_value() ? lager::reader<EventList>(lager::with( | |||||
m_event, | |||||
m_room->relatedEvents(m_eventIdStd, "m.replace") | |||||
).map([](const Event &origEvent, const EventList &edits) -> EventList { | |||||
// https://spec.matrix.org/v1.10/client-server-api/#event-replacements | |||||
if (!( | |||||
// (3) no state key | |||||
!origEvent.isState() | |||||
// (4) original event is not an edit | |||||
&& origEvent.relationship().first != "m.replace" | |||||
)) { | |||||
return EventList{}; | |||||
} | |||||
auto origType = origEvent.type(); | |||||
auto origSender = origEvent.sender(); | |||||
return intoImmer( | |||||
EventList{}, | |||||
zug::filter([&origType, &origSender](const Event &ev) { | |||||
return | |||||
// (0) same room id requirement is implicit. | |||||
// (1) same sender | |||||
origSender == ev.sender() | |||||
// (2) same type | |||||
&& origType == ev.type() | |||||
// (3) no state key | |||||
&& !ev.isState() | |||||
// (4) original event is not an edit is checked above | |||||
// (5) replaced event content has `m.new_content` | |||||
&& ev.content().get().contains("m.new_content"); | |||||
}), | |||||
edits | |||||
); | |||||
})) : lager::make_constant(EventList{})) | |||||
, LAGER_QT(eventId)(m_eventIdStd.xform(strToQt)) | |||||
, LAGER_QT(sender)(m_senderStd.xform(strToQt)) | |||||
, LAGER_QT(type)(m_event.xform(zug::map([](Event e) { return e.type(); }) | strToQt)) | , LAGER_QT(type)(m_event.xform(zug::map([](Event e) { return e.type(); }) | strToQt)) | ||||
, LAGER_QT(stateKey)(m_event.xform(zug::map([](Event e) { return e.stateKey(); }) | strToQt)) | , LAGER_QT(stateKey)(m_event.xform(zug::map([](Event e) { return e.stateKey(); }) | strToQt)) | ||||
, LAGER_QT(content)(m_event.xform(zug::map([](Event e) { return e.content().get().get<QJsonObject>(); }))) | , LAGER_QT(content)(lager::with(m_originalContent, m_edits).map([](const QJsonObject &origContent, const EventList &edits) { | ||||
if (edits.empty()) { | |||||
return origContent; | |||||
} else { | |||||
return edits.at(edits.size() - 1).content().get().at("m.new_content").get<QJsonObject>(); | |||||
} | |||||
})) | |||||
, LAGER_QT(encrypted)(m_event.xform(zug::map([](Event e) { return e.encrypted(); }))) | , LAGER_QT(encrypted)(m_event.xform(zug::map([](Event e) { return e.encrypted(); }))) | ||||
, LAGER_QT(decrypted)(m_event.map([](Event e) { return e.decrypted(); })) | , LAGER_QT(decrypted)(m_event.map([](Event e) { return e.decrypted(); })) | ||||
, LAGER_QT(isState)(m_event.map([](Event e) { return e.isState(); })) | , LAGER_QT(isState)(m_event.map([](Event e) { return e.isState(); })) | ||||
, LAGER_QT(unsignedData)(m_event.map([](Event e) { | , LAGER_QT(unsignedData)(m_event.map([](Event e) { | ||||
auto j = e.raw(); | auto j = e.raw(); | ||||
if (j.get().contains("unsigned")) { | if (j.get().contains("unsigned")) { | ||||
return j.get()["unsigned"].template get<QJsonObject>(); | return j.get()["unsigned"].template get<QJsonObject>(); | ||||
} else { | } else { | ||||
Show All 32 Lines | , LAGER_QT(formattedTime)(m_event | ||||
.map(&Event::originServerTs) | .map(&Event::originServerTs) | ||||
.map([](Timestamp ts) { | .map([](Timestamp ts) { | ||||
auto locale = QLocale::system(); | auto locale = QLocale::system(); | ||||
return locale.toString( | return locale.toString( | ||||
QDateTime::fromMSecsSinceEpoch(ts).time(), | QDateTime::fromMSecsSinceEpoch(ts).time(), | ||||
QLocale::ShortFormat | QLocale::ShortFormat | ||||
); | ); | ||||
})) | })) | ||||
, LAGER_QT(isEdited)(m_edits.map([](const auto &edits) { return !edits.empty(); })) | |||||
{ | { | ||||
} | } | ||||
MatrixEvent::MatrixEvent(lager::reader<Event> event, std::optional<Kazv::Room> room, QObject *parent) | MatrixEvent::MatrixEvent(lager::reader<Event> event, std::optional<Kazv::Room> room, QObject *parent) | ||||
: MatrixEvent(event.map([](const auto &e) -> std::variant<Kazv::Event, Kazv::LocalEchoDesc> { return e; }), room, parent) | : MatrixEvent(event.map([](const auto &e) -> std::variant<Kazv::Event, Kazv::LocalEchoDesc> { return e; }), room, parent) | ||||
{ | { | ||||
} | } | ||||
Show All 38 Lines |