1#pragma once
2
3/// @file
4/// @brief Collections to store multiple events of different types
5
6#include <variant>
7
8#include "mtx/events.hpp"
9#include "mtx/events/account_data/direct.hpp"
10#include "mtx/events/account_data/fully_read.hpp"
11#include "mtx/events/aliases.hpp"
12#include "mtx/events/avatar.hpp"
13#include "mtx/events/canonical_alias.hpp"
14#include "mtx/events/create.hpp"
15#include "mtx/events/encrypted.hpp"
16#include "mtx/events/encryption.hpp"
17#include "mtx/events/ephemeral/receipt.hpp"
18#include "mtx/events/ephemeral/typing.hpp"
19#include "mtx/events/guest_access.hpp"
20#include "mtx/events/history_visibility.hpp"
21#include "mtx/events/join_rules.hpp"
22#include "mtx/events/member.hpp"
23#include "mtx/events/mscs/image_packs.hpp"
24#include "mtx/events/name.hpp"
25#include "mtx/events/nheko_extensions/hidden_events.hpp"
26#include "mtx/events/pinned_events.hpp"
27#include "mtx/events/policy_rules.hpp"
28#include "mtx/events/power_levels.hpp"
29#include "mtx/events/presence.hpp"
30#include "mtx/events/reaction.hpp"
31#include "mtx/events/redaction.hpp"
32#include "mtx/events/spaces.hpp"
33#include "mtx/events/tag.hpp"
34#include "mtx/events/tombstone.hpp"
35#include "mtx/events/topic.hpp"
36#include "mtx/events/unknown.hpp"
37#include "mtx/events/voip.hpp"
38#include "mtx/events/widget.hpp"
39#include "mtx/pushrules.hpp"
40
41#include "mtx/events/messages/audio.hpp"
42#include "mtx/events/messages/confetti.hpp"
43#include "mtx/events/messages/emote.hpp"
44#include "mtx/events/messages/file.hpp"
45#include "mtx/events/messages/image.hpp"
46#include "mtx/events/messages/notice.hpp"
47#include "mtx/events/messages/text.hpp"
48#include "mtx/events/messages/video.hpp"
49
50namespace mtx {
51namespace events {
52
53//! Contains heterogeneous collections of events using std::variant.
54namespace collections {
55
56//! Collection of key verification events
57using DeviceEvents =
58 std::variant<mtx::events::DeviceEvent<mtx::events::msg::RoomKey>,
59 mtx::events::DeviceEvent<mtx::events::msg::ForwardedRoomKey>,
60 mtx::events::DeviceEvent<mtx::events::msg::KeyRequest>,
61 mtx::events::DeviceEvent<mtx::events::msg::OlmEncrypted>,
62 mtx::events::DeviceEvent<mtx::events::msg::Encrypted>,
63 mtx::events::DeviceEvent<mtx::events::msg::Dummy>,
64 mtx::events::DeviceEvent<mtx::events::msg::KeyVerificationRequest>,
65 mtx::events::DeviceEvent<mtx::events::msg::KeyVerificationStart>,
66 mtx::events::DeviceEvent<mtx::events::msg::KeyVerificationReady>,
67 mtx::events::DeviceEvent<mtx::events::msg::KeyVerificationDone>,
68 mtx::events::DeviceEvent<mtx::events::msg::KeyVerificationAccept>,
69 mtx::events::DeviceEvent<mtx::events::msg::KeyVerificationCancel>,
70 mtx::events::DeviceEvent<mtx::events::msg::KeyVerificationKey>,
71 mtx::events::DeviceEvent<mtx::events::msg::KeyVerificationMac>,
72 mtx::events::DeviceEvent<mtx::events::msg::SecretRequest>,
73 mtx::events::DeviceEvent<mtx::events::msg::SecretSend>,
74 mtx::events::DeviceEvent<mtx::events::Unknown>>;
75
76//! Collection of room specific account data
77using RoomAccountDataEvents = std::variant<
78 mtx::events::AccountDataEvent<mtx::events::account_data::Tags>,
79 mtx::events::AccountDataEvent<mtx::events::account_data::Direct>,
80 mtx::events::AccountDataEvent<mtx::events::account_data::FullyRead>,
81 mtx::events::AccountDataEvent<mtx::pushrules::GlobalRuleset>,
82 mtx::events::AccountDataEvent<mtx::events::account_data::nheko_extensions::HiddenEvents>,
83 mtx::events::AccountDataEvent<mtx::events::msc2545::ImagePack>,
84 mtx::events::AccountDataEvent<mtx::events::msc2545::ImagePackRooms>,
85 mtx::events::AccountDataEvent<mtx::events::Unknown>>;
86
87//! Collection of @p StateEvent only.
88using StateEvents =
89 std::variant<mtx::events::StateEvent<mtx::events::state::Aliases>,
90 mtx::events::StateEvent<mtx::events::state::Avatar>,
91 mtx::events::StateEvent<mtx::events::state::CanonicalAlias>,
92 mtx::events::StateEvent<mtx::events::state::Create>,
93 mtx::events::StateEvent<mtx::events::state::Encryption>,
94 mtx::events::StateEvent<mtx::events::state::GuestAccess>,
95 mtx::events::StateEvent<mtx::events::state::HistoryVisibility>,
96 mtx::events::StateEvent<mtx::events::state::JoinRules>,
97 mtx::events::StateEvent<mtx::events::state::Member>,
98 mtx::events::StateEvent<mtx::events::state::Name>,
99 mtx::events::StateEvent<mtx::events::state::PinnedEvents>,
100 mtx::events::StateEvent<mtx::events::state::PowerLevels>,
101 mtx::events::StateEvent<mtx::events::state::policy_rule::UserRule>,
102 mtx::events::StateEvent<mtx::events::state::policy_rule::RoomRule>,
103 mtx::events::StateEvent<mtx::events::state::policy_rule::ServerRule>,
104 mtx::events::StateEvent<mtx::events::state::space::Child>,
105 mtx::events::StateEvent<mtx::events::state::space::Parent>,
106 mtx::events::StateEvent<mtx::events::state::Tombstone>,
107 mtx::events::StateEvent<mtx::events::state::Topic>,
108 mtx::events::StateEvent<mtx::events::state::Widget>,
109 mtx::events::StateEvent<mtx::events::msg::Redacted>,
110 mtx::events::StateEvent<mtx::events::msc2545::ImagePack>,
111 mtx::events::StateEvent<mtx::events::Unknown>>;
112
113//! Collection of @p StrippedEvent only.
114using StrippedEvents =
115 std::variant<mtx::events::StrippedEvent<mtx::events::state::Aliases>,
116 mtx::events::StrippedEvent<mtx::events::state::Avatar>,
117 mtx::events::StrippedEvent<mtx::events::state::CanonicalAlias>,
118 mtx::events::StrippedEvent<mtx::events::state::Create>,
119 mtx::events::StrippedEvent<mtx::events::state::Encryption>,
120 mtx::events::StrippedEvent<mtx::events::state::GuestAccess>,
121 mtx::events::StrippedEvent<mtx::events::state::HistoryVisibility>,
122 mtx::events::StrippedEvent<mtx::events::state::JoinRules>,
123 mtx::events::StrippedEvent<mtx::events::state::Member>,
124 mtx::events::StrippedEvent<mtx::events::state::Name>,
125 mtx::events::StrippedEvent<mtx::events::state::PinnedEvents>,
126 mtx::events::StrippedEvent<mtx::events::state::PowerLevels>,
127 mtx::events::StrippedEvent<mtx::events::state::policy_rule::UserRule>,
128 mtx::events::StrippedEvent<mtx::events::state::policy_rule::RoomRule>,
129 mtx::events::StrippedEvent<mtx::events::state::policy_rule::ServerRule>,
130 mtx::events::StrippedEvent<mtx::events::state::space::Child>,
131 mtx::events::StrippedEvent<mtx::events::state::space::Parent>,
132 mtx::events::StrippedEvent<mtx::events::state::Tombstone>,
133 mtx::events::StrippedEvent<mtx::events::state::Topic>,
134 mtx::events::StrippedEvent<mtx::events::state::Widget>,
135 mtx::events::StrippedEvent<mtx::events::msg::Redacted>,
136 mtx::events::StrippedEvent<mtx::events::Unknown>>;
137
138//! Collection of @p StateEvent and @p RoomEvent. Those events would be
139//! available on the returned timeline.
140using TimelineEvents =
141 std::variant<mtx::events::StateEvent<mtx::events::state::Aliases>,
142 mtx::events::StateEvent<mtx::events::state::Avatar>,
143 mtx::events::StateEvent<mtx::events::state::CanonicalAlias>,
144 mtx::events::StateEvent<mtx::events::state::Create>,
145 mtx::events::StateEvent<mtx::events::state::Encryption>,
146 mtx::events::StateEvent<mtx::events::state::GuestAccess>,
147 mtx::events::StateEvent<mtx::events::state::HistoryVisibility>,
148 mtx::events::StateEvent<mtx::events::state::JoinRules>,
149 mtx::events::StateEvent<mtx::events::state::Member>,
150 mtx::events::StateEvent<mtx::events::state::Name>,
151 mtx::events::StateEvent<mtx::events::state::PinnedEvents>,
152 mtx::events::StateEvent<mtx::events::state::PowerLevels>,
153 mtx::events::StateEvent<mtx::events::state::policy_rule::UserRule>,
154 mtx::events::StateEvent<mtx::events::state::policy_rule::RoomRule>,
155 mtx::events::StateEvent<mtx::events::state::policy_rule::ServerRule>,
156 mtx::events::StateEvent<mtx::events::state::space::Child>,
157 mtx::events::StateEvent<mtx::events::state::space::Parent>,
158 mtx::events::StateEvent<mtx::events::state::Tombstone>,
159 mtx::events::StateEvent<mtx::events::state::Topic>,
160 mtx::events::StateEvent<mtx::events::state::Widget>,
161 mtx::events::StateEvent<mtx::events::msc2545::ImagePack>,
162 mtx::events::StateEvent<mtx::events::msg::Redacted>,
163 mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>,
164 mtx::events::RedactionEvent<mtx::events::msg::Redaction>,
165 mtx::events::Sticker,
166 mtx::events::RoomEvent<mtx::events::msg::Reaction>,
167 mtx::events::RoomEvent<mtx::events::msg::Redacted>,
168 mtx::events::RoomEvent<mtx::events::msg::Audio>,
169 mtx::events::RoomEvent<mtx::events::msg::Confetti>,
170 mtx::events::RoomEvent<mtx::events::msg::Emote>,
171 mtx::events::RoomEvent<mtx::events::msg::File>,
172 mtx::events::RoomEvent<mtx::events::msg::Image>,
173 // TODO: events::RoomEvent<mtx::events::msg::Location>,
174 mtx::events::RoomEvent<mtx::events::msg::Notice>,
175 mtx::events::RoomEvent<mtx::events::msg::Text>,
176 mtx::events::RoomEvent<mtx::events::msg::Video>,
177 mtx::events::RoomEvent<mtx::events::msg::KeyVerificationRequest>,
178 mtx::events::RoomEvent<mtx::events::msg::KeyVerificationStart>,
179 mtx::events::RoomEvent<mtx::events::msg::KeyVerificationReady>,
180 mtx::events::RoomEvent<mtx::events::msg::KeyVerificationDone>,
181 mtx::events::RoomEvent<mtx::events::msg::KeyVerificationAccept>,
182 mtx::events::RoomEvent<mtx::events::msg::KeyVerificationCancel>,
183 mtx::events::RoomEvent<mtx::events::msg::KeyVerificationKey>,
184 mtx::events::RoomEvent<mtx::events::msg::KeyVerificationMac>,
185 mtx::events::RoomEvent<mtx::events::voip::CallCandidates>,
186 mtx::events::RoomEvent<mtx::events::voip::CallInvite>,
187 mtx::events::RoomEvent<mtx::events::voip::CallAnswer>,
188 mtx::events::RoomEvent<mtx::events::voip::CallHangUp>,
189 mtx::events::RoomEvent<mtx::events::voip::CallSelectAnswer>,
190 mtx::events::RoomEvent<mtx::events::voip::CallReject>,
191 mtx::events::RoomEvent<mtx::events::voip::CallNegotiate>,
192 mtx::events::RoomEvent<mtx::events::Unknown>>;
193
194using EphemeralEvents = std::variant<mtx::events::EphemeralEvent<mtx::events::ephemeral::Typing>,
195 mtx::events::EphemeralEvent<mtx::events::ephemeral::Receipt>,
196 mtx::events::EphemeralEvent<mtx::events::Unknown>>;
197
198//! A wapper around TimelineEvent, that produces less noisy compiler errors.
199struct TimelineEvent
200{
201 TimelineEvents data;
202
203 friend void from_json(const nlohmann::json &obj, TimelineEvent &e);
204 friend void to_json(nlohmann::json &obj, const TimelineEvent &e);
205};
206
207} // namespace collections
208
209//! Get the right event type for some type of message content.
210template<typename Content>
211constexpr inline EventType message_content_to_type = EventType::Unsupported;
212
213template<>
214constexpr inline EventType message_content_to_type<mtx::events::msg::Encrypted> =
215 EventType::RoomEncrypted;
216template<>
217constexpr inline EventType message_content_to_type<mtx::events::msg::Reaction> =
218 EventType::Reaction;
219template<>
220constexpr inline EventType message_content_to_type<mtx::events::msg::Audio> =
221 EventType::RoomMessage;
222template<>
223constexpr inline EventType message_content_to_type<mtx::events::msg::Emote> =
224 EventType::RoomMessage;
225template<>
226constexpr inline EventType message_content_to_type<mtx::events::msg::File> = EventType::RoomMessage;
227template<>
228constexpr inline EventType message_content_to_type<mtx::events::msg::Image> =
229 EventType::RoomMessage;
230template<>
231constexpr inline EventType message_content_to_type<mtx::events::msg::Notice> =
232 EventType::RoomMessage;
233template<>
234constexpr inline EventType message_content_to_type<mtx::events::msg::Text> = EventType::RoomMessage;
235template<>
236constexpr inline EventType message_content_to_type<mtx::events::msg::Video> =
237 EventType::RoomMessage;
238template<>
239constexpr inline EventType message_content_to_type<mtx::events::msg::Confetti> =
240 EventType::RoomMessage;
241template<>
242constexpr inline EventType message_content_to_type<mtx::events::msg::StickerImage> =
243 EventType::Sticker;
244template<>
245constexpr inline EventType message_content_to_type<mtx::events::voip::CallInvite> =
246 EventType::CallInvite;
247template<>
248constexpr inline EventType message_content_to_type<mtx::events::voip::CallCandidates> =
249 EventType::CallCandidates;
250template<>
251constexpr inline EventType message_content_to_type<mtx::events::voip::CallAnswer> =
252 EventType::CallAnswer;
253template<>
254constexpr inline EventType message_content_to_type<mtx::events::voip::CallHangUp> =
255 EventType::CallHangUp;
256template<>
257constexpr inline EventType message_content_to_type<mtx::events::voip::CallSelectAnswer> =
258 EventType::CallSelectAnswer;
259template<>
260constexpr inline EventType message_content_to_type<mtx::events::voip::CallReject> =
261 EventType::CallReject;
262template<>
263constexpr inline EventType message_content_to_type<mtx::events::voip::CallNegotiate> =
264 EventType::CallNegotiate;
265
266//! Get the right event type for some type of state event content.
267template<typename Content>
268constexpr inline EventType state_content_to_type = EventType::Unsupported;
269
270template<>
271constexpr inline EventType state_content_to_type<mtx::events::state::Aliases> =
272 EventType::RoomAliases;
273template<>
274constexpr inline EventType state_content_to_type<mtx::events::state::Avatar> =
275 EventType::RoomAvatar;
276template<>
277constexpr inline EventType state_content_to_type<mtx::events::state::CanonicalAlias> =
278 EventType::RoomCanonicalAlias;
279template<>
280constexpr inline EventType state_content_to_type<mtx::events::state::Create> =
281 EventType::RoomCreate;
282template<>
283constexpr inline EventType state_content_to_type<mtx::events::state::Encryption> =
284 EventType::RoomEncryption;
285template<>
286constexpr inline EventType state_content_to_type<mtx::events::state::GuestAccess> =
287 EventType::RoomGuestAccess;
288template<>
289constexpr inline EventType state_content_to_type<mtx::events::state::HistoryVisibility> =
290 EventType::RoomHistoryVisibility;
291template<>
292constexpr inline EventType state_content_to_type<mtx::events::state::JoinRules> =
293 EventType::RoomJoinRules;
294template<>
295constexpr inline EventType state_content_to_type<mtx::events::state::Member> =
296 EventType::RoomMember;
297template<>
298constexpr inline EventType state_content_to_type<mtx::events::state::Name> = EventType::RoomName;
299template<>
300constexpr inline EventType state_content_to_type<mtx::events::state::PinnedEvents> =
301 EventType::RoomPinnedEvents;
302template<>
303constexpr inline EventType state_content_to_type<mtx::events::state::policy_rule::UserRule> =
304 EventType::PolicyRuleUser;
305template<>
306constexpr inline EventType state_content_to_type<mtx::events::state::policy_rule::RoomRule> =
307 EventType::PolicyRuleRoom;
308template<>
309constexpr inline EventType state_content_to_type<mtx::events::state::policy_rule::ServerRule> =
310 EventType::PolicyRuleServer;
311template<>
312constexpr inline EventType state_content_to_type<mtx::events::state::PowerLevels> =
313 EventType::RoomPowerLevels;
314template<>
315constexpr inline EventType state_content_to_type<mtx::events::state::Tombstone> =
316 EventType::RoomTombstone;
317
318template<>
319constexpr inline EventType state_content_to_type<mtx::events::state::space::Child> =
320 EventType::SpaceChild;
321template<>
322constexpr inline EventType state_content_to_type<mtx::events::state::space::Parent> =
323 EventType::SpaceParent;
324
325template<>
326constexpr inline EventType state_content_to_type<mtx::events::state::Widget> =
327 EventType::VectorWidget;
328
329template<>
330constexpr inline EventType state_content_to_type<mtx::events::state::Topic> = EventType::RoomTopic;
331template<>
332constexpr inline EventType state_content_to_type<mtx::events::msc2545::ImagePack> =
333 EventType::ImagePackInRoom;
334
335//! Get the right event type for some type of device message content.
336template<typename Content>
337constexpr inline EventType to_device_content_to_type = EventType::Unsupported;
338
339template<>
340constexpr inline EventType to_device_content_to_type<mtx::events::msg::RoomKey> =
341 EventType::RoomKey;
342template<>
343constexpr inline EventType to_device_content_to_type<mtx::events::msg::ForwardedRoomKey> =
344 EventType::ForwardedRoomKey;
345template<>
346constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyRequest> =
347 EventType::RoomKeyRequest;
348template<>
349constexpr inline EventType to_device_content_to_type<mtx::events::msg::OlmEncrypted> =
350 EventType::RoomEncrypted;
351template<>
352constexpr inline EventType to_device_content_to_type<mtx::events::msg::Encrypted> =
353 EventType::RoomEncrypted;
354template<>
355constexpr inline EventType to_device_content_to_type<mtx::events::msg::Dummy> = EventType::Dummy;
356template<>
357constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationRequest> =
358 EventType::KeyVerificationRequest;
359template<>
360constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationStart> =
361 EventType::KeyVerificationStart;
362template<>
363constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationReady> =
364 EventType::KeyVerificationReady;
365template<>
366constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationDone> =
367 EventType::KeyVerificationDone;
368template<>
369constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationAccept> =
370 EventType::KeyVerificationAccept;
371template<>
372constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationCancel> =
373 EventType::KeyVerificationCancel;
374template<>
375constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationKey> =
376 EventType::KeyVerificationKey;
377template<>
378constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationMac> =
379 EventType::KeyVerificationMac;
380template<>
381constexpr inline EventType to_device_content_to_type<mtx::events::msg::SecretSend> =
382 EventType::SecretSend;
383template<>
384constexpr inline EventType to_device_content_to_type<mtx::events::msg::SecretRequest> =
385 EventType::SecretRequest;
386
387//! Get the right event type for some type of account_data event content.
388template<typename Content>
389constexpr inline EventType account_data_content_to_type = EventType::Unsupported;
390
391template<>
392constexpr inline EventType account_data_content_to_type<mtx::events::msc2545::ImagePack> =
393 EventType::ImagePackInAccountData;
394template<>
395constexpr inline EventType account_data_content_to_type<mtx::events::msc2545::ImagePackRooms> =
396 EventType::ImagePackRooms;
397template<>
398constexpr inline EventType account_data_content_to_type<mtx::events::account_data::Tags> =
399 EventType::Tag;
400template<>
401constexpr inline EventType account_data_content_to_type<mtx::events::account_data::Direct> =
402 EventType::Direct;
403template<>
404constexpr inline EventType
405 account_data_content_to_type<mtx::events::account_data::nheko_extensions::HiddenEvents> =
406 EventType::NhekoHiddenEvents;
407
408} // namespace events
409} // namespace mtx
410