102 lines
2.7 KiB
Lua
102 lines
2.7 KiB
Lua
|
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
|