diff --git a/ArchiSteamFarm/Steam/Bot.cs b/ArchiSteamFarm/Steam/Bot.cs index 8e5755d87..6fe8ff8bb 100644 --- a/ArchiSteamFarm/Steam/Bot.cs +++ b/ArchiSteamFarm/Steam/Bot.cs @@ -1180,14 +1180,14 @@ public sealed class Bot : IAsyncDisposable, IDisposable { return (0, DateTime.MaxValue, true); } - if ((packageData.ProhibitRunInCountries == null) || packageData.ProhibitRunInCountries.IsEmpty) { + if (((packageData.ProhibitRunInCountries == null) || packageData.ProhibitRunInCountries.IsEmpty) && ((packageData.OnlyAllowRunInCountries == null) || packageData.OnlyAllowRunInCountries.IsEmpty)) { // No restrictions, we're good to go regionRestrictedUntil = null; break; } - if (packageData.ProhibitRunInCountries.Contains(IPCountryCode)) { + if ((packageData.ProhibitRunInCountries?.Contains(IPCountryCode) == true) || ((packageData.OnlyAllowRunInCountries?.Count > 0) && !packageData.OnlyAllowRunInCountries.Contains(IPCountryCode))) { // We are restricted by this package, we can only be saved by another package that is not restricted DateTime regionRestrictedUntilPackage = ownedPackageData.TimeCreated.AddMonths(RegionRestrictionPlayableBlockMonths); @@ -1404,6 +1404,14 @@ public sealed class Bot : IAsyncDisposable, IDisposable { } } + string[]? onlyAllowRunInCountries = null; + + string? onlyAllowRunInCountriesText = productInfo.KeyValues["extended"]["onlyallowrunincountries"].AsString(); + + if (!string.IsNullOrEmpty(onlyAllowRunInCountriesText)) { + onlyAllowRunInCountries = onlyAllowRunInCountriesText.Split(' ', StringSplitOptions.RemoveEmptyEntries); + } + string[]? prohibitRunInCountries = null; string? prohibitRunInCountriesText = productInfo.KeyValues["extended"]["prohibitrunincountries"].AsString(); @@ -1412,7 +1420,7 @@ public sealed class Bot : IAsyncDisposable, IDisposable { prohibitRunInCountries = prohibitRunInCountriesText.Split(' ', StringSplitOptions.RemoveEmptyEntries); } - result[productInfo.ID] = new PackageData(changeNumber, validUntil, appIDs?.ToImmutableHashSet(), prohibitRunInCountries?.ToImmutableHashSet(StringComparer.Ordinal)); + result[productInfo.ID] = new PackageData(changeNumber, validUntil, appIDs?.ToImmutableHashSet(), onlyAllowRunInCountries?.ToImmutableHashSet(StringComparer.Ordinal), prohibitRunInCountries?.ToImmutableHashSet(StringComparer.Ordinal)); } return result; diff --git a/ArchiSteamFarm/Storage/PackageData.cs b/ArchiSteamFarm/Storage/PackageData.cs index bd6fdf426..d7361aec7 100644 --- a/ArchiSteamFarm/Storage/PackageData.cs +++ b/ArchiSteamFarm/Storage/PackageData.cs @@ -36,6 +36,9 @@ public sealed class PackageData { [JsonRequired] public uint ChangeNumber { get; private init; } + [JsonInclude] + public ImmutableHashSet? OnlyAllowRunInCountries { get; private init; } + [JsonInclude] public ImmutableHashSet? ProhibitRunInCountries { get; private init; } @@ -43,13 +46,14 @@ public sealed class PackageData { [JsonRequired] public DateTime ValidUntil { get; private init; } - internal PackageData(uint changeNumber, DateTime validUntil, ImmutableHashSet? appIDs = null, ImmutableHashSet? prohibitRunInCountries = null) { + internal PackageData(uint changeNumber, DateTime validUntil, ImmutableHashSet? appIDs = null, ImmutableHashSet? onlyAllowRunInCountries = null, ImmutableHashSet? prohibitRunInCountries = null) { ArgumentOutOfRangeException.ThrowIfZero(changeNumber); ArgumentOutOfRangeException.ThrowIfEqual(validUntil, DateTime.MinValue); ChangeNumber = changeNumber; ValidUntil = validUntil; AppIDs = appIDs; + OnlyAllowRunInCountries = onlyAllowRunInCountries; ProhibitRunInCountries = prohibitRunInCountries; } @@ -59,6 +63,9 @@ public sealed class PackageData { [UsedImplicitly] public bool ShouldSerializeAppIDs() => AppIDs is { IsEmpty: false }; + [UsedImplicitly] + public bool ShouldSerializeOnlyAllowRunInCountries() => OnlyAllowRunInCountries is { IsEmpty: false }; + [UsedImplicitly] public bool ShouldSerializeProhibitRunInCountries() => ProhibitRunInCountries is { IsEmpty: false }; }