]> git.lizzy.rs Git - minetest.git/blobdiff - builtin/game/chatcommands.lua
Fix two nul deref if digging unknown nodes. (#5398)
[minetest.git] / builtin / game / chatcommands.lua
index d8fee1578757926f327bf71877d5644ade3b7d8a..745b012e6f03be15bcd7af59bef960c3387afcf5 100644 (file)
@@ -1,25 +1,17 @@
--- Minetest: builtin/chatcommands.lua
+-- Minetest: builtin/game/chatcommands.lua
 
 --
 -- Chat command handler
 --
 
-core.chatcommands = {}
-function core.register_chatcommand(cmd, def)
-       def = def or {}
-       def.params = def.params or ""
-       def.description = def.description or ""
-       def.privs = def.privs or {}
-       def.mod_origin = core.get_current_modname() or "??"
-       core.chatcommands[cmd] = def
-end
+core.chatcommands = core.registered_chatcommands -- BACKWARDS COMPATIBILITY
 
 core.register_on_chat_message(function(name, message)
        local cmd, param = string.match(message, "^/([^ ]+) *(.*)")
        if not param then
                param = ""
        end
-       local cmd_def = core.chatcommands[cmd]
+       local cmd_def = core.registered_chatcommands[cmd]
        if not cmd_def then
                return false
        end
@@ -70,7 +62,8 @@ end
 --
 core.register_chatcommand("me", {
        params = "<action>",
-       description = "chat action (eg. /me orders a pizza)",
+       description = "Display chat action (e.g., '/me orders a pizza' displays"
+                       .. " '<player name> orders a pizza')",
        privs = {shout=true},
        func = function(name, param)
                core.chat_send_all("* " .. name .. " " .. param)
@@ -107,7 +100,7 @@ core.register_chatcommand("help", {
                if param == "" then
                        local msg = ""
                        local cmds = {}
-                       for cmd, def in pairs(core.chatcommands) do
+                       for cmd, def in pairs(core.registered_chatcommands) do
                                if core.check_player_privs(name, def.privs) then
                                        cmds[#cmds + 1] = cmd
                                end
@@ -118,7 +111,7 @@ core.register_chatcommand("help", {
                                        .. " or '/help all' to list everything."
                elseif param == "all" then
                        local cmds = {}
-                       for cmd, def in pairs(core.chatcommands) do
+                       for cmd, def in pairs(core.registered_chatcommands) do
                                if core.check_player_privs(name, def.privs) then
                                        cmds[#cmds + 1] = format_help_line(cmd, def)
                                end
@@ -134,7 +127,7 @@ core.register_chatcommand("help", {
                        return true, "Available privileges:\n"..table.concat(privs, "\n")
                else
                        local cmd = param
-                       local def = core.chatcommands[cmd]
+                       local def = core.registered_chatcommands[cmd]
                        if not def then
                                return false, "Command not available: "..cmd
                        else
@@ -146,12 +139,13 @@ core.register_chatcommand("help", {
 
 core.register_chatcommand("privs", {
        params = "<name>",
-       description = "print out privileges of player",
-       func = function(name, param)
-               param = (param ~= "" and param or name)
-               return true, "Privileges of " .. param .. ": "
+       description = "Print privileges of player",
+       func = function(caller, param)
+               param = param:trim()
+               local name = (param ~= "" and param or caller)
+               return true, "Privileges of " .. name .. ": "
                        .. core.privs_to_string(
-                               core.get_player_privs(param), ' ')
+                               core.get_player_privs(name), ' ')
        end,
 })
 
@@ -160,8 +154,8 @@ local function handle_grant_command(caller, grantname, grantprivstr)
        if not (caller_privs.privs or caller_privs.basic_privs) then
                return false, "Your privileges are insufficient."
        end
-       
-       if not core.auth_table[grantname] then
+
+       if not core.get_auth_handler().get_auth(grantname) then
                return false, "Player " .. grantname .. " does not exist."
        end
        local grantprivs = core.string_to_privs(grantprivstr)
@@ -203,7 +197,7 @@ core.register_chatcommand("grant", {
                local grantname, grantprivstr = string.match(param, "([^ ]+) (.+)")
                if not grantname or not grantprivstr then
                        return false, "Invalid parameters (see /help grant)"
-               end     
+               end
                return handle_grant_command(name, grantname, grantprivstr)
        end,
 })
@@ -214,7 +208,7 @@ core.register_chatcommand("grantme", {
        func = function(name, param)
                if param == "" then
                        return false, "Invalid parameters (see /help grantme)"
-               end     
+               end
                return handle_grant_command(name, name, param)
        end,
 })
@@ -231,7 +225,7 @@ core.register_chatcommand("revoke", {
                local revoke_name, revoke_priv_str = string.match(param, "([^ ]+) (.+)")
                if not revoke_name or not revoke_priv_str then
                        return false, "Invalid parameters (see /help revoke)"
-               elseif not core.auth_table[revoke_name] then
+               elseif not core.get_auth_handler().get_auth(revoke_name) then
                        return false, "Player " .. revoke_name .. " does not exist."
                end
                local revoke_privs = core.string_to_privs(revoke_priv_str)
@@ -268,7 +262,7 @@ core.register_chatcommand("revoke", {
 
 core.register_chatcommand("setpassword", {
        params = "<name> <password>",
-       description = "set given password",
+       description = "Set player's password",
        privs = {password=true},
        func = function(name, param)
                local toname, raw_password = string.match(param, "^([^ ]+) +(.+)$")
@@ -306,7 +300,7 @@ core.register_chatcommand("setpassword", {
 
 core.register_chatcommand("clearpassword", {
        params = "<name>",
-       description = "set empty password",
+       description = "Set empty password",
        privs = {password=true},
        func = function(name, param)
                local toname = param
@@ -323,7 +317,7 @@ core.register_chatcommand("clearpassword", {
 
 core.register_chatcommand("auth_reload", {
        params = "",
-       description = "reload authentication data",
+       description = "Reload authentication data",
        privs = {server=true},
        func = function(name, param)
                local done = core.auth_reload()
@@ -333,7 +327,7 @@ core.register_chatcommand("auth_reload", {
 
 core.register_chatcommand("teleport", {
        params = "<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>",
-       description = "teleport to given position",
+       description = "Teleport to player or position",
        privs = {teleport=true},
        func = function(name, param)
                -- Returns (pos, true) if found, otherwise (pos, false)
@@ -441,7 +435,7 @@ core.register_chatcommand("teleport", {
 
 core.register_chatcommand("set", {
        params = "[-n] <name> <value> | <name>",
-       description = "set or read server configuration setting",
+       description = "Set or read server configuration setting",
        privs = {server=true},
        func = function(name, param)
                local arg, setname, setvalue = string.match(param, "(-[n]) ([^ ]+) (.+)")
@@ -496,7 +490,7 @@ end
 
 core.register_chatcommand("emergeblocks", {
        params = "(here [radius]) | (<pos1> <pos2>)",
-       description = "starts loading (or generating, if inexistent) map blocks "
+       description = "Load (or, if nonexistent, generate) map blocks "
                .. "contained in area pos1 to pos2",
        privs = {server=true},
        func = function(name, param)
@@ -522,7 +516,7 @@ core.register_chatcommand("emergeblocks", {
 
 core.register_chatcommand("deleteblocks", {
        params = "(here [radius]) | (<pos1> <pos2>)",
-       description = "delete map blocks contained in area pos1 to pos2",
+       description = "Delete map blocks contained in area pos1 to pos2",
        privs = {server=true},
        func = function(name, param)
                local p1, p2 = parse_range_str(name, param)
@@ -586,7 +580,7 @@ end
 
 core.register_chatcommand("give", {
        params = "<name> <ItemString>",
-       description = "give item to player",
+       description = "Give item to player",
        privs = {give=true},
        func = function(name, param)
                local toname, itemstring = string.match(param, "^([^ ]+) +(.+)$")
@@ -599,7 +593,7 @@ core.register_chatcommand("give", {
 
 core.register_chatcommand("giveme", {
        params = "<ItemString>",
-       description = "give item to yourself",
+       description = "Give item to yourself",
        privs = {give=true},
        func = function(name, param)
                local itemstring = string.match(param, "(.+)$")
@@ -670,9 +664,9 @@ end)
 
 core.register_chatcommand("rollback_check", {
        params = "[<range>] [<seconds>] [limit]",
-       description = "Check who has last touched a node or near it,"
-                       .. " max. <seconds> ago (default range=0,"
-                       .. " seconds=86400=24h, limit=5)",
+       description = "Check who last touched a node or a node near it"
+                       .. " within the time specified by <seconds>. Default: range = 0,"
+                       .. " seconds = 86400 = 24h, limit = 5",
        privs = {rollback=true},
        func = function(name, param)
                if not core.setting_getbool("enable_rollback_recording") then
@@ -723,7 +717,7 @@ core.register_chatcommand("rollback_check", {
 
 core.register_chatcommand("rollback", {
        params = "<player name> [<seconds>] | :<actor> [<seconds>]",
-       description = "revert actions of a player; default for <seconds> is 60",
+       description = "Revert actions of a player. Default for <seconds> is 60",
        privs = {rollback=true},
        func = function(name, param)
                if not core.setting_getbool("enable_rollback_recording") then
@@ -768,7 +762,7 @@ core.register_chatcommand("status", {
 
 core.register_chatcommand("time", {
        params = "<0..23>:<0..59> | <0..24000>",
-       description = "set time of day",
+       description = "Set time of day",
        privs = {},
        func = function(name, param)
                if param == "" then
@@ -814,12 +808,15 @@ core.register_chatcommand("days", {
 })
 
 core.register_chatcommand("shutdown", {
-       description = "shutdown server",
+       description = "Shutdown server",
+       params = "[reconnect] [message]",
        privs = {server=true},
        func = function(name, param)
                core.log("action", name .. " shuts down server")
-               core.request_shutdown()
                core.chat_send_all("*** Server shutting down (operator request).")
+               local reconnect, message = param:match("([^ ]+)(.*)")
+               message = message or ""
+               core.request_shutdown(message:trim(), core.is_yes(reconnect))
        end,
 })
 
@@ -845,7 +842,7 @@ core.register_chatcommand("ban", {
 
 core.register_chatcommand("unban", {
        params = "<name/ip>",
-       description = "remove IP ban",
+       description = "Remove IP ban",
        privs = {ban=true},
        func = function(name, param)
                if not core.unban_player_or_ip(param) then
@@ -858,7 +855,7 @@ core.register_chatcommand("unban", {
 
 core.register_chatcommand("kick", {
        params = "<name> [reason]",
-       description = "kick a player",
+       description = "Kick a player",
        privs = {kick=true},
        func = function(name, param)
                local tokick, reason = param:match("([^ ]+) (.+)")
@@ -877,7 +874,7 @@ core.register_chatcommand("kick", {
 
 core.register_chatcommand("clearobjects", {
        params = "[full|quick]",
-       description = "clear all objects in world",
+       description = "Clear all objects in world",
        privs = {server=true},
        func = function(name, param)
                local options = {}