GSServer-CBT/soggy_resources/lua/Console.lua

102 lines
2.7 KiB
Lua
Raw Normal View History

2022-11-21 11:30:31 +03:00
local Console = {}
local loadstring_ = nil
if(loadstring) then
loadstring_ = loadstring
else
loadstring_ = load
end
socketMgr = singletonManager:GetSingletonInstance("MoleMole.SocketManager")
function Console:onSocketConnected()
self.socketCR = nil
socketMgr:SendString("connected\r\n>")
end
function Console:onSocketData(msg)
if not self.socketCR then
self.socketCR = coroutine.create(self.socketCrFunc)
end
ret, info = coroutine.resume(self.socketCR, msg)
if not ret then
socketMgr:SendString("onSocketData err " .. info)
end
end
function Console.socketCrFunc(str)
local syntaxErr = false
local localindex = { }
local locals = {}
local printFmt = "print(inspect(%s, {['depth']=1}))"
setmetatable(locals, {
["__index"] = localindex,
["__newindex"] = function(t, k, v)
localindex[k] = v
end,
["__mode"] = "kv"
})
setmetatable(localindex, {
["__index"] = setmetatable({}, {["__index"] = _G}),
["__mode"] = "kv"
})
localindex["__locals"] = locals
localindex["inspect"] = require("Base/Inspect")
while true do
if #str > 1 and string.byte(str, 1, 2) == 61 then
str = string.format(printFmt, string.sub(str, 2))
end
local ret, msg = loadstring_(str)
if not ret then
local modstr = string.format(printFmt, str)
if loadstring_(modstr) then
str = modstr
else
syntaxErr = true
socketMgr:SendString(msg .. "\r\n")
end
end
if not syntaxErr then
local line = str .. [[
local __debug_idx = 1
while true do
local name, value = debug.getlocal(1, __debug_idx)
if not name then break end
rawset(__locals, name, value)
__debug_idx = __debug_idx + 1
end
]]
local oldPrint = _G["print"]
local function traceback(msg)
local msg = debug.traceback(msg, 1)
Console.ConsolePrint(msg)
return msg
end
rawset(_G, "print", Console.ConsolePrint)
xpcall(function() xpcall(setfenv(loadstring_(line) , locals), traceback) end, traceback)
rawset(_G, "print", oldPrint)
end
socketMgr:SendString(">")
str = coroutine.yield()
syntaxErr = false
end
end
function Console.ConsolePrint(...)
local outputStr = ""
for k, v in ipairs({...}) do
outputStr = outputStr .. tostring(v)
end
outputStr = string.gsub(outputStr, "\n", "\r\n")
socketMgr:SendString(outputStr.."\r\n")
end
return Console