qstbak/QuestionableCompanion/QuestionableCompanion.Services/DataCenterService.cs
2025-12-04 04:39:08 +10:00

206 lines
4.4 KiB
C#

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<string, string> worldToDCCache = new Dictionary<string, string>();
private readonly Dictionary<string, string> dataCenterToRegion = new Dictionary<string, string>
{
{ "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<World> worldSheet = dataManager.GetExcelSheet<World>();
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<string, List<string>> GroupCharactersByDataCenter(List<string> characters)
{
Dictionary<string, List<string>> grouped = new Dictionary<string, List<string>>
{
{
"EU",
new List<string>()
},
{
"NA",
new List<string>()
},
{
"JP",
new List<string>()
},
{
"OCE",
new List<string>()
},
{
"Others",
new List<string>()
},
{
"Unknown",
new List<string>()
}
};
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<string>();
}
grouped[dataCenter].Add(character);
}
catch (Exception)
{
grouped["Unknown"].Add(character);
}
}
foreach (KeyValuePair<string, List<string>> item in grouped.Where((KeyValuePair<string, List<string>> g) => g.Value.Count > 0))
{
_ = item;
}
return grouped;
}
public List<string> GetAvailableDataCenters(Dictionary<string, List<string>> charactersByDataCenter)
{
List<string> dataCenters = new List<string> { "All" };
string[] array = new string[6] { "EU", "NA", "JP", "OCE", "Others", "Unknown" };
foreach (string dc in array)
{
if (charactersByDataCenter.TryGetValue(dc, out List<string> chars) && chars.Count > 0)
{
dataCenters.Add(dc);
}
}
return dataCenters;
}
public List<string> GetCharactersForDataCenter(List<string> allCharacters, string dataCenterName, Dictionary<string, List<string>> charactersByDataCenter)
{
if (dataCenterName == "All")
{
return allCharacters;
}
if (charactersByDataCenter.TryGetValue(dataCenterName, out List<string> characters))
{
return characters;
}
return new List<string>();
}
}