1#include "mtx/events/mscs/image_packs.hpp"
2
3#include <nlohmann/json.hpp>
4
5namespace {
6template<class T>
7T
8safe_get(const nlohmann::json &obj, const std::string &name, T default_val = {})
9try {
10 return obj.value(name, default_val);
11} catch (const nlohmann::json::type_error &) {
12 return default_val;
13}
14}
15
16namespace mtx {
17namespace events {
18namespace msc2545 {
19void
20from_json(const nlohmann::json &obj, PackImage &content)
21{
22 content.url = obj.at(key: "url").get<std::string>();
23 content.body = safe_get<std::string>(obj, name: "body", default_val: "");
24 if (obj.contains(key: "info"))
25 content.info = obj.at(key: "info").get<mtx::common::ImageInfo>();
26
27 if (obj.contains(key: "usage")) {
28 for (const auto &e : obj.at(key: "usage")) {
29 if (e == "sticker")
30 content.usage.set(position: PackUsage::Sticker);
31 else if (e == "emoticon")
32 content.usage.set(position: PackUsage::Emoji);
33 }
34 }
35}
36
37void
38from_json(const nlohmann::json &obj, ImagePack::PackDescription &content)
39{
40 content.avatar_url = safe_get<std::string>(obj, name: "avatar_url", default_val: "");
41 content.display_name = safe_get<std::string>(obj, name: "display_name", default_val: "");
42 content.attribution = safe_get<std::string>(obj, name: "attribution", default_val: "");
43
44 if (obj.contains(key: "usage") && obj.at(key: "usage").is_array()) {
45 for (const auto &e : obj.at(key: "usage")) {
46 if (e == "sticker")
47 content.usage.set(position: PackUsage::Sticker);
48 else if (e == "emoticon")
49 content.usage.set(position: PackUsage::Emoji);
50 }
51 }
52}
53
54void
55from_json(const nlohmann::json &obj, ImagePack &content)
56{
57 if (obj.contains(key: "pack")) {
58 content.pack = ImagePack::PackDescription{};
59 from_json(obj: obj.at(key: "pack"), content&: *content.pack);
60 }
61 if (obj.contains(key: "images"))
62 content.images = obj.at(key: "images").get<std::map<std::string, PackImage>>();
63}
64
65void
66to_json(nlohmann::json &obj, const PackImage &content)
67{
68 obj["url"] = content.url;
69
70 if (!content.body.empty())
71 obj["body"] = content.body;
72 if (content.info)
73 obj["info"] = content.info.value();
74
75 if (content.usage.test(position: PackUsage::Sticker))
76 obj["usage"].push_back(val: "sticker");
77 if (content.usage.test(position: PackUsage::Emoji))
78 obj["usage"].push_back(val: "emoticon");
79}
80void
81to_json(nlohmann::json &obj, const ImagePack::PackDescription &content)
82{
83 if (!content.avatar_url.empty())
84 obj["avatar_url"] = content.avatar_url;
85 if (!content.display_name.empty())
86 obj["display_name"] = content.display_name;
87 if (!content.attribution.empty())
88 obj["attribution"] = content.attribution;
89
90 if (content.usage.test(position: PackUsage::Sticker))
91 obj["usage"].push_back(val: "sticker");
92 if (content.usage.test(position: PackUsage::Emoji))
93 obj["usage"].push_back(val: "emoticon");
94}
95void
96to_json(nlohmann::json &obj, const ImagePack &content)
97{
98 if (content.pack)
99 to_json(obj&: obj["pack"], content: *content.pack);
100
101 obj["images"] = content.images;
102}
103
104void
105from_json(const nlohmann::json &obj, ImagePackRooms &content)
106{
107 if (obj.contains(key: "rooms")) {
108 for (const auto &[roomid, packs] : obj["rooms"].items()) {
109 for (const auto &[packid, body] : packs.items()) {
110 content.rooms[roomid][packid] = body.dump();
111 }
112 }
113 }
114}
115void
116to_json(nlohmann::json &obj, const ImagePackRooms &content)
117{
118 obj["rooms"] = nlohmann::json::object();
119 for (const auto &[roomid, packs] : content.rooms) {
120 for (const auto &[packid, body] : packs) {
121 if (body.empty())
122 obj["rooms"][roomid][packid] = nlohmann::json::object();
123 else
124 obj["rooms"][roomid][packid] = nlohmann::json::parse(i: body);
125 }
126 }
127}
128}
129}
130}
131