From b12c3274f39ac105ae8929075253e9f4b54e3dac Mon Sep 17 00:00:00 2001 From: LossyDragon Date: Thu, 2 Oct 2025 15:38:53 -0500 Subject: [PATCH 1/3] Rename .java to .kt --- .../util/log/{DefaultLogListener.java => DefaultLogListener.kt} | 0 .../javasteam/util/log/{LogListener.java => LogListener.kt} | 0 .../javasteam/util/log/{LogManager.java => LogManager.kt} | 0 .../in/dragonbra/javasteam/util/log/{Logger.java => Logger.kt} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/in/dragonbra/javasteam/util/log/{DefaultLogListener.java => DefaultLogListener.kt} (100%) rename src/main/java/in/dragonbra/javasteam/util/log/{LogListener.java => LogListener.kt} (100%) rename src/main/java/in/dragonbra/javasteam/util/log/{LogManager.java => LogManager.kt} (100%) rename src/main/java/in/dragonbra/javasteam/util/log/{Logger.java => Logger.kt} (100%) diff --git a/src/main/java/in/dragonbra/javasteam/util/log/DefaultLogListener.java b/src/main/java/in/dragonbra/javasteam/util/log/DefaultLogListener.kt similarity index 100% rename from src/main/java/in/dragonbra/javasteam/util/log/DefaultLogListener.java rename to src/main/java/in/dragonbra/javasteam/util/log/DefaultLogListener.kt diff --git a/src/main/java/in/dragonbra/javasteam/util/log/LogListener.java b/src/main/java/in/dragonbra/javasteam/util/log/LogListener.kt similarity index 100% rename from src/main/java/in/dragonbra/javasteam/util/log/LogListener.java rename to src/main/java/in/dragonbra/javasteam/util/log/LogListener.kt diff --git a/src/main/java/in/dragonbra/javasteam/util/log/LogManager.java b/src/main/java/in/dragonbra/javasteam/util/log/LogManager.kt similarity index 100% rename from src/main/java/in/dragonbra/javasteam/util/log/LogManager.java rename to src/main/java/in/dragonbra/javasteam/util/log/LogManager.kt diff --git a/src/main/java/in/dragonbra/javasteam/util/log/Logger.java b/src/main/java/in/dragonbra/javasteam/util/log/Logger.kt similarity index 100% rename from src/main/java/in/dragonbra/javasteam/util/log/Logger.java rename to src/main/java/in/dragonbra/javasteam/util/log/Logger.kt From 20009a05034b7501b9314d6215f223c640c59003 Mon Sep 17 00:00:00 2001 From: LossyDragon Date: Thu, 2 Oct 2025 15:38:53 -0500 Subject: [PATCH 2/3] Convert loggers to kotlin to support reified methods. Add simple @JavaSteamAnnotation to notate which methods are custom to JavaSteam. Update code to reflect changes. --- .../steam/authentication/AuthSession.kt | 2 +- .../dragonbra/javasteam/steam/cdn/Client.kt | 2 +- .../javasteam/steam/cdn/ClientPool.kt | 2 +- .../steam/discovery/FileServerListProvider.kt | 8 +-- .../javasteam/steam/discovery/ServerRecord.kt | 3 +- .../steam/discovery/SmartCMServerList.kt | 3 +- .../handlers/steamapps/PICSProductInfo.kt | 2 +- .../steam/handlers/steamapps/SteamApps.kt | 5 +- .../callback/GuestPassListCallback.kt | 2 +- .../callback/PurchaseResponseCallback.kt | 2 +- .../steamapps/callback/VACStatusCallback.kt | 2 +- .../steam/handlers/steamcloud/SteamCloud.kt | 21 ++++---- .../handlers/steamfriends/SteamFriends.kt | 10 ++-- .../callback/ChatEnterCallback.kt | 2 +- .../callback/ChatMemberInfoCallback.kt | 2 +- .../steam/handlers/steamuser/SteamUser.kt | 3 +- .../steamuser/callback/LoggedOnCallback.kt | 2 +- .../callback/MarketingMessageCallback.kt | 8 +-- .../steamuserstats/AchievementBlocks.kt | 4 +- .../steamuserstats/LeaderboardEntry.kt | 2 +- .../steam/handlers/steamuserstats/Stats.kt | 4 +- .../handlers/steamuserstats/SteamUserStats.kt | 4 +- .../callback/UserStatsCallback.kt | 3 +- .../javasteam/types/DepotManifest.kt | 3 +- .../in/dragonbra/javasteam/types/KeyValue.kt | 5 +- .../in/dragonbra/javasteam/types/SteamID.kt | 3 +- .../in/dragonbra/javasteam/util/Annotation.kt | 17 +++++++ .../in/dragonbra/javasteam/util/VZipUtil.kt | 2 +- .../in/dragonbra/javasteam/util/VZstdUtil.kt | 2 +- .../javasteam/util/log/DefaultLogListener.kt | 47 +++++++---------- .../javasteam/util/log/LogListener.kt | 9 ++-- .../javasteam/util/log/LogManager.kt | 50 ++++++++++--------- .../in/dragonbra/javasteam/util/log/Logger.kt | 47 +++++------------ 33 files changed, 140 insertions(+), 143 deletions(-) create mode 100644 src/main/java/in/dragonbra/javasteam/util/Annotation.kt diff --git a/src/main/java/in/dragonbra/javasteam/steam/authentication/AuthSession.kt b/src/main/java/in/dragonbra/javasteam/steam/authentication/AuthSession.kt index e3fd38b8..0bf1b8c7 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/authentication/AuthSession.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/authentication/AuthSession.kt @@ -39,7 +39,7 @@ open class AuthSession( ) { companion object { - private val logger = LogManager.getLogger(AuthSession::class.java) + private val logger = LogManager.getLogger() } init { diff --git a/src/main/java/in/dragonbra/javasteam/steam/cdn/Client.kt b/src/main/java/in/dragonbra/javasteam/steam/cdn/Client.kt index aebd8bcb..9f7591f4 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/cdn/Client.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/cdn/Client.kt @@ -38,7 +38,7 @@ class Client(steamClient: SteamClient) : Closeable { companion object { - private val logger: Logger = LogManager.getLogger(Client::class.java) + private val logger: Logger = LogManager.getLogger() /** * Default timeout to use when making requests diff --git a/src/main/java/in/dragonbra/javasteam/steam/cdn/ClientPool.kt b/src/main/java/in/dragonbra/javasteam/steam/cdn/ClientPool.kt index ae479786..ee377dd2 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/cdn/ClientPool.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/cdn/ClientPool.kt @@ -39,7 +39,7 @@ class ClientPool(internal val steamClient: SteamClient, private val appId: Int, private val monitorJob: Job - private val logger: Logger = LogManager.getLogger(ClientPool::class.java) + private val logger: Logger = LogManager.getLogger() init { monitorJob = parentScope.launch { connectionPoolMonitor().await() } diff --git a/src/main/java/in/dragonbra/javasteam/steam/discovery/FileServerListProvider.kt b/src/main/java/in/dragonbra/javasteam/steam/discovery/FileServerListProvider.kt index 4429ec02..f55c8cd3 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/discovery/FileServerListProvider.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/discovery/FileServerListProvider.kt @@ -20,6 +20,10 @@ import java.time.Instant */ class FileServerListProvider(val file: Path) : IServerListProvider { + companion object { + private val logger: Logger = LogManager.getLogger() + } + /** * Instantiates a [FileServerListProvider] object. * @param file the file that will store the servers @@ -102,8 +106,4 @@ class FileServerListProvider(val file: Path) : IServerListProvider { logger.error("Failed to write servers to file ${file.fileName}", e) } } - - companion object { - private val logger: Logger = LogManager.getLogger(FileServerListProvider::class.java) - } } diff --git a/src/main/java/in/dragonbra/javasteam/steam/discovery/ServerRecord.kt b/src/main/java/in/dragonbra/javasteam/steam/discovery/ServerRecord.kt index b3a4f64e..8d18b9be 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/discovery/ServerRecord.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/discovery/ServerRecord.kt @@ -54,7 +54,8 @@ class ServerRecord private constructor( override fun hashCode(): Int = endpoint.hashCode() xor protocolTypes.hashCode() companion object { - private val logger = LogManager.getLogger(ServerRecord::class.java) + + private val logger = LogManager.getLogger() /** * Creates a server record for a given endpoint. diff --git a/src/main/java/in/dragonbra/javasteam/steam/discovery/SmartCMServerList.kt b/src/main/java/in/dragonbra/javasteam/steam/discovery/SmartCMServerList.kt index f6d46ed9..4a3b17a3 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/discovery/SmartCMServerList.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/discovery/SmartCMServerList.kt @@ -18,7 +18,8 @@ import java.util.EnumSet class SmartCMServerList(private val configuration: SteamConfiguration) { companion object { - private val logger: Logger = LogManager.getLogger(SmartCMServerList::class.java) + + private val logger: Logger = LogManager.getLogger() /** * The default fallback Websockets server to attempt connecting to if fetching server list through other means fails. diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/PICSProductInfo.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/PICSProductInfo.kt index 42287a37..8264c318 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/PICSProductInfo.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/PICSProductInfo.kt @@ -19,7 +19,7 @@ import java.util.* class PICSProductInfo : CallbackMsg { companion object { - private val logger = LogManager.getLogger(PICSProductInfo::class.java) + private val logger = LogManager.getLogger() } /** diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.kt index afbd27c3..49577e99 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.kt @@ -38,6 +38,7 @@ import `in`.dragonbra.javasteam.steam.steamclient.callbackmgr.CallbackMsg import `in`.dragonbra.javasteam.types.AsyncJobMultiple import `in`.dragonbra.javasteam.types.AsyncJobSingle import `in`.dragonbra.javasteam.types.GameID +import `in`.dragonbra.javasteam.util.JavaSteamAddition import `in`.dragonbra.javasteam.util.NetHelpers import io.ktor.client.request.request @@ -345,7 +346,7 @@ class SteamApps : ClientMsgHandler() { * @param gameId Holds information pertaining to the app being launched * @param usageEvent The type of launch occurring */ - // JavaSteam Addition + @JavaSteamAddition fun sendClientAppUsageEvent( gameId: GameID, usageEvent: EAppUsageEvent, @@ -365,7 +366,7 @@ class SteamApps : ClientMsgHandler() { * @param gamesPlayed The list of the different game processes * @param clientOsType The OS type of the client launching the games */ - // JavaSteam Addition + @JavaSteamAddition @Suppress("DuplicatedCode", "unused") @JvmOverloads fun notifyGamesPlayed( diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/GuestPassListCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/GuestPassListCallback.kt index 0fcfec5f..5fd321bb 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/GuestPassListCallback.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/GuestPassListCallback.kt @@ -15,7 +15,7 @@ import java.io.IOException class GuestPassListCallback(packetMsg: IPacketMsg) : CallbackMsg() { companion object { - private val logger = LogManager.getLogger(GuestPassListCallback::class.java) + private val logger = LogManager.getLogger() } /** diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/PurchaseResponseCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/PurchaseResponseCallback.kt index 5880b862..aebd38f7 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/PurchaseResponseCallback.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/PurchaseResponseCallback.kt @@ -17,7 +17,7 @@ import `in`.dragonbra.javasteam.util.stream.MemoryStream class PurchaseResponseCallback(packetMsg: IPacketMsg) : CallbackMsg() { companion object { - private val logger = LogManager.getLogger(PurchaseResponseCallback::class.java) + private val logger = LogManager.getLogger() } /** diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/VACStatusCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/VACStatusCallback.kt index 7ee500c0..387757ae 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/VACStatusCallback.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/VACStatusCallback.kt @@ -15,7 +15,7 @@ import java.util.* class VACStatusCallback(packetMsg: IPacketMsg) : CallbackMsg() { companion object { - private val logger = LogManager.getLogger(VACStatusCallback::class.java) + private val logger = LogManager.getLogger() } /** diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamcloud/SteamCloud.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamcloud/SteamCloud.kt index c33bee9f..8adf288a 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamcloud/SteamCloud.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamcloud/SteamCloud.kt @@ -34,6 +34,7 @@ import `in`.dragonbra.javasteam.steam.steamclient.callbackmgr.CallbackMsg import `in`.dragonbra.javasteam.types.AsyncJobSingle import `in`.dragonbra.javasteam.types.UGCHandle import `in`.dragonbra.javasteam.util.HardwareUtils +import `in`.dragonbra.javasteam.util.JavaSteamAddition import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.future.future @@ -135,7 +136,7 @@ class SteamCloud : ClientMsgHandler() { * @param syncedChangeNumber The sync change number * @return A [AppFileChangeList] containing the files changed */ - // JavaSteam Addition + @JavaSteamAddition @JvmOverloads fun getAppFileListChange( appId: Int, @@ -161,7 +162,7 @@ class SteamCloud : ClientMsgHandler() { * @param forceProxy Whether to force proxy * @return A [FileDownloadInfo] containing information about how to download the user file */ - // JavaSteam Addition + @JavaSteamAddition @JvmOverloads fun clientFileDownload( appId: Int, @@ -193,7 +194,7 @@ class SteamCloud : ClientMsgHandler() { * @param appBuildId The build ID of the app * @return An [AppUploadBatchResponse] containing the batch ID and the app change number */ - // JavaSteam Addition + @JavaSteamAddition @JvmOverloads fun beginAppUploadBatch( appId: Int, @@ -229,7 +230,7 @@ class SteamCloud : ClientMsgHandler() { * @param uploadBatchId The ID of the upload batch this file upload belongs to (see [beginAppUploadBatch]) * @return The upload information needed to upload the file in blocks */ - // JavaSteam Addition + @JavaSteamAddition fun beginFileUpload( appId: Int, fileSize: Int, @@ -274,7 +275,7 @@ class SteamCloud : ClientMsgHandler() { * @param filename The path of the file including the prefix (ex %GameInstall%) * @return Whether the file has been committed */ - // JavaSteam Addition + @JavaSteamAddition @JvmOverloads fun commitFileUpload( transferSucceeded: Boolean, @@ -302,7 +303,7 @@ class SteamCloud : ClientMsgHandler() { * @param batchId The ID of the batch * @param batchEResult The result of the upload batch */ - // JavaSteam Addition + @JavaSteamAddition @JvmOverloads fun completeAppUploadBatch( appId: Int, @@ -334,7 +335,7 @@ class SteamCloud : ClientMsgHandler() { * @param microsecDownloadFiles The time the sync took to download all the required files in micro-seconds * @param microsecUploadFiles The time the sync took to upload all the required files in micro-seconds */ - // JavaSteam Addition + @JavaSteamAddition @JvmOverloads fun appCloudSyncStats( appId: Int, @@ -418,7 +419,7 @@ class SteamCloud : ClientMsgHandler() { * @param osType The OS type of the machine launching the app * @return A list of the pending remote operations, empty if none */ - // JavaSteam Addition + @JavaSteamAddition @JvmOverloads fun signalAppLaunchIntent( appId: Int, @@ -450,7 +451,7 @@ class SteamCloud : ClientMsgHandler() { * @param appId The ID of the app who finished syncing * @param clientId The ID given when authenticating the user [AuthSession.clientID] */ - // JavaSteam Addition + @JavaSteamAddition fun signalAppExitSyncDone( appId: Int, clientId: Long, @@ -481,7 +482,7 @@ class SteamCloud : ClientMsgHandler() { * @param cellId The cell ID * @param proxied Whether the transfer was through a proxy */ - // JavaSteam Addition + @JavaSteamAddition @JvmOverloads fun externalStorageTransferReport( host: String, diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/SteamFriends.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/SteamFriends.kt index b6c70e84..4091d9a9 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/SteamFriends.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/SteamFriends.kt @@ -65,6 +65,7 @@ import `in`.dragonbra.javasteam.types.AsyncJobSingle import `in`.dragonbra.javasteam.types.GameID import `in`.dragonbra.javasteam.types.JobID import `in`.dragonbra.javasteam.types.SteamID +import `in`.dragonbra.javasteam.util.JavaSteamAddition import `in`.dragonbra.javasteam.util.log.LogManager import `in`.dragonbra.javasteam.util.log.Logger import java.io.IOException @@ -79,6 +80,7 @@ class SteamFriends : ClientMsgHandler() { var friendsList: MutableList = mutableListOf() private set + var clanList: MutableList = mutableListOf() private set @@ -182,9 +184,9 @@ class SteamFriends : ClientMsgHandler() { } /** - * JavaSteam addition: * Sets the local user's persona state flag back to normal desktop mode. */ + @JavaSteamAddition fun resetPersonaStateFlag() { ClientMsgProtobuf( CMsgClientChangeStatus::class.java, @@ -196,15 +198,14 @@ class SteamFriends : ClientMsgHandler() { } /** - * JavaSteam addition: * Sets the local user's persona state flag to a valid ClientType - * * @param flag one of the following * [EPersonaStateFlag.ClientTypeWeb], * [EPersonaStateFlag.ClientTypeMobile], * [EPersonaStateFlag.ClientTypeTenfoot], * or [EPersonaStateFlag.ClientTypeVR]. */ + @JavaSteamAddition fun setPersonaStateFlag(flag: EPersonaStateFlag) { require(!(flag.code() < EPersonaStateFlag.ClientTypeWeb.code() || flag.code() > EPersonaStateFlag.ClientTypeVR.code())) { "Persona State Flag was not a valid ClientType" } @@ -897,7 +898,8 @@ class SteamFriends : ClientMsgHandler() { } companion object { - private val logger: Logger = LogManager.getLogger(SteamFriends::class.java) + + private val logger: Logger = LogManager.getLogger() private fun getCallback(packetMsg: IPacketMsg): CallbackMsg? = when (packetMsg.msgType) { EMsg.ClientClanState -> ClanStateCallback(packetMsg) diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/callback/ChatEnterCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/callback/ChatEnterCallback.kt index c38e0abe..fd9320e0 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/callback/ChatEnterCallback.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/callback/ChatEnterCallback.kt @@ -18,7 +18,7 @@ import `in`.dragonbra.javasteam.util.stream.BinaryReader class ChatEnterCallback(packetMsg: IPacketMsg) : CallbackMsg() { companion object { - private val logger = LogManager.getLogger(ChatEnterCallback::class.java) + private val logger = LogManager.getLogger() } /** diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/callback/ChatMemberInfoCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/callback/ChatMemberInfoCallback.kt index 549d451d..4b4e5b70 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/callback/ChatMemberInfoCallback.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamfriends/callback/ChatMemberInfoCallback.kt @@ -21,7 +21,7 @@ import java.util.* class ChatMemberInfoCallback(packetMsg: IPacketMsg) : CallbackMsg() { companion object { - private val logger = LogManager.getLogger(ChatMemberInfoCallback::class.java) + private val logger = LogManager.getLogger() } /** diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/SteamUser.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/SteamUser.kt index 869a4697..9f859ee4 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/SteamUser.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/SteamUser.kt @@ -28,6 +28,7 @@ import `in`.dragonbra.javasteam.steam.steamclient.callbackmgr.CallbackMsg import `in`.dragonbra.javasteam.steam.steamclient.callbacks.DisconnectedCallback import `in`.dragonbra.javasteam.types.SteamID import `in`.dragonbra.javasteam.util.HardwareUtils +import `in`.dragonbra.javasteam.util.JavaSteamAddition import `in`.dragonbra.javasteam.util.NetHelpers /** @@ -191,7 +192,7 @@ class SteamUser : ClientMsgHandler() { * * @param onlyStopGame Whether to only stop the game or quit the Steam client as well */ - // JavaSteam Addition + @JavaSteamAddition fun kickPlayingSession( onlyStopGame: Boolean = false, ) { diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/LoggedOnCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/LoggedOnCallback.kt index dc719d8a..66b21e4b 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/LoggedOnCallback.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/LoggedOnCallback.kt @@ -25,7 +25,7 @@ import java.util.* class LoggedOnCallback : CallbackMsg { companion object { - private val logger = LogManager.getLogger(LoggedOnCallback::class.java) + private val logger = LogManager.getLogger() } /** diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/MarketingMessageCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/MarketingMessageCallback.kt index b1d8e5c0..3381637f 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/MarketingMessageCallback.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/MarketingMessageCallback.kt @@ -18,6 +18,10 @@ import java.util.* */ class MarketingMessageCallback(packetMsg: IPacketMsg) : CallbackMsg() { + companion object { + private val logger: Logger = LogManager.getLogger() + } + /** * Gets the time of this marketing message update. */ @@ -88,8 +92,4 @@ class MarketingMessageCallback(packetMsg: IPacketMsg) : CallbackMsg() { } } } - - companion object { - private val logger: Logger = LogManager.getLogger(MarketingMessageCallback::class.java) - } } diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/AchievementBlocks.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/AchievementBlocks.kt index 94a57dfd..f2c4fd19 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/AchievementBlocks.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/AchievementBlocks.kt @@ -1,10 +1,12 @@ package `in`.dragonbra.javasteam.steam.handlers.steamuserstats -// JavaSteam Addition +import `in`.dragonbra.javasteam.util.JavaSteamAddition + /** * A Block of achievements with the timestamp of when the achievement (in order of the schema) is unlocked. * @param achievementId the achievement id. * @param unlockTime a [List] of integers containing when an achievement was unlocked. * An unlockTime of 0 means it has not been achieved, unlocked achievements are displayed as valve-timestamps. */ +@JavaSteamAddition data class AchievementBlocks(val achievementId: Int, val unlockTime: List) diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/LeaderboardEntry.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/LeaderboardEntry.kt index d431105a..b888cf81 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/LeaderboardEntry.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/LeaderboardEntry.kt @@ -15,7 +15,7 @@ import java.io.IOException class LeaderboardEntry(entry: CMsgClientLBSGetLBEntriesResponse.Entry) { companion object { - private val logger = LogManager.getLogger(LeaderboardEntry::class.java) + private val logger = LogManager.getLogger() } /** diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/Stats.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/Stats.kt index 0c5ac8ba..f5e816be 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/Stats.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/Stats.kt @@ -1,10 +1,12 @@ package `in`.dragonbra.javasteam.steam.handlers.steamuserstats -// JavaSteam Addition +import `in`.dragonbra.javasteam.util.JavaSteamAddition + /** * A Class representing stat values of a game. * This data is commonly used for richer stats in games that support it. For example: Left 4 Dead 2. * @param statId The id of the stat. This is used to reference the id in the schema. * @param statValue The value of the stat. */ +@JavaSteamAddition data class Stats(val statId: Int, val statValue: Int) diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/SteamUserStats.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/SteamUserStats.kt index da33691d..f7f2f79f 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/SteamUserStats.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/SteamUserStats.kt @@ -18,6 +18,7 @@ import `in`.dragonbra.javasteam.steam.handlers.steamuserstats.callback.UserStats import `in`.dragonbra.javasteam.steam.steamclient.callbackmgr.CallbackMsg import `in`.dragonbra.javasteam.types.AsyncJobSingle import `in`.dragonbra.javasteam.types.SteamID +import `in`.dragonbra.javasteam.util.JavaSteamAddition /** * This handler handles Steam user statistic related actions. @@ -150,14 +151,13 @@ class SteamUserStats : ClientMsgHandler() { return AsyncJobSingle(this.client, msg.sourceJobID) } - // JavaSteam addition. - /** * Gets the Stats-Schema for the specified app. This schema includes Global Achievements and Stats, * @param appId The appID of the game. * @param steamID The [SteamID] that owns the game. Note the SteamID user has to have a public profile. * @return The Job ID of the request. This can be used to find the appropriate [UserStatsCallback]. */ + @JavaSteamAddition fun getUserStats(appId: Int, steamID: SteamID): AsyncJobSingle { val msg = ClientMsgProtobuf( CMsgClientGetUserStats::class.java, diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/callback/UserStatsCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/callback/UserStatsCallback.kt index de8eca6b..fb1f3aa1 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/callback/UserStatsCallback.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuserstats/callback/UserStatsCallback.kt @@ -10,12 +10,13 @@ import `in`.dragonbra.javasteam.steam.handlers.steamuserstats.Stats import `in`.dragonbra.javasteam.steam.handlers.steamuserstats.SteamUserStats import `in`.dragonbra.javasteam.steam.steamclient.callbackmgr.CallbackMsg import `in`.dragonbra.javasteam.types.KeyValue +import `in`.dragonbra.javasteam.util.JavaSteamAddition import `in`.dragonbra.javasteam.util.stream.MemoryStream -// JavaSteam Addition /** * This callback is fired in response to [SteamUserStats.getUserStats]. */ +@JavaSteamAddition class UserStatsCallback(packetMsg: IPacketMsg?) : CallbackMsg() { /** diff --git a/src/main/java/in/dragonbra/javasteam/types/DepotManifest.kt b/src/main/java/in/dragonbra/javasteam/types/DepotManifest.kt index 357e4eaf..ec30be2d 100644 --- a/src/main/java/in/dragonbra/javasteam/types/DepotManifest.kt +++ b/src/main/java/in/dragonbra/javasteam/types/DepotManifest.kt @@ -32,7 +32,8 @@ import kotlin.collections.HashSet class DepotManifest { companion object { - private val logger: Logger = LogManager.getLogger(DepotManifest::class.java) + + private val logger: Logger = LogManager.getLogger() private const val PROTOBUF_PAYLOAD_MAGIC: Int = 0x71F617D0 private const val PROTOBUF_METADATA_MAGIC: Int = 0x1F4812BE diff --git a/src/main/java/in/dragonbra/javasteam/types/KeyValue.kt b/src/main/java/in/dragonbra/javasteam/types/KeyValue.kt index 6f3244d3..0ca5f071 100644 --- a/src/main/java/in/dragonbra/javasteam/types/KeyValue.kt +++ b/src/main/java/in/dragonbra/javasteam/types/KeyValue.kt @@ -411,6 +411,9 @@ class KeyValue @JvmOverloads constructor( } companion object { + + private val logger: Logger = LogManager.getLogger() + enum class Type(val code: Byte) { NONE(0), STRING(1), @@ -433,8 +436,6 @@ class KeyValue @JvmOverloads constructor( } } - private val logger: Logger = LogManager.getLogger(KeyValue::class.java) - /** * Represents an invalid [KeyValue] given when a searched for child does not exist. */ diff --git a/src/main/java/in/dragonbra/javasteam/types/SteamID.kt b/src/main/java/in/dragonbra/javasteam/types/SteamID.kt index aea5cccf..727223f2 100644 --- a/src/main/java/in/dragonbra/javasteam/types/SteamID.kt +++ b/src/main/java/in/dragonbra/javasteam/types/SteamID.kt @@ -3,6 +3,7 @@ package `in`.dragonbra.javasteam.types import `in`.dragonbra.javasteam.enums.EAccountType import `in`.dragonbra.javasteam.enums.EUniverse import `in`.dragonbra.javasteam.util.CollectionUtils +import `in`.dragonbra.javasteam.util.JavaSteamAddition import `in`.dragonbra.javasteam.util.Strings import `in`.dragonbra.javasteam.util.compat.ObjectsCompat import java.util.regex.Matcher @@ -249,7 +250,7 @@ class SteamID { * Sets the various components of this SteamID from a 64bit string integer form. * @param stringSteamId The 64bit string integer to assign this SteamID from. */ - // JavaSteam addition + @JavaSteamAddition fun setFromUInt64String(stringSteamId: String) { val longSteamId = stringSteamId.toLong() setFromUInt64(longSteamId) diff --git a/src/main/java/in/dragonbra/javasteam/util/Annotation.kt b/src/main/java/in/dragonbra/javasteam/util/Annotation.kt new file mode 100644 index 00000000..a40d5d6d --- /dev/null +++ b/src/main/java/in/dragonbra/javasteam/util/Annotation.kt @@ -0,0 +1,17 @@ +@file:Suppress("ktlint:standard:filename") + +package `in`.dragonbra.javasteam.util + +/** + * This annotation indicates that this API is specific to JavaSteam + * and does not exist in the original SteamKit implementation. + */ +@Target( + AnnotationTarget.CLASS, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY, + AnnotationTarget.CONSTRUCTOR +) +@Retention(AnnotationRetention.SOURCE) // Only in source +@MustBeDocumented +annotation class JavaSteamAddition(val reason: String = "") diff --git a/src/main/java/in/dragonbra/javasteam/util/VZipUtil.kt b/src/main/java/in/dragonbra/javasteam/util/VZipUtil.kt index 642faa2e..76438ffe 100644 --- a/src/main/java/in/dragonbra/javasteam/util/VZipUtil.kt +++ b/src/main/java/in/dragonbra/javasteam/util/VZipUtil.kt @@ -17,7 +17,7 @@ import kotlin.math.max @Suppress("SpellCheckingInspection", "unused") object VZipUtil { - private val logger = LogManager.getLogger(VZipUtil::class.java) + private val logger = LogManager.getLogger() private const val VZIP_HEADER: Short = 0x5A56 // "VZ" in hex private const val VZIP_FOOTER: Short = 0x767A // "vz" in hex diff --git a/src/main/java/in/dragonbra/javasteam/util/VZstdUtil.kt b/src/main/java/in/dragonbra/javasteam/util/VZstdUtil.kt index ca6c09b6..f3fae970 100644 --- a/src/main/java/in/dragonbra/javasteam/util/VZstdUtil.kt +++ b/src/main/java/in/dragonbra/javasteam/util/VZstdUtil.kt @@ -11,7 +11,7 @@ object VZstdUtil { private const val VZSTD_HEADER: Int = 0x615A5356 - private val logger = LogManager.getLogger(VZstdUtil::class.java) + private val logger = LogManager.getLogger() @Throws(IOException::class, IllegalArgumentException::class) @JvmStatic diff --git a/src/main/java/in/dragonbra/javasteam/util/log/DefaultLogListener.kt b/src/main/java/in/dragonbra/javasteam/util/log/DefaultLogListener.kt index d8bc009f..fe5ed47f 100644 --- a/src/main/java/in/dragonbra/javasteam/util/log/DefaultLogListener.kt +++ b/src/main/java/in/dragonbra/javasteam/util/log/DefaultLogListener.kt @@ -1,52 +1,39 @@ -package in.dragonbra.javasteam.util.log; +package `in`.dragonbra.javasteam.util.log -import java.text.SimpleDateFormat; -import java.util.Date; +import java.text.SimpleDateFormat +import java.util.* /** * @author lngtr * @since 2018-03-02 */ -public class DefaultLogListener implements LogListener { +class DefaultLogListener : LogListener { - private static final SimpleDateFormat FORMAT = new SimpleDateFormat("HH:mm:ss.SSS"); + companion object { + private val FORMAT = SimpleDateFormat("HH:mm:ss.SSS") + } - @Override - public void onLog(Class clazz, String message, Throwable throwable) { - if (clazz == null) { - throw new IllegalArgumentException("class is null"); - } - String threadName = Thread.currentThread().getName(); - threadName = threadName.substring(0, Math.min(10, threadName.length())); - String className = clazz.getName(); + override fun onLog(clazz: Class<*>, message: String?, throwable: Throwable?) { + val threadName = Thread.currentThread().name.take(10) if (message == null) { - System.out.printf("%s [%10s] %s%n", FORMAT.format(new Date()), threadName, className); + System.out.printf("%s [%10s] %s%n", FORMAT.format(Date()), threadName, clazz.name) } else { - System.out.printf("%s [%10s] %s - %s%n", FORMAT.format(new Date()), threadName, className, message); + System.out.printf("%s [%10s] %s - %s%n", FORMAT.format(Date()), threadName, clazz.name, message) } - if (throwable != null) { - throwable.printStackTrace(); - } + throwable?.printStackTrace() } - public void onError(Class clazz, String message, Throwable throwable) { - if (clazz == null) { - throw new IllegalArgumentException("class is null"); - } - String threadName = Thread.currentThread().getName(); - threadName = threadName.substring(0, Math.min(10, threadName.length())); - String className = clazz.getName(); + override fun onError(clazz: Class<*>, message: String?, throwable: Throwable?) { + val threadName = Thread.currentThread().name.take(10) if (message == null) { - System.err.printf("%s [%10s] %s%n", FORMAT.format(new Date()), threadName, className); + System.err.printf("%s [%10s] %s%n", FORMAT.format(Date()), threadName, clazz.name) } else { - System.err.printf("%s [%10s] %s - %s%n", FORMAT.format(new Date()), threadName, className, message); + System.err.printf("%s [%10s] %s - %s%n", FORMAT.format(Date()), threadName, clazz.name, message) } - if (throwable != null) { - throwable.printStackTrace(); - } + throwable?.printStackTrace() } } diff --git a/src/main/java/in/dragonbra/javasteam/util/log/LogListener.kt b/src/main/java/in/dragonbra/javasteam/util/log/LogListener.kt index 1c041468..33001747 100644 --- a/src/main/java/in/dragonbra/javasteam/util/log/LogListener.kt +++ b/src/main/java/in/dragonbra/javasteam/util/log/LogListener.kt @@ -1,11 +1,10 @@ -package in.dragonbra.javasteam.util.log; +package `in`.dragonbra.javasteam.util.log /** * @author lngtr * @since 2018-03-02 */ -public interface LogListener { - void onLog(Class clazz, String message, Throwable throwable); - - void onError(Class clazz, String message, Throwable throwable); +interface LogListener { + fun onLog(clazz: Class<*>, message: String?, throwable: Throwable?) + fun onError(clazz: Class<*>, message: String?, throwable: Throwable?) } diff --git a/src/main/java/in/dragonbra/javasteam/util/log/LogManager.kt b/src/main/java/in/dragonbra/javasteam/util/log/LogManager.kt index 76d6b0d6..9b636394 100644 --- a/src/main/java/in/dragonbra/javasteam/util/log/LogManager.kt +++ b/src/main/java/in/dragonbra/javasteam/util/log/LogManager.kt @@ -1,51 +1,53 @@ -package in.dragonbra.javasteam.util.log; +package `in`.dragonbra.javasteam.util.log -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import `in`.dragonbra.javasteam.util.JavaSteamAddition +import java.util.* /** * @author lngtr * @since 2018-03-02 */ -public class LogManager { +object LogManager { - static final List LOG_LISTENERS = new LinkedList<>(); + private val LOGGERS: MutableMap, Logger> = HashMap, Logger>() - private static final Map, Logger> LOGGERS = new HashMap<>(); + @JvmField + val LOG_LISTENERS: MutableList = LinkedList() /** - * Gets the {@link Logger} instance of the specified class. - * + * Gets the [Logger] instance of the specified class. * @param clazz the class, must not be null. * @return the logger instance. */ - public static Logger getLogger(Class clazz) { - return LOGGERS.computeIfAbsent(clazz, k -> new Logger(clazz)); - } + @JvmStatic + fun getLogger(clazz: Class<*>): Logger = LOGGERS.computeIfAbsent(clazz) { Logger(clazz) } /** * Adds a log listener that will be notified of logging events. - * You can use the {@link DefaultLogListener} that prints logs to the standard output in a format similar to Log4j2 - * + * You can use the [DefaultLogListener] that prints logs to the standard output in a format similar to Log4j2 * @param listener the listener. */ - public static void addListener(LogListener listener) { - if (listener != null) { - LOG_LISTENERS.add(listener); - } + @JvmStatic + fun addListener(listener: LogListener) { + LOG_LISTENERS.add(listener) } /** * Remove a log listener. - * * @param listener the listener. */ - public static void removeListener(LogListener listener) { - LOG_LISTENERS.remove(listener); + @JvmStatic + fun removeListener(listener: LogListener) { + LOG_LISTENERS.remove(listener) } - private LogManager() { - } + // Kotlin Helpers + + /** + * Gets the [Logger] instance of the specified class. + * @param T the class, must not be null. + * @return the logger instance. + */ + @JavaSteamAddition + inline fun getLogger(): Logger = getLogger(T::class.java) } diff --git a/src/main/java/in/dragonbra/javasteam/util/log/Logger.kt b/src/main/java/in/dragonbra/javasteam/util/log/Logger.kt index 0118585b..bba35cf6 100644 --- a/src/main/java/in/dragonbra/javasteam/util/log/Logger.kt +++ b/src/main/java/in/dragonbra/javasteam/util/log/Logger.kt @@ -1,49 +1,26 @@ -package in.dragonbra.javasteam.util.log; +package `in`.dragonbra.javasteam.util.log /** * @author lngtr * @since 2018-03-02 */ -public class Logger { +class Logger internal constructor(private val clazz: Class<*>) { - private final Class clazz; - - Logger(Class clazz) { - if (clazz == null) { - throw new IllegalArgumentException("class is null"); - } - this.clazz = clazz; - } - - public void debug(Throwable throwable) { - debug(null, throwable); - } - - public void debug(String message) { - debug(message, null); - } - - public void debug(String message, Throwable throwable) { - for (LogListener listener : LogManager.LOG_LISTENERS) { - if (listener != null) { - listener.onLog(clazz, message, throwable); - } - } + fun debug(throwable: Throwable) { + debug(null, throwable) } - public void error(Throwable throwable) { - error(null, throwable); + @JvmOverloads + fun debug(message: String?, throwable: Throwable? = null) { + LogManager.LOG_LISTENERS.forEach { it.onLog(clazz, message, throwable) } } - public void error(String message) { - error(message, null); + fun error(throwable: Throwable) { + error(null, throwable) } - public void error(String message, Throwable throwable) { - for (LogListener listener : LogManager.LOG_LISTENERS) { - if (listener != null) { - listener.onError(clazz, message, throwable); - } - } + @JvmOverloads + fun error(message: String? = null, throwable: Throwable? = null) { + LogManager.LOG_LISTENERS.forEach { it.onError(clazz, message, throwable) } } } From 7a07a2fae23922280813bd6f82b310e2f0c8201a Mon Sep 17 00:00:00 2001 From: LossyDragon Date: Thu, 2 Oct 2025 15:43:53 -0500 Subject: [PATCH 3/3] Forgot WebSocketConnection --- .../javasteam/networking/steam3/WebSocketConnection.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/in/dragonbra/javasteam/networking/steam3/WebSocketConnection.kt b/src/main/java/in/dragonbra/javasteam/networking/steam3/WebSocketConnection.kt index d0e9e948..b0a4212d 100644 --- a/src/main/java/in/dragonbra/javasteam/networking/steam3/WebSocketConnection.kt +++ b/src/main/java/in/dragonbra/javasteam/networking/steam3/WebSocketConnection.kt @@ -34,7 +34,7 @@ class WebSocketConnection : CoroutineScope { companion object { - private val logger = LogManager.getLogger(WebSocketConnection::class.java) + private val logger = LogManager.getLogger() } private val job: Job = SupervisorJob()