aboutsummaryrefslogtreecommitdiff
path: root/lib/events
diff options
context:
space:
mode:
Diffstat (limited to 'lib/events')
-rw-r--r--lib/events/accountdataevents.h10
-rw-r--r--lib/events/roomevent.cpp6
-rw-r--r--lib/events/roomevent.h5
-rw-r--r--lib/events/roommemberevent.cpp14
-rw-r--r--lib/events/roommemberevent.h7
-rw-r--r--lib/events/roommessageevent.cpp23
-rw-r--r--lib/events/roommessageevent.h2
7 files changed, 39 insertions, 28 deletions
diff --git a/lib/events/accountdataevents.h b/lib/events/accountdataevents.h
index 31176766..a55016d9 100644
--- a/lib/events/accountdataevents.h
+++ b/lib/events/accountdataevents.h
@@ -1,5 +1,3 @@
-#include <utility>
-
/******************************************************************************
* Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
*
@@ -34,13 +32,13 @@ struct TagRecord {
order_type order;
- TagRecord(order_type order = none) : order(order) {}
+ TagRecord(order_type order = none) : order(std::move(order)) {}
bool operator<(const TagRecord& other) const
{
- // Per The Spec, rooms with no order should be after those with order
- return !order.omitted()
- && (other.order.omitted() || order.value() < other.order.value());
+ // Per The Spec, rooms with no order should be after those with order,
+ // against optional<>::operator<() convention.
+ return order && (!other.order || *order < *other.order);
}
};
diff --git a/lib/events/roomevent.cpp b/lib/events/roomevent.cpp
index 971d8597..a59cd6e0 100644
--- a/lib/events/roomevent.cpp
+++ b/lib/events/roomevent.cpp
@@ -36,17 +36,15 @@ RoomEvent::RoomEvent(Type type, const QJsonObject& json) : Event(type, json)
{
const auto unsignedData = json[UnsignedKeyL].toObject();
const auto redaction = unsignedData[RedactedCauseKeyL];
- if (redaction.isObject()) {
+ if (redaction.isObject())
_redactedBecause = makeEvent<RedactionEvent>(redaction.toObject());
- return;
- }
}
RoomEvent::~RoomEvent() = default; // Let the smart pointer do its job
QString RoomEvent::id() const { return fullJson()[EventIdKeyL].toString(); }
-QDateTime RoomEvent::timestamp() const
+QDateTime RoomEvent::originTimestamp() const
{
return Quotient::fromJson<QDateTime>(fullJson()["origin_server_ts"_ls]);
}
diff --git a/lib/events/roomevent.h b/lib/events/roomevent.h
index f943bce4..621652cb 100644
--- a/lib/events/roomevent.h
+++ b/lib/events/roomevent.h
@@ -46,7 +46,10 @@ public:
~RoomEvent() override;
QString id() const;
- QDateTime timestamp() const;
+ QDateTime originTimestamp() const;
+ [[deprecated("Use originTimestamp()")]] QDateTime timestamp() const {
+ return originTimestamp();
+ }
QString roomId() const;
QString senderId() const;
bool isReplaced() const;
diff --git a/lib/events/roommemberevent.cpp b/lib/events/roommemberevent.cpp
index d0787170..d4b2be45 100644
--- a/lib/events/roommemberevent.cpp
+++ b/lib/events/roommemberevent.cpp
@@ -52,6 +52,7 @@ MemberEventContent::MemberEventContent(const QJsonObject& json)
, isDirect(json["is_direct"_ls].toBool())
, displayName(sanitized(json["displayname"_ls].toString()))
, avatarUrl(json["avatar_url"_ls].toString())
+ , reason(json["reason"_ls].toString())
{}
void MemberEventContent::fillJson(QJsonObject* o) const
@@ -64,18 +65,23 @@ void MemberEventContent::fillJson(QJsonObject* o) const
o->insert(QStringLiteral("displayname"), displayName);
if (avatarUrl.isValid())
o->insert(QStringLiteral("avatar_url"), avatarUrl.toString());
+ if (!reason.isEmpty())
+ o->insert(QStringLiteral("reason"), reason);
+}
+
+bool RoomMemberEvent::changesMembership() const
+{
+ return !prevContent() || prevContent()->membership != membership();
}
bool RoomMemberEvent::isInvite() const
{
- return membership() == MembershipType::Invite
- && (!prevContent() || prevContent()->membership != membership());
+ return membership() == MembershipType::Invite && changesMembership();
}
bool RoomMemberEvent::isJoin() const
{
- return membership() == MembershipType::Join
- && (!prevContent() || prevContent()->membership != membership());
+ return membership() == MembershipType::Join && changesMembership();
}
bool RoomMemberEvent::isLeave() const
diff --git a/lib/events/roommemberevent.h b/lib/events/roommemberevent.h
index 6a34fd7f..0ca439e1 100644
--- a/lib/events/roommemberevent.h
+++ b/lib/events/roommemberevent.h
@@ -40,6 +40,7 @@ public:
bool isDirect = false;
QString displayName;
QUrl avatarUrl;
+ QString reason;
protected:
void fillJson(QJsonObject* o) const override;
@@ -56,8 +57,8 @@ public:
explicit RoomMemberEvent(const QJsonObject& obj) : StateEvent(typeId(), obj)
{}
- [[deprecated("Use RoomMemberEvent(userId, contentArgs) "
- "instead")]] RoomMemberEvent(MemberEventContent&& c)
+ [[deprecated("Use RoomMemberEvent(userId, contentArgs) instead")]]
+ RoomMemberEvent(MemberEventContent&& c)
: StateEvent(typeId(), matrixTypeId(), QString(), c)
{}
template <typename... ArgTs>
@@ -85,6 +86,8 @@ public:
bool isDirect() const { return content().isDirect; }
QString displayName() const { return content().displayName; }
QUrl avatarUrl() const { return content().avatarUrl; }
+ QString reason() const { return content().reason; }
+ bool changesMembership() const;
bool isInvite() const;
bool isJoin() const;
bool isLeave() const;
diff --git a/lib/events/roommessageevent.cpp b/lib/events/roommessageevent.cpp
index 09562d65..078ae70a 100644
--- a/lib/events/roommessageevent.cpp
+++ b/lib/events/roommessageevent.cpp
@@ -95,6 +95,11 @@ MsgType jsonToMsgType(const QString& matrixType)
return MsgType::Unknown;
}
+inline bool isReplacement(const Omittable<RelatesTo>& rel)
+{
+ return rel && rel->type == RelatesTo::ReplacementTypeId();
+}
+
QJsonObject RoomMessageEvent::assembleContentJson(const QString& plainBody,
const QString& jsonMsgType,
TypedBase* content)
@@ -111,6 +116,7 @@ QJsonObject RoomMessageEvent::assembleContentJson(const QString& plainBody,
// After the above, we know for sure that the content is TextContent
// and that its RelatesTo structure is not omitted
auto* textContent = static_cast<const TextContent*>(content);
+ Q_ASSERT(textContent && textContent->relatesTo.has_value());
if (textContent->relatesTo->type == RelatesTo::ReplacementTypeId()) {
auto newContentJson = json.take("m.new_content"_ls).toObject();
newContentJson.insert(BodyKey, plainBody);
@@ -243,9 +249,7 @@ QString RoomMessageEvent::replacedEvent() const
return {};
const auto& rel = static_cast<const TextContent*>(content())->relatesTo;
- return !rel.omitted() && rel->type == RelatesTo::ReplacementTypeId()
- ? rel->eventId
- : QString();
+ return isReplacement(rel) ? rel->eventId : QString();
}
QString rawMsgTypeForMimeType(const QMimeType& mimeType)
@@ -269,10 +273,10 @@ QString RoomMessageEvent::rawMsgTypeForFile(const QFileInfo& fi)
return rawMsgTypeForMimeType(QMimeDatabase().mimeTypeForFile(fi));
}
-TextContent::TextContent(const QString& text, const QString& contentType,
+TextContent::TextContent(QString text, const QString& contentType,
Omittable<RelatesTo> relatesTo)
: mimeType(QMimeDatabase().mimeTypeForName(contentType))
- , body(text)
+ , body(std::move(text))
, relatesTo(std::move(relatesTo))
{
if (contentType == HtmlContentTypeId)
@@ -304,10 +308,9 @@ TextContent::TextContent(const QJsonObject& json)
static const auto PlainTextMimeType = db.mimeTypeForName("text/plain");
static const auto HtmlMimeType = db.mimeTypeForName("text/html");
- const auto actualJson =
- relatesTo.omitted() || relatesTo->type != RelatesTo::ReplacementTypeId()
- ? json
- : json.value("m.new_content"_ls).toObject();
+ const auto actualJson = isReplacement(relatesTo)
+ ? json.value("m.new_content"_ls).toObject()
+ : json;
// Special-casing the custom matrix.org's (actually, Riot's) way
// of sending HTML messages.
if (actualJson["format"_ls].toString() == HtmlContentTypeId) {
@@ -331,7 +334,7 @@ void TextContent::fillJson(QJsonObject* json) const
json->insert(FormatKey, HtmlContentTypeId);
json->insert(FormattedBodyKey, body);
}
- if (!relatesTo.omitted()) {
+ if (relatesTo) {
json->insert(QStringLiteral("m.relates_to"),
QJsonObject { { relatesTo->type, relatesTo->eventId } });
if (relatesTo->type == RelatesTo::ReplacementTypeId()) {
diff --git a/lib/events/roommessageevent.h b/lib/events/roommessageevent.h
index e95aabfc..ded5e572 100644
--- a/lib/events/roommessageevent.h
+++ b/lib/events/roommessageevent.h
@@ -114,7 +114,7 @@ namespace EventContent {
*/
class TextContent : public TypedBase {
public:
- TextContent(const QString& text, const QString& contentType,
+ TextContent(QString text, const QString& contentType,
Omittable<RelatesTo> relatesTo = none);
explicit TextContent(const QJsonObject& json);