brackeys-12/components/Logger/logger.gd
2024-09-08 13:34:41 -04:00

138 lines
3.7 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Node
## A logger to log data to relevant locations
##
## A logger that logs various forms of data at different log levels to both
## built in locations in Godot as well as other components that listen to the
## provided log created signal.
signal log_created(message: String, level: LogLevel)
enum LogLevel {
DEBUG = 0,
INFO = 1,
WARN = 2,
ERROR = 3
}
## The log level that should be outputted as a minimum.
@export var log_level: LogLevel
## Log a message at log level debug (meant for troubleshooting).
func debug(message: String, arguments: Dictionary = {}) -> void:
if log_level > LogLevel.DEBUG:
return
_log(message, LogLevel.DEBUG, arguments)
## Log a message at log level info (log to indicate something happened).
func info(message: String, arguments: Dictionary = {}) -> void:
if log_level > LogLevel.INFO:
return
_log(message, LogLevel.INFO, arguments)
## Log a warning at log level warning (something unexpected happened but it can
## continue).
func warn(message: String, arguments: Dictionary = {}) -> void:
_log(message, LogLevel.WARN, arguments)
## Log an error at log level error (an issue that prevents something from
## functioning).
func error(message: String, arguments: Dictionary = {}) -> void:
_log(message, LogLevel.ERROR, arguments)
func _log(message: String, level: LogLevel, arguments: Dictionary = {}) -> void:
var category = arguments.category if arguments.has("category") and arguments.category else "???"
var color = arguments.color if arguments.has("color") else "olive"
var image = arguments.image if arguments.has("image") and arguments.image else "res://components/Logger/scroll-text.svg"
var adjusted_message = _clean_message(message)
var constructed_message = "[color=%s][%s][/color] [img= width=12 height=12 valign=center]%s[/img] %s" % [color, category, image, adjusted_message]
print_rich(constructed_message)
log_created.emit(constructed_message, level)
func _clean_message(message: String) -> String:
var cleans = [
{
"type": "button",
"regex": "μ(.*)μ",
"color": Color.html("#a4bf37")
},
{
"type": "key",
"regex": "<(.*)>",
"color": Color.html("#42ad24")
},
{
"type": "tool",
"regex": "λ(.*)λ",
"color": Color.html("#bf9d37")
},
{
"type": "object",
"regex": "→(.*)←",
"color": Color.html("#854322")
},
{
"type": "path",
"regex": "♢(.*)♢",
"color": Color.html("#22852e")
},
{
"type": "function",
"regex": "(.*)",
"color": Color.html("#ad2452")
},
{
"type": "trigger",
"regex": "∧(.*)∧",
"color": Color.html("#ad2d24")
},
{
"type": "category",
"regex": "\\{(.*)\\}",
"color": Color.html("#ad9b24")
},
{
"type": "value",
"regex": "\\|(.*)\\|",
"color": Color.TEAL
}
]
var adjusted_message = message
for clean in cleans:
adjusted_message = _replace_regex_color(adjusted_message, clean.regex, clean.color)
return adjusted_message
func _replace_regex_color(message: String, regex_string: String, color: Color) -> String:
return _replace_regex(message, regex_string, "[color=" + color.to_html() + "]%s[/color]")
func _replace_regex(message: String, regex_string: String, new_content: String) -> String:
var adjusted_message = message
var stripped_message = message
var regex = RegEx.new()
regex.compile(regex_string)
var result = regex.search(adjusted_message)
while result:
var before_content = adjusted_message.substr(0, result.get_start())
var after_content = adjusted_message.substr(result.get_end(), adjusted_message.length())
var template_string = "%s" + new_content + "%s"
adjusted_message = template_string % [before_content, result.get_string(1), after_content]
result = regex.search(adjusted_message)
return adjusted_message