Files
leonwww/flumi/Scripts/Utils/Lua/Trace.gd
2025-09-01 17:08:47 +03:00

88 lines
2.1 KiB
GDScript

class_name Trace
extends RefCounted
signal log_message(message: String, level: String, timestamp: float)
enum LogLevel {
LOG,
WARNING,
ERROR
}
static var _instance: Trace
static var _messages: Array[Dictionary] = []
static func get_instance() -> Trace:
if not _instance:
_instance = Trace.new()
return _instance
static func trace_log(message: String) -> void:
_emit_message(message, "log")
static func trace_warning(message: String) -> void:
_emit_message(message, "warning")
static func trace_error(message: String) -> void:
_emit_message(message, "error")
static func _emit_message(message: String, level: String) -> void:
var timestamp = Time.get_ticks_msec() / 1000.0
var log_entry = {
"message": message,
"level": level,
"timestamp": timestamp
}
_messages.append(log_entry)
get_instance().call_deferred("emit_signal", "log_message", message, level, timestamp)
match level:
"log":
print("TRACE LOG: ", message)
"warning":
print("TRACE WARNING: ", message)
"error":
print("TRACE ERROR: ", message)
static func get_all_messages() -> Array[Dictionary]:
return _messages.duplicate()
static func clear_messages() -> void:
_messages.clear()
static func _lua_trace_log_handler(vm: LuauVM) -> int:
var message = vm.luaL_checkstring(1)
vm.lua_getglobal("_trace_log")
vm.lua_pushstring(message)
vm.lua_call(1, 0)
return 0
static func _lua_trace_warn_handler(vm: LuauVM) -> int:
var message = vm.luaL_checkstring(1)
vm.lua_getglobal("_trace_warning")
vm.lua_pushstring(message)
vm.lua_call(1, 0)
return 0
static func _lua_trace_error_handler(vm: LuauVM) -> int:
var message = vm.luaL_checkstring(1)
vm.lua_getglobal("_trace_error")
vm.lua_pushstring(message)
vm.lua_call(1, 0)
return 0
static func setup_trace_api(vm: LuauVM) -> void:
vm.lua_newtable()
vm.lua_pushcallable(_lua_trace_log_handler, "trace.log")
vm.lua_setfield(-2, "log")
vm.lua_pushcallable(_lua_trace_warn_handler, "trace.warn")
vm.lua_setfield(-2, "warn")
vm.lua_pushcallable(_lua_trace_error_handler, "trace.error")
vm.lua_setfield(-2, "error")
vm.lua_setglobal("trace")