2018-10-13 23:19:32 +00:00
--- Executes multiple worldedit commands in sequence.
-- @module worldeditadditions.multi
2021-02-10 00:53:30 +00:00
-- explode(separator, string)
2018-10-13 23:19:32 +00:00
-- From http://lua-users.org/wiki/SplitJoin
2020-06-10 00:38:09 +00:00
local function explode ( delim , str )
2018-10-13 23:19:32 +00:00
local ll , is_done
local delim_length = string.len ( delim )
ll = 0
is_done = false
return function ( )
if is_done then return end
2021-07-30 19:03:16 +00:00
local result
2018-10-13 23:19:32 +00:00
local loc = string.find ( str , delim , ll , true ) -- find the next d in the string
if loc ~= nil then -- if "not not" found then..
result = string.sub ( str , ll , loc - 1 ) -- Save it in our array.
ll = loc + delim_length -- save just after where we found it for searching next time.
else
result = string.sub ( str , ll ) -- Save what's left in our array.
is_done = true
end
return result
end
end
minetest.register_chatcommand ( " /multi " , {
2020-06-10 00:38:09 +00:00
params = " /<command_a> <args> //<command_b> <args> /<command_c> <args>..... " ,
description = " Executes multiple chat commands in sequence. Just prepend a list of space-separated chat commands with //multi, and you're good to go! The forward slashes at the beginning of each chat command must be the same as if you were executing it normally. " ,
2018-10-13 23:19:32 +00:00
privs = { worldedit = true } ,
func = function ( name , params_text )
2021-03-11 02:04:22 +00:00
if not params_text then return false , " Error: No commands specified, so there's nothing to do. " end
params_text = worldeditadditions.trim ( params_text )
if # params_text == 0 then return false , " Error: No commands specified, so there's nothing to do. " end
2018-10-19 21:35:02 +00:00
local i = 1 -- For feedback only
2020-06-26 19:46:35 +00:00
local master_start_time = worldeditadditions.get_ms_time ( )
2018-10-19 21:35:02 +00:00
local times = { }
2021-05-29 00:17:24 +00:00
-- Tokenise the input into a list of commands
local success , commands = worldeditadditions.parse . tokenise_commands ( params_text )
if not success then return success , commands end
for i , command in ipairs ( commands ) do
2021-07-04 13:35:02 +00:00
-- print("[DEBUG] i", i, "command: '"..command.."'")
2020-06-26 19:46:35 +00:00
local start_time = worldeditadditions.get_ms_time ( )
2021-05-29 00:17:24 +00:00
2018-10-13 23:19:32 +00:00
local found , _ , command_name , args = command : find ( " ^([^%s]+)%s(.+)$ " )
if not found then command_name = command end
2021-05-29 00:17:24 +00:00
-- Things start at 1, not 0 in Lua :-(
command_name = worldeditadditions.trim ( command_name ) : sub ( 2 ) -- Strip the leading /
2021-03-11 02:04:22 +00:00
if not args then args = " " end
2021-07-04 13:35:02 +00:00
-- print("command_name", command_name)
2018-10-13 23:19:32 +00:00
2021-05-29 00:17:24 +00:00
worldedit.player_notify ( name , " # " .. i .. " : " .. command )
2018-10-13 23:19:32 +00:00
local cmd = minetest.chatcommands [ command_name ]
if not cmd then
return false , " Error: " .. command_name .. " isn't a valid command. "
end
if not minetest.check_player_privs ( name , cmd.privs ) then
2021-05-29 00:17:24 +00:00
return false , " Your privileges are insufficient to execute " .. command_name .. " . Abort. "
2018-10-13 23:19:32 +00:00
end
2021-03-11 02:04:22 +00:00
-- print("[DEBUG] command_name", command_name, "cmd", dump2(cmd))
2018-10-13 23:19:32 +00:00
minetest.log ( " action " , name .. " runs " .. command )
cmd.func ( name , args )
2020-06-26 20:15:13 +00:00
times [ # times + 1 ] = ( worldeditadditions.get_ms_time ( ) - start_time )
2021-05-29 00:17:24 +00:00
-- i = i + 1
2018-10-13 23:19:32 +00:00
end
2018-10-19 21:35:02 +00:00
2020-06-26 20:15:13 +00:00
local total_time = ( worldeditadditions.get_ms_time ( ) - master_start_time )
2020-06-25 22:45:27 +00:00
local done_message = { }
table.insert ( done_message ,
string.format ( " Executed %d commands in %s ( " ,
# times ,
2021-03-20 01:48:56 +00:00
worldeditadditions.format . human_time ( total_time )
2020-06-25 22:45:27 +00:00
)
)
local message_parts = { }
2018-10-19 21:35:02 +00:00
for j = 1 , # times do
2021-03-20 01:48:56 +00:00
table.insert ( message_parts , worldeditadditions.format . human_time ( times [ j ] ) )
2018-10-19 21:35:02 +00:00
end
2020-06-25 22:45:27 +00:00
table.insert ( done_message , table.concat ( message_parts , " , " ) )
table.insert ( done_message , " ) " )
2018-10-19 21:35:02 +00:00
2020-06-25 22:45:27 +00:00
worldedit.player_notify ( name , table.concat ( done_message , " " ) )
2018-10-13 23:19:32 +00:00
end
} )