diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt index 7f38157ae..d8d371413 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt @@ -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 } }) } diff --git a/src/main/java/de/bixilon/minosoft/util/logging/Log.kt b/src/main/java/de/bixilon/minosoft/util/logging/Log.kt index 40e4eceec..6fb778e5c 100644 --- a/src/main/java/de/bixilon/minosoft/util/logging/Log.kt +++ b/src/main/java/de/bixilon/minosoft/util/logging/Log.kt @@ -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)