diff --git a/ArchiSteamFarm/ArchiWebHandler.cs b/ArchiSteamFarm/ArchiWebHandler.cs index 73f80509a..572dc9608 100644 --- a/ArchiSteamFarm/ArchiWebHandler.cs +++ b/ArchiSteamFarm/ArchiWebHandler.cs @@ -183,7 +183,7 @@ namespace ArchiSteamFarm { return null; } - Dictionary descriptions = new Dictionary(); + Dictionary<(ulong ClassID, ulong InstanceID), (bool Marketable, bool Tradable, uint RealAppID, Steam.Asset.EType Type, Steam.Asset.ERarity Rarity)> descriptions = new Dictionary<(ulong ClassID, ulong InstanceID), (bool Marketable, bool Tradable, uint RealAppID, Steam.Asset.EType Type, Steam.Asset.ERarity Rarity)>(); foreach (Steam.InventoryResponse.Description description in response.Descriptions.Where(description => description != null)) { if (description.ClassID == 0) { @@ -192,15 +192,11 @@ namespace ArchiSteamFarm { return null; } - if (descriptions.ContainsKey(description.ClassID)) { - continue; - } - - descriptions[description.ClassID] = (description.Marketable, description.Tradable, description.RealAppID, description.Type, description.Rarity); + descriptions[(description.ClassID, description.InstanceID)] = (description.Marketable, description.Tradable, description.RealAppID, description.Type, description.Rarity); } foreach (Steam.Asset asset in response.Assets.Where(asset => asset != null)) { - if (descriptions.TryGetValue(asset.ClassID, out (bool Marketable, bool Tradable, uint RealAppID, Steam.Asset.EType Type, Steam.Asset.ERarity Rarity) description)) { + if (descriptions.TryGetValue((asset.ClassID, asset.InstanceID), out (bool Marketable, bool Tradable, uint RealAppID, Steam.Asset.EType Type, Steam.Asset.ERarity Rarity) description)) { if ((marketable.HasValue && (description.Marketable != marketable.Value)) || (tradable.HasValue && (description.Tradable != tradable.Value)) || (wantedRealAppIDs?.Contains(description.RealAppID) == false) || (unwantedRealAppIDs?.Contains(description.RealAppID) == true) || (wantedTypes?.Contains(description.Type) == false) || (wantedSets?.Contains((description.RealAppID, description.Type, description.Rarity)) == false)) { continue; } diff --git a/ArchiSteamFarm/Json/Steam.cs b/ArchiSteamFarm/Json/Steam.cs index bf6affc4b..4aaa151d1 100644 --- a/ArchiSteamFarm/Json/Steam.cs +++ b/ArchiSteamFarm/Json/Steam.cs @@ -55,6 +55,9 @@ namespace ArchiSteamFarm.Json { [PublicAPI] public ulong ContextID { get; private set; } + [PublicAPI] + public ulong InstanceID { get; private set; } + [PublicAPI] public bool Marketable { get; internal set; } @@ -171,6 +174,25 @@ namespace ArchiSteamFarm.Json { } #pragma warning restore IDE0051 +#pragma warning disable IDE0051 + [JsonProperty(PropertyName = "instanceid", Required = Required.DisallowNull)] + private string InstanceIDText { + set { + if (string.IsNullOrEmpty(value)) { + return; + } + + if (!ulong.TryParse(value, out ulong instanceID)) { + ASF.ArchiLogger.LogNullError(nameof(instanceID)); + + return; + } + + InstanceID = instanceID; + } + } +#pragma warning restore IDE0051 + // Constructed from trades being received or plugins public Asset(uint appID, ulong contextID, ulong classID, uint amount, bool marketable = true, uint realAppID = 0, EType type = EType.Unknown, ERarity rarity = ERarity.Unknown) { if ((appID == 0) || (contextID == 0) || (classID == 0) || (amount == 0)) { @@ -456,6 +478,7 @@ namespace ArchiSteamFarm.Json { internal readonly uint AppID; internal ulong ClassID { get; private set; } + internal ulong InstanceID { get; private set; } internal bool Marketable { get; private set; } internal Asset.ERarity Rarity { get; private set; } internal uint RealAppID { get; private set; } @@ -483,6 +506,25 @@ namespace ArchiSteamFarm.Json { } #pragma warning restore IDE0051 +#pragma warning disable IDE0051 + [JsonProperty(PropertyName = "instanceid", Required = Required.DisallowNull)] + private string InstanceIDText { + set { + if (string.IsNullOrEmpty(value)) { + return; + } + + if (!ulong.TryParse(value, out ulong instanceID)) { + ASF.ArchiLogger.LogNullError(nameof(instanceID)); + + return; + } + + InstanceID = instanceID; + } + } +#pragma warning restore IDE0051 + #pragma warning disable IDE0051 [JsonProperty(PropertyName = "marketable", Required = Required.Always)] private byte MarketableNumber {