From 3ab7572f3cd72b762fc3e5d8ebd4e664240d2bff Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 16 Jan 2018 22:04:19 +0100 Subject: [PATCH] Add substitutes --- init.lua | 64 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/init.lua b/init.lua index dd140c1..a1eb9e6 100644 --- a/init.lua +++ b/init.lua @@ -37,6 +37,46 @@ local get_commands = function(itemstack) return cmds end +--[[ Takes a command and substitutes placeholders like “@playername” with the actual values. +This operation might fail. +Returns the substituted command on success. +Returns false on failure. ]] +local substitute_placeholders = function(command, itemstack, player, pointed_thing) + local pos_pt, pos_pl + pos_pl = player:get_pos() + if pointed_thing.type == "node" then + pos_pt = pointed_thing.under + + command = string.gsub(command, "@ptx", pos_pt.x) + command = string.gsub(command, "@pty", pos_pt.y) + command = string.gsub(command, "@ptz", pos_pt.z) + + local node = minetest.get_node(pos_pt) + command = string.gsub(command, "@nodename", node.name) + command = string.gsub(command, "@param2", node.param2) + else + -- If one of the coordinate parameters is in the command, but + -- the pointed thing is not a node, we have to fail as the placeholders + -- are meaningless. + local coord = {"@ptx", "@pty", "@ptz", "@nodename", "@param2", "@light"} + for c=1, #coord do + if string.find(command, coord[c]) ~= nil then + return false + end + end + end + + command = string.gsub(command, "@plx", pos_pl.x) + command = string.gsub(command, "@ply", pos_pl.y) + command = string.gsub(command, "@plz", pos_pl.z) + + command = string.gsub(command, "@playername", player:get_player_name()) + + command = string.gsub(command, "@@", "@") + + return command +end + local execute_command = function(itemstack, player, pointed_thing) local player_name = player:get_player_name() local cmds = get_commands(itemstack) @@ -46,6 +86,7 @@ local execute_command = function(itemstack, player, pointed_thing) local player_privs = minetest.get_player_privs(player_name) for c=1, #cmds do local cmd = cmds[1] + -- Substitution successful? -- Split command string into command name and parameters local cmd_split = string.split(cmd, " ", false, 1) local cmd_name @@ -59,18 +100,25 @@ local execute_command = function(itemstack, player, pointed_thing) if cmd_split[2] then cmd_params = cmd_split[2] end + cmd_params = substitute_placeholders(cmd_params, itemstack, player, pointed_thing) local def = minetest.registered_chatcommands[cmd_name] + -- Command exists? Placeholder substitution successful? if def then - local required_privs = def.privs - for priv, _ in pairs(required_privs) do - if player_privs[priv] ~= true then - minetest.chat_send_player(player_name, "Insufficient privileges for using command “"..cmd_name.."”! You need the “"..priv.."” privilege.") - return + if cmd_params then + local required_privs = def.privs + for priv, _ in pairs(required_privs) do + if player_privs[priv] ~= true then + minetest.chat_send_player(player_name, "Insufficient privileges for using command “"..cmd_name.."”! You need the “"..priv.."” privilege.") + return + end end + -- All tests survived! + -- Call the command + def.func(player_name, cmd_params) + else + -- TODO: Rewrite error msg + minetest.chat_send_player(player_name, "Placeholders in command “"..cmd_name.."” do not apply!") end - -- All tests survived! - -- Call the command - def.func(player_name, cmd_params) else minetest.chat_send_player(player_name, "The command “"..cmd_name.."” does not exist!") return