130 lines
3.6 KiB
Lua
130 lines
3.6 KiB
Lua
function runString (commandstring, outputTo, source)
|
|
me = source
|
|
local sourceName = source and getPlayerName(source) or "Console"
|
|
|
|
outputChatBoxR(sourceName.." executed command: "..commandstring, outputTo, true)
|
|
local notReturned
|
|
--First we test with return
|
|
local commandFunction,errorMsg = loadstring("return "..commandstring)
|
|
if errorMsg then
|
|
--It failed. Lets try without "return"
|
|
commandFunction, errorMsg = loadstring(commandstring)
|
|
end
|
|
if errorMsg then
|
|
--It still failed. Print the error message and stop the function
|
|
outputChatBoxR("Error: "..errorMsg, outputTo)
|
|
return
|
|
end
|
|
--Finally, lets execute our function
|
|
local results = { pcall(commandFunction) }
|
|
if not results[1] then
|
|
--It failed.
|
|
outputChatBoxR("Error: "..results[2], outputTo)
|
|
return
|
|
end
|
|
|
|
local resultsString = ""
|
|
local first = true
|
|
for i = 2, #results do
|
|
if first then
|
|
first = false
|
|
else
|
|
resultsString = resultsString..", "
|
|
end
|
|
local resultType = type(results[i])
|
|
if isElement(results[i]) then
|
|
resultType = "element:"..getElementType(results[i])
|
|
end
|
|
resultsString = resultsString..tostring(results[i]).." ["..resultType.."]"
|
|
end
|
|
|
|
if #results > 1 then
|
|
outputChatBoxR("Command results: " ..resultsString, outputTo)
|
|
return
|
|
end
|
|
|
|
outputChatBoxR("Command executed!", outputTo)
|
|
end
|
|
|
|
-- run command
|
|
addCommandHandler("run",
|
|
function (player, command, ...)
|
|
local commandstring = table.concat({...}, " ")
|
|
return runString(commandstring, root, player)
|
|
end
|
|
)
|
|
|
|
-- silent run command
|
|
addCommandHandler("srun",
|
|
function (player, command, ...)
|
|
local commandstring = table.concat({...}, " ")
|
|
return runString(commandstring, player, player)
|
|
end
|
|
)
|
|
|
|
-- clientside run command
|
|
addCommandHandler("crun",
|
|
function (player, command, ...)
|
|
local commandstring = table.concat({...}, " ")
|
|
if player then
|
|
outputChatBoxR(getPlayerName(player) .. " executed client-side command: " .. commandstring, false)
|
|
return triggerClientEvent(player, "doCrun", root, commandstring)
|
|
else
|
|
return runString(commandstring, false, false)
|
|
end
|
|
end
|
|
)
|
|
|
|
-- http interface run export
|
|
function httpRun(commandstring)
|
|
if not user then outputDebugString ( "httpRun can only be called via http", 2 ) return end
|
|
|
|
-- check acl permission
|
|
local accName = getAccountName(user)
|
|
local objectName = "user." .. accName
|
|
|
|
if(not hasObjectPermissionTo(objectName, "command.srun", false)) then
|
|
outputServerLog(getAccountName(user) .. " from " .. hostname .. " attempted to execute Lua code with missing acl permission (command.srun)")
|
|
return "Error: Permission denied"
|
|
end
|
|
|
|
local notReturned
|
|
--First we test with return
|
|
local commandFunction,errorMsg = loadstring("return "..commandstring)
|
|
if errorMsg then
|
|
--It failed. Lets try without "return"
|
|
notReturned = true
|
|
commandFunction, errorMsg = loadstring(commandstring)
|
|
end
|
|
if errorMsg then
|
|
--It still failed. Print the error message and stop the function
|
|
return "Error: "..errorMsg
|
|
end
|
|
--Finally, lets execute our function
|
|
local results = { pcall(commandFunction) }
|
|
if not results[1] then
|
|
--It failed.
|
|
return "Error: "..results[2]
|
|
end
|
|
|
|
outputChatBoxR("[HTTP] " .. accName .. " from " .. hostname .. " executed command: " .. commandstring, false)
|
|
|
|
if not notReturned then
|
|
local resultsString = ""
|
|
local first = true
|
|
for i = 2, #results do
|
|
if first then
|
|
first = false
|
|
else
|
|
resultsString = resultsString..", "
|
|
end
|
|
local resultType = type(results[i])
|
|
if isElement(results[i]) then
|
|
resultType = "element:"..getElementType(results[i])
|
|
end
|
|
resultsString = resultsString..tostring(results[i]).." ["..resultType.."]"
|
|
end
|
|
return "Command results: "..resultsString
|
|
end
|
|
return "Command executed!"
|
|
end
|