From ee07c3f7cf638e854518d2cfcb9c11a64412cc72 Mon Sep 17 00:00:00 2001 From: proller Date: Fri, 22 Feb 2013 02:00:44 +0400 Subject: new auto masterserver --- src/serverlist.cpp | 119 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 105 insertions(+), 14 deletions(-) (limited to 'src/serverlist.cpp') diff --git a/src/serverlist.cpp b/src/serverlist.cpp index 88a213db1..b2f49ae72 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "filesys.h" #include "porting.h" #include "log.h" +#include "json/json.h" #if USE_CURL #include #endif @@ -83,7 +84,7 @@ std::vector getOnline() { CURLcode res; - curl_easy_setopt(curl, CURLOPT_URL, g_settings->get("serverlist_url").c_str()); + curl_easy_setopt(curl, CURLOPT_URL, (g_settings->get("serverlist_url")+"/list").c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ServerList::WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &liststring); @@ -92,8 +93,7 @@ std::vector getOnline() errorstream<<"Serverlist at url "<get("serverlist_url")<<" not found (internet connection?)"< serverlist = ServerList::getLocal(); for(unsigned i = 0; i < serverlist.size(); i++) { - if (serverlist[i].address == server.address - && serverlist[i].port == server.port) + if (serverlist[i]["address"] == server["address"] + && serverlist[i]["port"] == server["port"]) { serverlist.erase(serverlist.begin() + i); } @@ -150,17 +150,21 @@ std::vector deSerialize(std::string liststring) { std::vector serverlist; std::istringstream stream(liststring); - std::string line; + std::string line, tmp; while (std::getline(stream, line)) { std::transform(line.begin(), line.end(),line.begin(), ::toupper); if (line == "[SERVER]") { ServerListSpec thisserver; - std::getline(stream, thisserver.name); - std::getline(stream, thisserver.address); - std::getline(stream, thisserver.port); - std::getline(stream, thisserver.description); + std::getline(stream, tmp); + thisserver["name"] = tmp; + std::getline(stream, tmp); + thisserver["address"] = tmp; + std::getline(stream, tmp); + thisserver["port"] = tmp; + std::getline(stream, tmp); + thisserver["description"] = tmp; serverlist.push_back(thisserver); } } @@ -173,13 +177,100 @@ std::string serialize(std::vector serverlist) for(std::vector::iterator i = serverlist.begin(); i != serverlist.end(); i++) { liststring += "[server]\n"; - liststring += i->name + "\n"; - liststring += i->address + "\n"; - liststring += i->port + "\n"; - liststring += i->description + "\n"; + liststring += (*i)["name"].asString() + "\n"; + liststring += (*i)["address"].asString() + "\n"; + liststring += (*i)["port"].asString() + "\n"; + liststring += (*i)["description"].asString() + "\n"; liststring += "\n"; } return liststring; } +std::vector deSerializeJson(std::string liststring) +{ + std::vector serverlist; + Json::Value root; + Json::Reader reader; + std::istringstream stream(liststring); + if (!liststring.size()) { + return serverlist; + } + if (!reader.parse( stream, root ) ) + { + errorstream << "Failed to parse server list " << reader.getFormattedErrorMessages(); + return serverlist; + } + if (root["list"].isArray()) + for (unsigned int i = 0; i < root["list"].size(); i++) + { + if (root["list"][i].isObject()) { + serverlist.push_back(root["list"][i]); + } + } + return serverlist; +} + +std::string serializeJson(std::vector serverlist) +{ + Json::Value root; + Json::Value list(Json::arrayValue); + for(std::vector::iterator i = serverlist.begin(); i != serverlist.end(); i++) + { + list.append(*i); + } + root["list"] = list; + Json::StyledWriter writer; + return writer.write( root ); +} + + +#if USE_CURL +static size_t ServerAnnounceCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + return 0; + //((std::string*)userp)->append((char*)contents, size * nmemb); + //return size * nmemb; +} +void sendAnnounce(std::string action, u16 clients) { + Json::Value server; + if (action.size()) + server["action"] = action; + server["port"] = g_settings->get("port"); + if (action != "del") { + server["name"] = g_settings->get("server_name"); + server["description"] = g_settings->get("server_description"); + server["address"] = g_settings->get("server_address"); + server["version"] = VERSION_STRING; + 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["password"] = g_settings->getBool("disallow_empty_password"); + server["pvp"] = g_settings->getBool("enable_pvp"); + server["clients"] = clients; + server["clients_max"] = g_settings->get("max_users"); + } + if(server["action"] == "start") + actionstream << "announcing to " << g_settings->get("serverlist_url") << std::endl; + Json::StyledWriter writer; + CURL *curl; + curl = curl_easy_init(); + if (curl) + { + CURLcode res; + 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")<<" not found (internet connection?)"< Date: Sun, 24 Feb 2013 18:40:43 +0100 Subject: Change Minetest-c55 to Minetest --- src/serverlist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/serverlist.cpp') diff --git a/src/serverlist.cpp b/src/serverlist.cpp index b2f49ae72..77b0ceef1 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -1,5 +1,5 @@ /* -Minetest-c55 +Minetest Copyright (C) 2011 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -- cgit v1.2.3 From 6d0ea26c2d62c3774ff384cf1bfc2a3372b49a3b Mon Sep 17 00:00:00 2001 From: Sfan5 Date: Sun, 24 Feb 2013 19:38:45 +0100 Subject: Update Copyright Years --- src/serverlist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/serverlist.cpp') diff --git a/src/serverlist.cpp b/src/serverlist.cpp index 77b0ceef1..b5e6aad4e 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -1,6 +1,6 @@ /* Minetest -Copyright (C) 2011 celeron55, Perttu Ahola +Copyright (C) 2013 celeron55, Perttu Ahola 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 -- cgit v1.2.3