1#include "mtx/events.hpp"
2
3#include <nlohmann/json.hpp>
4
5using json = nlohmann::json;
6
7namespace mtx {
8namespace events {
9
10EventType
11getEventType(const std::string &type)
12{
13 if (type == "m.key.verification.request")
14 return EventType::KeyVerificationRequest;
15 else if (type == "m.key.verification.start")
16 return EventType::KeyVerificationStart;
17 else if (type == "m.key.verification.accept")
18 return EventType::KeyVerificationAccept;
19 else if (type == "m.key.verification.ready")
20 return EventType::KeyVerificationReady;
21 else if (type == "m.key.verification.done")
22 return EventType::KeyVerificationDone;
23 else if (type == "m.key.verification.key")
24 return EventType::KeyVerificationKey;
25 else if (type == "m.key.verification.mac")
26 return EventType::KeyVerificationMac;
27 else if (type == "m.key.verification.cancel")
28 return EventType::KeyVerificationCancel;
29 else if (type == "m.reaction")
30 return EventType::Reaction;
31 else if (type == "m.room_key")
32 return EventType::RoomKey;
33 else if (type == "m.forwarded_room_key")
34 return EventType::ForwardedRoomKey;
35 else if (type == "m.room_key_request")
36 return EventType::RoomKeyRequest;
37 else if (type == "m.room.aliases")
38 return EventType::RoomAliases;
39 else if (type == "m.room.avatar")
40 return EventType::RoomAvatar;
41 else if (type == "m.room.canonical_alias")
42 return EventType::RoomCanonicalAlias;
43 else if (type == "m.room.create")
44 return EventType::RoomCreate;
45 else if (type == "m.room.encrypted")
46 return EventType::RoomEncrypted;
47 else if (type == "m.dummy")
48 return EventType::Dummy;
49 else if (type == "m.room.encryption")
50 return EventType::RoomEncryption;
51 else if (type == "m.room.guest_access")
52 return EventType::RoomGuestAccess;
53 else if (type == "m.room.history_visibility")
54 return EventType::RoomHistoryVisibility;
55 else if (type == "m.room.join_rules")
56 return EventType::RoomJoinRules;
57 else if (type == "m.room.member")
58 return EventType::RoomMember;
59 else if (type == "m.room.message")
60 return EventType::RoomMessage;
61 else if (type == "m.room.name")
62 return EventType::RoomName;
63 else if (type == "m.room.power_levels")
64 return EventType::RoomPowerLevels;
65 else if (type == "m.room.topic")
66 return EventType::RoomTopic;
67 else if (type == "m.widget")
68 return EventType::Widget;
69 else if (type == "im.vector.modular.widgets")
70 return EventType::VectorWidget;
71 else if (type == "m.room.redaction")
72 return EventType::RoomRedaction;
73 else if (type == "m.room.pinned_events")
74 return EventType::RoomPinnedEvents;
75 else if (type == "m.room.tombstone")
76 return EventType::RoomTombstone;
77 else if (type == "m.sticker")
78 return EventType::Sticker;
79
80 else if (type == "m.policy.rule.user")
81 return EventType::PolicyRuleUser;
82 else if (type == "m.policy.rule.room")
83 return EventType::PolicyRuleRoom;
84 else if (type == "m.policy.rule.server")
85 return EventType::PolicyRuleServer;
86
87 else if (type == "m.space.child")
88 return EventType::SpaceChild;
89 else if (type == "m.space.parent")
90 return EventType::SpaceParent;
91
92 else if (type == "m.tag")
93 return EventType::Tag;
94 else if (type == "m.direct")
95 return EventType::Direct;
96 else if (type == "m.presence")
97 return EventType::Presence;
98 else if (type == "m.push_rules")
99 return EventType::PushRules;
100 else if (type == "m.call.invite")
101 return EventType::CallInvite;
102 else if (type == "m.call.candidates")
103 return EventType::CallCandidates;
104 else if (type == "m.call.answer")
105 return EventType::CallAnswer;
106 else if (type == "m.call.hangup")
107 return EventType::CallHangUp;
108 else if (type == "m.call.select_answer")
109 return EventType::CallSelectAnswer;
110 else if (type == "m.call.reject")
111 return EventType::CallReject;
112 else if (type == "m.call.negotiate")
113 return EventType::CallNegotiate;
114 else if (type == "m.secret.request")
115 return EventType::SecretRequest;
116 else if (type == "m.secret.send")
117 return EventType::SecretSend;
118 else if (type == "m.typing")
119 return EventType::Typing;
120 else if (type == "m.receipt")
121 return EventType::Receipt;
122 else if (type == "m.fully_read")
123 return EventType::FullyRead;
124 else if (type == "im.nheko.hidden_events")
125 return EventType::NhekoHiddenEvents;
126 else if (type == "im.ponies.room_emotes")
127 return EventType::ImagePackInRoom;
128 else if (type == "im.ponies.user_emotes")
129 return EventType::ImagePackInAccountData;
130 else if (type == "im.ponies.emote_rooms")
131 return EventType::ImagePackRooms;
132 else
133 return EventType::Unsupported;
134}
135
136std::string
137to_string(EventType type)
138{
139 switch (type) {
140 case EventType::KeyVerificationCancel:
141 return "m.key.verification.cancel";
142 case EventType::KeyVerificationRequest:
143 return "m.key.verification.request";
144 case EventType::KeyVerificationStart:
145 return "m.key.verification.start";
146 case EventType::KeyVerificationAccept:
147 return "m.key.verification.accept";
148 case EventType::KeyVerificationKey:
149 return "m.key.verification.key";
150 case EventType::KeyVerificationReady:
151 return "m.key.verification.ready";
152 case EventType::KeyVerificationDone:
153 return "m.key.verification.done";
154 case EventType::KeyVerificationMac:
155 return "m.key.verification.mac";
156 case EventType::Reaction:
157 return "m.reaction";
158 case EventType::RoomKey:
159 return "m.room_key";
160 case EventType::ForwardedRoomKey:
161 return "m.forwarded_room_key";
162 case EventType::RoomKeyRequest:
163 return "m.room_key_request";
164 case EventType::RoomAliases:
165 return "m.room.aliases";
166 case EventType::RoomAvatar:
167 return "m.room.avatar";
168 case EventType::RoomCanonicalAlias:
169 return "m.room.canonical_alias";
170 case EventType::RoomCreate:
171 return "m.room.create";
172 case EventType::RoomEncrypted:
173 return "m.room.encrypted";
174 case EventType::Dummy:
175 return "m.dummy";
176 case EventType::RoomEncryption:
177 return "m.room.encryption";
178 case EventType::RoomGuestAccess:
179 return "m.room.guest_access";
180 case EventType::RoomHistoryVisibility:
181 return "m.room.history_visibility";
182 case EventType::RoomJoinRules:
183 return "m.room.join_rules";
184 case EventType::RoomMember:
185 return "m.room.member";
186 case EventType::RoomMessage:
187 return "m.room.message";
188 case EventType::RoomName:
189 return "m.room.name";
190 case EventType::RoomPowerLevels:
191 return "m.room.power_levels";
192 case EventType::RoomTopic:
193 return "m.room.topic";
194 case EventType::Widget:
195 return "m.widget";
196 case EventType::VectorWidget:
197 return "im.vector.modular.widgets";
198 case EventType::RoomRedaction:
199 return "m.room.redaction";
200 case EventType::RoomPinnedEvents:
201 return "m.room.pinned_events";
202 case EventType::RoomTombstone:
203 return "m.room.tombstone";
204 case EventType::Sticker:
205 return "m.sticker";
206
207 case EventType::PolicyRuleUser:
208 return "m.policy.rule.user";
209 case EventType::PolicyRuleRoom:
210 return "m.policy.rule.room";
211 case EventType::PolicyRuleServer:
212 return "m.policy.rule.server";
213
214 case EventType::SpaceChild:
215 return "m.space.child";
216 case EventType::SpaceParent:
217 return "m.space.parent";
218
219 case EventType::Tag:
220 return "m.tag";
221 case EventType::Direct:
222 return "m.direct";
223 case EventType::Presence:
224 return "m.presence";
225 case EventType::PushRules:
226 return "m.push_rules";
227 case EventType::CallInvite:
228 return "m.call.invite";
229 case EventType::CallCandidates:
230 return "m.call.candidates";
231 case EventType::CallAnswer:
232 return "m.call.answer";
233 case EventType::CallHangUp:
234 return "m.call.hangup";
235 case EventType::CallSelectAnswer:
236 return "m.call.select_answer";
237 case EventType::CallReject:
238 return "m.call.reject";
239 case EventType::CallNegotiate:
240 return "m.call.negotiate";
241 case EventType::SecretRequest:
242 return "m.secret.request";
243 case EventType::SecretSend:
244 return "m.secret.send";
245 case EventType::Typing:
246 return "m.typing";
247 case EventType::Receipt:
248 return "m.receipt";
249 case EventType::FullyRead:
250 return "m.fully_read";
251 case EventType::NhekoHiddenEvents:
252 return "im.nheko.hidden_events";
253 case EventType::ImagePackInRoom:
254 return "im.ponies.room_emotes";
255 case EventType::ImagePackInAccountData:
256 return "im.ponies.user_emotes";
257 case EventType::ImagePackRooms:
258 return "im.ponies.emote_rooms";
259 case EventType::Unsupported:
260 return "";
261 }
262
263 return "";
264}
265
266EventType
267getEventType(const json &obj)
268{
269 if (obj.find(key: "type") != obj.end())
270 return getEventType(type: obj.at(key: "type").get<std::string>());
271
272 return EventType::Unsupported;
273}
274
275MessageType
276getMessageType(const std::string &type)
277{
278 if (type == "m.audio")
279 return MessageType::Audio;
280 else if (type == "m.emote")
281 return MessageType::Emote;
282 else if (type == "m.file")
283 return MessageType::File;
284 else if (type == "m.image")
285 return MessageType::Image;
286 else if (type == "m.location")
287 return MessageType::Location;
288 else if (type == "m.notice")
289 return MessageType::Notice;
290 else if (type == "m.text")
291 return MessageType::Text;
292 else if (type == "nic.custom.confetti")
293 return MessageType::Confetti;
294 else if (type == "m.video")
295 return MessageType::Video;
296 else if (type == "m.key.verification.request")
297 return MessageType::KeyVerificationRequest;
298
299 return MessageType::Unknown;
300}
301
302MessageType
303getMessageType(const json &obj)
304{
305 if (obj.is_null())
306 return MessageType::Unknown;
307
308 if (obj.find(key: "msgtype") == obj.end())
309 return MessageType::Unknown;
310
311 try {
312 return getMessageType(type: obj.at(key: "msgtype").get<std::string>());
313 } catch (...) {
314 return MessageType::Unknown;
315 }
316}
317}
318}
319