]> 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 85314a3bc319653d82da9eb471fc245e97cd2979..7b723d14cd9d865c39bdb31641607287d3d9232b 100644 (file)
@@ -33,7 +33,8 @@ int ModApiServer::l_request_shutdown(lua_State *L)
        NO_MAP_LOCK_REQUIRED;
        const char *msg = lua_tolstring(L, 1, NULL);
        bool reconnect = lua_toboolean(L, 2);
-       getServer(L)->requestShutdown(msg ? msg : "", reconnect);
+       float seconds_before_shutdown = lua_tonumber(L, 3);
+       getServer(L)->requestShutdown(msg ? msg : "", reconnect, seconds_before_shutdown);
        return 0;
 }
 
@@ -45,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)
 {
@@ -83,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());
        }
@@ -96,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
@@ -117,15 +137,14 @@ int ModApiServer::l_get_player_ip(lua_State *L)
        }
 }
 
-// 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;
        }
@@ -212,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);
@@ -268,15 +287,15 @@ 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);
        }
@@ -304,9 +323,9 @@ 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;
        }
@@ -315,6 +334,22 @@ int ModApiServer::l_kick_player(lua_State *L)
        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)
 {
@@ -382,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);
        }
@@ -464,40 +499,11 @@ int ModApiServer::l_set_last_run_mod(lua_State *L)
        return 0;
 }
 
-#ifndef NDEBUG
-// cause_error(type_of_error)
-int ModApiServer::l_cause_error(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");
-       }
-
-       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);
 
@@ -505,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);
@@ -518,12 +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);
 
        API_FCT(get_last_run_mod);
        API_FCT(set_last_run_mod);
-#ifndef NDEBUG
-       API_FCT(cause_error);
-#endif
 }