HTTPFetchRequest fetchrequest;
HTTPFetchResult fetchresult;
fetchrequest.url = url;
- fetchrequest.useragent = std::string("Minetest ")+minetest_version_hash;
- fetchrequest.timeout = g_settings->getS32("curl_timeout");
fetchrequest.caller = HTTPFETCH_SYNC;
struct curl_slist* runptr = chunk;
HTTPFetchRequest fetchrequest;
HTTPFetchResult fetchresult;
fetchrequest.url = url;
- fetchrequest.useragent = std::string("Minetest ")+minetest_version_hash;
- fetchrequest.timeout = g_settings->getS32("curl_timeout");
fetchrequest.caller = HTTPFETCH_SYNC;
httpfetch_sync(fetchrequest,fetchresult);
#include <list>
#include <map>
#include <errno.h>
+#ifndef _MSC_VER
+#include <sys/utsname.h>
+#endif
#include "jthread/jevent.h"
#include "config.h"
#include "exceptions.h"
#include "log.h"
#include "util/container.h"
#include "util/thread.h"
+#include "version.h"
+#include "main.h"
+#include "settings.h"
JMutex g_httpfetch_mutex;
std::map<unsigned long, std::list<HTTPFetchResult> > g_httpfetch_results;
+ HTTPFetchRequest::HTTPFetchRequest()
+ {
+ url = "";
+ caller = HTTPFETCH_DISCARD;
+ request_id = 0;
+ timeout = g_settings->getS32("curl_timeout");
+ connect_timeout = timeout * 5;
+
+ useragent = std::string("Minetest ") + minetest_version_hash;
+#ifdef _MSC_VER
+ useragent += "Windows";
+#else
+ struct utsname osinfo;
+ uname(&osinfo);
+ useragent += std::string(" (") + osinfo.sysname + "; " + osinfo.release + "; " + osinfo.machine + ")";
+#endif
+ }
+
+
static void httpfetch_deliver_result(const HTTPFetchResult &fetchresult)
{
unsigned long caller = fetchresult.caller;
//useragent to use
std::string useragent;
- HTTPFetchRequest()
- {
- url = "";
- caller = HTTPFETCH_DISCARD;
- request_id = 0;
- timeout = 0;
- connect_timeout = 0;
- }
+ HTTPFetchRequest();
};
struct HTTPFetchResult
m_savemap_timer = 0.0;
m_step_dtime = 0.0;
+ m_lag = g_settings->getFloat("dedicated_server_step");
if(path_world == "")
throw ServerError("Supplied empty world path");
}
+ m_lag += (m_lag > dtime ? -1 : 1) * dtime/100;
#if USE_CURL
// send masterserver announce
{
float &counter = m_masterserver_timer;
if(!isSingleplayer() && (!counter || counter >= 300.0) && g_settings->getBool("server_announce") == true)
{
- ServerList::sendAnnounce(!counter ? "start" : "update", m_clients_names, m_uptime.get(), m_env->getGameTime(), m_gamespec.id, m_mods);
+ ServerList::sendAnnounce(!counter ? "start" : "update", m_clients_names, m_uptime.get(), m_env->getGameTime(), m_lag, m_gamespec.id, m_mods);
counter = 0.01;
}
counter += dtime;
float m_step_dtime;
JMutex m_step_dtime_mutex;
+ float m_lag;
+
// The server mainly operates in this thread
ServerThread *m_thread;
#if USE_CURL
-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;
server["mods"].append(m->name);
}
actionstream << "announcing to " << g_settings->get("serverlist_url") << std::endl;
+ } else {
+ if (lag)
+ server["step"] = lag;
}
- Json::StyledWriter writer;
+ Json::FastWriter writer;
HTTPFetchRequest fetchrequest;
- fetchrequest.url = g_settings->get("serverlist_url")
- + std::string("/announce?json=")
- + urlencode(writer.write(server));
- fetchrequest.useragent = std::string("Minetest ")+minetest_version_hash;
- fetchrequest.caller = HTTPFETCH_DISCARD;
- fetchrequest.timeout = g_settings->getS32("curl_timeout");
+ 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
std::string serializeJson(std::vector<ServerListSpec>);
#if USE_CURL
void sendAnnounce(std::string action = "", const std::vector<std::string> & clients_names = std::vector<std::string>(),
- double uptime = 0, u32 game_time = 0,std::string gameid = "",
+ double uptime = 0, u32 game_time = 0, float lag = 0, std::string gameid = "",
std::vector<ModSpec> mods = std::vector<ModSpec>());
#endif
} //ServerList namespace
{{? !master.no_description}}<th>Description</th>{{?}}
{{? !master.no_flags}}<th>Flags</th>{{?}}
{{? !master.no_uptime}}<th>Uptime, Age</th>{{?}}
- {{? !master.no_ping}}<th>Ping</th>{{?}}
+ {{? !master.no_ping}}<th>Ping, Lag</th>{{?}}
</tr>
{{~it.list :server:index}}
{{ if (master.limit && index + 1 > master.limit) break;}}
</td>{{?}}
{{? !master.no_ping}}
<td class="ping">
- {{=Math.floor(server.ping * 1000)}}
+ {{=Math.floor(server.ping * 1000)}}{{? server.lag}}, {{= Math.floor(server.lag * 1000)}}{{?}}
</td>{{?}}
</tr>
{{~}}