Add function to get server info.

This commit is contained in:
red-001 2017-04-19 14:16:54 +01:00 committed by paramat
parent 468eeb618e
commit ae0d8f74d7
7 changed files with 53 additions and 21 deletions

@ -8,6 +8,11 @@ end)
core.register_on_connect(function() core.register_on_connect(function()
print("[PREVIEW] Player connection completed") print("[PREVIEW] Player connection completed")
local server_info = core.get_server_info()
print("Server version: " .. server_info.protocol_version)
print("Server ip: " .. server_info.ip)
print("Server address: " .. server_info.address)
print("Server port: " .. server_info.port)
end) end)
core.register_on_placenode(function(pointed_thing, node) core.register_on_placenode(function(pointed_thing, node)
@ -80,7 +85,6 @@ core.after(2, function()
print("[PREVIEW] loaded " .. modname .. " mod") print("[PREVIEW] loaded " .. modname .. " mod")
modstorage:set_string("current_mod", modname) modstorage:set_string("current_mod", modname)
print(modstorage:get_string("current_mod")) print(modstorage:get_string("current_mod"))
print("Server version:" .. core.get_protocol_version())
preview_minimap() preview_minimap()
end) end)

@ -702,11 +702,10 @@ Call these functions only at load time!
* `minetest.disconnect()` * `minetest.disconnect()`
* Disconnect from the server and exit to main menu. * Disconnect from the server and exit to main menu.
* Returns `false` if the client is already disconnecting otherwise returns `true`. * Returns `false` if the client is already disconnecting otherwise returns `true`.
* `minetest.get_protocol_version()`
* Returns the protocol version of the server.
* Might not be accurate at start up as the client might not be connected to the server yet, in that case it will return 0.
* `minetest.take_screenshot()` * `minetest.take_screenshot()`
* Take a screenshot. * Take a screenshot.
* `minetest.get_server_info()`
* Returns [server info](#server-info).
### Misc. ### Misc.
* `minetest.parse_json(string[, nullvalue])`: returns something * `minetest.parse_json(string[, nullvalue])`: returns something
@ -932,9 +931,18 @@ Can be obtained via `minetest.get_meta(pos)`.
{ {
params = "<name> <privilege>", -- Short parameter description params = "<name> <privilege>", -- Short parameter description
description = "Remove privilege from player", -- Full description description = "Remove privilege from player", -- Full description
func = function(param), -- Called when command is run. func = function(param), -- Called when command is run.
-- Returns boolean success and text output. -- Returns boolean success and text output.
} }
### Server info
```lua
{
address = "minetest.example.org", -- The domain name/IP address of a remote server or "" for a local server.
ip = "203.0.113.156", -- The IP address of the server.
port = 30000, -- The port the client is connected to.
protocol_version = 30 -- Will not be accurate at start up as the client might not be connected to the server yet, in that case it will be 0.
}
```
Escape sequences Escape sequences
---------------- ----------------

@ -58,6 +58,7 @@ Client::Client(
IrrlichtDevice *device, IrrlichtDevice *device,
const char *playername, const char *playername,
const std::string &password, const std::string &password,
const std::string &address_name,
MapDrawControl &control, MapDrawControl &control,
IWritableTextureSource *tsrc, IWritableTextureSource *tsrc,
IWritableShaderSource *shsrc, IWritableShaderSource *shsrc,
@ -89,6 +90,7 @@ Client::Client(
), ),
m_particle_manager(&m_env), m_particle_manager(&m_env),
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this), m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this),
m_address_name(address_name),
m_device(device), m_device(device),
m_camera(NULL), m_camera(NULL),
m_minimap_disabled_by_server(false), m_minimap_disabled_by_server(false),
@ -253,13 +255,11 @@ Client::~Client()
delete m_minimap; delete m_minimap;
} }
void Client::connect(Address address, void Client::connect(Address address, bool is_local_server)
const std::string &address_name,
bool is_local_server)
{ {
DSTACK(FUNCTION_NAME); DSTACK(FUNCTION_NAME);
initLocalMapSaving(address, address_name, is_local_server); initLocalMapSaving(address, m_address_name, is_local_server);
m_con.SetTimeoutMs(0); m_con.SetTimeoutMs(0);
m_con.Connect(address); m_con.Connect(address);

@ -257,6 +257,7 @@ public:
IrrlichtDevice *device, IrrlichtDevice *device,
const char *playername, const char *playername,
const std::string &password, const std::string &password,
const std::string &address_name,
MapDrawControl &control, MapDrawControl &control,
IWritableTextureSource *tsrc, IWritableTextureSource *tsrc,
IWritableShaderSource *shsrc, IWritableShaderSource *shsrc,
@ -284,9 +285,7 @@ public:
The name of the local player should already be set when The name of the local player should already be set when
calling this, as it is sent in the initialization. calling this, as it is sent in the initialization.
*/ */
void connect(Address address, void connect(Address address, bool is_local_server);
const std::string &address_name,
bool is_local_server);
/* /*
Stuff that references the environment is valid only as Stuff that references the environment is valid only as
@ -525,6 +524,16 @@ public:
IrrlichtDevice *getDevice() const { return m_device; } IrrlichtDevice *getDevice() const { return m_device; }
const Address getServerAddress()
{
return m_con.GetPeerAddress(PEER_ID_SERVER);
}
const std::string &getAddressName() const
{
return m_address_name;
}
private: private:
// Virtual methods from con::PeerHandler // Virtual methods from con::PeerHandler
@ -576,6 +585,7 @@ private:
ClientEnvironment m_env; ClientEnvironment m_env;
ParticleManager m_particle_manager; ParticleManager m_particle_manager;
con::Connection m_con; con::Connection m_con;
std::string m_address_name;
IrrlichtDevice *m_device; IrrlichtDevice *m_device;
Camera *m_camera; Camera *m_camera;
Minimap *m_minimap; Minimap *m_minimap;

@ -2044,7 +2044,7 @@ bool Game::connectToServer(const std::string &playername,
} }
client = new Client(device, client = new Client(device,
playername.c_str(), password, playername.c_str(), password, *address,
*draw_control, texture_src, shader_src, *draw_control, texture_src, shader_src,
itemdef_manager, nodedef_manager, sound, eventmgr, itemdef_manager, nodedef_manager, sound, eventmgr,
connect_address.isIPv6(), &flags); connect_address.isIPv6(), &flags);
@ -2056,7 +2056,7 @@ bool Game::connectToServer(const std::string &playername,
connect_address.print(&infostream); connect_address.print(&infostream);
infostream << std::endl; infostream << std::endl;
client->connect(connect_address, *address, client->connect(connect_address,
simple_singleplayer_mode || local_server_mode); simple_singleplayer_mode || local_server_mode);
/* /*

@ -234,10 +234,20 @@ int ModApiClient::l_sound_stop(lua_State *L)
return 0; return 0;
} }
// get_protocol_version() // get_server_info()
int ModApiClient::l_get_protocol_version(lua_State *L) int ModApiClient::l_get_server_info(lua_State *L)
{ {
lua_pushinteger(L, getClient(L)->getProtoVersion()); Client *client = getClient(L);
Address serverAddress = client->getServerAddress();
lua_newtable(L);
lua_pushstring(L, client->getAddressName().c_str());
lua_setfield(L, -2, "address");
lua_pushstring(L, serverAddress.serializeString().c_str());
lua_setfield(L, -2, "ip");
lua_pushinteger(L, serverAddress.getPort());
lua_setfield(L, -2, "port");
lua_pushinteger(L, client->getProtoVersion());
lua_setfield(L, -2, "protocol_version");
return 1; return 1;
} }
@ -265,6 +275,6 @@ void ModApiClient::Initialize(lua_State *L, int top)
API_FCT(get_meta); API_FCT(get_meta);
API_FCT(sound_play); API_FCT(sound_play);
API_FCT(sound_stop); API_FCT(sound_stop);
API_FCT(get_protocol_version); API_FCT(get_server_info);
API_FCT(take_screenshot); API_FCT(take_screenshot);
} }

@ -69,8 +69,8 @@ private:
static int l_sound_stop(lua_State *L); static int l_sound_stop(lua_State *L);
// get_protocol_version() // get_server_info()
static int l_get_protocol_version(lua_State *L); static int l_get_server_info(lua_State *L);
static int l_take_screenshot(lua_State *L); static int l_take_screenshot(lua_State *L);