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 49577e99..c2f9a7b8 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 @@ -11,6 +11,7 @@ import `in`.dragonbra.javasteam.generated.MsgClientAppUsageEvent import `in`.dragonbra.javasteam.generated.MsgClientGetLegacyGameKey import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver.CMsgClientGamesPlayed import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver.CMsgClientGetAppOwnershipTicket +import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver.CMsgClientRequestEncryptedAppTicket import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientCheckAppBetaPassword import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientGetDepotDecryptionKey import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientRequestFreeLicense @@ -22,6 +23,7 @@ import `in`.dragonbra.javasteam.steam.handlers.ClientMsgHandler import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.AppOwnershipTicketCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.CheckAppBetaPasswordCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.DepotKeyCallback +import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.EncryptedAppTicketCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.FreeLicenseCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.GameConnectTokensCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.GuestPassListCallback @@ -94,6 +96,34 @@ class SteamApps : ClientMsgHandler() { return AsyncJobSingle(client, request.sourceJobID) } + /** + * Requests an encrypted app ticket for the specified AppID. + * Results are returned in an [EncryptedAppTicketCallback] callback. + * + * @param appId The appid to request the encrypted ticket for. + * @param userdata Optional user data to include in the ticket. + * @return The Job ID of the request. This can be used to find the appropriate [EncryptedAppTicketCallback]. + */ + @JavaSteamAddition + @JvmOverloads + fun requestEncryptedAppTicket(appId: Int, userdata: ByteArray? = null): AsyncJobSingle { + val request = ClientMsgProtobuf( + CMsgClientRequestEncryptedAppTicket::class.java, + EMsg.ClientRequestEncryptedAppTicket + ).apply { + sourceJobID = client.getNextJobID() + + body.appId = appId + userdata?.let { + body.userdata = ByteString.copyFrom(it) + } + } + + client.send(request) + + return AsyncJobSingle(client, request.sourceJobID) + } + /** * Request PICS access tokens for an app or package. * Results are returned in a [PICSTokensCallback] callback. @@ -468,6 +498,7 @@ class SteamApps : ClientMsgHandler() { EMsg.ClientUpdateGuestPassesList -> GuestPassListCallback(packetMsg) EMsg.ClientCheckAppBetaPasswordResponse -> CheckAppBetaPasswordCallback(packetMsg) EMsg.ClientPICSPrivateBetaResponse -> PrivateBetaCallback(packetMsg) + EMsg.ClientRequestEncryptedAppTicketResponse -> EncryptedAppTicketCallback(packetMsg) else -> null } } diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/EncryptedAppTicketCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/EncryptedAppTicketCallback.kt new file mode 100644 index 00000000..ad3cfba2 --- /dev/null +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/EncryptedAppTicketCallback.kt @@ -0,0 +1,48 @@ +package `in`.dragonbra.javasteam.steam.handlers.steamapps.callback + +import `in`.dragonbra.javasteam.base.ClientMsgProtobuf +import `in`.dragonbra.javasteam.base.IPacketMsg +import `in`.dragonbra.javasteam.enums.EResult +import `in`.dragonbra.javasteam.protobufs.steamclient.EncryptedAppTicketOuterClass.EncryptedAppTicket +import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver.CMsgClientRequestEncryptedAppTicketResponse +import `in`.dragonbra.javasteam.steam.handlers.steamapps.SteamApps +import `in`.dragonbra.javasteam.steam.steamclient.callbackmgr.CallbackMsg + +/** + * This callback is received in response to calling [SteamApps.requestEncryptedAppTicket] + */ +class EncryptedAppTicketCallback(packetMsg: IPacketMsg) : CallbackMsg() { + + /** + * Gets the result of requesting the encrypted app ticket. + */ + val result: EResult + + /** + * Gets the AppID this ticket is for. + */ + val appID: Int + + /** + * Gets the encrypted app ticket, or null if the request failed. + */ + val encryptedAppTicket: EncryptedAppTicket? + + init { + val ticketResponse = ClientMsgProtobuf( + CMsgClientRequestEncryptedAppTicketResponse::class.java, + packetMsg + ) + val msg = ticketResponse.body + + jobID = ticketResponse.targetJobID + + result = EResult.from(msg.eresult) + appID = msg.appId + encryptedAppTicket = if (msg.hasEncryptedAppTicket()) { + msg.encryptedAppTicket + } else { + null + } + } +}