balatro-mods/DebugPlus/logger.lua
2025-01-19 15:01:49 +08:00

185 lines
5.1 KiB
Lua

local global = {}
local logs = nil
local old_print = print
local util = require("debugplus.util")
local levelMeta = {
DEBUG = {
level = 'DEBUG',
colour = {1, 0, 1},
shouldShow = false,
},
INFO = {
level = 'INFO',
colour = {0, 1, 1},
shouldShow = true,
},
WARN = {
level = 'WARN',
colour = {1, 1, 0},
shouldShow = true,
},
ERROR = {
level = 'ERROR',
colour = {1, 0, 0},
shouldShow = true,
}
}
global.levelMeta = levelMeta
local SMODSLogPattern = "[%d-]+ [%d:]+ :: (%S+) +:: (%S+) :: (.*)"
local SMODSLevelMeta = {
TRACE = levelMeta.DEBUG,
DEBUG = levelMeta.DEBUG,
INFO = levelMeta.INFO,
WARN = levelMeta.WARN,
ERROR = levelMeta.ERROR,
FATAL = levelMeta.ERROR
}
function global.handleLogAdvanced(data, ...)
local stringifyPrint = require("debugplus.config").getValue("stringifyPrint")
if not stringifyPrint then
old_print(...)
end
local _str = ""
local stringify = tostring
if require("debugplus.config").getValue("processTables") then
stringify = util.stringifyTable
end
for _, v in ipairs({...}) do
_str = _str .. stringify(v) .. " "
end
if stringifyPrint then
old_print(_str)
end
local meta = {
str = _str,
time = love.timer.getTime(),
colour = data.colour,
level = data.level,
command = data.command,
}
if data.fromPrint then
local level, source, msg = string.match(_str, SMODSLogPattern)
if level then
local levelMeta = SMODSLevelMeta[level] or SMODSLevelMeta.INFO
meta = {
str = "[" .. source .. "] " .. msg,
time = love.timer.getTime(),
colour = levelMeta.colour,
level = levelMeta.level
}
else
-- Handling the few times the game itself prints
if _str:match("^LONG DT @ [%d.: ]+$") then -- LONG DT messages
meta.level = "DEBUG"
meta.colour = levelMeta.DEBUG.colour
elseif _str:match("^ERROR LOADING GAME: Card area '[%w%d_-]+' not instantiated before load") then -- Error loading areas
meta.level = "ERROR"
meta.colour = levelMeta.ERROR.colour
elseif _str:match("^\n [+-]+ \n | #") and debug.getinfo(3).short_src == "engine/controller.lua" then -- Profiler results table. Extra check cause I don't trust this pattern to not have false positives
meta.level = "DEBUG"
meta.colour = levelMeta.DEBUG.colour
meta.command = true
end
end
end
if not meta.colour then meta.colour = levelMeta[meta.level].colour end
-- Dirty hack to work better with multiline text
if string.match(meta.str, "\n") then
local first = true
for w in string.gmatch(meta.str, "[^\n]+") do
local _meta = {
str = w,
time = meta.time,
colour = meta.colour,
level = meta.level,
command = meta.command,
hack_no_prefix = not first
}
first = false
table.insert(logs, _meta)
-- TODO: fix me
if logOffset ~= 0 then
global.handleLogsChange(1)
end
if #logs > 5000 then
table.remove(logs, 1)
end
end
else
table.insert(logs, meta)
global.handleLogsChange(1)
if logOffset ~= 0 then
global.handleLogsChange(1)
end
if #logs > 5000 then
table.remove(logs, 1)
end
end
end
function global.handleLog(colour, level, ...)
global.handleLogAdvanced({
colour = colour,
level = level,
command = true,
}, ...)
end
function global.log(...)
global.handleLogAdvanced({
colour = {.65, .36, 1},
level = "INFO",
}, "[DebugPlus]", ...)
end
function global.logCmd(...)
global.handleLog({.65, .36, 1}, "INFO", "[DebugPlus]", ...)
end
function global.errorLog(...)
global.handleLogAdvanced({
colour = {1, 0, 0},
level = "ERROR",
}, "[DebugPlus]", ...)
end
function global.registerLogHandler()
if logs then
return
end
logs = {}
global.logs = logs
print = function(...)
global.handleLogAdvanced({
colour = {0, 1, 1},
level = "INFO",
fromPrint = true,
}, ...)
end
end
function global.handleLogsChange() -- Placeholder. Overwritten in console.lua
end
-- config.configDefinition.logLevel.onUpdate = function(v)
-- for k, v in pairs(levelMeta) do
-- v.shouldShow = false
-- end
-- levelMeta.ERROR.shouldShow = true
-- if v == "ERROR" then return end
-- levelMeta.WARN.shouldShow = true
-- if v == "WARN" then return end
-- levelMeta.INFO.shouldShow = true
-- if v == "INFO" then return end
-- levelMeta.DEBUG.shouldShow = true
-- end
-- config.configDefinition.logLevel.onUpdate(config.getValue("logLevel"))
return global