From fd811d8cf442ac1cc8487615ff0d4b8c094cbdb2 Mon Sep 17 00:00:00 2001 From: Archi Date: Mon, 18 Mar 2024 12:44:29 +0100 Subject: [PATCH] Implement DeepClone() for asset and description --- .../RemoteCommunication.cs | 6 +++--- ArchiSteamFarm/Steam/Bot.cs | 2 +- ArchiSteamFarm/Steam/Data/Asset.cs | 3 ++- ArchiSteamFarm/Steam/Data/InventoryDescription.cs | 3 +++ ArchiSteamFarm/Steam/Exchange/Trading.cs | 4 ++-- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ArchiSteamFarm.OfficialPlugins.ItemsMatcher/RemoteCommunication.cs b/ArchiSteamFarm.OfficialPlugins.ItemsMatcher/RemoteCommunication.cs index 5a981247c..e16dde016 100644 --- a/ArchiSteamFarm.OfficialPlugins.ItemsMatcher/RemoteCommunication.cs +++ b/ArchiSteamFarm.OfficialPlugins.ItemsMatcher/RemoteCommunication.cs @@ -1347,11 +1347,11 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable { fairClassIDsToReceive[theirItem] = ++fairReceivedAmount; // Filter their inventory for the sets we're trading or have traded with this user - HashSet fairFiltered = theirInventory.Where(item => ((item.RealAppID == set.RealAppID) && (item.Type == set.Type) && (item.Rarity == set.Rarity)) || skippedSetsThisTrade.Contains((item.RealAppID, item.Type, item.Rarity))).Select(static item => item.CreateShallowCopy()).ToHashSet(); + HashSet fairFiltered = theirInventory.Where(item => ((item.RealAppID == set.RealAppID) && (item.Type == set.Type) && (item.Rarity == set.Rarity)) || skippedSetsThisTrade.Contains((item.RealAppID, item.Type, item.Rarity))).Select(static item => item.DeepClone()).ToHashSet(); // Copy list to HashSet - HashSet fairItemsToGive = Trading.GetTradableItemsFromInventory(ourInventory.Values.Where(item => ((item.RealAppID == set.RealAppID) && (item.Type == set.Type) && (item.Rarity == set.Rarity)) || skippedSetsThisTrade.Contains((item.RealAppID, item.Type, item.Rarity))).Select(static item => item.CreateShallowCopy()).ToHashSet(), fairClassIDsToGive.ToDictionary(static classID => classID.Key, static classID => classID.Value)); - HashSet fairItemsToReceive = Trading.GetTradableItemsFromInventory(fairFiltered.Select(static item => item.CreateShallowCopy()).ToHashSet(), fairClassIDsToReceive.ToDictionary(static classID => classID.Key, static classID => classID.Value)); + HashSet fairItemsToGive = Trading.GetTradableItemsFromInventory(ourInventory.Values.Where(item => ((item.RealAppID == set.RealAppID) && (item.Type == set.Type) && (item.Rarity == set.Rarity)) || skippedSetsThisTrade.Contains((item.RealAppID, item.Type, item.Rarity))).Select(static item => item.DeepClone()).ToHashSet(), fairClassIDsToGive.ToDictionary(static classID => classID.Key, static classID => classID.Value)); + HashSet fairItemsToReceive = Trading.GetTradableItemsFromInventory(fairFiltered.Select(static item => item.DeepClone()).ToHashSet(), fairClassIDsToReceive.ToDictionary(static classID => classID.Key, static classID => classID.Value)); // Actual check if (!Trading.IsTradeNeutralOrBetter(fairFiltered, fairItemsToReceive, fairItemsToGive)) { diff --git a/ArchiSteamFarm/Steam/Bot.cs b/ArchiSteamFarm/Steam/Bot.cs index ced23b830..fcc244c01 100644 --- a/ArchiSteamFarm/Steam/Bot.cs +++ b/ArchiSteamFarm/Steam/Bot.cs @@ -723,7 +723,7 @@ public sealed class Bot : IAsyncDisposable, IDisposable { foreach (Asset item in itemsOfClass.TakeWhile(_ => classRemaining > 0)) { if (item.Amount > classRemaining) { - Asset itemToSend = item.CreateShallowCopy(); + Asset itemToSend = item.DeepClone(); itemToSend.Amount = classRemaining; result.Add(itemToSend); diff --git a/ArchiSteamFarm/Steam/Data/Asset.cs b/ArchiSteamFarm/Steam/Data/Asset.cs index 0d3bd7338..a06f90533 100644 --- a/ArchiSteamFarm/Steam/Data/Asset.cs +++ b/ArchiSteamFarm/Steam/Data/Asset.cs @@ -24,6 +24,7 @@ using System; using System.Text.Json.Serialization; using JetBrains.Annotations; +using ProtoBuf; using SteamKit2.Internal; namespace ArchiSteamFarm.Steam.Data; @@ -141,5 +142,5 @@ public sealed class Asset { [JsonConstructor] private Asset() { } - internal Asset CreateShallowCopy() => (Asset) MemberwiseClone(); + public Asset DeepClone() => new(Serializer.DeepClone(Body), Description?.DeepClone()); } diff --git a/ArchiSteamFarm/Steam/Data/InventoryDescription.cs b/ArchiSteamFarm/Steam/Data/InventoryDescription.cs index 0d407361f..d5e001739 100644 --- a/ArchiSteamFarm/Steam/Data/InventoryDescription.cs +++ b/ArchiSteamFarm/Steam/Data/InventoryDescription.cs @@ -31,6 +31,7 @@ using ArchiSteamFarm.Core; using ArchiSteamFarm.Helpers.Json; using ArchiSteamFarm.Localization; using JetBrains.Annotations; +using ProtoBuf; using SteamKit2.Internal; namespace ArchiSteamFarm.Steam.Data; @@ -543,4 +544,6 @@ public sealed class InventoryDescription { [JsonConstructor] private InventoryDescription() { } + + public InventoryDescription DeepClone() => new(Serializer.DeepClone(Body)); } diff --git a/ArchiSteamFarm/Steam/Exchange/Trading.cs b/ArchiSteamFarm/Steam/Exchange/Trading.cs index 1a486095b..bedc35432 100644 --- a/ArchiSteamFarm/Steam/Exchange/Trading.cs +++ b/ArchiSteamFarm/Steam/Exchange/Trading.cs @@ -276,7 +276,7 @@ public sealed class Trading : IDisposable { continue; } - Asset itemToAdd = item.CreateShallowCopy(); + Asset itemToAdd = item.DeepClone(); if (amount < itemToAdd.Amount) { // We give only a fraction of this item @@ -664,7 +664,7 @@ public sealed class Trading : IDisposable { return ParseTradeResult.EResult.TryAgain; } - bool accept = IsTradeNeutralOrBetter(inventory, tradeOffer.ItemsToGive.Select(static item => item.CreateShallowCopy()).ToHashSet(), tradeOffer.ItemsToReceive.Select(static item => item.CreateShallowCopy()).ToHashSet()); + bool accept = IsTradeNeutralOrBetter(inventory, tradeOffer.ItemsToGive.Select(static item => item.DeepClone()).ToHashSet(), tradeOffer.ItemsToReceive.Select(static item => item.DeepClone()).ToHashSet()); // We're now sure whether the trade is neutral+ for us or not ParseTradeResult.EResult acceptResult = accept ? ParseTradeResult.EResult.Accepted : ParseTradeResult.EResult.Rejected;