diff --git a/LightlessSync/UI/BroadcastUI.cs b/LightlessSync/UI/BroadcastUI.cs index 2076f6c..6d50184 100644 --- a/LightlessSync/UI/BroadcastUI.cs +++ b/LightlessSync/UI/BroadcastUI.cs @@ -22,7 +22,7 @@ namespace LightlessSync.UI private IReadOnlyList _allSyncshells; private string _userUid = string.Empty; - private List<(string Label, string? GID, bool IsAvailable)> _syncshellOptions = new(); + private readonly List<(string Label, string? GID, bool IsAvailable)> _syncshellOptions = new(); public BroadcastUI( ILogger logger, @@ -48,7 +48,7 @@ namespace LightlessSync.UI MaximumSize = new(750, 400) }; - mediator.Subscribe(this, async _ => await RefreshSyncshells()); + mediator.Subscribe(this, async _ => await RefreshSyncshells().ConfigureAwait(false)); } private void RebuildSyncshellDropdownOptions() @@ -62,7 +62,7 @@ namespace LightlessSync.UI _syncshellOptions.Clear(); _syncshellOptions.Add(("None", null, true)); - var addedGids = new HashSet(); + var addedGids = new HashSet(StringComparer.Ordinal); foreach (var shell in ownedSyncshells) { @@ -73,7 +73,7 @@ namespace LightlessSync.UI if (!string.IsNullOrEmpty(selectedGid) && !addedGids.Contains(selectedGid)) { - var matching = allSyncshells.FirstOrDefault(g => g.GID == selectedGid); + var matching = allSyncshells.FirstOrDefault(g => string.Equals(g.GID, selectedGid, StringComparison.Ordinal)); if (matching != null) { var label = matching.GroupAliasOrGID ?? matching.GID; @@ -97,7 +97,7 @@ namespace LightlessSync.UI { if (!_apiController.IsConnected) { - _allSyncshells = Array.Empty(); + _allSyncshells = []; RebuildSyncshellDropdownOptions(); return; } @@ -109,7 +109,7 @@ namespace LightlessSync.UI catch (Exception ex) { _logger.LogError(ex, "Failed to fetch Syncshells."); - _allSyncshells = Array.Empty(); + _allSyncshells = []; } RebuildSyncshellDropdownOptions(); @@ -260,14 +260,14 @@ namespace LightlessSync.UI } var selectedGid = _configService.Current.SelectedFinderSyncshell; - var currentOption = _syncshellOptions.FirstOrDefault(o => o.GID == selectedGid); + var currentOption = _syncshellOptions.FirstOrDefault(o => string.Equals(o.GID, selectedGid, StringComparison.Ordinal)); var preview = currentOption.Label ?? "Select a Syncshell..."; if (ImGui.BeginCombo("##SyncshellDropdown", preview)) { foreach (var (label, gid, available) in _syncshellOptions) { - bool isSelected = gid == selectedGid; + bool isSelected = string.Equals(gid, selectedGid, StringComparison.Ordinal); if (!available) ImGui.PushStyleColor(ImGuiCol.Text, UIColors.Get("DimRed")); @@ -373,10 +373,5 @@ namespace LightlessSync.UI ImGui.EndTabBar(); } } - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - } } } diff --git a/LightlessSync/UI/ContextMenu.cs b/LightlessSync/UI/ContextMenu.cs index 5a8b291..80bbb0c 100644 --- a/LightlessSync/UI/ContextMenu.cs +++ b/LightlessSync/UI/ContextMenu.cs @@ -9,6 +9,7 @@ using LightlessSync.WebAPI; using Lumina.Excel.Sheets; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using System.Linq; namespace LightlessSync.UI; @@ -141,8 +142,29 @@ internal class ContextMenu : IHostedService private World GetWorld(uint worldId) { var sheet = _gameData.GetExcelSheet()!; - return sheet.TryGetRow(worldId, out var world) ? world : sheet.First(); + var luminaWorlds = sheet.Where(x => + { + var dc = x.DataCenter.ValueNullable; + var name = x.Name.ExtractText(); + var internalName = x.InternalName.ExtractText(); + + if (dc == null || dc.Value.Region == 0 || string.IsNullOrWhiteSpace(dc.Value.Name.ExtractText())) + return false; + + if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(internalName)) + return false; + + if (name.Contains('-', StringComparison.Ordinal) || name.Contains('_', StringComparison.Ordinal)) + return false; + + return x.RowId > 3001 && IsChineseJapaneseKoreanString(name); + }); + + return luminaWorlds.FirstOrDefault(x => x.RowId == worldId); } + private static bool IsChineseJapaneseKoreanString(string text) => text.All(IsChineseJapaneseKoreanCharacter); + + private static bool IsChineseJapaneseKoreanCharacter(char c) => (c >= 0x4E00 && c <= 0x9FFF); public bool IsWorldValid(uint worldId) => IsWorldValid(GetWorld(worldId));