10constexpr inline auto PrevContentKey =
"prev_content"_L1;
14 QUO_BASE_EVENT(StateEvent, RoomEvent,
"json.contains('state_key')")
16 static bool isValid(
const QJsonObject& fullJson)
18 return fullJson.contains(StateKeyKey);
27 static constexpr auto needsStateKey =
false;
29 explicit StateEvent(event_type_t type,
const QString& stateKey = {},
30 const QJsonObject& contentJson = {});
33 static QJsonObject basicJson(
const QString& matrixTypeId,
34 const QString& stateKey = {},
35 const QJsonObject& contentJson = {})
37 return { { TypeKey, matrixTypeId },
38 { StateKeyKey, stateKey },
39 { ContentKey, contentJson } };
42 QString replacedState()
const;
43 virtual bool repeatsState()
const;
46 explicit StateEvent(
const QJsonObject& json);
47 void dumpTo(QDebug dbg)
const override;
49using StateEventPtr = event_ptr_tt<StateEvent>;
50using StateEvents = EventsArray<StateEvent>;
53
54
55
56
57
58using StateEventKey = std::pair<QString, QString>;
60template <
typename EventT,
typename ContentT>
61class EventTemplate<EventT, StateEvent, ContentT>
64 using content_type = ContentT;
67 explicit Prev() =
default;
68 explicit Prev(
const QJsonObject& unsignedJson)
69 : senderId(fromJson<QString>(unsignedJson[
"prev_sender"_L1]))
70 , content(fromJson<std::optional<ContentT>>(unsignedJson[PrevContentKey]))
74 std::optional<ContentT> content;
77 explicit EventTemplate(
const QJsonObject& fullJson)
78 : StateEvent(fullJson)
79 , _content(fromJson<ContentT>(Event::contentJson()))
80 , _prev(unsignedJson())
82 template <
typename... ContentParamTs>
83 explicit EventTemplate(
const QString& stateKey,
84 ContentParamTs&&... contentParams)
85 : StateEvent(EventT::TypeId, stateKey)
86 , _content { std::forward<ContentParamTs>(contentParams)... }
88 editJson().insert(ContentKey, toJson(_content));
91 const ContentT& content()
const {
return _content; }
93 void editContent(
auto&& visitor)
96 editJson()[ContentKey] = toJson(_content);
98 const std::optional<ContentT>& prevContent()
const {
return _prev.content; }
99 QString prevSenderId()
const {
return _prev.senderId; }
106template <
typename EventT,
typename ContentT>
107class KeyedStateEventBase
108 :
public EventTemplate<EventT, StateEvent, ContentT> {
110 static constexpr auto needsStateKey =
true;
112 using EventTemplate<EventT, StateEvent, ContentT>::EventTemplate;
115template <
typename EvT>
116concept Keyed_State_Event = EvT::needsStateKey;
118template <
typename EventT,
typename ContentT>
119class KeylessStateEventBase
120 :
public EventTemplate<EventT, StateEvent, ContentT> {
122 using base_type = EventTemplate<EventT, StateEvent, ContentT>;
125 template <
typename... ContentParamTs>
129 requires std::constructible_from<base_type, QString, ContentParamTs...>
130 explicit KeylessStateEventBase(ContentParamTs&&... contentParams)
131 : base_type(QString(), std::forward<ContentParamTs>(contentParams)...)
135 explicit KeylessStateEventBase(
const QJsonObject& fullJson)
136 : base_type(fullJson)
140template <
typename EvT>
141concept Keyless_State_Event = !EvT::needsStateKey;
144Q_DECLARE_METATYPE(Quotient::StateEvent*)
145Q_DECLARE_METATYPE(
const Quotient::StateEvent*)
149struct std::hash<Quotient::StateEventKey> {
150 size_t operator()(
const Quotient::StateEventKey& k)
const
152 return qHash(k, QHashSeed::globalSeed());
#define QUO_BASE_EVENT(CppType_, BaseCppType_,...)
Supply event metatype information in base event types.