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 | |
50 | namespace mtx { |
51 | namespace events { |
52 | |
53 | //! Contains heterogeneous collections of events using std::variant. |
54 | namespace collections { |
55 | |
56 | //! Collection of key verification events |
57 | using 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 |
77 | using 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. |
88 | using 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. |
114 | using 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. |
140 | using 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 | |
194 | using 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. |
199 | struct 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. |
210 | template<typename Content> |
211 | constexpr inline EventType message_content_to_type = EventType::Unsupported; |
212 | |
213 | template<> |
214 | constexpr inline EventType message_content_to_type<mtx::events::msg::Encrypted> = |
215 | EventType::RoomEncrypted; |
216 | template<> |
217 | constexpr inline EventType message_content_to_type<mtx::events::msg::Reaction> = |
218 | EventType::Reaction; |
219 | template<> |
220 | constexpr inline EventType message_content_to_type<mtx::events::msg::Audio> = |
221 | EventType::RoomMessage; |
222 | template<> |
223 | constexpr inline EventType message_content_to_type<mtx::events::msg::Emote> = |
224 | EventType::RoomMessage; |
225 | template<> |
226 | constexpr inline EventType message_content_to_type<mtx::events::msg::File> = EventType::RoomMessage; |
227 | template<> |
228 | constexpr inline EventType message_content_to_type<mtx::events::msg::Image> = |
229 | EventType::RoomMessage; |
230 | template<> |
231 | constexpr inline EventType message_content_to_type<mtx::events::msg::Notice> = |
232 | EventType::RoomMessage; |
233 | template<> |
234 | constexpr inline EventType message_content_to_type<mtx::events::msg::Text> = EventType::RoomMessage; |
235 | template<> |
236 | constexpr inline EventType message_content_to_type<mtx::events::msg::Video> = |
237 | EventType::RoomMessage; |
238 | template<> |
239 | constexpr inline EventType message_content_to_type<mtx::events::msg::Confetti> = |
240 | EventType::RoomMessage; |
241 | template<> |
242 | constexpr inline EventType message_content_to_type<mtx::events::msg::StickerImage> = |
243 | EventType::Sticker; |
244 | template<> |
245 | constexpr inline EventType message_content_to_type<mtx::events::voip::CallInvite> = |
246 | EventType::CallInvite; |
247 | template<> |
248 | constexpr inline EventType message_content_to_type<mtx::events::voip::CallCandidates> = |
249 | EventType::CallCandidates; |
250 | template<> |
251 | constexpr inline EventType message_content_to_type<mtx::events::voip::CallAnswer> = |
252 | EventType::CallAnswer; |
253 | template<> |
254 | constexpr inline EventType message_content_to_type<mtx::events::voip::CallHangUp> = |
255 | EventType::CallHangUp; |
256 | template<> |
257 | constexpr inline EventType message_content_to_type<mtx::events::voip::CallSelectAnswer> = |
258 | EventType::CallSelectAnswer; |
259 | template<> |
260 | constexpr inline EventType message_content_to_type<mtx::events::voip::CallReject> = |
261 | EventType::CallReject; |
262 | template<> |
263 | constexpr 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. |
267 | template<typename Content> |
268 | constexpr inline EventType state_content_to_type = EventType::Unsupported; |
269 | |
270 | template<> |
271 | constexpr inline EventType state_content_to_type<mtx::events::state::Aliases> = |
272 | EventType::RoomAliases; |
273 | template<> |
274 | constexpr inline EventType state_content_to_type<mtx::events::state::Avatar> = |
275 | EventType::RoomAvatar; |
276 | template<> |
277 | constexpr inline EventType state_content_to_type<mtx::events::state::CanonicalAlias> = |
278 | EventType::RoomCanonicalAlias; |
279 | template<> |
280 | constexpr inline EventType state_content_to_type<mtx::events::state::Create> = |
281 | EventType::RoomCreate; |
282 | template<> |
283 | constexpr inline EventType state_content_to_type<mtx::events::state::Encryption> = |
284 | EventType::RoomEncryption; |
285 | template<> |
286 | constexpr inline EventType state_content_to_type<mtx::events::state::GuestAccess> = |
287 | EventType::RoomGuestAccess; |
288 | template<> |
289 | constexpr inline EventType state_content_to_type<mtx::events::state::HistoryVisibility> = |
290 | EventType::RoomHistoryVisibility; |
291 | template<> |
292 | constexpr inline EventType state_content_to_type<mtx::events::state::JoinRules> = |
293 | EventType::RoomJoinRules; |
294 | template<> |
295 | constexpr inline EventType state_content_to_type<mtx::events::state::Member> = |
296 | EventType::RoomMember; |
297 | template<> |
298 | constexpr inline EventType state_content_to_type<mtx::events::state::Name> = EventType::RoomName; |
299 | template<> |
300 | constexpr inline EventType state_content_to_type<mtx::events::state::PinnedEvents> = |
301 | EventType::RoomPinnedEvents; |
302 | template<> |
303 | constexpr inline EventType state_content_to_type<mtx::events::state::policy_rule::UserRule> = |
304 | EventType::PolicyRuleUser; |
305 | template<> |
306 | constexpr inline EventType state_content_to_type<mtx::events::state::policy_rule::RoomRule> = |
307 | EventType::PolicyRuleRoom; |
308 | template<> |
309 | constexpr inline EventType state_content_to_type<mtx::events::state::policy_rule::ServerRule> = |
310 | EventType::PolicyRuleServer; |
311 | template<> |
312 | constexpr inline EventType state_content_to_type<mtx::events::state::PowerLevels> = |
313 | EventType::RoomPowerLevels; |
314 | template<> |
315 | constexpr inline EventType state_content_to_type<mtx::events::state::Tombstone> = |
316 | EventType::RoomTombstone; |
317 | |
318 | template<> |
319 | constexpr inline EventType state_content_to_type<mtx::events::state::space::Child> = |
320 | EventType::SpaceChild; |
321 | template<> |
322 | constexpr inline EventType state_content_to_type<mtx::events::state::space::Parent> = |
323 | EventType::SpaceParent; |
324 | |
325 | template<> |
326 | constexpr inline EventType state_content_to_type<mtx::events::state::Widget> = |
327 | EventType::VectorWidget; |
328 | |
329 | template<> |
330 | constexpr inline EventType state_content_to_type<mtx::events::state::Topic> = EventType::RoomTopic; |
331 | template<> |
332 | constexpr 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. |
336 | template<typename Content> |
337 | constexpr inline EventType to_device_content_to_type = EventType::Unsupported; |
338 | |
339 | template<> |
340 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::RoomKey> = |
341 | EventType::RoomKey; |
342 | template<> |
343 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::ForwardedRoomKey> = |
344 | EventType::ForwardedRoomKey; |
345 | template<> |
346 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyRequest> = |
347 | EventType::RoomKeyRequest; |
348 | template<> |
349 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::OlmEncrypted> = |
350 | EventType::RoomEncrypted; |
351 | template<> |
352 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::Encrypted> = |
353 | EventType::RoomEncrypted; |
354 | template<> |
355 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::Dummy> = EventType::Dummy; |
356 | template<> |
357 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationRequest> = |
358 | EventType::KeyVerificationRequest; |
359 | template<> |
360 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationStart> = |
361 | EventType::KeyVerificationStart; |
362 | template<> |
363 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationReady> = |
364 | EventType::KeyVerificationReady; |
365 | template<> |
366 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationDone> = |
367 | EventType::KeyVerificationDone; |
368 | template<> |
369 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationAccept> = |
370 | EventType::KeyVerificationAccept; |
371 | template<> |
372 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationCancel> = |
373 | EventType::KeyVerificationCancel; |
374 | template<> |
375 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationKey> = |
376 | EventType::KeyVerificationKey; |
377 | template<> |
378 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::KeyVerificationMac> = |
379 | EventType::KeyVerificationMac; |
380 | template<> |
381 | constexpr inline EventType to_device_content_to_type<mtx::events::msg::SecretSend> = |
382 | EventType::SecretSend; |
383 | template<> |
384 | constexpr 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. |
388 | template<typename Content> |
389 | constexpr inline EventType account_data_content_to_type = EventType::Unsupported; |
390 | |
391 | template<> |
392 | constexpr inline EventType account_data_content_to_type<mtx::events::msc2545::ImagePack> = |
393 | EventType::ImagePackInAccountData; |
394 | template<> |
395 | constexpr inline EventType account_data_content_to_type<mtx::events::msc2545::ImagePackRooms> = |
396 | EventType::ImagePackRooms; |
397 | template<> |
398 | constexpr inline EventType account_data_content_to_type<mtx::events::account_data::Tags> = |
399 | EventType::Tag; |
400 | template<> |
401 | constexpr inline EventType account_data_content_to_type<mtx::events::account_data::Direct> = |
402 | EventType::Direct; |
403 | template<> |
404 | constexpr 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 | |