mirror of
https://github.com/citizenfx/cfx-server-data.git
synced 2025-01-11 00:03:18 +08:00
133 lines
2.4 KiB
Lua
133 lines
2.4 KiB
Lua
local cachedFiles = {}
|
|
|
|
local function sendFile(res, fileName)
|
|
if cachedFiles[fileName] then
|
|
res.send(cachedFiles[fileName])
|
|
return
|
|
end
|
|
|
|
local fileData = LoadResourceFile(GetCurrentResourceName(), 'web/' .. fileName)
|
|
|
|
if not fileData then
|
|
res.writeHead(404)
|
|
res.send('Not found.')
|
|
return
|
|
end
|
|
|
|
cachedFiles[fileName] = fileData
|
|
res.send(fileData)
|
|
end
|
|
|
|
local codeId = 1
|
|
local codes = {}
|
|
|
|
local function handlePost(req, res)
|
|
req.setDataHandler(function(body)
|
|
local data = json.decode(body)
|
|
|
|
if not data or not data.password or not data.code then
|
|
res.send(json.encode({ error = 'Bad request.'}))
|
|
return
|
|
end
|
|
|
|
if GetConvar('rcon_password', '') == '' then
|
|
res.send(json.encode({ error = 'The server has an empty rcon_password.'}))
|
|
return
|
|
end
|
|
|
|
if data.password ~= GetConvar('rcon_password', '') then
|
|
res.send(json.encode({ error = 'Bad password.'}))
|
|
return
|
|
end
|
|
|
|
if not data.client or data.client == '' then
|
|
CreateThread(function()
|
|
local result, err = RunCode(data.code)
|
|
|
|
res.send(json.encode({
|
|
result = result,
|
|
error = err
|
|
}))
|
|
end)
|
|
else
|
|
codes[codeId] = {
|
|
timeout = GetGameTimer() + 1000,
|
|
res = res
|
|
}
|
|
|
|
TriggerClientEvent('runcode:gotSnippet', tonumber(data.client), codeId, data.code)
|
|
|
|
codeId = codeId + 1
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function returnCode(id, res, err)
|
|
if not codes[id] then
|
|
return
|
|
end
|
|
|
|
local code = codes[id]
|
|
codes[id] = nil
|
|
|
|
local gotFrom
|
|
|
|
if source then
|
|
gotFrom = GetPlayerName(source) .. ' [' .. tostring(source) .. ']'
|
|
end
|
|
|
|
code.res.send(json.encode({
|
|
result = res,
|
|
error = err,
|
|
from = gotFrom
|
|
}))
|
|
end
|
|
|
|
CreateThread(function()
|
|
while true do
|
|
Wait(100)
|
|
|
|
for k, v in ipairs(codes) do
|
|
if GetGameTimer() > v.timeout then
|
|
source = nil
|
|
returnCode(k, '', 'Timed out waiting on the target client.')
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('runcode:gotResult')
|
|
AddEventHandler('runcode:gotResult', returnCode)
|
|
|
|
SetHttpHandler(function(req, res)
|
|
local path = req.path
|
|
|
|
if req.method == 'POST' then
|
|
return handlePost(req, res)
|
|
end
|
|
|
|
-- client shortcuts
|
|
if req.path == '/clients' then
|
|
local clientList = {}
|
|
|
|
for _, id in ipairs(GetPlayers()) do
|
|
table.insert(clientList, { GetPlayerName(id), id })
|
|
end
|
|
|
|
res.send(json.encode({
|
|
clients = clientList
|
|
}))
|
|
|
|
return
|
|
end
|
|
|
|
-- should this be the index?
|
|
if req.path == '/' then
|
|
path = 'index.html'
|
|
end
|
|
|
|
-- remove any '..' from the path
|
|
path = path:gsub("%.%.", "")
|
|
|
|
return sendFile(res, path)
|
|
end) |