diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index bb0589409..ea56f6ea2 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -64,6 +64,7 @@ namespace ArchiSteamFarm { private readonly CardsFarmer CardsFarmer; private readonly ConcurrentHashSet HandledGifts = new ConcurrentHashSet(); + private readonly ConcurrentHashSet OwnedPackageIDs = new ConcurrentHashSet(); private readonly SteamApps SteamApps; private readonly SteamFriends SteamFriends; private readonly SteamUser SteamUser; @@ -185,6 +186,7 @@ namespace ArchiSteamFarm { SteamApps = SteamClient.GetHandler(); CallbackManager.Subscribe(OnFreeLicense); CallbackManager.Subscribe(OnGuestPassList); + CallbackManager.Subscribe(OnLicenseList); SteamFriends = SteamClient.GetHandler(); CallbackManager.Subscribe(OnChatInvite); @@ -971,7 +973,8 @@ namespace ArchiSteamFarm { } bool alreadyHandled = false; - foreach (Bot bot in Bots.Values.Where(bot => (bot != this) && bot.SteamClient.IsConnected)) { + foreach (Bot bot in Bots.Values.Where(bot => (bot != this) && bot.SteamClient.IsConnected && result.Items.Keys.Any(packageID => !bot.OwnedPackageIDs.Contains(packageID)))) { + ArchiHandler.PurchaseResponseCallback otherResult = await bot.ArchiHandler.RedeemKey(key).ConfigureAwait(false); if (otherResult == null) { response.Append(Environment.NewLine + "<" + bot.BotName + "> Key: " + key + " | Status: Timeout!"); @@ -1619,6 +1622,21 @@ namespace ArchiSteamFarm { } } + private void OnLicenseList(SteamApps.LicenseListCallback callback) { + if (callback?.LicenseList == null) { + Logging.LogNullError(nameof(callback) + " || " + nameof(callback.LicenseList), BotName); + return; + } + + OwnedPackageIDs.Clear(); + + foreach (SteamApps.LicenseListCallback.License license in callback.LicenseList) { + OwnedPackageIDs.Add(license.PackageID); + } + + OwnedPackageIDs.TrimExcess(); + } + private void OnChatInvite(SteamFriends.ChatInviteCallback callback) { if ((callback?.ChatRoomID == null) || (callback.PatronID == null)) { Logging.LogNullError(nameof(callback) + " || " + nameof(callback.ChatRoomID) + " || " + nameof(callback.PatronID), BotName); diff --git a/ArchiSteamFarm/ConcurrentHashSet.cs b/ArchiSteamFarm/ConcurrentHashSet.cs index a8b246824..a35071a12 100644 --- a/ArchiSteamFarm/ConcurrentHashSet.cs +++ b/ArchiSteamFarm/ConcurrentHashSet.cs @@ -100,6 +100,16 @@ namespace ArchiSteamFarm { } } + public void TrimExcess() { + Lock.EnterWriteLock(); + + try { + HashSet.TrimExcess(); + } finally { + Lock.ExitWriteLock(); + } + } + public void Dispose() => Lock.Dispose(); public void CopyTo(T[] array, int arrayIndex) {