using SPTarkov.DI.Annotations; using SPTarkov.Server.Core.Extensions; using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Eft.Ragfair; using SPTarkov.Server.Core.Models.Enums; using SPTarkov.Server.Core.Models.Spt.Config; using SPTarkov.Server.Core.Servers; using SPTarkov.Server.Core.Services; using SPTarkov.Server.Core.Utils.Cloners; namespace SPTarkov.Server.Core.Helpers; [Injectable] public class RagfairHelper( TraderAssortHelper traderAssortHelper, DatabaseService databaseService, HandbookHelper handbookHelper, ItemHelper itemHelper, RagfairLinkedItemService ragfairLinkedItemService, ConfigServer configServer, ICloner cloner ) { protected readonly RagfairConfig _ragfairConfig = configServer.GetConfig(); /// /// Gets currency TAG from currency tpl value /// /// Currency tpl /// Currency tag, e.g. RUB public string GetCurrencyTag(string currencyTpl) { switch (currencyTpl) { case Money.EUROS: return "EUR"; case Money.DOLLARS: return "USD"; case Money.ROUBLES: return "RUB"; case Money.GP: return "GP"; default: return ""; } } /// /// Get a currency TAG by its search filter value (e.g. 0 = all, 1 = RUB) /// /// Search filter choice /// Currency tag public string GetCurrencyTag(int currencyFilter) { switch (currencyFilter) { case 3: return "EUR"; case 2: return "USD"; case 1: return "RUB"; default: return "all"; } } public List FilterCategories(string sessionId, SearchRequestData request) { var result = new List(); // Case: weapon builds if (request.BuildCount > 0) { return request.BuildItems.Keys.ToList(); } // Case: search if (!string.IsNullOrEmpty(request.LinkedSearchId)) { var data = ragfairLinkedItemService.GetLinkedItems(request.LinkedSearchId); result = [.. data]; } // Case: category if (!string.IsNullOrEmpty(request.HandbookId)) { var handbook = GetCategoryList(request.HandbookId); result = result?.Count > 0 ? result.IntersectWith(handbook) : handbook; } return result; } public Dictionary GetDisplayableAssorts(string sessionId) { var result = new Dictionary(); foreach ( var traderId in databaseService .GetTraders() .Keys.Where(traderId => _ragfairConfig.Traders.ContainsKey(traderId)) ) { result[traderId] = traderAssortHelper.GetAssort(sessionId, traderId, true); } return result; } protected List GetCategoryList(string handbookId) { var result = new List(); // if its "mods" great-parent category, do double recursive loop if (handbookId == "5b5f71a686f77447ed5636ab") { foreach (var category in handbookHelper.ChildrenCategories(handbookId)) { foreach (var subCategory in handbookHelper.ChildrenCategories(category)) { result = [.. result, .. handbookHelper.TemplatesWithParent(subCategory)]; } } return result; } // item is in any other category if (handbookHelper.IsCategory(handbookId)) { // list all item of the category result = handbookHelper.TemplatesWithParent(handbookId); return handbookHelper .ChildrenCategories(handbookId) .Aggregate( result, (current, category) => [.. current, .. handbookHelper.TemplatesWithParent(category)] ); } // It's a specific item searched result.Add(handbookId); return result; } /** * Iterate over array of identical items and merge stack count * Ragfair allows abnormally large stacks. */ public List MergeStackable(List items) { var list = new List(); Item? rootItem = null; foreach (var item in items) { item.FixItemStackCount(); var isChild = items.Any(it => it.Id == item.ParentId); if (!isChild) { if (rootItem == null) { rootItem = cloner.Clone(item); rootItem.Upd.OriginalStackObjectsCount = rootItem.Upd.StackObjectsCount; } else { rootItem.Upd.StackObjectsCount += item.Upd.StackObjectsCount; list.Add(item); } } else { list.Add(item); } } return [rootItem, .. list]; } /** * Return the symbol for a currency * e.g. 5449016a4bdc2d6f028b456f return ₽ * @param currencyTpl currency to get symbol for * @returns symbol of currency */ public string GetCurrencySymbol(string currencyTpl) { return currencyTpl switch { Money.EUROS => "€", Money.DOLLARS => "$", _ => "₽", }; } }