diff --git a/Core/Services/TraderPurchasePersisterService.cs b/Core/Services/TraderPurchasePersisterService.cs index 8c6cbd26..45a5051c 100644 --- a/Core/Services/TraderPurchasePersisterService.cs +++ b/Core/Services/TraderPurchasePersisterService.cs @@ -1,11 +1,44 @@ -using Core.Annotations; +using Core.Annotations; +using Core.Helpers; using Core.Models.Eft.Profile; +using Core.Models.Enums; +using Core.Models.Spt.Config; +using Core.Servers; +using Core.Utils; +using ILogger = Core.Models.Utils.ILogger; namespace Core.Services; [Injectable(InjectionType.Singleton)] public class TraderPurchasePersisterService { + private readonly ILogger _logger; + private readonly RandomUtil _randomUtil; + private readonly TimeUtil _timeUtil; + private readonly ProfileHelper _profileHelper; + private readonly LocalisationService _localisationService; + private readonly ConfigServer _configServer; + + private readonly TraderConfig _traderConfig; + + public TraderPurchasePersisterService( + ILogger logger, + RandomUtil randomUtil, + TimeUtil timeUtil, + ProfileHelper profileHelper, + LocalisationService localisationService, + ConfigServer configServer) + { + _logger = logger; + _randomUtil = randomUtil; + _timeUtil = timeUtil; + _profileHelper = profileHelper; + _localisationService = localisationService; + _configServer = configServer; + + _traderConfig = _configServer.GetConfig(ConfigTypes.TRADER); + } + /** * Get the purchases made from a trader for this profile before the last trader reset * @param sessionId Session id @@ -49,6 +82,43 @@ public class TraderPurchasePersisterService */ public void RemoveStalePurchasesFromProfiles(string traderId) { - throw new NotImplementedException(); + var profiles = _profileHelper.GetProfiles(); + foreach (var profileKvP in profiles) { + var profile = profileKvP.Value; + + // Skip if no purchases or no trader-specific purchases + var purchasesFromTrader = profile.TraderPurchases?.GetValueOrDefault(traderId, null); + if (purchasesFromTrader is null) + { + continue; + } + + foreach (var purchaseKvP in purchasesFromTrader) { + var traderUpdateDetails = _traderConfig.UpdateTime.FirstOrDefault((x) => x.TraderId == traderId); + if (traderUpdateDetails is null) + { + _logger.Error( + _localisationService.GetText("trader-unable_to_delete_stale_purchases", new { + profileId = profile.ProfileInfo.ProfileId, + traderId = traderId, + }) + ); + + continue; + } + + var purchaseDetails = purchaseKvP.Value; + var resetTimeForItem = + purchaseDetails.PurchaseTimestamp + + _randomUtil.GetInt((int)traderUpdateDetails.Seconds.Min, (int)traderUpdateDetails.Seconds.Max); + if (resetTimeForItem < _timeUtil.GetTimeStamp()) + { + // Item was purchased far enough in past a trader refresh would have occured, remove purchase record from profile + _logger.Debug($"Removed trader: ${ traderId} purchase: ${ purchaseKvP} from profile: ${ profile.ProfileInfo.ProfileId}"); + + profile.TraderPurchases.Remove(purchaseKvP.Key); + } + } + } } }