diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/SteamUser.java b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/SteamUser.java index 36e3b641..0e58cf5a 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/SteamUser.java +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/SteamUser.java @@ -15,7 +15,9 @@ import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesBase; import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver.CMsgClientSessionToken; import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver.CMsgClientWalletInfoUpdate; +import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2; import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientEmailAddrInfo; +import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientPlayingSessionState; import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientUpdateMachineAuth; import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientUpdateMachineAuthResponse; import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientVanityURLChangedNotification; @@ -109,6 +111,12 @@ public void accept(IPacketMsg packetMsg) { handleMarketingMessageUpdate(packetMsg); } }); + dispatchMap.put(EMsg.ClientPlayingSessionState, new Consumer() { + @Override + public void accept(IPacketMsg packetMsg) { + handlePlayingSessionState(packetMsg); + } + }); dispatchMap = Collections.unmodifiableMap(dispatchMap); } @@ -432,4 +440,10 @@ private void handleMarketingMessageUpdate(IPacketMsg packetMsg) { client.postCallback(new MarketingMessageCallback(marketingMessage.getBody(), payload)); } + + private void handlePlayingSessionState(IPacketMsg packetMsg) { + ClientMsgProtobuf playingSessionState = new ClientMsgProtobuf<>(CMsgClientPlayingSessionState.class, packetMsg); + + client.postCallback(new PlayingSessionStateCallback(playingSessionState.getTargetJobID(), playingSessionState.getBody())); + } } diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/PlayingSessionStateCallback.java b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/PlayingSessionStateCallback.java new file mode 100644 index 00000000..bca0feab --- /dev/null +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamuser/callback/PlayingSessionStateCallback.java @@ -0,0 +1,42 @@ +package in.dragonbra.javasteam.steam.handlers.steamuser.callback; + +import in.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientPlayingSessionState; +import in.dragonbra.javasteam.steam.steamclient.callbackmgr.CallbackMsg; +import in.dragonbra.javasteam.types.JobID; + +/** + * This callback is received when another client starts or stops playing a game. + * While {@link PlayingSessionStateCallback#playingBlocked}, sending {@link in.dragonbra.javasteam.enums.EMsg#ClientGamesPlayed} + * message will log you off with {@link in.dragonbra.javasteam.enums.EResult#LoggedInElsewhere} result. + */ +public class PlayingSessionStateCallback extends CallbackMsg { + + private boolean playingBlocked; + + private int playingAppID; + + public PlayingSessionStateCallback(JobID jobID, CMsgClientPlayingSessionState.Builder msg) { + setJobID(jobID); + + this.playingBlocked = msg.getPlayingBlocked(); + this.playingAppID = msg.getPlayingApp(); + } + + /** + * Indicates whether playing is currently blocked by another client. + * + * @return true if blocked by another client, otherwise false. + */ + public boolean isPlayingBlocked() { + return playingBlocked; + } + + /** + * When blocked, gets the appid which is currently being played. + * + * @return the app id. + */ + public int getPlayingAppID() { + return playingAppID; + } +}