From d39ed71d89689dd332cf8d71b78bbd1e3986a30f Mon Sep 17 00:00:00 2001 From: JustArchi Date: Fri, 30 Sep 2016 01:15:26 +0200 Subject: [PATCH] Add first family sharing bits --- ArchiSteamFarm/ArchiHandler.cs | 26 +++++++++++++++++++++++ ArchiSteamFarm/Bot.cs | 39 ++++++++++++++++++++++++---------- ArchiSteamFarm/CardsFarmer.cs | 6 +++--- 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/ArchiSteamFarm/ArchiHandler.cs b/ArchiSteamFarm/ArchiHandler.cs index 5f8c674a4..dd9601eb0 100644 --- a/ArchiSteamFarm/ArchiHandler.cs +++ b/ArchiSteamFarm/ArchiHandler.cs @@ -178,6 +178,19 @@ namespace ArchiSteamFarm { } } + internal sealed class SharedLibraryLockStatusCallback : CallbackMsg { + internal readonly bool LibraryLocked; + + internal SharedLibraryLockStatusCallback(JobID jobID, CMsgClientSharedLibraryLockStatus msg) { + if ((jobID == null) || (msg == null)) { + throw new ArgumentNullException(nameof(jobID) + " || " + nameof(msg)); + } + + JobID = jobID; + LibraryLocked = msg.own_library_locked_by != 0; + } + } + /* __ __ _ _ _ | \/ | ___ | |_ | |__ ___ __| | ___ @@ -347,6 +360,9 @@ namespace ArchiSteamFarm { case EMsg.ClientRedeemGuestPassResponse: HandleRedeemGuestPassResponse(packetMsg); break; + case EMsg.ClientSharedLibraryLockStatus: + HandleSharedLibraryLockStatus(packetMsg); + break; case EMsg.ClientUserNotifications: HandleUserNotifications(packetMsg); break; @@ -403,6 +419,16 @@ namespace ArchiSteamFarm { Client.PostCallback(new RedeemGuestPassResponseCallback(packetMsg.TargetJobID, response.Body)); } + private void HandleSharedLibraryLockStatus(IPacketMsg packetMsg) { + if (packetMsg == null) { + Logging.LogNullError(nameof(packetMsg), Bot.BotName); + return; + } + + ClientMsgProtobuf response = new ClientMsgProtobuf(packetMsg); + Client.PostCallback(new SharedLibraryLockStatusCallback(packetMsg.TargetJobID, response.Body)); + } + private void HandleUserNotifications(IPacketMsg packetMsg) { if (packetMsg == null) { Logging.LogNullError(nameof(packetMsg), Bot.BotName); diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index f1665408d..941946194 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -72,13 +72,12 @@ namespace ArchiSteamFarm { internal bool HasMobileAuthenticator => BotDatabase.MobileAuthenticator != null; internal bool IsConnectedAndLoggedOn => SteamClient.IsConnected && (SteamClient.SteamID != null); + internal bool IsFarmingPossible => !PlayingBlocked && !LibraryLocked; [JsonProperty] internal bool KeepRunning { get; private set; } - internal bool PlayingBlocked { get; private set; } - - private bool FirstTradeSent, SkipFirstShutdown; + private bool FirstTradeSent, LibraryLocked, PlayingBlocked, SkipFirstShutdown; private string AuthCode, TwoFactorCode; private EResult LastLogOnResult; @@ -230,6 +229,7 @@ namespace ArchiSteamFarm { CallbackManager.Subscribe(OnOfflineMessage); CallbackManager.Subscribe(OnPlayingSessionState); CallbackManager.Subscribe(OnPurchaseResponse); + CallbackManager.Subscribe(OnSharedLibraryLockStatus); ArchiWebHandler = new ArchiWebHandler(this); CardsFarmer = new CardsFarmer(this); @@ -584,6 +584,15 @@ namespace ArchiSteamFarm { return false; } + private void CheckOccupationStatus() { + if (IsFarmingPossible) { + Logging.LogGenericInfo("Account is no longer occupied, farming process resumed!", BotName); + CardsFarmer.StartFarming().Forget(); + } else { + Logging.LogGenericInfo("Account is currently being used, ASF will resume farming when it's free...", BotName); + } + } + private void ImportAuthenticator(string maFilePath) { if ((BotDatabase.MobileAuthenticator != null) || !File.Exists(maFilePath)) { return; @@ -2126,14 +2135,8 @@ namespace ArchiSteamFarm { return; // No status update, we're not interested } - if (callback.PlayingBlocked) { - PlayingBlocked = true; - Logging.LogGenericInfo("Account is currently being used, ASF will resume farming when it's free...", BotName); - } else { - PlayingBlocked = false; - Logging.LogGenericInfo("Account is no longer occupied, farming process resumed!", BotName); - CardsFarmer.StartFarming().Forget(); - } + PlayingBlocked = callback.PlayingBlocked; + CheckOccupationStatus(); } private void OnPurchaseResponse(ArchiHandler.PurchaseResponseCallback callback) { @@ -2141,5 +2144,19 @@ namespace ArchiSteamFarm { Logging.LogNullError(nameof(callback), BotName); } } + + private void OnSharedLibraryLockStatus(ArchiHandler.SharedLibraryLockStatusCallback callback) { + if (callback == null) { + Logging.LogNullError(nameof(callback), BotName); + return; + } + + if (callback.LibraryLocked == LibraryLocked) { + return; // No status update, we're not interested + } + + LibraryLocked = callback.LibraryLocked; + CheckOccupationStatus(); + } } } diff --git a/ArchiSteamFarm/CardsFarmer.cs b/ArchiSteamFarm/CardsFarmer.cs index 1bd949778..fc7032923 100755 --- a/ArchiSteamFarm/CardsFarmer.cs +++ b/ArchiSteamFarm/CardsFarmer.cs @@ -140,14 +140,14 @@ namespace ArchiSteamFarm { } internal async Task StartFarming() { - if (NowFarming || ManualMode || Bot.PlayingBlocked) { + if (NowFarming || ManualMode || !Bot.IsFarmingPossible) { return; } await FarmingSemaphore.WaitAsync().ConfigureAwait(false); try { - if (NowFarming || ManualMode || Bot.PlayingBlocked) { + if (NowFarming || ManualMode || !Bot.IsFarmingPossible) { return; } @@ -160,7 +160,7 @@ namespace ArchiSteamFarm { Logging.LogGenericInfo("We have a total of " + GamesToFarm.Count + " games (" + GamesToFarm.Sum(game => game.CardsRemaining) + " cards) to farm on this account...", Bot.BotName); // This is the last moment for final check if we can farm - if (Bot.PlayingBlocked) { + if (!Bot.IsFarmingPossible) { Logging.LogGenericInfo("But account is currently occupied, so farming is stopped!", Bot.BotName); return; }