diff --git a/builtin/chatcommands.lua b/builtin/chatcommands.lua index 570c07b05..d2bf62c6a 100644 --- a/builtin/chatcommands.lua +++ b/builtin/chatcommands.lua @@ -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 = "", description = "ban IP of player", privs = {ban=true}}) +minetest.register_chatcommand("unban", {params = "", description = "remove IP ban", privs = {ban=true}}) + +-- Register other commands minetest.register_chatcommand("help", { privs = {}, params = "(nothing)/all/privs/", @@ -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 = " = ", 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 = "", description = "ban IP of player", privs = {ban=true}}) -minetest.register_chatcommand("unban", {params = "", description = "remove IP ban", privs = {ban=true}}) - --- Register some other commands minetest.register_chatcommand("privs", { params = "", 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, ", ")..")") - end - return true -- handled chat message +minetest.register_chatcommand("set", { + params = "[-n] | ", + 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 - end - return false -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 ' to create a new setting.") + return + end + minetest.setting_set(setname, setvalue) + minetest.chat_send_player(name, setname.." = "..setvalue) + return + end + local setname = string.match(param, "([^ ]+)") + if setname then + local setvalue = minetest.setting_get(setname) + if not setvalue then + setvalue = "" + end + minetest.chat_send_player(name, setname.." = "..setvalue) + return + end + minetest.chat_send_player(name, "Invalid parameters (see /help set)") + end, +}) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 61cb73f30..798ea607c 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -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) diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index ac5142209..f8fca00c7 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -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}, diff --git a/src/servercommand.cpp b/src/servercommand.cpp index f6088925e..2c74c81ea 100644 --- a/src/servercommand.cpp +++ b/src/servercommand.cpp @@ -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<parms[1] + L" = " + ctx->params[2]);*/ - - std::string confline = wide_to_narrow(ctx->paramstring); - - actionstream<player->getName() - <<" sets: "<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")