Add substitutes

master
Wuzzy 2018-01-16 22:04:19 +01:00
parent a8bb37a750
commit 3ab7572f3c
1 changed files with 56 additions and 8 deletions

View File

@ -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