22 QUO_EVENT(RoomMessageEvent,
"m.room.message")
36 RoomMessageEvent(
const QString& plainBody,
const QString& jsonMsgType,
37 EventContent::TypedBase* content =
nullptr);
38 explicit RoomMessageEvent(
const QString& plainBody,
39 MsgType msgType = MsgType::Text,
40 EventContent::TypedBase* content =
nullptr);
42 explicit RoomMessageEvent(
const QJsonObject& obj);
44 MsgType msgtype()
const;
45 QString rawMsgtype()
const;
46 QString plainBody()
const;
47 const EventContent::TypedBase* content()
const {
return _content.data(); }
48 void editContent(
auto visitor)
51 editJson()[ContentKey] = assembleContentJson(plainBody(), rawMsgtype(), _content.data());
53 QMimeType mimeType()
const;
59 bool hasTextContent()
const;
64 bool hasFileContent()
const;
71 bool hasThumbnail()
const;
75 QString replacedEvent()
const;
81 bool isReplaced()
const;
83 QString replacedBy()
const;
85 QString fileNameToDownload()
const;
87 static QString rawMsgTypeForUrl(
const QUrl& url);
88 static QString rawMsgTypeForFile(
const QFileInfo& fi);
91 QScopedPointer<EventContent::TypedBase> _content;
94 static QJsonObject assembleContentJson(
const QString& plainBody,
95 const QString& jsonMsgType,
96 EventContent::TypedBase* content);
101 using MessageEventType = RoomMessageEvent::MsgType;
103 namespace EventContent {
115 TextContent(QString text,
const QString& contentType,
116 std::optional<EventRelation> relatesTo = {});
117 explicit TextContent(
const QJsonObject& json);
119 QMimeType type()
const override {
return mimeType; }
123 std::optional<EventRelation> relatesTo;
126 void fillJson(QJsonObject& json)
const override;
144 LocationContent(
const QString& geoUri,
const Thumbnail& thumbnail = {});
145 explicit LocationContent(
const QJsonObject& json);
147 QMimeType type()
const override;
154 void fillJson(QJsonObject& o)
const override;
160 template <
typename InfoT>
161 class PlayableContent :
public UrlBasedContent<InfoT> {
163 using UrlBasedContent<InfoT>::UrlBasedContent;
164 PlayableContent(
const QJsonObject& json)
165 : UrlBasedContent<InfoT>(json)
166 , duration(FileInfo::originalInfoJson[
"duration"_ls].toInt())
170 void fillInfoJson(QJsonObject& infoJson)
const override
172 infoJson.insert(QStringLiteral(
"duration"), duration);
198 using VideoContent = PlayableContent<ImageInfo>;
218 using AudioContent = PlayableContent<FileInfo>;