X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fserverlist.cpp;h=8a85b33b3d5511a83d755eaa3b6a48bdf83c14fa;hb=ea6c3835debfffa22163f048eae57928311143c4;hp=7a374eb47179dbf3520a3774a21910ca8dd737bd;hpb=ac7a44792c77747e60beb1e8215fcd4976aa3b06;p=oweals%2Fminetest.git diff --git a/src/serverlist.cpp b/src/serverlist.cpp index 7a374eb47..8a85b33b3 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include +#include "version.h" #include "main.h" // for g_settings #include "settings.h" #include "serverlist.h" @@ -29,9 +30,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "json/json.h" #include "convert_json.h" -#if USE_CURL -#include -#endif +#include "httpfetch.h" +#include "util/string.h" namespace ServerList { @@ -68,10 +68,9 @@ std::vector getLocal() } -#if USE_CURL std::vector getOnline() { - Json::Value root = fetchJsonValue((g_settings->get("serverlist_url")+"/list").c_str(),0); + Json::Value root = fetchJsonValue((g_settings->get("serverlist_url")+"/list").c_str(), NULL); std::vector serverlist; @@ -87,8 +86,6 @@ std::vector getOnline() return serverlist; } -#endif - /* Delete a server fromt he local favorites list */ @@ -105,13 +102,11 @@ bool deleteEntry (ServerListSpec server) } std::string path = ServerList::getFilePath(); - std::ofstream stream (path.c_str()); - if (stream.is_open()) - { - stream< serverlist) #if USE_CURL -static size_t ServerAnnounceCallback(void *contents, size_t size, size_t nmemb, void *userp) -{ - //((std::string*)userp)->append((char*)contents, size * nmemb); - return size * nmemb; -} -void sendAnnounce(std::string action, u16 clients, double uptime, std::string gameid, std::vector m_mods) { +void sendAnnounce(std::string action, const std::vector & clients_names, double uptime, u32 game_time, float lag, std::string gameid, std::vector mods) { Json::Value server; if (action.size()) server["action"] = action; - server["port"] = g_settings->get("port"); + server["port"] = g_settings->get("port"); server["address"] = g_settings->get("server_address"); if (action != "delete") { server["name"] = g_settings->get("server_name"); server["description"] = g_settings->get("server_description"); - server["version"] = VERSION_STRING; + server["version"] = minetest_version_simple; server["url"] = g_settings->get("server_url"); server["creative"] = g_settings->get("creative_mode"); server["damage"] = g_settings->get("enable_damage"); - server["dedicated"] = g_settings->get("server_dedicated"); - server["rollback"] = g_settings->getBool("enable_rollback_recording"); server["password"] = g_settings->getBool("disallow_empty_password"); server["pvp"] = g_settings->getBool("enable_pvp"); - server["clients"] = clients; + server["clients"] = (int)clients_names.size(); server["clients_max"] = g_settings->get("max_users"); - if (uptime >=1) server["uptime"] = (int)uptime; - if (gameid!="") server["gameid"] = gameid; + server["clients_list"] = Json::Value(Json::arrayValue); + for(u32 i = 0; i < clients_names.size(); ++i) { + server["clients_list"].append(clients_names[i]); + } + if (uptime >= 1) server["uptime"] = (int)uptime; + if (gameid != "") server["gameid"] = gameid; + if (game_time >= 1) server["game_time"] = game_time; } if(server["action"] == "start") { - server["mods"] = Json::Value(Json::arrayValue); - for(std::vector::iterator m = m_mods.begin(); m != m_mods.end(); m++) { + server["dedicated"] = g_settings->get("server_dedicated"); + server["privs"] = g_settings->get("default_privs"); + server["rollback"] = g_settings->getBool("enable_rollback_recording"); + server["mapgen"] = g_settings->get("mg_name"); + server["can_see_far_names"] = g_settings->getBool("unlimited_player_transfer_distance"); + server["mods"] = Json::Value(Json::arrayValue); + for(std::vector::iterator m = mods.begin(); m != mods.end(); m++) { server["mods"].append(m->name); } actionstream << "announcing to " << g_settings->get("serverlist_url") << std::endl; + } else { + if (lag) + server["lag"] = lag; } - Json::StyledWriter writer; - CURL *curl; - curl = curl_easy_init(); - if (curl) - { - CURLcode res; - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_URL, (g_settings->get("serverlist_url")+std::string("/announce?json=")+curl_easy_escape(curl, writer.write( server ).c_str(), 0)).c_str()); - //curl_easy_setopt(curl, CURLOPT_USERAGENT, "minetest"); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ServerList::ServerAnnounceCallback); - //curl_easy_setopt(curl, CURLOPT_WRITEDATA, &liststring); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 1); - res = curl_easy_perform(curl); - if (res != CURLE_OK) - errorstream<<"Serverlist at url "<get("serverlist_url")<<" error ("<get("serverlist_url") + std::string("/announce"); + std::string query = std::string("json=") + urlencode(writer.write(server)); + if (query.size() < 1000) + fetchrequest.url += "?" + query; + else + fetchrequest.post_fields = query; + httpfetch_async(fetchrequest); } #endif