12 QUO_BASE_EVENT(StateEvent, RoomEvent,
"json.contains('state_key')")
14 static bool isValid(
const QJsonObject& fullJson)
16 return fullJson.contains(StateKeyKey);
25 static constexpr auto needsStateKey =
false;
27 explicit StateEvent(event_type_t type,
const QString& stateKey = {},
28 const QJsonObject& contentJson = {});
31 static QJsonObject basicJson(
const QString& matrixTypeId,
32 const QString& stateKey = {},
33 const QJsonObject& contentJson = {})
35 return { { TypeKey, matrixTypeId },
36 { StateKeyKey, stateKey },
37 { ContentKey, contentJson } };
40 QString replacedState()
const;
41 virtual bool repeatsState()
const;
44 explicit StateEvent(
const QJsonObject& json);
45 void dumpTo(QDebug dbg)
const override;
47 using StateEventPtr = event_ptr_tt<StateEvent>;
48 using StateEvents = EventsArray<StateEvent>;
56 using StateEventKey = std::pair<QString, QString>;
58 template <
typename EventT,
typename ContentT>
59 class EventTemplate<EventT, StateEvent, ContentT>
62 using content_type = ContentT;
65 explicit Prev() =
default;
66 explicit Prev(
const QJsonObject& unsignedJson)
67 : senderId(fromJson<QString>(unsignedJson[
"prev_sender"_ls]))
68 , content(fromJson<std::optional<ContentT>>(unsignedJson[PrevContentKey]))
72 std::optional<ContentT> content;
75 explicit EventTemplate(
const QJsonObject& fullJson)
76 : StateEvent(fullJson)
77 , _content(fromJson<ContentT>(Event::contentJson()))
78 , _prev(unsignedJson())
80 template <
typename... ContentParamTs>
81 explicit EventTemplate(
const QString& stateKey,
82 ContentParamTs&&... contentParams)
83 : StateEvent(EventT::TypeId, stateKey)
84 , _content { std::forward<ContentParamTs>(contentParams)... }
86 editJson().insert(ContentKey, toJson(_content));
89 const ContentT& content()
const {
return _content; }
91 template <
typename VisitorT>
92 void editContent(VisitorT&& visitor)
95 editJson()[ContentKey] = toJson(_content);
97 const std::optional<ContentT>& prevContent()
const {
return _prev.content; }
98 QString prevSenderId()
const {
return _prev.senderId; }
105 template <
typename EventT,
typename ContentT>
106 class KeyedStateEventBase
107 :
public EventTemplate<EventT, StateEvent, ContentT> {
109 static constexpr auto needsStateKey =
true;
111 using EventTemplate<EventT, StateEvent, ContentT>::EventTemplate;
114 template <
typename EvT>
115 concept Keyed_State_Event = EvT::needsStateKey;
117 template <
typename EventT,
typename ContentT>
118 class KeylessStateEventBase
119 :
public EventTemplate<EventT, StateEvent, ContentT> {
121 using base_type = EventTemplate<EventT, StateEvent, ContentT>;
124 template <
typename... ContentParamTs>
125 explicit KeylessStateEventBase(ContentParamTs&&... contentParams)
126 : base_type(QString(), std::forward<ContentParamTs>(contentParams)...)
130 explicit KeylessStateEventBase(
const QJsonObject& fullJson)
131 : base_type(fullJson)
135 template <
typename EvT>
136 concept Keyless_State_Event = !EvT::needsStateKey;
139 Q_DECLARE_METATYPE(Quotient::StateEvent*)
140 Q_DECLARE_METATYPE(
const Quotient::StateEvent*)
144 struct std::hash<Quotient::StateEventKey> {
145 size_t operator()(
const Quotient::StateEventKey& k)
const
147 return qHash(k, QHashSeed::globalSeed());