From ae0d8f74d747fab2fbe5b4553818e0f938e3289d Mon Sep 17 00:00:00 2001 From: red-001 Date: Wed, 19 Apr 2017 14:16:54 +0100 Subject: [PATCH] Add function to get server info. --- clientmods/preview/init.lua | 6 +++++- doc/client_lua_api.md | 18 +++++++++++++----- src/client.cpp | 8 ++++---- src/client.h | 16 +++++++++++++--- src/game.cpp | 4 ++-- src/script/lua_api/l_client.cpp | 18 ++++++++++++++---- src/script/lua_api/l_client.h | 4 ++-- 7 files changed, 53 insertions(+), 21 deletions(-) diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua index 255c0b83f..fb606b3f4 100644 --- a/clientmods/preview/init.lua +++ b/clientmods/preview/init.lua @@ -8,6 +8,11 @@ end) core.register_on_connect(function() 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) core.register_on_placenode(function(pointed_thing, node) @@ -80,7 +85,6 @@ core.after(2, function() print("[PREVIEW] loaded " .. modname .. " mod") modstorage:set_string("current_mod", modname) print(modstorage:get_string("current_mod")) - print("Server version:" .. core.get_protocol_version()) preview_minimap() end) diff --git a/doc/client_lua_api.md b/doc/client_lua_api.md index 3e81818ae..b76a406ea 100644 --- a/doc/client_lua_api.md +++ b/doc/client_lua_api.md @@ -702,11 +702,10 @@ Call these functions only at load time! * `minetest.disconnect()` * Disconnect from the server and exit to main menu. * 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()` * Take a screenshot. +* `minetest.get_server_info()` + * Returns [server info](#server-info). ### Misc. * `minetest.parse_json(string[, nullvalue])`: returns something @@ -932,9 +931,18 @@ Can be obtained via `minetest.get_meta(pos)`. { params = " ", -- Short parameter description description = "Remove privilege from player", -- Full description - func = function(param), -- Called when command is run. - -- Returns boolean success and text output. + func = function(param), -- Called when command is run. + -- 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 ---------------- diff --git a/src/client.cpp b/src/client.cpp index 3269c573a..1e17e7c11 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -58,6 +58,7 @@ Client::Client( IrrlichtDevice *device, const char *playername, const std::string &password, + const std::string &address_name, MapDrawControl &control, IWritableTextureSource *tsrc, IWritableShaderSource *shsrc, @@ -89,6 +90,7 @@ Client::Client( ), m_particle_manager(&m_env), m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this), + m_address_name(address_name), m_device(device), m_camera(NULL), m_minimap_disabled_by_server(false), @@ -253,13 +255,11 @@ Client::~Client() delete m_minimap; } -void Client::connect(Address address, - const std::string &address_name, - bool is_local_server) +void Client::connect(Address address, bool is_local_server) { DSTACK(FUNCTION_NAME); - initLocalMapSaving(address, address_name, is_local_server); + initLocalMapSaving(address, m_address_name, is_local_server); m_con.SetTimeoutMs(0); m_con.Connect(address); diff --git a/src/client.h b/src/client.h index 0dd519308..11b670977 100644 --- a/src/client.h +++ b/src/client.h @@ -257,6 +257,7 @@ public: IrrlichtDevice *device, const char *playername, const std::string &password, + const std::string &address_name, MapDrawControl &control, IWritableTextureSource *tsrc, IWritableShaderSource *shsrc, @@ -284,9 +285,7 @@ public: The name of the local player should already be set when calling this, as it is sent in the initialization. */ - void connect(Address address, - const std::string &address_name, - bool is_local_server); + void connect(Address address, bool is_local_server); /* Stuff that references the environment is valid only as @@ -525,6 +524,16 @@ public: 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: // Virtual methods from con::PeerHandler @@ -576,6 +585,7 @@ private: ClientEnvironment m_env; ParticleManager m_particle_manager; con::Connection m_con; + std::string m_address_name; IrrlichtDevice *m_device; Camera *m_camera; Minimap *m_minimap; diff --git a/src/game.cpp b/src/game.cpp index 7dd9c942d..be0cc8fd5 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2044,7 +2044,7 @@ bool Game::connectToServer(const std::string &playername, } client = new Client(device, - playername.c_str(), password, + playername.c_str(), password, *address, *draw_control, texture_src, shader_src, itemdef_manager, nodedef_manager, sound, eventmgr, connect_address.isIPv6(), &flags); @@ -2056,7 +2056,7 @@ bool Game::connectToServer(const std::string &playername, connect_address.print(&infostream); infostream << std::endl; - client->connect(connect_address, *address, + client->connect(connect_address, simple_singleplayer_mode || local_server_mode); /* diff --git a/src/script/lua_api/l_client.cpp b/src/script/lua_api/l_client.cpp index c982a2f11..7f89a4d5d 100644 --- a/src/script/lua_api/l_client.cpp +++ b/src/script/lua_api/l_client.cpp @@ -234,10 +234,20 @@ int ModApiClient::l_sound_stop(lua_State *L) return 0; } -// get_protocol_version() -int ModApiClient::l_get_protocol_version(lua_State *L) +// get_server_info() +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; } @@ -265,6 +275,6 @@ void ModApiClient::Initialize(lua_State *L, int top) API_FCT(get_meta); API_FCT(sound_play); API_FCT(sound_stop); - API_FCT(get_protocol_version); + API_FCT(get_server_info); API_FCT(take_screenshot); } diff --git a/src/script/lua_api/l_client.h b/src/script/lua_api/l_client.h index 6afcd996b..a36d7e51c 100644 --- a/src/script/lua_api/l_client.h +++ b/src/script/lua_api/l_client.h @@ -69,8 +69,8 @@ private: static int l_sound_stop(lua_State *L); - // get_protocol_version() - static int l_get_protocol_version(lua_State *L); + // get_server_info() + static int l_get_server_info(lua_State *L); static int l_take_screenshot(lua_State *L);