From 1ef6f50246fa58a9b39b61dcb19f8022044d32ea Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Tue, 29 Oct 2024 15:09:58 +0100 Subject: [PATCH] fix issues with uid selection and in case of a bad/unparsable token --- .../ServerConfigurationManager.cs | 14 +++++- MareSynchronos/UI/SettingsUi.cs | 6 +-- MareSynchronos/UI/UISharedService.cs | 46 +++++++++++-------- 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/MareSynchronos/Services/ServerConfiguration/ServerConfigurationManager.cs b/MareSynchronos/Services/ServerConfiguration/ServerConfigurationManager.cs index 15cdaed..0ae7c6e 100644 --- a/MareSynchronos/Services/ServerConfiguration/ServerConfigurationManager.cs +++ b/MareSynchronos/Services/ServerConfiguration/ServerConfigurationManager.cs @@ -194,8 +194,18 @@ public class ServerConfigurationManager { JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler(); if (server.OAuthToken == null) return string.Empty; - var token = handler.ReadJwtToken(server.OAuthToken); - return token.Claims.First(f => string.Equals(f.Type, "discord_user", StringComparison.Ordinal)).Value!; + try + { + var token = handler.ReadJwtToken(server.OAuthToken); + return token.Claims.First(f => string.Equals(f.Type, "discord_user", StringComparison.Ordinal)).Value!; + } + catch (Exception ex) + { + _logger.LogWarning(ex, "Could not read jwt, resetting it"); + server.OAuthToken = null; + Save(); + return string.Empty; + } } public string[] GetServerNames() diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index 9e43b5a..1abda4a 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -1315,7 +1315,7 @@ public class SettingsUi : WindowMediatorSubscriberBase } else { - friendlyName = item.UID; + friendlyName = item.UID ?? "-"; friendlyNameTranslation = "UID"; } @@ -1346,7 +1346,7 @@ public class SettingsUi : WindowMediatorSubscriberBase if (!useOauth) { - _uiShared.DrawCombo("Secret Key##" + item.CharacterName + i, keys, (w) => w.Value.FriendlyName, + _uiShared.DrawCombo("Secret Key###" + item.CharacterName + i, keys, (w) => w.Value.FriendlyName, (w) => { if (w.Key != item.SecretKeyIdx) @@ -1358,7 +1358,7 @@ public class SettingsUi : WindowMediatorSubscriberBase } else { - _uiShared.DrawUIDComboForAuthentication(i, item, selectedServer.ServerUri); + _uiShared.DrawUIDComboForAuthentication(i, item, selectedServer.ServerUri, _logger); } if (_uiShared.IconTextButton(FontAwesomeIcon.Trash, "Delete Character") && UiSharedService.CtrlPressed()) _serverConfigurationManager.RemoveCharacterFromServer(idx, item); diff --git a/MareSynchronos/UI/UISharedService.cs b/MareSynchronos/UI/UISharedService.cs index a88dd86..89063b3 100644 --- a/MareSynchronos/UI/UISharedService.cs +++ b/MareSynchronos/UI/UISharedService.cs @@ -54,7 +54,7 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase private readonly Dalamud.Localization _localization; private readonly IDalamudPluginInterface _pluginInterface; private readonly ITextureProvider _textureProvider; - private readonly Dictionary _selectedComboItems = new(StringComparer.Ordinal); + private readonly Dictionary _selectedComboItems = new(StringComparer.Ordinal); private readonly ServerConfigurationManager _serverConfigurationManager; private bool _cacheDirectoryHasOtherFilesThanCache = false; @@ -552,14 +552,14 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase DrawHelpText("The storage is automatically governed by Mare. It will clear itself automatically once it reaches the set capacity by removing the oldest unused files. You typically do not need to clear it yourself."); } - public T? DrawCombo(string comboName, IEnumerable comboItems, Func toName, + public T? DrawCombo(string comboName, IEnumerable comboItems, Func toName, Action? onSelected = null, T? initialSelectedItem = default) { if (!comboItems.Any()) return default; if (!_selectedComboItems.TryGetValue(comboName, out var selectedItem) && selectedItem == null) { - if (!EqualityComparer.Default.Equals(initialSelectedItem, default)) + if (!EqualityComparer.Default.Equals(initialSelectedItem, default(T))) { selectedItem = initialSelectedItem; _selectedComboItems[comboName] = selectedItem!; @@ -568,12 +568,12 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase } else { - selectedItem = comboItems.First(); - _selectedComboItems[comboName] = selectedItem!; + selectedItem = null; + _selectedComboItems[comboName] = selectedItem; } } - if (ImGui.BeginCombo(comboName, toName((T)selectedItem!))) + if (ImGui.BeginCombo(comboName, toName((T?)selectedItem))) { foreach (var item in comboItems) { @@ -588,7 +588,7 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase ImGui.EndCombo(); } - return (T)_selectedComboItems[comboName]; + return (T?)_selectedComboItems[comboName]; } public void DrawFileScanState() @@ -879,32 +879,40 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase } } - public void DrawUIDComboForAuthentication(int indexOffset, Authentication item, string serverUri) + private record UIDAliasPair(string? UID, string? Alias); + + public void DrawUIDComboForAuthentication(int indexOffset, Authentication item, string serverUri, ILogger? logger = null) { using (ImRaii.Disabled(_discordOAuthUIDs == null)) { - DrawCombo("UID##" + item.CharacterName + serverUri + indexOffset, _discordOAuthUIDs?.Result ?? new(StringComparer.Ordinal) { { item.UID ?? string.Empty, string.Empty } }, + var aliasPairs = _discordOAuthUIDs?.Result?.Select(t => new UIDAliasPair(t.Key, t.Value)).ToList() ?? [new UIDAliasPair(item.UID ?? null, null)]; + var uidComboName = "UID###" + item.CharacterName + item.WorldId + serverUri + indexOffset; + logger?.LogInformation("Drawing Combo with name {name}", uidComboName); + DrawCombo(uidComboName, aliasPairs, (v) => { - if (!string.IsNullOrEmpty(v.Value)) - { - return $"{v.Key} ({v.Value})"; - } - - if (string.IsNullOrEmpty(v.Key)) + if (v is null) return "No UID set"; - return $"{v.Key}"; + if (!string.IsNullOrEmpty(v.Alias)) + { + return $"{v.UID} ({v.Alias})"; + } + + if (string.IsNullOrEmpty(v.UID)) + return "No UID set"; + + return $"{v.UID}"; }, (v) => { - if (!string.Equals(v.Key, item.UID, StringComparison.Ordinal)) + if (!string.Equals(v.UID, item.UID, StringComparison.Ordinal)) { - item.UID = v.Key; + item.UID = v.UID; _serverConfigurationManager.Save(); } }, - _discordOAuthUIDs?.Result?.FirstOrDefault(f => string.Equals(f.Key, item.UID, StringComparison.Ordinal)) ?? default); + aliasPairs.Find(f => string.Equals(f.UID, item.UID, StringComparison.Ordinal)) ?? default); } if (_discordOAuthUIDs == null) {