1#include "mtx/events/presence.hpp"
2
3#include <nlohmann/json.hpp>
4
5#include <string>
6#include <string_view>
7
8namespace mtx {
9namespace presence {
10std::string
11to_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}
23PresenceState
24from_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
35namespace events {
36namespace presence {
37void
38from_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}
51void
52to_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