Glasslike_framed drawtype rework.
[oweals/minetest.git] / src / serverlist.cpp
index fa2ddad1579d35d12434e01ed7cb94ef17d5b2e0..8a85b33b3d5511a83d755eaa3b6a48bdf83c14fa 100644 (file)
@@ -30,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 <curl/curl.h>
-#endif
+#include "httpfetch.h"
+#include "util/string.h"
 
 namespace ServerList
 {
@@ -69,10 +68,9 @@ std::vector<ServerListSpec> getLocal()
 }
 
 
-#if USE_CURL
 std::vector<ServerListSpec> 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<ServerListSpec> serverlist;
 
@@ -88,8 +86,6 @@ std::vector<ServerListSpec> getOnline()
        return serverlist;
 }
 
-#endif
-
 /*
        Delete a server fromt he local favorites list
 */
@@ -189,12 +185,7 @@ std::string serializeJson(std::vector<ServerListSpec> 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, const std::vector<std::string> & clients_names, double uptime, u32 game_time, std::string gameid, std::vector<ModSpec> mods) {
+void sendAnnounce(std::string action, const std::vector<std::string> & clients_names, double uptime, u32 game_time, float lag, std::string gameid, std::vector<ModSpec> mods) {
        Json::Value server;
        if (action.size())
                server["action"]        = action;
@@ -224,34 +215,27 @@ void sendAnnounce(std::string action, const std::vector<std::string> & clients_n
                server["dedicated"]     = g_settings->get("server_dedicated");
                server["privs"]         = g_settings->get("default_privs");
                server["rollback"]      = g_settings->getBool("enable_rollback_recording");
-               server["liquid_finite"] = g_settings->getBool("liquid_finite");
                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<ModSpec>::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 "<<g_settings->get("serverlist_url")<<" error ("<<curl_easy_strerror(res)<<")"<<std::endl;
-               curl_easy_cleanup(curl);
-       }
-
+       Json::FastWriter writer;
+       HTTPFetchRequest fetchrequest;
+       fetchrequest.url = g_settings->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