| 1 | #include "mtx/events/presence.hpp" |
|---|---|
| 2 | |
| 3 | #include <nlohmann/json.hpp> |
| 4 | |
| 5 | #include <string> |
| 6 | #include <string_view> |
| 7 | |
| 8 | namespace mtx { |
| 9 | namespace presence { |
| 10 | std::string |
| 11 | to_string(PresenceState state) |
| 12 | { |
| 13 | switch (state) { |
| 14 | case PresenceState::offline: |
| 15 | return "offline"; |
| 16 | case PresenceState::unavailable: |
| 17 | return "unavailable"; |
| 18 | case PresenceState::online: |
| 19 | default: |
| 20 | return "online"; |
| 21 | } |
| 22 | } |
| 23 | PresenceState |
| 24 | from_string(std::string_view str) |
| 25 | { |
| 26 | if (str == "offline") |
| 27 | return PresenceState::offline; |
| 28 | else if (str == "unavailable") |
| 29 | return PresenceState::unavailable; |
| 30 | else |
| 31 | return PresenceState::online; |
| 32 | } |
| 33 | } |
| 34 | |
| 35 | namespace events { |
| 36 | namespace presence { |
| 37 | void |
| 38 | from_json(const nlohmann::json &obj, Presence &presence) |
| 39 | { |
| 40 | presence.avatar_url = obj.value(key: "avatar_url", default_value: ""); |
| 41 | presence.displayname = obj.value(key: "displayname", default_value: ""); |
| 42 | presence.last_active_ago = obj.value(key: "last_active_ago", default_value: std::uint64_t{0}); |
| 43 | presence.presence = mtx::presence::from_string(str: obj.value(key: "presence", default_value: "online")); |
| 44 | presence.currently_active = obj.value(key: "currently_active", default_value: false); |
| 45 | try { |
| 46 | if (obj.contains(key: "status_msg")) |
| 47 | presence.status_msg = obj.at(key: "status_msg").get<std::string>(); |
| 48 | } catch (...) { |
| 49 | } |
| 50 | } |
| 51 | void |
| 52 | to_json(nlohmann::json &obj, const Presence &presence) |
| 53 | { |
| 54 | if (!presence.avatar_url.empty()) |
| 55 | obj["avatar_url"] = presence.avatar_url; |
| 56 | if (!presence.displayname.empty()) |
| 57 | obj["displayname"] = presence.displayname; |
| 58 | if (presence.last_active_ago) |
| 59 | obj["last_active_ago"] = presence.last_active_ago; |
| 60 | obj["presence"] = to_string(state: presence.presence); |
| 61 | if (presence.currently_active) |
| 62 | obj["currently_active"] = true; |
| 63 | if (!presence.status_msg.empty()) |
| 64 | obj["status_msg"] = presence.status_msg; |
| 65 | } |
| 66 | } |
| 67 | } |
| 68 | } |
| 69 |