diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.java b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.java index 46d4b042..b8796bad 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.java +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.java @@ -4,6 +4,8 @@ import in.dragonbra.javasteam.base.ClientMsgProtobuf; import in.dragonbra.javasteam.base.IPacketMsg; import in.dragonbra.javasteam.enums.EMsg; +import in.dragonbra.javasteam.generated.MsgClientGetLegacyGameKey; +import in.dragonbra.javasteam.generated.MsgClientGetLegacyGameKeyResponse; import in.dragonbra.javasteam.generated.MsgClientUpdateGuestPassesList; import in.dragonbra.javasteam.generated.MsgClientVACBanStatus; import in.dragonbra.javasteam.handlers.ClientMsgHandler; @@ -81,6 +83,12 @@ public void accept(IPacketMsg packetMsg) { handleDepotKeyResponse(packetMsg); } }); + dispatchMap.put(EMsg.ClientGetLegacyGameKeyResponse, new Consumer() { + @Override + public void accept(IPacketMsg packetMsg) { + handleLegacyGameKeyResponse(packetMsg); + } + }); dispatchMap.put(EMsg.ClientPICSAccessTokenResponse, new Consumer() { @Override public void accept(IPacketMsg packetMsg) { @@ -487,6 +495,25 @@ public JobID checkAppBetaPassword(int app, String password) { return jobID; } + /** + * Request the legacy CD game keys for the requested appid. + * + * @param appId The AppID to request game keys for. + * @return The Job ID of the request. This can be used to find the appropriate {@link LegacyGameKeyCallback} + */ + public JobID getLegacyGameKey(int appId) { + ClientMsg request = new ClientMsg<>(MsgClientGetLegacyGameKey.class); + JobID jobID = client.getNextJobID(); + request.setSourceJobID(jobID); + + request.setSourceJobID(jobID); + request.getBody().setAppId(appId); + + client.send(request); + + return jobID; + } + @Override public void handleMsg(IPacketMsg packetMsg) { if (packetMsg == null) { @@ -520,6 +547,13 @@ private void handleGameConnectTokens(IPacketMsg packetMsg) { client.postCallback(new GameConnectTokensCallback(gcTokens.getBody())); } + private void handleLegacyGameKeyResponse(IPacketMsg packetMsg) { + ClientMsg keyResponse = + new ClientMsg<>(MsgClientGetLegacyGameKeyResponse.class, packetMsg); + + client.postCallback(new LegacyGameKeyCallback(keyResponse.getTargetJobID(), keyResponse.getBody(), keyResponse.getPayload().toByteArray())); + } + private void handleLicenseList(IPacketMsg packetMsg) { ClientMsgProtobuf licenseList = new ClientMsgProtobuf<>(CMsgClientLicenseList.class, packetMsg); diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/LegacyGameKeyCallback.java b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/LegacyGameKeyCallback.java new file mode 100644 index 00000000..fd42a099 --- /dev/null +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/LegacyGameKeyCallback.java @@ -0,0 +1,51 @@ +package in.dragonbra.javasteam.steam.handlers.steamapps.callback; + +import in.dragonbra.javasteam.enums.EResult; +import in.dragonbra.javasteam.generated.MsgClientGetLegacyGameKeyResponse; +import in.dragonbra.javasteam.steam.handlers.steamapps.SteamApps; +import in.dragonbra.javasteam.steam.steamclient.callbackmgr.CallbackMsg; +import in.dragonbra.javasteam.types.JobID; + +/** + * This callback is received in response to calling {@link SteamApps#getLegacyGameKey}. + */ +public class LegacyGameKeyCallback extends CallbackMsg { + + private EResult result; + + private int appID; + + private String key; + + public LegacyGameKeyCallback(JobID jobID, MsgClientGetLegacyGameKeyResponse msg, byte[] payload) { + setJobID(jobID); + this.appID = msg.getAppId(); + this.result = msg.getResult(); + + if (msg.getLength() > 0) { + int length = msg.getLength() - 1; + key = new String(payload, 0, length); + } + } + + /** + * @return the result of requesting this game key. + */ + public EResult getResult() { + return result; + } + + /** + * @return the appid that this game key is for. + */ + public int getAppID() { + return appID; + } + + /** + * @return the game key. + */ + public String getKey() { + return key; + } +} diff --git a/src/main/steamd/in/dragonbra/javasteam/steammsg.steamd b/src/main/steamd/in/dragonbra/javasteam/steammsg.steamd index a15260a0..24d123d1 100644 --- a/src/main/steamd/in/dragonbra/javasteam/steammsg.steamd +++ b/src/main/steamd/in/dragonbra/javasteam/steammsg.steamd @@ -358,3 +358,15 @@ class MsgClientMarketingMessageUpdate2 uint marketingMessageUpdateTime; uint count; }; + +class MsgClientGetLegacyGameKey +{ + uint appId; +}; + +class MsgClientGetLegacyGameKeyResponse +{ + uint appId; + EResult result; + uint length; +};