diff --git a/Core/Callbacks/RagfairCallbacks.cs b/Core/Callbacks/RagfairCallbacks.cs index 3f457fd0..ca17a33b 100644 --- a/Core/Callbacks/RagfairCallbacks.cs +++ b/Core/Callbacks/RagfairCallbacks.cs @@ -1,4 +1,4 @@ -using Core.Annotations; +using Core.Annotations; using Core.Controllers; using Core.DI; using Core.Models.Eft.Common; @@ -16,7 +16,7 @@ namespace Core.Callbacks; [Injectable(InjectableTypeOverride = typeof(RagfairCallbacks))] public class RagfairCallbacks( HttpResponseUtil _httpResponseUtil, - // RagfairServer _ragfairServer + RagfairServer _ragfairServer, RagfairController _ragfairController, RagfairTaxService _ragfairTaxService, ConfigServer _configServer @@ -27,7 +27,6 @@ public class RagfairCallbacks( public async Task OnLoad() { // await _ragfairServer.Load(); - // TODO: implement RagfairServer } public string GetRoute() diff --git a/Core/Servers/RagfairServer.cs b/Core/Servers/RagfairServer.cs new file mode 100644 index 00000000..808b2a25 --- /dev/null +++ b/Core/Servers/RagfairServer.cs @@ -0,0 +1,134 @@ +using Core.Annotations; +using Core.Generators; +using Core.Models.Eft.Ragfair; +using Core.Models.Enums; +using Core.Models.Spt.Config; +using Core.Models.Utils; +using Core.Services; + +namespace Core.Servers +{ + [Injectable] + public class RagfairServer + { + protected ISptLogger _logger; + protected RagfairOfferService _ragfairOfferService; + protected RagfairCategoriesService _ragfairCategoriesService; + protected RagfairRequiredItemsService _ragfairRequiredItemsService; + protected LocalisationService _localisationService; + protected RagfairOfferGenerator _ragfairOfferGenerator; + protected ConfigServer _configServer; + protected RagfairConfig _ragfairConfig; + + public RagfairServer( + ISptLogger logger, + RagfairOfferService ragfairOfferService, + RagfairCategoriesService ragfairCategoriesService, + RagfairRequiredItemsService ragfairRequiredItemsService, + LocalisationService localisationService, + RagfairOfferGenerator ragfairOfferGenerator, + ConfigServer configServer) + { + _logger = logger; + _ragfairOfferService = ragfairOfferService; + _ragfairCategoriesService = ragfairCategoriesService; + _ragfairRequiredItemsService = ragfairRequiredItemsService; + _localisationService = localisationService; + _ragfairOfferGenerator = ragfairOfferGenerator; + _configServer = configServer; + + _ragfairConfig = _configServer.GetConfig(); + } + + public async Task Load(){ + _logger.Info(_localisationService.GetText("ragfair-generating_offers")); + await _ragfairOfferGenerator.GenerateDynamicOffers(); + await Update(); + } + + private async Task Update() + { + _ragfairOfferService.ExpireStaleOffers(); + + // Generate trader offers + var traders = GetUpdateableTraders(); + foreach (var traderId in traders) { + // Edge case - skip generating fence offers + if (traderId == Traders.FENCE) + { + continue; + } + + if (_ragfairOfferService.TraderOffersNeedRefreshing(traderId)) + { + _ragfairOfferGenerator.GenerateFleaOffersForTrader(traderId); + } + } + + // Regenerate expired offers when over threshold limit + if (_ragfairOfferService.GetExpiredOfferCount() >= _ragfairConfig.Dynamic.ExpiredOfferThreshold) + { + var expiredAssortsWithChildren = _ragfairOfferService.GetExpiredOfferAssorts(); + await _ragfairOfferGenerator.GenerateDynamicOffers(expiredAssortsWithChildren); + + // Clear out expired offers now we've generated them + _ragfairOfferService.ResetExpiredOffers(); + } + + _ragfairRequiredItemsService.BuildRequiredItemTable(); + } + + /** + * Get traders who need to be periodically refreshed + * @returns string array of traders + */ + public List GetUpdateableTraders() + { + return _ragfairConfig.Traders.Keys.ToList(); + } + + public Dictionary GetAllActiveCategories( + bool fleaUnlocked, + SearchRequestData searchRequestData, + List offers){ + return _ragfairCategoriesService.GetCategoriesFromOffers(offers, searchRequestData, fleaUnlocked); + } + + /** + * Disable/Hide an offer from flea + * @param offerId + */ + public void HideOffer(string offerId){ + var offers = _ragfairOfferService.GetOffers(); + var offer = offers.FirstOrDefault((x) => x.Id == offerId); + + if (offer is null) { + _logger.Error(_localisationService.GetText("ragfair-offer_not_found_unable_to_hide", offerId)); + + return; + } + + offer.Locked = true; + } + + public RagfairOffer GetOffer(string offerId) { + return _ragfairOfferService.GetOfferByOfferId(offerId); + } + + public List GetOffers() { + return _ragfairOfferService.GetOffers(); + } + + public void RemoveOfferStack(string offerId, int amount) { + _ragfairOfferService.RemoveOfferStack(offerId, amount); + } + + public bool DoesOfferExist(string offerId) { + return _ragfairOfferService.DoesOfferExist(offerId); + } + + public void AddPlayerOffers() { + _ragfairOfferService.AddPlayerOffers(); + } +} +}