1 | #include "mtx/events/mscs/image_packs.hpp" |
2 | |
3 | #include <nlohmann/json.hpp> |
4 | |
5 | namespace { |
6 | template<class T> |
7 | T |
8 | safe_get(const nlohmann::json &obj, const std::string &name, T default_val = {}) |
9 | try { |
10 | return obj.value(name, default_val); |
11 | } catch (const nlohmann::json::type_error &) { |
12 | return default_val; |
13 | } |
14 | } |
15 | |
16 | namespace mtx { |
17 | namespace events { |
18 | namespace msc2545 { |
19 | void |
20 | from_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 | |
37 | void |
38 | from_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 | |
54 | void |
55 | from_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 | |
65 | void |
66 | to_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 | } |
80 | void |
81 | to_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 | } |
95 | void |
96 | to_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 | |
104 | void |
105 | from_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 | } |
115 | void |
116 | to_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 | |