Remplement and improve /setting in Lua, now called /set
authorPerttu Ahola <celeron55@gmail.com>
Sun, 1 Apr 2012 10:08:52 +0000 (13:08 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 1 Apr 2012 10:08:52 +0000 (13:08 +0300)
builtin/chatcommands.lua
doc/lua_api.txt
src/scriptapi.cpp
src/servercommand.cpp

index 570c07b05a77e762d5b67ca2635c3797ef5667bb..d2bf62c6aee1ce2df368aac30993435ce7795202 100644 (file)
@@ -1,7 +1,7 @@
 -- Minetest: builtin/chatcommands.lua
 
 --
--- Chat commands
+-- Chat command handler
 --
 
 minetest.chatcommands = {}
@@ -13,7 +13,43 @@ function minetest.register_chatcommand(cmd, def)
        minetest.chatcommands[cmd] = def
 end
 
--- Register the help command
+minetest.register_on_chat_message(function(name, message)
+       local cmd, param = string.match(message, "/([^ ]+) *(.*)")
+       if not param then
+               param = ""
+       end
+       local cmd_def = minetest.chatcommands[cmd]
+       if cmd_def then
+               if not cmd_def.func then
+                       -- This is a C++ command
+                       return false
+               else
+                       local has_privs, missing_privs = minetest.check_player_privs(name, cmd_def.privs)
+                       if has_privs then
+                               cmd_def.func(name, param)
+                       else
+                               minetest.chat_send_player(name, "You don't have permission to run this command (missing privileges: "..table.concat(missing_privs, ", ")..")")
+                       end
+                       return true -- handled chat message
+               end
+       end
+       return false
+end)
+
+--
+-- Chat commands
+--
+
+-- Register C++ commands without functions
+minetest.register_chatcommand("me", {params = nil, description = "chat action (eg. /me orders a pizza)"})
+minetest.register_chatcommand("status", {description = "print server status line"})
+minetest.register_chatcommand("shutdown", {params = "", description = "shutdown server", privs = {server=true}})
+minetest.register_chatcommand("clearobjects", {params = "", description = "clear all objects in world", privs = {server=true}})
+minetest.register_chatcommand("time", {params = "<0...24000>", description = "set time of day", privs = {settime=true}})
+minetest.register_chatcommand("ban", {params = "<name>", description = "ban IP of player", privs = {ban=true}})
+minetest.register_chatcommand("unban", {params = "<name/ip>", description = "remove IP ban", privs = {ban=true}})
+
+-- Register other commands
 minetest.register_chatcommand("help", {
        privs = {},
        params = "(nothing)/all/privs/<cmd>",
@@ -58,18 +94,6 @@ minetest.register_chatcommand("help", {
                end
        end,
 })
-
--- Register C++ commands without functions
-minetest.register_chatcommand("me", {params = nil, description = "chat action (eg. /me orders a pizza)"})
-minetest.register_chatcommand("status", {description = "print server status line"})
-minetest.register_chatcommand("shutdown", {params = "", description = "shutdown server", privs = {server=true}})
-minetest.register_chatcommand("setting", {params = "<name> = <value>", description = "set line in configuration file", privs = {server=true}})
-minetest.register_chatcommand("clearobjects", {params = "", description = "clear all objects in world", privs = {server=true}})
-minetest.register_chatcommand("time", {params = "<0...24000>", description = "set time of day", privs = {settime=true}})
-minetest.register_chatcommand("ban", {params = "<name>", description = "ban IP of player", privs = {ban=true}})
-minetest.register_chatcommand("unban", {params = "<name/ip>", description = "remove IP ban", privs = {ban=true}})
-
--- Register some other commands
 minetest.register_chatcommand("privs", {
        params = "<name>",
        description = "print out privileges of player",
@@ -272,31 +296,37 @@ minetest.register_chatcommand("teleport", {
        end,
 })
 
---
--- Builtin chat handler
---
-
-minetest.register_on_chat_message(function(name, message)
-       local cmd, param = string.match(message, "/([^ ]+) *(.*)")
-       if not param then
-               param = ""
-       end
-       local cmd_def = minetest.chatcommands[cmd]
-       if cmd_def then
-               if not cmd_def.func then
-                       -- This is a C++ command
-                       return false
-               else
-                       local has_privs, missing_privs = minetest.check_player_privs(name, cmd_def.privs)
-                       if has_privs then
-                               cmd_def.func(name, param)
-                       else
-                               minetest.chat_send_player(name, "You don't have permission to run this command (missing privileges: "..table.concat(missing_privs, ", ")..")")
+minetest.register_chatcommand("set", {
+       params = "[-n] <name> <value> | <name>",
+       description = "set or read server configuration setting",
+       privs = {server=true},
+       func = function(name, param)
+               local arg, setname, setvalue = string.match(param, "(-[n]) ([^ ]+) (.+)")
+               if arg and arg == "n" and setname and setvalue then
+                       minetest.setting_set(setname, setvalue)
+                       minetest.chat_send_player(name, setname.." = "..setvalue)
+                       return
+               end
+               local setname, setvalue = string.match(param, "([^ ]+) (.+)")
+               if setname and setvalue then
+                       if not minetest.setting_get(setname) then
+                               minetest.chat_send_player(name, "Failed. Use '/set -n <name> <value>' to create a new setting.")
+                               return
                        end
-                       return true -- handled chat message
+                       minetest.setting_set(setname, setvalue)
+                       minetest.chat_send_player(name, setname.." = "..setvalue)
+                       return
                end
-       end
-       return false
-end)
-
+               local setname = string.match(param, "([^ ]+)")
+               if setname then
+                       local setvalue = minetest.setting_get(setname)
+                       if not setvalue then
+                               setvalue = "<not set>"
+                       end
+                       minetest.chat_send_player(name, setname.." = "..setvalue)
+                       return
+               end
+               minetest.chat_send_player(name, "Invalid parameters (see /help set)")
+       end,
+})
 
index 61cb73f30e23b9c2e4674f40ccb0b3724e59b1e6..798ea607c5f259d54c2594ec0e3869d369f0f840 100644 (file)
@@ -516,6 +516,7 @@ minetest.register_authentication_handler(handler)
 ^ See minetest.builtin_auth_handler in builtin.lua for reference
 
 Setting-related:
+minetest.setting_set(name, value)
 minetest.setting_get(name) -> string or nil
 minetest.setting_getbool(name) -> boolean value or nil
 minetest.add_to_creative_inventory(itemstring)
index ac51422096f7b060e80d34c9ee66d483938bcdde..f8fca00c7f83ecb94c90251c3c6cdfa3ba3d8c0e 100644 (file)
@@ -3800,6 +3800,15 @@ static int l_register_craft(lua_State *L)
        return 0; /* number of results */
 }
 
+// setting_set(name, value)
+static int l_setting_set(lua_State *L)
+{
+       const char *name = luaL_checkstring(L, 1);
+       const char *value = luaL_checkstring(L, 2);
+       g_settings->set(name, value);
+       return 0;
+}
+
 // setting_get(name)
 static int l_setting_get(lua_State *L)
 {
@@ -4006,6 +4015,7 @@ static const struct luaL_Reg minetest_f [] = {
        {"register_item_raw", l_register_item_raw},
        {"register_alias_raw", l_register_alias_raw},
        {"register_craft", l_register_craft},
+       {"setting_set", l_setting_set},
        {"setting_get", l_setting_get},
        {"setting_getbool", l_setting_getbool},
        {"chat_send_all", l_chat_send_all},
index f6088925ea851d4067c7feac43b0b84c15b1cdd6..2c74c81ea9d73677f0830866384d33819d8ff365 100644 (file)
@@ -79,30 +79,6 @@ void cmd_shutdown(std::wostringstream &os,
        ctx->flags |= SEND_TO_OTHERS;
 }
 
-void cmd_setting(std::wostringstream &os,
-       ServerCommandContext *ctx)
-{
-       if(!ctx->server->checkPriv(ctx->player->getName(), "server"))
-       {
-               os<<L"-!- You don't have permission to do that";
-               return;
-       }
-
-       /*std::string confline = wide_to_narrow(
-                       ctx->parms[1] + L" = " + ctx->params[2]);*/
-
-       std::string confline = wide_to_narrow(ctx->paramstring);
-       
-       actionstream<<ctx->player->getName()
-                       <<" sets: "<<confline<<std::endl;
-
-       g_settings->parseConfigLine(confline);
-       
-       ctx->server->saveConfig();
-
-       os<< L"-!- Setting changed and configuration saved.";
-}
-
 void cmd_banunban(std::wostringstream &os, ServerCommandContext *ctx)
 {
        if(!ctx->server->checkPriv(ctx->player->getName(), "ban"))
@@ -194,8 +170,6 @@ std::wstring processServerCommand(ServerCommandContext *ctx)
                cmd_time(os, ctx);
        else if(ctx->parms[0] == L"shutdown")
                cmd_shutdown(os, ctx);
-       else if(ctx->parms[0] == L"setting")
-               cmd_setting(os, ctx);
        else if(ctx->parms[0] == L"ban" || ctx->parms[0] == L"unban")
                cmd_banunban(os, ctx);
        else if(ctx->parms[0] == L"me")