]> git.lizzy.rs Git - dragonfireclient.git/blob - src/convert_json.cpp
Temporarily set default biome in builtin
[dragonfireclient.git] / src / convert_json.cpp
1 /*
2 Minetest
3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include <vector>
21 #include <iostream>
22 #include <sstream>
23
24 #include "convert_json.h"
25 #include "mods.h"
26 #include "config.h"
27 #include "log.h"
28 #include "main.h" // for g_settings
29 #include "settings.h"
30 #include "httpfetch.h"
31 #include "porting.h"
32
33 Json::Value fetchJsonValue(const std::string &url,
34                 std::vector<std::string> *extra_headers)
35 {
36         HTTPFetchRequest fetch_request;
37         HTTPFetchResult fetch_result;
38         fetch_request.url = url;
39         fetch_request.caller = HTTPFETCH_SYNC;
40
41         if (extra_headers != NULL)
42                 fetch_request.extra_headers = *extra_headers;
43
44         httpfetch_sync(fetch_request, fetch_result);
45
46         if (!fetch_result.succeeded) {
47                 return Json::Value();
48         }
49         Json::Value root;
50         Json::Reader reader;
51         std::istringstream stream(fetch_result.data);
52
53         if (!reader.parse(stream, root)) {
54                 errorstream << "URL: " << url << std::endl;
55                 errorstream << "Failed to parse json data " << reader.getFormattedErrorMessages();
56                 errorstream << "data: \"" << fetch_result.data << "\"" << std::endl;
57                 return Json::Value();
58         }
59
60         return root;
61 }
62
63 std::vector<ModStoreMod>    readModStoreList(Json::Value& modlist) {
64                 std::vector<ModStoreMod> retval;
65
66         if (modlist.isArray()) {
67                 for (unsigned int i = 0; i < modlist.size(); i++)
68                 {
69                         ModStoreMod toadd;
70                         toadd.valid = true;
71
72                         //id
73                         if (modlist[i]["id"].asString().size()) {
74                                 std::string id_raw = modlist[i]["id"].asString();
75                                 char* endptr = 0;
76                                 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
77
78                                 if ((id_raw != "") && (*endptr == 0)) {
79                                         toadd.id = numbervalue;
80                                 }
81                                 else {
82                                         errorstream << "readModStoreList: missing id" << std::endl;
83                                         toadd.valid = false;
84                                 }
85                         }
86                         else {
87                                 errorstream << "readModStoreList: missing id" << std::endl;
88                                 toadd.valid = false;
89                         }
90
91                         //title
92                         if (modlist[i]["title"].asString().size()) {
93                                 toadd.title = modlist[i]["title"].asString();
94                         }
95                         else {
96                                 errorstream << "readModStoreList: missing title" << std::endl;
97                                 toadd.valid = false;
98                         }
99
100                         //basename
101                         if (modlist[i]["basename"].asString().size()) {
102                                 toadd.basename = modlist[i]["basename"].asString();
103                         }
104                         else {
105                                 errorstream << "readModStoreList: missing basename" << std::endl;
106                                 toadd.valid = false;
107                         }
108
109                         //author
110
111                         //rating
112
113                         //version
114
115                         if (toadd.valid) {
116                                 retval.push_back(toadd);
117                         }
118                 }
119         }
120         return retval;
121 }
122
123 ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
124
125         ModStoreModDetails retval;
126
127         retval.valid = true;
128
129         //version set
130         if (details["version_set"].isArray()) {
131                 for (unsigned int i = 0; i < details["version_set"].size(); i++)
132                 {
133                         ModStoreVersionEntry toadd;
134
135                         if (details["version_set"][i]["id"].asString().size()) {
136                                 std::string id_raw = details["version_set"][i]["id"].asString();
137                                 char* endptr = 0;
138                                 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
139
140                                 if ((id_raw != "") && (*endptr == 0)) {
141                                         toadd.id = numbervalue;
142                                 }
143                         }
144                         else {
145                                 errorstream << "readModStoreModDetails: missing version_set id" << std::endl;
146                                 retval.valid = false;
147                         }
148
149                         //date
150                         if (details["version_set"][i]["date"].asString().size()) {
151                                 toadd.date = details["version_set"][i]["date"].asString();
152                         }
153
154                         //file
155                         if (details["version_set"][i]["file"].asString().size()) {
156                                 toadd.file = details["version_set"][i]["file"].asString();
157                         }
158                         else {
159                                 errorstream << "readModStoreModDetails: missing version_set file" << std::endl;
160                                 retval.valid = false;
161                         }
162
163                         //approved
164
165                         //mtversion
166
167                         if( retval.valid ) {
168                                 retval.versions.push_back(toadd);
169                         }
170                         else {
171                                 break;
172                         }
173                 }
174         }
175
176         if (retval.versions.size() < 1) {
177                 infostream << "readModStoreModDetails: not a single version specified!" << std::endl;
178                 retval.valid = false;
179         }
180
181         //categories
182         if (details["categories"].isObject()) {
183                 for (unsigned int i = 0; i < details["categories"].size(); i++) {
184                         ModStoreCategoryInfo toadd;
185
186                         if (details["categories"][i]["id"].asString().size()) {
187
188                                 std::string id_raw = details["categories"][i]["id"].asString();
189                                 char* endptr = 0;
190                                 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
191
192                                 if ((id_raw != "") && (*endptr == 0)) {
193                                         toadd.id = numbervalue;
194                                 }
195                         }
196                         else {
197                                 errorstream << "readModStoreModDetails: missing categories id" << std::endl;
198                                 retval.valid = false;
199                         }
200                         if (details["categories"][i]["title"].asString().size()) {
201                                 toadd.name = details["categories"][i]["title"].asString();
202                         }
203                         else {
204                                 errorstream << "readModStoreModDetails: missing categories title" << std::endl;
205                                 retval.valid = false;
206                         }
207
208                         if( retval.valid ) {
209                                 retval.categories.push_back(toadd);
210                         }
211                         else {
212                                 break;
213                         }
214                 }
215         }
216
217         //author
218         if (details["author"].isObject()) {
219                 if (details["author"]["id"].asString().size()) {
220
221                         std::string id_raw = details["author"]["id"].asString();
222                         char* endptr = 0;
223                         int numbervalue = strtol(id_raw.c_str(),&endptr,10);
224
225                         if ((id_raw != "") && (*endptr == 0)) {
226                                 retval.author.id = numbervalue;
227                         }
228                         else {
229                                 errorstream << "readModStoreModDetails: missing author id (convert)" << std::endl;
230                                 retval.valid = false;
231                         }
232                 }
233                 else {
234                         errorstream << "readModStoreModDetails: missing author id" << std::endl;
235                         retval.valid = false;
236                 }
237
238                 if (details["author"]["username"].asString().size()) {
239                         retval.author.username = details["author"]["username"].asString();
240                 }
241                 else {
242                         errorstream << "readModStoreModDetails: missing author username" << std::endl;
243                         retval.valid = false;
244                 }
245         }
246         else {
247                 errorstream << "readModStoreModDetails: missing author" << std::endl;
248                 retval.valid = false;
249         }
250
251         //license
252         if (details["license"].isObject()) {
253                 if (details["license"]["id"].asString().size()) {
254
255                         std::string id_raw = details["license"]["id"].asString();
256                         char* endptr = 0;
257                         int numbervalue = strtol(id_raw.c_str(),&endptr,10);
258
259                         if ((id_raw != "") && (*endptr == 0)) {
260                                 retval.license.id = numbervalue;
261                         }
262                 }
263                 else {
264                         errorstream << "readModStoreModDetails: missing license id" << std::endl;
265                         retval.valid = false;
266                 }
267
268                 if (details["license"]["short"].asString().size()) {
269                         retval.license.shortinfo = details["license"]["short"].asString();
270                 }
271                 else {
272                         errorstream << "readModStoreModDetails: missing license short" << std::endl;
273                         retval.valid = false;
274                 }
275
276                 if (details["license"]["link"].asString().size()) {
277                         retval.license.url = details["license"]["link"].asString();
278                 }
279
280         }
281
282         //titlepic
283         if (details["titlepic"].isObject()) {
284                 if (details["titlepic"]["id"].asString().size()) {
285
286                         std::string id_raw = details["titlepic"]["id"].asString();
287                         char* endptr = 0;
288                         int numbervalue = strtol(id_raw.c_str(),&endptr,10);
289
290                         if ((id_raw != "") && (*endptr == 0)) {
291                                 retval.titlepic.id = numbervalue;
292                         }
293                 }
294
295                 if (details["titlepic"]["file"].asString().size()) {
296                         retval.titlepic.file = details["titlepic"]["file"].asString();
297                 }
298
299                 if (details["titlepic"]["desc"].asString().size()) {
300                         retval.titlepic.description = details["titlepic"]["desc"].asString();
301                 }
302
303                 if (details["titlepic"]["mod"].asString().size()) {
304
305                         std::string mod_raw = details["titlepic"]["mod"].asString();
306                         char* endptr = 0;
307                         int numbervalue = strtol(mod_raw.c_str(),&endptr,10);
308
309                         if ((mod_raw != "") && (*endptr == 0)) {
310                                 retval.titlepic.mod = numbervalue;
311                         }
312                 }
313         }
314
315         //id
316         if (details["id"].asString().size()) {
317
318                 std::string id_raw = details["id"].asString();
319                 char* endptr = 0;
320                 int numbervalue = strtol(id_raw.c_str(),&endptr,10);
321
322                 if ((id_raw != "") && (*endptr == 0)) {
323                         retval.id = numbervalue;
324                 }
325         }
326         else {
327                 errorstream << "readModStoreModDetails: missing id" << std::endl;
328                 retval.valid = false;
329         }
330
331         //title
332         if (details["title"].asString().size()) {
333                 retval.title = details["title"].asString();
334         }
335         else {
336                 errorstream << "readModStoreModDetails: missing title" << std::endl;
337                 retval.valid = false;
338         }
339
340         //basename
341         if (details["basename"].asString().size()) {
342                 retval.basename = details["basename"].asString();
343         }
344         else {
345                 errorstream << "readModStoreModDetails: missing basename" << std::endl;
346                 retval.valid = false;
347         }
348
349         //description
350         if (details["desc"].asString().size()) {
351                 retval.description = details["desc"].asString();
352         }
353
354         //repository
355         if (details["replink"].asString().size()) {
356                 retval.repository = details["replink"].asString();
357         }
358
359         //value
360         if (details["rating"].asString().size()) {
361
362                 std::string id_raw = details["rating"].asString();
363                 char* endptr = 0;
364                 float numbervalue = strtof(id_raw.c_str(),&endptr);
365
366                 if ((id_raw != "") && (*endptr == 0)) {
367                         retval.rating = numbervalue;
368                 }
369         }
370         else {
371                 retval.rating = 0.0;
372         }
373
374         //depends
375         if (details["depends"].isArray()) {
376                 //TODO
377         }
378
379         //softdepends
380         if (details["softdep"].isArray()) {
381                 //TODO
382         }
383
384         //screenshot url
385         if (details["screenshot_url"].asString().size()) {
386                 retval.screenshot_url = details["screenshot_url"].asString();
387         }
388
389         return retval;
390 }