]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script/lua_api/l_server.cpp
Allow scripts to get the client protocol version in non-debug builds. (#5649)
[dragonfireclient.git] / src / script / lua_api / l_server.cpp
index 0d892631702d5509ef13f8670351c619f04f8fe6..7b723d14cd9d865c39bdb31641607287d3d9232b 100644 (file)
@@ -30,7 +30,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 // request_shutdown()
 int ModApiServer::l_request_shutdown(lua_State *L)
 {
-       getServer(L)->requestShutdown();
+       NO_MAP_LOCK_REQUIRED;
+       const char *msg = lua_tolstring(L, 1, NULL);
+       bool reconnect = lua_toboolean(L, 2);
+       float seconds_before_shutdown = lua_tonumber(L, 3);
+       getServer(L)->requestShutdown(msg ? msg : "", reconnect, seconds_before_shutdown);
        return 0;
 }
 
@@ -42,6 +46,25 @@ int ModApiServer::l_get_server_status(lua_State *L)
        return 1;
 }
 
+// get_server_uptime()
+int ModApiServer::l_get_server_uptime(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       lua_pushnumber(L, getServer(L)->getUptime());
+       return 1;
+}
+
+
+// print(text)
+int ModApiServer::l_print(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       std::string text;
+       text = luaL_checkstring(L, 1);
+       getServer(L)->printToConsoleOnly(text);
+       return 0;
+}
+
 // chat_send_all(text)
 int ModApiServer::l_chat_send_all(lua_State *L)
 {
@@ -80,7 +103,7 @@ int ModApiServer::l_get_player_privs(lua_State *L)
        int table = lua_gettop(L);
        std::set<std::string> privs_s = server->getPlayerEffectivePrivs(name);
        for(std::set<std::string>::const_iterator
-                       i = privs_s.begin(); i != privs_s.end(); i++){
+                       i = privs_s.begin(); i != privs_s.end(); ++i){
                lua_pushboolean(L, true);
                lua_setfield(L, table, i->c_str());
        }
@@ -93,7 +116,7 @@ int ModApiServer::l_get_player_ip(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
        const char * name = luaL_checkstring(L, 1);
-       Player *player = getEnv(L)->getPlayer(name);
+       RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
        if(player == NULL)
        {
                lua_pushnil(L); // no such player
@@ -108,21 +131,20 @@ int ModApiServer::l_get_player_ip(lua_State *L)
        }
        catch(con::PeerNotFoundException) // unlikely
        {
-               dstream << __FUNCTION_NAME << ": peer was not found" << std::endl;
+               dstream << FUNCTION_NAME << ": peer was not found" << std::endl;
                lua_pushnil(L); // error
                return 1;
        }
 }
 
-// get_player_information()
+// get_player_information(name)
 int ModApiServer::l_get_player_information(lua_State *L)
 {
 
        NO_MAP_LOCK_REQUIRED;
        const char * name = luaL_checkstring(L, 1);
-       Player *player = getEnv(L)->getPlayer(name);
-       if(player == NULL)
-       {
+       RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
+       if (player == NULL) {
                lua_pushnil(L); // no such player
                return 1;
        }
@@ -134,7 +156,7 @@ int ModApiServer::l_get_player_information(lua_State *L)
        }
        catch(con::PeerNotFoundException) // unlikely
        {
-               dstream << __FUNCTION_NAME << ": peer was not found" << std::endl;
+               dstream << FUNCTION_NAME << ": peer was not found" << std::endl;
                lua_pushnil(L); // error
                return 1;
        }
@@ -148,7 +170,7 @@ int ModApiServer::l_get_player_information(lua_State *L)
 
 #define ERET(code)                                                             \
        if (!(code)) {                                                             \
-               dstream << __FUNCTION_NAME << ": peer was not found" << std::endl;     \
+               dstream << FUNCTION_NAME << ": peer was not found" << std::endl;     \
                lua_pushnil(L); /* error */                                            \
                return 1;                                                              \
        }
@@ -209,15 +231,15 @@ int ModApiServer::l_get_player_information(lua_State *L)
        lua_pushnumber(L, uptime);
        lua_settable(L, table);
 
+       lua_pushstring(L,"protocol_version");
+       lua_pushnumber(L, prot_vers);
+       lua_settable(L, table);
+       
 #ifndef NDEBUG
        lua_pushstring(L,"serialization_version");
        lua_pushnumber(L, ser_vers);
        lua_settable(L, table);
 
-       lua_pushstring(L,"protocol_version");
-       lua_pushnumber(L, prot_vers);
-       lua_settable(L, table);
-
        lua_pushstring(L,"major");
        lua_pushnumber(L, major);
        lua_settable(L, table);
@@ -265,21 +287,21 @@ int ModApiServer::l_ban_player(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
        const char * name = luaL_checkstring(L, 1);
-       Player *player = getEnv(L)->getPlayer(name);
-       if(player == NULL)
-       {
+       RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
+       if (player == NULL) {
                lua_pushboolean(L, false); // no such player
                return 1;
        }
        try
        {
-               Address addr = getServer(L)->getPeerAddress(getEnv(L)->getPlayer(name)->peer_id);
+               Address addr = getServer(L)->getPeerAddress(
+                       dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name)->peer_id);
                std::string ip_str = addr.serializeString();
                getServer(L)->setIpBanned(ip_str, name);
        }
        catch(con::PeerNotFoundException) // unlikely
        {
-               dstream << __FUNCTION_NAME << ": peer was not found" << std::endl;
+               dstream << FUNCTION_NAME << ": peer was not found" << std::endl;
                lua_pushboolean(L, false); // error
                return 1;
        }
@@ -301,17 +323,33 @@ int ModApiServer::l_kick_player(lua_State *L)
        {
                message = "Kicked.";
        }
-       Player *player = getEnv(L)->getPlayer(name);
-       if (player == NULL)
-       {
+
+       RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
+       if (player == NULL) {
                lua_pushboolean(L, false); // No such player
                return 1;
        }
-       getServer(L)->DenyAccess_Legacy(player->peer_id, narrow_to_wide(message));
+       getServer(L)->DenyAccess_Legacy(player->peer_id, utf8_to_wide(message));
        lua_pushboolean(L, true);
        return 1;
 }
 
+int ModApiServer::l_remove_player(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       std::string name = luaL_checkstring(L, 1);
+       ServerEnvironment *s_env = dynamic_cast<ServerEnvironment *>(getEnv(L));
+       assert(s_env);
+
+       RemotePlayer *player = s_env->getPlayer(name.c_str());
+       if (!player)
+               lua_pushinteger(L, s_env->removePlayerFromDatabase(name) ? 0 : 1);
+       else
+               lua_pushinteger(L, 2);
+
+       return 1;
+}
+
 // unban_player_or_ip()
 int ModApiServer::l_unban_player_or_ip(lua_State *L)
 {
@@ -343,7 +381,7 @@ int ModApiServer::l_show_formspec(lua_State *L)
 int ModApiServer::l_get_current_modname(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
-       lua_getfield(L, LUA_REGISTRYINDEX, SCRIPT_MOD_NAME_FIELD);
+       lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME);
        return 1;
 }
 
@@ -379,7 +417,7 @@ int ModApiServer::l_get_modnames(lua_State *L)
        // Package them up for Lua
        lua_createtable(L, modlist.size(), 0);
        std::vector<std::string>::iterator iter = modlist.begin();
-       for (u16 i = 0; iter != modlist.end(); iter++) {
+       for (u16 i = 0; iter != modlist.end(); ++iter) {
                lua_pushstring(L, iter->c_str());
                lua_rawseti(L, -2, ++i);
        }
@@ -436,40 +474,36 @@ int ModApiServer::l_notify_authentication_modified(lua_State *L)
        return 0;
 }
 
-#ifndef NDEBUG
-// cause_error(type_of_error)
-int ModApiServer::l_cause_error(lua_State *L)
+// get_last_run_mod()
+int ModApiServer::l_get_last_run_mod(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
-       std::string type_of_error = "none";
-       if(lua_isstring(L, 1))
-               type_of_error = lua_tostring(L, 1);
-
-       errorstream << "Error handler test called, errortype=" << type_of_error << std::endl;
-
-       if(type_of_error == "segv") {
-               volatile int* some_pointer = 0;
-               errorstream << "Cause a sigsegv now: " << (*some_pointer) << std::endl;
-
-       } else if (type_of_error == "zerodivision") {
-
-               unsigned int some_number = porting::getTimeS();
-               unsigned int zerovalue = 0;
-               unsigned int result = some_number / zerovalue;
-               errorstream << "Well this shouldn't ever be shown: " << result << std::endl;
-
-       } else if (type_of_error == "exception") {
-               throw BaseException("Errorhandler test fct called");
+       lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME);
+       const char *current_mod = lua_tostring(L, -1);
+       if (current_mod == NULL || current_mod[0] == '\0') {
+               lua_pop(L, 1);
+               lua_pushstring(L, getScriptApiBase(L)->getOrigin().c_str());
        }
+       return 1;
+}
 
+// set_last_run_mod(modname)
+int ModApiServer::l_set_last_run_mod(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+#ifdef SCRIPTAPI_DEBUG
+       const char *mod = lua_tostring(L, 1);
+       getScriptApiBase(L)->setOriginDirect(mod);
+       //printf(">>>> last mod set from Lua: %s\n", mod);
+#endif
        return 0;
 }
-#endif
 
 void ModApiServer::Initialize(lua_State *L, int top)
 {
        API_FCT(request_shutdown);
        API_FCT(get_server_status);
+       API_FCT(get_server_uptime);
        API_FCT(get_worldpath);
        API_FCT(is_singleplayer);
 
@@ -477,6 +511,8 @@ void ModApiServer::Initialize(lua_State *L, int top)
        API_FCT(get_modpath);
        API_FCT(get_modnames);
 
+       API_FCT(print);
+
        API_FCT(chat_send_all);
        API_FCT(chat_send_player);
        API_FCT(show_formspec);
@@ -490,10 +526,10 @@ void ModApiServer::Initialize(lua_State *L, int top)
        API_FCT(get_ban_description);
        API_FCT(ban_player);
        API_FCT(kick_player);
+       API_FCT(remove_player);
        API_FCT(unban_player_or_ip);
        API_FCT(notify_authentication_modified);
 
-#ifndef NDEBUG
-       API_FCT(cause_error);
-#endif
+       API_FCT(get_last_run_mod);
+       API_FCT(set_last_run_mod);
 }