using System; using System.Collections.Generic; using System.Linq; using Dalamud.Plugin.Services; using Lumina.Excel; using Lumina.Excel.Sheets; namespace QuestionableCompanion.Services; public class DataCenterService { private readonly IDataManager dataManager; private readonly IPluginLog log; private readonly Dictionary worldToDCCache = new Dictionary(); private readonly Dictionary dataCenterToRegion = new Dictionary { { "Chaos", "EU" }, { "Light", "EU" }, { "Shadow", "EU" }, { "Aether", "NA" }, { "Primal", "NA" }, { "Crystal", "NA" }, { "Dynamis", "NA" }, { "Elemental", "JP" }, { "Gaia", "JP" }, { "Mana", "JP" }, { "Meteor", "JP" }, { "Materia", "OCE" }, { "陆行鸟", "Others" }, { "莫古力", "Others" }, { "猫小胖", "Others" }, { "豆豆柴", "Others" } }; public DataCenterService(IDataManager dataManager, IPluginLog log) { this.dataManager = dataManager; this.log = log; } public void InitializeWorldMapping() { try { ExcelSheet worldSheet = dataManager.GetExcelSheet(); if (worldSheet == null) { return; } int worldCount = 0; int skippedCount = 0; foreach (World world in worldSheet) { if (world.RowId == 0) { continue; } string worldName = world.Name.ExtractText(); if (string.IsNullOrEmpty(worldName)) { skippedCount++; continue; } WorldDCGroupType? dataCenterGroup = world.DataCenter.ValueNullable; if (!dataCenterGroup.HasValue) { skippedCount++; continue; } string dataCenterName = dataCenterGroup.Value.Name.ExtractText(); if (string.IsNullOrEmpty(dataCenterName)) { skippedCount++; continue; } if (!world.IsPublic) { skippedCount++; continue; } string region = GetRegionForDataCenter(dataCenterName); worldToDCCache[worldName.ToLower()] = region; worldCount++; if (worldCount > 10) { _ = region != "Others"; } } } catch (Exception) { } } private string GetRegionForDataCenter(string dataCenterName) { if (dataCenterToRegion.TryGetValue(dataCenterName, out string region)) { return region; } return "Others"; } public string GetDataCenterForWorld(string worldName) { if (string.IsNullOrEmpty(worldName)) { return "Unknown"; } string key = worldName.ToLower(); if (worldToDCCache.TryGetValue(key, out string dataCenter)) { return dataCenter; } return "Unknown"; } public Dictionary> GroupCharactersByDataCenter(List characters) { Dictionary> grouped = new Dictionary> { { "EU", new List() }, { "NA", new List() }, { "JP", new List() }, { "OCE", new List() }, { "Others", new List() }, { "Unknown", new List() } }; foreach (string character in characters) { try { string[] parts = character.Split('@'); if (parts.Length != 2) { grouped["Unknown"].Add(character); continue; } string worldName = parts[1]; string dataCenter = GetDataCenterForWorld(worldName); if (!grouped.ContainsKey(dataCenter)) { grouped[dataCenter] = new List(); } grouped[dataCenter].Add(character); } catch (Exception) { grouped["Unknown"].Add(character); } } foreach (KeyValuePair> item in grouped.Where((KeyValuePair> g) => g.Value.Count > 0)) { _ = item; } return grouped; } public List GetAvailableDataCenters(Dictionary> charactersByDataCenter) { List dataCenters = new List { "All" }; string[] array = new string[6] { "EU", "NA", "JP", "OCE", "Others", "Unknown" }; foreach (string dc in array) { if (charactersByDataCenter.TryGetValue(dc, out List chars) && chars.Count > 0) { dataCenters.Add(dc); } } return dataCenters; } public List GetCharactersForDataCenter(List allCharacters, string dataCenterName, Dictionary> charactersByDataCenter) { if (dataCenterName == "All") { return allCharacters; } if (charactersByDataCenter.TryGetValue(dataCenterName, out List characters)) { return characters; } return new List(); } }