cleanup some function overloading in logging

This commit is contained in:
Moritz Zwerger 2024-01-19 15:49:07 +01:00
parent e6fe8135c0
commit 74e52823f5
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
2 changed files with 61 additions and 68 deletions

View File

@ -1,6 +1,6 @@
/*
* Minosoft
* Copyright (C) 2020-2023 Moritz Zwerger
* Copyright (C) 2020-2024 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
@ -167,7 +167,7 @@ class PlayConnection(
ChatTextPositions.HOTBAR -> "[HOTBAR] "
else -> ""
}
Log.log(LogMessageType.CHAT_IN, level = if (it.message.type.position == ChatTextPositions.HOTBAR) LogLevels.VERBOSE else LogLevels.INFO, additionalPrefix = ChatComponent.of(additionalPrefix)) { it.message.text }
Log.log(LogMessageType.CHAT_IN, level = if (it.message.type.position == ChatTextPositions.HOTBAR) LogLevels.VERBOSE else LogLevels.INFO, prefix = ChatComponent.of(additionalPrefix)) { it.message.text }
})
}

View File

@ -29,12 +29,8 @@ import java.io.PrintWriter
import java.io.StringWriter
import java.text.SimpleDateFormat
import java.util.concurrent.LinkedBlockingQueue
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@OptIn(ExperimentalContracts::class)
object Log {
var ASYNC_LOGGING = true
private val MINOSOFT_START_TIME = millis()
@ -119,43 +115,72 @@ object Log {
return setLevel.ordinal < level.ordinal
}
fun log(type: LogMessageType, level: LogLevels = LogLevels.INFO, additionalPrefix: ChatComponent? = null, message: Any?, vararg formatting: Any) {
if (skipLogging(type, level)) {
return
private fun formatMessage(message: Any?, vararg formatting: Any) = when (message) {
is ChatComponent -> message
is TextFormattable -> ChatComponent.of(message.toText())
is Throwable -> {
val stringWriter = StringWriter()
message.printStackTrace(PrintWriter(stringWriter))
ChatComponent.of(stringWriter.toString(), ignoreJson = true)
}
val formattedMessage = when (message) {
is ChatComponent -> message
is TextFormattable -> ChatComponent.of(message.toText())
is Throwable -> {
val stringWriter = StringWriter()
message.printStackTrace(PrintWriter(stringWriter))
ChatComponent.of(stringWriter.toString(), ignoreJson = true)
}
is String -> {
if (message.isBlank()) {
return
}
if (formatting.isNotEmpty()) {
ChatComponent.of(message.format(*formatting), ignoreJson = true)
} else {
ChatComponent.of(message, ignoreJson = true)
}
}
is String -> when {
message.isBlank() -> ChatComponent.EMPTY
formatting.isNotEmpty() -> ChatComponent.of(message.format(*formatting), ignoreJson = true)
else -> ChatComponent.of(message, ignoreJson = true)
}
QueuedMessage(
message = formattedMessage,
time = millis(),
type = type,
level = level,
thread = Thread.currentThread(),
prefix = additionalPrefix,
).queue()
else -> ChatComponent.of(message, ignoreJson = true)
}
@JvmStatic
fun logInternal(type: LogMessageType, level: LogLevels, prefix: ChatComponent?, message: Any?, vararg formatting: Any) {
val formatted = formatMessage(message, *formatting)
if (formatted.length <= 0) return
QueuedMessage(message = formatted, time = millis(), type = type, level = level, thread = Thread.currentThread(), prefix = prefix).queue()
}
@JvmStatic
fun log(type: LogMessageType, level: LogLevels, prefix: ChatComponent?, message: Any?, vararg formatting: Any) {
if (skipLogging(type, level)) return
logInternal(type, level, prefix, message, formatting)
}
@JvmStatic
fun log(type: LogMessageType, level: LogLevels, prefix: ChatComponent?, message: Any?) {
if (skipLogging(type, level)) return
logInternal(type, level, prefix, message)
}
@JvmStatic
fun log(type: LogMessageType, level: LogLevels, message: Any?) {
if (skipLogging(type, level)) return
logInternal(type, level, null, message)
}
inline fun log(type: LogMessageType, level: LogLevels, prefix: ChatComponent?, builder: () -> Any?, vararg formatting: Any) {
if (skipLogging(type, level)) return
logInternal(type, level, prefix, builder.invoke(), *formatting)
}
inline fun log(type: LogMessageType, level: LogLevels, prefix: ChatComponent?, builder: () -> Any?) {
if (skipLogging(type, level)) return
logInternal(type, level, prefix, builder.invoke())
}
inline fun log(type: LogMessageType, level: LogLevels, builder: () -> Any?) {
if (skipLogging(type, level)) return
logInternal(type, level, null, builder.invoke())
}
inline fun log(type: LogMessageType, builder: () -> Any?) {
if (skipLogging(type, LogLevels.INFO)) return
logInternal(type, LogLevels.INFO, null, builder.invoke())
}
private fun QueuedMessage.queue() {
if (!ASYNC_LOGGING) {
this.print()
@ -164,38 +189,6 @@ object Log {
QUEUE += this
}
@JvmStatic
inline fun log(type: LogMessageType, level: LogLevels = LogLevels.INFO, additionalPrefix: ChatComponent? = null, messageBuilder: () -> Any?) {
contract {
callsInPlace(messageBuilder, InvocationKind.AT_MOST_ONCE)
}
if (skipLogging(type, level)) {
return
}
log(type, level, additionalPrefix, messageBuilder.invoke())
}
@JvmStatic
inline fun log(type: LogMessageType, level: LogLevels, messageBuilder: () -> Any?) {
contract {
callsInPlace(messageBuilder, InvocationKind.AT_MOST_ONCE)
}
log(type, level = level, additionalPrefix = null, messageBuilder = messageBuilder)
}
inline fun log(type: LogMessageType, level: LogLevels, message: Any?) {
log(type, level, null, message)
}
@JvmStatic
fun log(type: LogMessageType, messageBuilder: () -> Any?) {
contract {
callsInPlace(messageBuilder, InvocationKind.AT_MOST_ONCE)
}
log(type, additionalPrefix = null, messageBuilder = messageBuilder)
}
fun await() {
while (this.QUEUE.isNotEmpty()) {
Thread.sleep(1)