123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- /*
- Minetest
- Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
- #include <vector>
- #include <iostream>
- #include <sstream>
- #include "convert_json.h"
- #include "mods.h"
- #include "config.h"
- #include "log.h"
- #include "main.h" // for g_settings
- #include "settings.h"
- #include "httpfetch.h"
- #include "porting.h"
- Json::Value fetchJsonValue(const std::string &url,
- std::vector<std::string> *extra_headers)
- {
- HTTPFetchRequest fetch_request;
- HTTPFetchResult fetch_result;
- fetch_request.url = url;
- fetch_request.caller = HTTPFETCH_SYNC;
- if (extra_headers != NULL)
- fetch_request.extra_headers = *extra_headers;
- httpfetch_sync(fetch_request, fetch_result);
- if (!fetch_result.succeeded) {
- return Json::Value();
- }
- Json::Value root;
- Json::Reader reader;
- std::istringstream stream(fetch_result.data);
- if (!reader.parse(stream, root)) {
- errorstream << "URL: " << url << std::endl;
- errorstream << "Failed to parse json data " << reader.getFormattedErrorMessages();
- errorstream << "data: \"" << fetch_result.data << "\"" << std::endl;
- return Json::Value();
- }
- return root;
- }
- std::vector<ModStoreMod> readModStoreList(Json::Value& modlist) {
- std::vector<ModStoreMod> retval;
- if (modlist.isArray()) {
- for (unsigned int i = 0; i < modlist.size(); i++)
- {
- ModStoreMod toadd;
- toadd.valid = true;
- //id
- if (modlist[i]["id"].asString().size()) {
- std::string id_raw = modlist[i]["id"].asString();
- char* endptr = 0;
- int numbervalue = strtol(id_raw.c_str(),&endptr,10);
- if ((id_raw != "") && (*endptr == 0)) {
- toadd.id = numbervalue;
- }
- else {
- errorstream << "readModStoreList: missing id" << std::endl;
- toadd.valid = false;
- }
- }
- else {
- errorstream << "readModStoreList: missing id" << std::endl;
- toadd.valid = false;
- }
- //title
- if (modlist[i]["title"].asString().size()) {
- toadd.title = modlist[i]["title"].asString();
- }
- else {
- errorstream << "readModStoreList: missing title" << std::endl;
- toadd.valid = false;
- }
- //basename
- if (modlist[i]["basename"].asString().size()) {
- toadd.basename = modlist[i]["basename"].asString();
- }
- else {
- errorstream << "readModStoreList: missing basename" << std::endl;
- toadd.valid = false;
- }
- //author
- //rating
- //version
- if (toadd.valid) {
- retval.push_back(toadd);
- }
- }
- }
- return retval;
- }
- ModStoreModDetails readModStoreModDetails(Json::Value& details) {
- ModStoreModDetails retval;
- retval.valid = true;
- //version set
- if (details["version_set"].isArray()) {
- for (unsigned int i = 0; i < details["version_set"].size(); i++)
- {
- ModStoreVersionEntry toadd;
- if (details["version_set"][i]["id"].asString().size()) {
- std::string id_raw = details["version_set"][i]["id"].asString();
- char* endptr = 0;
- int numbervalue = strtol(id_raw.c_str(),&endptr,10);
- if ((id_raw != "") && (*endptr == 0)) {
- toadd.id = numbervalue;
- }
- }
- else {
- errorstream << "readModStoreModDetails: missing version_set id" << std::endl;
- retval.valid = false;
- }
- //date
- if (details["version_set"][i]["date"].asString().size()) {
- toadd.date = details["version_set"][i]["date"].asString();
- }
- //file
- if (details["version_set"][i]["file"].asString().size()) {
- toadd.file = details["version_set"][i]["file"].asString();
- }
- else {
- errorstream << "readModStoreModDetails: missing version_set file" << std::endl;
- retval.valid = false;
- }
- //approved
- //mtversion
- if( retval.valid ) {
- retval.versions.push_back(toadd);
- }
- else {
- break;
- }
- }
- }
- if (retval.versions.size() < 1) {
- infostream << "readModStoreModDetails: not a single version specified!" << std::endl;
- retval.valid = false;
- }
- //categories
- if (details["categories"].isObject()) {
- for (unsigned int i = 0; i < details["categories"].size(); i++) {
- ModStoreCategoryInfo toadd;
- if (details["categories"][i]["id"].asString().size()) {
- std::string id_raw = details["categories"][i]["id"].asString();
- char* endptr = 0;
- int numbervalue = strtol(id_raw.c_str(),&endptr,10);
- if ((id_raw != "") && (*endptr == 0)) {
- toadd.id = numbervalue;
- }
- }
- else {
- errorstream << "readModStoreModDetails: missing categories id" << std::endl;
- retval.valid = false;
- }
- if (details["categories"][i]["title"].asString().size()) {
- toadd.name = details["categories"][i]["title"].asString();
- }
- else {
- errorstream << "readModStoreModDetails: missing categories title" << std::endl;
- retval.valid = false;
- }
- if( retval.valid ) {
- retval.categories.push_back(toadd);
- }
- else {
- break;
- }
- }
- }
- //author
- if (details["author"].isObject()) {
- if (details["author"]["id"].asString().size()) {
- std::string id_raw = details["author"]["id"].asString();
- char* endptr = 0;
- int numbervalue = strtol(id_raw.c_str(),&endptr,10);
- if ((id_raw != "") && (*endptr == 0)) {
- retval.author.id = numbervalue;
- }
- else {
- errorstream << "readModStoreModDetails: missing author id (convert)" << std::endl;
- retval.valid = false;
- }
- }
- else {
- errorstream << "readModStoreModDetails: missing author id" << std::endl;
- retval.valid = false;
- }
- if (details["author"]["username"].asString().size()) {
- retval.author.username = details["author"]["username"].asString();
- }
- else {
- errorstream << "readModStoreModDetails: missing author username" << std::endl;
- retval.valid = false;
- }
- }
- else {
- errorstream << "readModStoreModDetails: missing author" << std::endl;
- retval.valid = false;
- }
- //license
- if (details["license"].isObject()) {
- if (details["license"]["id"].asString().size()) {
- std::string id_raw = details["license"]["id"].asString();
- char* endptr = 0;
- int numbervalue = strtol(id_raw.c_str(),&endptr,10);
- if ((id_raw != "") && (*endptr == 0)) {
- retval.license.id = numbervalue;
- }
- }
- else {
- errorstream << "readModStoreModDetails: missing license id" << std::endl;
- retval.valid = false;
- }
- if (details["license"]["short"].asString().size()) {
- retval.license.shortinfo = details["license"]["short"].asString();
- }
- else {
- errorstream << "readModStoreModDetails: missing license short" << std::endl;
- retval.valid = false;
- }
- if (details["license"]["link"].asString().size()) {
- retval.license.url = details["license"]["link"].asString();
- }
- }
- //titlepic
- if (details["titlepic"].isObject()) {
- if (details["titlepic"]["id"].asString().size()) {
- std::string id_raw = details["titlepic"]["id"].asString();
- char* endptr = 0;
- int numbervalue = strtol(id_raw.c_str(),&endptr,10);
- if ((id_raw != "") && (*endptr == 0)) {
- retval.titlepic.id = numbervalue;
- }
- }
- if (details["titlepic"]["file"].asString().size()) {
- retval.titlepic.file = details["titlepic"]["file"].asString();
- }
- if (details["titlepic"]["desc"].asString().size()) {
- retval.titlepic.description = details["titlepic"]["desc"].asString();
- }
- if (details["titlepic"]["mod"].asString().size()) {
- std::string mod_raw = details["titlepic"]["mod"].asString();
- char* endptr = 0;
- int numbervalue = strtol(mod_raw.c_str(),&endptr,10);
- if ((mod_raw != "") && (*endptr == 0)) {
- retval.titlepic.mod = numbervalue;
- }
- }
- }
- //id
- if (details["id"].asString().size()) {
- std::string id_raw = details["id"].asString();
- char* endptr = 0;
- int numbervalue = strtol(id_raw.c_str(),&endptr,10);
- if ((id_raw != "") && (*endptr == 0)) {
- retval.id = numbervalue;
- }
- }
- else {
- errorstream << "readModStoreModDetails: missing id" << std::endl;
- retval.valid = false;
- }
- //title
- if (details["title"].asString().size()) {
- retval.title = details["title"].asString();
- }
- else {
- errorstream << "readModStoreModDetails: missing title" << std::endl;
- retval.valid = false;
- }
- //basename
- if (details["basename"].asString().size()) {
- retval.basename = details["basename"].asString();
- }
- else {
- errorstream << "readModStoreModDetails: missing basename" << std::endl;
- retval.valid = false;
- }
- //description
- if (details["desc"].asString().size()) {
- retval.description = details["desc"].asString();
- }
- //repository
- if (details["replink"].asString().size()) {
- retval.repository = details["replink"].asString();
- }
- //value
- if (details["rating"].asString().size()) {
- std::string id_raw = details["rating"].asString();
- char* endptr = 0;
- float numbervalue = strtof(id_raw.c_str(),&endptr);
- if ((id_raw != "") && (*endptr == 0)) {
- retval.rating = numbervalue;
- }
- }
- else {
- retval.rating = 0.0;
- }
- //depends
- if (details["depends"].isArray()) {
- //TODO
- }
- //softdepends
- if (details["softdep"].isArray()) {
- //TODO
- }
- //screenshot url
- if (details["screenshot_url"].asString().size()) {
- retval.screenshot_url = details["screenshot_url"].asString();
- }
- return retval;
- }
|