mta-resources/[admin]/runcode/server.lua
2025-05-10 22:29:17 +00:00

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