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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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(), {}}};
|
||||||
|
|||||||
Reference in New Issue
Block a user