| 1 | #include "mtx/events.hpp" |
|---|---|
| 2 | |
| 3 | #include <nlohmann/json.hpp> |
| 4 | |
| 5 | using json = nlohmann::json; |
| 6 | |
| 7 | namespace mtx { |
| 8 | namespace events { |
| 9 | |
| 10 | EventType |
| 11 | getEventType(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 | |
| 136 | std::string |
| 137 | to_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 | |
| 266 | EventType |
| 267 | getEventType(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 | |
| 275 | MessageType |
| 276 | getMessageType(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 | |
| 302 | MessageType |
| 303 | getMessageType(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 |