diff --git a/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs b/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs index f98d34ce..0633e773 100644 --- a/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs +++ b/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs @@ -39,8 +39,8 @@ public class RagfairServer( RefreshTraderOffers(); ProcessExpiredFleaOffers(); - // Update requirements now offers have been expired/regenerated, ensuring accuracy - ragfairRequiredItemsService.BuildRequiredItemTable(); + // Flag data as stale and in need of regeneration + ragfairRequiredItemsService.CacheIsStale(); } protected void RefreshTraderOffers() diff --git a/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs b/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs index 3a96a4df..503b22e9 100644 --- a/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs @@ -8,6 +8,8 @@ namespace SPTarkov.Server.Core.Services; [Injectable(InjectionType.Singleton)] public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService, PaymentHelper paymentHelper) { + private bool _cacheIsStale = true; + /// /// Key = tpl /// @@ -25,6 +27,11 @@ public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService /// Set of OfferIds public IReadOnlySet GetRequiredOffersById(MongoId tpl) { + if (_cacheIsStale) + { + BuildRequiredItemTable(); + } + return RequiredItemsCache.TryGetValue(tpl, out var offerIds) ? offerIds : EmptyOfferIdSet; } @@ -33,13 +40,13 @@ public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService /// public void BuildRequiredItemTable() { - RequiredItemsCache.Clear(); + Clear(); + foreach (var offer in ragfairOfferService.GetOffers()) { foreach (var requirement in offer.Requirements ?? []) { - // Skip offers for currency, it's too expensive to process - // Only process barter offers + // Skip offers for currency, we only need barter offers as this cache is used by `GetOffersThatRequireItem` if (paymentHelper.IsMoneyTpl(requirement.TemplateId)) { continue; @@ -52,5 +59,24 @@ public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService offerIds.Add(offer.Id); } } + + // Cache is now fresh + _cacheIsStale = false; + } + + /// + /// Clear all data from cache + /// + public void Clear() + { + RequiredItemsCache.Clear(); + } + + /// + /// Flag the cache as stale + /// + public void CacheIsStale() + { + _cacheIsStale = true; } }