EventHandler: Acknowledge that non-room-events can have a body as well

Specifically, in the current architecture, these can be EncryptedEvents
which are redactions of previous events. These will have artifical bodies.
This commit is contained in:
Arno Rehn
2025-10-07 21:49:52 +02:00
committed by Tobias Fella
parent 7356a68f4c
commit 1a43d15c6d
3 changed files with 41 additions and 44 deletions

View File

@@ -195,20 +195,25 @@ bool EventHandler::isHidden(const NeoChatRoom *room, const Quotient::RoomEvent *
return false; return false;
} }
Qt::TextFormat EventHandler::messageBodyInputFormat(const Quotient::RoomMessageEvent &event) Qt::TextFormat EventHandler::messageBodyInputFormat(const Quotient::RoomEvent &event)
{ {
if (event.isRedacted() && !event.isStateEvent()) { if (event.isRedacted() && !event.isStateEvent()) {
return Qt::RichText; return Qt::RichText;
} }
if (event.mimeType().name() == "text/plain"_L1) { auto msgEvent = eventCast<const Quotient::RoomMessageEvent>(&event);
if (!msgEvent) {
return Qt::PlainText;
}
if (msgEvent->mimeType().name() == "text/plain"_L1) {
return Qt::PlainText; return Qt::PlainText;
} else { } else {
return Qt::RichText; return Qt::RichText;
} }
} }
QString EventHandler::rawMessageBody(const Quotient::RoomMessageEvent &event) QString EventHandler::rawMessageBody(const RoomEvent &event)
{ {
if (event.isRedacted() && !event.isStateEvent()) { if (event.isRedacted() && !event.isStateEvent()) {
auto reason = event.redactedBecause()->reason(); auto reason = event.redactedBecause()->reason();
@@ -217,21 +222,26 @@ QString EventHandler::rawMessageBody(const Quotient::RoomMessageEvent &event)
QString body; QString body;
if (event.has<EventContent::FileContent>()) { auto msgEvent = eventCast<const Quotient::RoomMessageEvent>(&event);
if (!msgEvent) {
return body;
}
if (msgEvent->has<EventContent::FileContent>()) {
// if filename is given or body is equal to filename, // if filename is given or body is equal to filename,
// then body is a caption // then body is a caption
QString filename = event.get<EventContent::FileContent>()->originalName; QString filename = msgEvent->get<EventContent::FileContent>()->originalName;
QString body = event.plainBody(); QString body = msgEvent->plainBody();
if (filename.isEmpty() || filename == body) { if (filename.isEmpty() || filename == body) {
return QString(); return QString();
} }
return body; return body;
} }
if (event.has<EventContent::TextContent>() && event.content()) { if (msgEvent->has<EventContent::TextContent>() && msgEvent->content()) {
body = event.get<EventContent::TextContent>()->body; body = msgEvent->get<EventContent::TextContent>()->body;
} else { } else {
body = event.plainBody(); body = msgEvent->plainBody();
} }
return body; return body;
} }

View File

@@ -122,15 +122,15 @@ public:
* I.e. if the message has only a body the format will be Qt::PlainText, if it * I.e. if the message has only a body the format will be Qt::PlainText, if it
* has a formatted body it will be Qt::RichText. * has a formatted body it will be Qt::RichText.
*/ */
static Qt::TextFormat messageBodyInputFormat(const Quotient::RoomMessageEvent &event); static Qt::TextFormat messageBodyInputFormat(const Quotient::RoomEvent &event);
/** /**
* @brief Output a string for the room message content without any formatting. * @brief Output a string for the message content without any formatting.
* *
* This is the content of the formatted_body key if present or the body key if * This is the content of the formatted_body key if present or the body key if
* not. * not.
*/ */
static QString rawMessageBody(const Quotient::RoomMessageEvent &event); static QString rawMessageBody(const Quotient::RoomEvent &event);
/** /**
* @brief Output a string for the message content ready for display in a rich text field. * @brief Output a string for the message content ready for display in a rich text field.

View File

@@ -366,55 +366,42 @@ void EventMessageContentModel::updateReplyModel()
QList<MessageComponent> EventMessageContentModel::componentsForType(MessageComponentType::Type type) QList<MessageComponent> EventMessageContentModel::componentsForType(MessageComponentType::Type type)
{ {
const auto event = m_room->getEvent(m_eventId); const auto [event, _] = m_room->getEvent(m_eventId);
if (event.first == nullptr) { if (event == nullptr) {
return {}; return {};
} }
const auto roomMessageEvent = eventCast<const Quotient::RoomMessageEvent>(event);
switch (type) { switch (type) {
case MessageComponentType::Verification: { case MessageComponentType::Verification: {
return {MessageComponent{MessageComponentType::Verification, QString(), {}}}; return {MessageComponent{MessageComponentType::Verification, QString(), {}}};
} }
case MessageComponentType::Text: { case MessageComponentType::Text: {
if (const auto roomMessageEvent = eventCast<const Quotient::RoomMessageEvent>(event.first)) { return TextHandler().textComponents(EventHandler::rawMessageBody(*event),
return TextHandler().textComponents(EventHandler::rawMessageBody(*roomMessageEvent), EventHandler::messageBodyInputFormat(*event),
EventHandler::messageBodyInputFormat(*roomMessageEvent),
m_room,
roomMessageEvent,
roomMessageEvent->isReplaced());
} else {
return TextHandler().textComponents(EventHandler::plainBody(m_room, event.first), Qt::TextFormat::PlainText, m_room, event.first, false);
}
const auto roomMessageEvent = eventCast<const Quotient::RoomMessageEvent>(event.first);
return TextHandler().textComponents(EventHandler::rawMessageBody(*roomMessageEvent),
EventHandler::messageBodyInputFormat(*roomMessageEvent),
m_room, m_room,
roomMessageEvent, event,
roomMessageEvent->isReplaced()); roomMessageEvent ? roomMessageEvent->isReplaced() : false);
} }
case MessageComponentType::File: { case MessageComponentType::File: {
QList<MessageComponent> components; QList<MessageComponent> components;
components += MessageComponent{MessageComponentType::File, {}, EventHandler::mediaInfo(m_room, event.first)}; components += MessageComponent{MessageComponentType::File, {}, EventHandler::mediaInfo(m_room, event)};
const auto roomMessageEvent = eventCast<const Quotient::RoomMessageEvent>(event.first); auto body = EventHandler::rawMessageBody(*event);
auto body = EventHandler::rawMessageBody(*roomMessageEvent);
if (!body.isEmpty()) { if (!body.isEmpty()) {
components += TextHandler().textComponents(body, components += TextHandler().textComponents(body,
EventHandler::messageBodyInputFormat(*roomMessageEvent), EventHandler::messageBodyInputFormat(*event),
m_room, m_room,
roomMessageEvent, event,
roomMessageEvent->isReplaced()); roomMessageEvent ? roomMessageEvent->isReplaced() : false);
} }
return components; return components;
} }
case MessageComponentType::Image: case MessageComponentType::Image:
case MessageComponentType::Audio: case MessageComponentType::Audio:
case MessageComponentType::Video: { case MessageComponentType::Video: {
QList<MessageComponent> components = { QList<MessageComponent> components = {MessageComponent{type, EventHandler::richBody(m_room, event), EventHandler::mediaInfo(m_room, event)}};
MessageComponent{type, EventHandler::richBody(m_room, event.first), EventHandler::mediaInfo(m_room, event.first)}};
if (!event.first->is<StickerEvent>()) { if (!event->is<StickerEvent>() && roomMessageEvent) {
const auto roomMessageEvent = eventCast<const Quotient::RoomMessageEvent>(event.first);
const auto fileContent = roomMessageEvent->get<EventContent::FileContentBase>(); const auto fileContent = roomMessageEvent->get<EventContent::FileContentBase>();
if (fileContent != nullptr) { if (fileContent != nullptr) {
const auto fileInfo = fileContent->commonInfo(); const auto fileInfo = fileContent->commonInfo();
@@ -433,11 +420,11 @@ QList<MessageComponent> EventMessageContentModel::componentsForType(MessageCompo
} }
case MessageComponentType::Location: case MessageComponentType::Location:
return {MessageComponent{type, return {MessageComponent{type,
EventHandler::plainBody(m_room, event.first), EventHandler::plainBody(m_room, event),
{ {
{u"latitude"_s, EventHandler::latitude(event.first)}, {u"latitude"_s, EventHandler::latitude(event)},
{u"longitude"_s, EventHandler::longitude(event.first)}, {u"longitude"_s, EventHandler::longitude(event)},
{u"asset"_s, EventHandler::locationAssetType(event.first)}, {u"asset"_s, EventHandler::locationAssetType(event)},
}}}; }}};
default: default:
return {MessageComponent{type, QString(), {}}}; return {MessageComponent{type, QString(), {}}};