From aa377439ceebbb02f9b9ab9bfaf1045fcb19b253 Mon Sep 17 00:00:00 2001 From: Loporrit <141286461+loporrit@users.noreply.github.com> Date: Mon, 30 Jun 2025 17:50:31 +0000 Subject: [PATCH] Fix a lot of the analyzer warnings too --- MareSynchronos/.editorconfig | 3 ++ MareSynchronos/FileCache/CacheMonitor.cs | 2 +- MareSynchronos/FileCache/FileCacheManager.cs | 6 +-- MareSynchronos/FileCache/FileCompactor.cs | 1 + .../FileCache/TransientResourceManager.cs | 2 +- MareSynchronos/Interop/GameChatHooks.cs | 8 +-- MareSynchronos/Interop/GameModel/MdlFile.cs | 4 +- .../Interop/Ipc/IpcCallerGlamourer.cs | 4 +- .../Interop/Ipc/IpcCallerPenumbra.cs | 4 +- MareSynchronos/Interop/Ipc/IpcProvider.cs | 2 +- .../PlayerData/Data/FileReplacement.cs | 2 + .../PlayerData/Handlers/PairHandler.cs | 20 ++++---- .../PlayerData/Pairs/PairManager.cs | 2 +- .../Services/CacheCreationService.cs | 8 +-- MareSynchronos/Plugin.cs | 10 ++-- .../CharaData/CharaDataCharacterHandler.cs | 6 +-- MareSynchronos/Services/CharacterAnalyzer.cs | 2 +- MareSynchronos/Services/ChatService.cs | 20 ++++---- MareSynchronos/Services/GuiHookService.cs | 10 ++-- MareSynchronos/Services/MareProfileManager.cs | 2 +- .../Services/Mediator/MareMediator.cs | 4 +- MareSynchronos/Services/PairAnalyzer.cs | 2 +- .../Services/PlayerPerformanceService.cs | 7 ++- .../Services/PluginWatcherService.cs | 14 +++--- .../ServerConfigurationManager.cs | 43 ++++++++-------- MareSynchronos/Services/VisibilityService.cs | 5 +- MareSynchronos/Services/XivDataAnalyzer.cs | 2 +- MareSynchronos/UI/CompactUI.cs | 22 +++----- MareSynchronos/UI/DataAnalysisUi.cs | 4 +- MareSynchronos/UI/EditProfileUi.cs | 2 +- MareSynchronos/UI/IntroUI.cs | 2 + MareSynchronos/UI/SettingsUi.cs | 50 +++---------------- MareSynchronos/UI/SyncshellAdminUI.cs | 2 +- MareSynchronos/UI/UISharedService.cs | 3 +- MareSynchronos/Utils/CountedStream.cs | 4 +- MareSynchronos/Utils/HashingStream.cs | 5 +- MareSynchronos/Utils/LimitedStream.cs | 19 +++---- MareSynchronos/Utils/RollingList.cs | 2 +- MareSynchronos/Utils/VariousExtensions.cs | 4 +- .../WebAPI/Files/FileDownloadManager.cs | 6 +-- .../WebAPI/Files/FileTransferOrchestrator.cs | 2 +- .../WebAPI/Files/FileUploadManager.cs | 14 ++---- .../WebAPI/Files/ThrottledStream.cs | 4 +- .../WebAPI/SignalR/ApiController.cs | 2 +- MareSynchronos/WebAPI/SignalR/HubFactory.cs | 8 +-- .../WebAPI/SignalR/TokenProvider.cs | 20 ++++---- 46 files changed, 160 insertions(+), 210 deletions(-) diff --git a/MareSynchronos/.editorconfig b/MareSynchronos/.editorconfig index 9222004..77dfdf8 100644 --- a/MareSynchronos/.editorconfig +++ b/MareSynchronos/.editorconfig @@ -115,3 +115,6 @@ csharp_style_prefer_primary_constructors = false # S3267: Loops should be simplified with "LINQ" expressions dotnet_diagnostic.S3267.severity = silent + +# MA0048: File name must match type name +dotnet_diagnostic.MA0048.severity = silent diff --git a/MareSynchronos/FileCache/CacheMonitor.cs b/MareSynchronos/FileCache/CacheMonitor.cs index 96314e3..4b8fa20 100644 --- a/MareSynchronos/FileCache/CacheMonitor.cs +++ b/MareSynchronos/FileCache/CacheMonitor.cs @@ -703,7 +703,7 @@ public sealed class CacheMonitor : DisposableMediatorSubscriberBase List entitiesToRemove = []; List entitiesToUpdate = []; - object sync = new(); + Lock sync = new(); Thread[] workerThreads = new Thread[threadCount]; ConcurrentQueue fileCaches = new(_fileDbManager.GetAllFileCaches()); diff --git a/MareSynchronos/FileCache/FileCacheManager.cs b/MareSynchronos/FileCache/FileCacheManager.cs index 43585c9..f7c3d11 100644 --- a/MareSynchronos/FileCache/FileCacheManager.cs +++ b/MareSynchronos/FileCache/FileCacheManager.cs @@ -26,7 +26,7 @@ public sealed class FileCacheManager : IHostedService private readonly string _csvPath; private readonly ConcurrentDictionary> _fileCaches = new(StringComparer.Ordinal); private readonly SemaphoreSlim _getCachesByPathsSemaphore = new(1, 1); - private readonly object _fileWriteLock = new(); + private readonly Lock _fileWriteLock = new(); private readonly IpcManager _ipcManager; private readonly ILogger _logger; @@ -127,7 +127,7 @@ public sealed class FileCacheManager : IHostedService var computedHash = Crypto.GetFileHash(fileCache.ResolvedFilepath); if (!string.Equals(computedHash, fileCache.Hash, StringComparison.Ordinal)) { - _logger.LogInformation("Failed to validate {file}, got hash {hash}, expected hash {hash}", fileCache.ResolvedFilepath, computedHash, fileCache.Hash); + _logger.LogInformation("Failed to validate {file}, got hash {hash}, expected hash {expectedHash}", fileCache.ResolvedFilepath, computedHash, fileCache.Hash); brokenEntities.Add(fileCache); } } @@ -271,7 +271,7 @@ public sealed class FileCacheManager : IHostedService if (caches?.Count == 0) { - _fileCaches.Remove(hash, out var entity); + _fileCaches.Remove(hash, out var _); } } } diff --git a/MareSynchronos/FileCache/FileCompactor.cs b/MareSynchronos/FileCache/FileCompactor.cs index 2d1d2de..b48c516 100644 --- a/MareSynchronos/FileCache/FileCompactor.cs +++ b/MareSynchronos/FileCache/FileCompactor.cs @@ -241,6 +241,7 @@ public sealed class FileCompactor } } + [StructLayout(LayoutKind.Sequential)] private struct WOF_FILE_COMPRESSION_INFO_V1 { public CompressionAlgorithm Algorithm; diff --git a/MareSynchronos/FileCache/TransientResourceManager.cs b/MareSynchronos/FileCache/TransientResourceManager.cs index 87a8be1..eb5b739 100644 --- a/MareSynchronos/FileCache/TransientResourceManager.cs +++ b/MareSynchronos/FileCache/TransientResourceManager.cs @@ -11,7 +11,7 @@ namespace MareSynchronos.FileCache; public sealed class TransientResourceManager : DisposableMediatorSubscriberBase { - private readonly object _cacheAdditionLock = new(); + private readonly Lock _cacheAdditionLock = new(); private readonly HashSet _cachedHandledPaths = new(StringComparer.Ordinal); private readonly TransientConfigService _configurationService; private readonly DalamudUtilService _dalamudUtil; diff --git a/MareSynchronos/Interop/GameChatHooks.cs b/MareSynchronos/Interop/GameChatHooks.cs index 87f8cc7..3396c07 100644 --- a/MareSynchronos/Interop/GameChatHooks.cs +++ b/MareSynchronos/Interop/GameChatHooks.cs @@ -14,7 +14,7 @@ using Microsoft.Extensions.Logging; namespace MareSynchronos.Interop; -public class ChatChannelOverride +public record ChatChannelOverride { public string ChannelName = string.Empty; public Action? ChatMessageHandler; @@ -30,7 +30,7 @@ public unsafe sealed class GameChatHooks : IDisposable #pragma warning disable CS0649 // I do not know what kind of black magic this function performs [Signature("E8 ?? ?? ?? ?? 0F B7 7F 08 48 8B CE")] - private readonly delegate* unmanaged ProcessStringStep2; + private readonly delegate* unmanaged _processStringStep2; // Component::Shell::ShellCommandModule::ExecuteCommandInner private delegate void SendMessageDelegate(ShellCommandModule* module, Utf8String* message, UIModule* uiModule); @@ -133,7 +133,7 @@ public unsafe sealed class GameChatHooks : IDisposable if (payload != null && payload.Text.Length > 2 && payload.Text[2] == '/') { isCommand = true; - if (payload.Text[2..].StartsWith("/r ") || payload.Text[2..].StartsWith("/reply ")) + if (payload.Text[2..].StartsWith("/r ", StringComparison.Ordinal) || payload.Text[2..].StartsWith("/reply ", StringComparison.Ordinal)) isReply = true; } } @@ -155,7 +155,7 @@ public unsafe sealed class GameChatHooks : IDisposable // The chat input string is rendered in to a payload for display first var pronounModule = UIModule.Instance()->GetPronounModule(); var chatString1 = pronounModule->ProcessString(message, true); - var chatString2 = this.ProcessStringStep2(pronounModule, chatString1, 1); + var chatString2 = this._processStringStep2(pronounModule, chatString1, 1); var chatBytes = MemoryHelper.ReadRaw((nint)chatString2->StringPtr.Value, chatString2->Length); if (chatBytes.Length > 0) diff --git a/MareSynchronos/Interop/GameModel/MdlFile.cs b/MareSynchronos/Interop/GameModel/MdlFile.cs index bd98064..c77d5e3 100644 --- a/MareSynchronos/Interop/GameModel/MdlFile.cs +++ b/MareSynchronos/Interop/GameModel/MdlFile.cs @@ -1,5 +1,6 @@ using Lumina.Data; using Lumina.Extensions; +using System.Runtime.InteropServices; using System.Text; using static Lumina.Data.Parsing.MdlStructs; @@ -92,7 +93,7 @@ public class MdlFile Lods[i] = lod; } - ExtraLods = (modelHeader.Flags2 & ModelFlags2.ExtraLodEnabled) != 0 + ExtraLods = modelHeader.Flags2.HasFlag(ModelFlags2.ExtraLodEnabled) ? r.ReadStructuresAsArray(3) : []; @@ -150,6 +151,7 @@ public class MdlFile return (offsets, strings); } + [StructLayout(LayoutKind.Sequential)] public unsafe struct ModelHeader { // MeshHeader diff --git a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs index 08de7aa..283a029 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs @@ -13,7 +13,6 @@ namespace MareSynchronos.Interop.Ipc; public sealed class IpcCallerGlamourer : DisposableMediatorSubscriberBase, IIpcCaller { private readonly ILogger _logger; - private readonly IDalamudPluginInterface _pi; private readonly DalamudUtilService _dalamudUtil; private readonly MareMediator _mareMediator; private readonly RedrawManager _redrawManager; @@ -45,12 +44,11 @@ public sealed class IpcCallerGlamourer : DisposableMediatorSubscriberBase, IIpcC _glamourerUnlockByName = new UnlockStateName(pi); _logger = logger; - _pi = pi; _dalamudUtil = dalamudUtil; _mareMediator = mareMediator; _redrawManager = redrawManager; - var plugin = _pi.InstalledPlugins.FirstOrDefault(p => p.InternalName.Equals("Glamourer", StringComparison.Ordinal)); + var plugin = pi.InstalledPlugins.FirstOrDefault(p => p.InternalName.Equals("Glamourer", StringComparison.Ordinal)); _pluginLoaded = plugin?.IsLoaded ?? false; _pluginVersion = plugin?.Version ?? new(0, 0, 0, 0); diff --git a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs index d973421..eae4c9a 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs @@ -13,7 +13,6 @@ namespace MareSynchronos.Interop.Ipc; public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCaller { - private readonly IDalamudPluginInterface _pi; private readonly DalamudUtilService _dalamudUtil; private readonly MareMediator _mareMediator; private readonly RedrawManager _redrawManager; @@ -59,7 +58,6 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa public IpcCallerPenumbra(ILogger logger, IDalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator, RedrawManager redrawManager) : base(logger, mareMediator) { - _pi = pi; _dalamudUtil = dalamudUtil; _mareMediator = mareMediator; _redrawManager = redrawManager; @@ -86,7 +84,7 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa _penumbraGameObjectResourcePathResolved = GameObjectResourcePathResolved.Subscriber(pi, ResourceLoaded); - var plugin = _pi.InstalledPlugins.FirstOrDefault(p => p.InternalName.Equals("Penumbra", StringComparison.Ordinal)); + var plugin = pi.InstalledPlugins.FirstOrDefault(p => p.InternalName.Equals("Penumbra", StringComparison.Ordinal)); _pluginLoaded = plugin?.IsLoaded ?? false; _pluginVersion = plugin?.Version ?? new(0, 0, 0, 0); diff --git a/MareSynchronos/Interop/Ipc/IpcProvider.cs b/MareSynchronos/Interop/Ipc/IpcProvider.cs index 52cdfef..83b17e6 100644 --- a/MareSynchronos/Interop/Ipc/IpcProvider.cs +++ b/MareSynchronos/Interop/Ipc/IpcProvider.cs @@ -53,7 +53,7 @@ public class IpcProvider : IHostedService, IMediatorSubscriber _activeGameObjectHandlers.Remove(msg.GameObjectHandler); }); - _marePluginEnabled = pi.InstalledPlugins.Any(p => p.InternalName == "MareSynchronos" && p.IsLoaded); + _marePluginEnabled = pi.InstalledPlugins.Any(p => p.InternalName.Equals("MareSynchronos", StringComparison.Ordinal) && p.IsLoaded); Mediator.SubscribeKeyed(this, "MareSynchronos", p => { _marePluginEnabled = p.IsLoaded; HandleMareImpersonation(); diff --git a/MareSynchronos/PlayerData/Data/FileReplacement.cs b/MareSynchronos/PlayerData/Data/FileReplacement.cs index 32c17a3..2d6e358 100644 --- a/MareSynchronos/PlayerData/Data/FileReplacement.cs +++ b/MareSynchronos/PlayerData/Data/FileReplacement.cs @@ -35,6 +35,8 @@ public partial class FileReplacement return $"HasReplacement:{HasFileReplacement},IsFileSwap:{IsFileSwap} - {string.Join(",", GamePaths)} => {ResolvedPath}"; } +#pragma warning disable MA0009 [GeneratedRegex(@"^[a-zA-Z]:(/|\\)", RegexOptions.ECMAScript)] private static partial Regex LocalPathRegex(); +#pragma warning restore MA0009 } \ No newline at end of file diff --git a/MareSynchronos/PlayerData/Handlers/PairHandler.cs b/MareSynchronos/PlayerData/Handlers/PairHandler.cs index 784ad8f..371e4ee 100644 --- a/MareSynchronos/PlayerData/Handlers/PairHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/PairHandler.cs @@ -334,7 +334,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase Logger.LogDebug("[{applicationId}] Removing Temp Collection for {name} ({user})", applicationId, name, Pair.UserPair); if (_penumbraCollection != Guid.Empty) { - _ipcManager.Penumbra.RemoveTemporaryCollectionAsync(Logger, applicationId, _penumbraCollection).GetAwaiter().GetResult(); + await _ipcManager.Penumbra.RemoveTemporaryCollectionAsync(Logger, applicationId, _penumbraCollection).ConfigureAwait(false); _penumbraCollection = Guid.Empty; } @@ -344,7 +344,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase if (!IsVisible) { Logger.LogDebug("[{applicationId}] Restoring Glamourer for {name} ({user})", applicationId, name, Pair.UserPair); - await _ipcManager.Glamourer.RevertByNameAsync(Logger, name, applicationId); + await _ipcManager.Glamourer.RevertByNameAsync(Logger, name, applicationId).ConfigureAwait(false); } else { @@ -357,7 +357,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase { try { - await RevertCustomizationDataAsync(item.Key, name, applicationId, cts.Token); + await RevertCustomizationDataAsync(item.Key, name, applicationId, cts.Token).ConfigureAwait(false); } catch (InvalidOperationException ex) { @@ -508,7 +508,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase return; } - _pairDownloadTask = Task.Run(async () => await _downloadManager.DownloadFiles(_charaHandler!, toDownloadReplacements, downloadToken).ConfigureAwait(false)); + _pairDownloadTask = Task.Run(async () => await _downloadManager.DownloadFiles(_charaHandler!, toDownloadReplacements, downloadToken).ConfigureAwait(false), downloadToken); await _pairDownloadTask.ConfigureAwait(false); @@ -595,8 +595,8 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase { if (objIndex == ushort.MaxValue) objIndex = await _dalamudUtil.RunOnFrameworkThread(() => _charaHandler!.GetGameObject()!.ObjectIndex).ConfigureAwait(false); - _penumbraCollection = await _ipcManager.Penumbra.CreateTemporaryCollectionAsync(Logger, Pair.UserData.UID); - await _ipcManager.Penumbra.AssignTemporaryCollectionAsync(Logger, _penumbraCollection, objIndex); + _penumbraCollection = await _ipcManager.Penumbra.CreateTemporaryCollectionAsync(Logger, Pair.UserData.UID).ConfigureAwait(false); + await _ipcManager.Penumbra.AssignTemporaryCollectionAsync(Logger, _penumbraCollection, objIndex).ConfigureAwait(false); } Logger.LogDebug("[{applicationId}] Waiting for initial draw for for {handler}", _applicationId, _charaHandler); @@ -714,18 +714,18 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase PlayerName = name; _charaHandler = _gameObjectHandlerFactory.Create(ObjectKind.Player, () => _dalamudUtil.GetPlayerCharacterFromCachedTableByIdent(Pair.Ident), isWatched: false).GetAwaiter().GetResult(); - Mediator.Subscribe(this, async (_) => + Mediator.Subscribe(this, msg => { if (string.IsNullOrEmpty(_cachedData?.HonorificData)) return; Logger.LogTrace("Reapplying Honorific data for {this}", this); - await _ipcManager.Honorific.SetTitleAsync(PlayerCharacter, _cachedData.HonorificData).ConfigureAwait(false); + _ = Task.Run(async () => await _ipcManager.Honorific.SetTitleAsync(PlayerCharacter, _cachedData.HonorificData).ConfigureAwait(false), CancellationToken.None); }); - Mediator.Subscribe(this, async (_) => + Mediator.Subscribe(this, msg => { if (string.IsNullOrEmpty(_cachedData?.PetNamesData)) return; Logger.LogTrace("Reapplying Pet Names data for {this}", this); - await _ipcManager.PetNames.SetPlayerData(PlayerCharacter, _cachedData.PetNamesData).ConfigureAwait(false); + _ = Task.Run(async () => await _ipcManager.PetNames.SetPlayerData(PlayerCharacter, _cachedData.PetNamesData).ConfigureAwait(false), CancellationToken.None); }); } diff --git a/MareSynchronos/PlayerData/Pairs/PairManager.cs b/MareSynchronos/PlayerData/Pairs/PairManager.cs index d24e3f8..1b5d89a 100644 --- a/MareSynchronos/PlayerData/Pairs/PairManager.cs +++ b/MareSynchronos/PlayerData/Pairs/PairManager.cs @@ -63,7 +63,7 @@ public sealed class PairManager : DisposableMediatorSubscriberBase public Pair? GetPairByUID(string uid) { - var existingPair = _allClientPairs.FirstOrDefault(f => f.Key.UID == uid); + var existingPair = _allClientPairs.FirstOrDefault(f => uid.Equals(f.Key.UID, StringComparison.Ordinal)); if (!Equals(existingPair, default(KeyValuePair))) { return existingPair.Value; diff --git a/MareSynchronos/PlayerData/Services/CacheCreationService.cs b/MareSynchronos/PlayerData/Services/CacheCreationService.cs index b21f557..a3603c2 100644 --- a/MareSynchronos/PlayerData/Services/CacheCreationService.cs +++ b/MareSynchronos/PlayerData/Services/CacheCreationService.cs @@ -106,7 +106,7 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase { if (_isZoning) return; var changedType = _playerRelatedObjects.FirstOrDefault(f => f.Value.Address == msg.Address); - if (!default(KeyValuePair).Equals(changedType)) + if (changedType.Key != default || changedType.Value != default) { GlamourerChanged(changedType.Key); } @@ -133,16 +133,16 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase { if (_isZoning) return; var changedType = _playerRelatedObjects.FirstOrDefault(f => f.Value.Address == msg.Address); - if (!default(KeyValuePair).Equals(changedType) && changedType.Key == ObjectKind.Player) + if (changedType.Key == ObjectKind.Player && changedType.Value != default) { Logger.LogDebug("Received Moodles change, updating player"); MoodlesChanged(); } }); - Mediator.Subscribe(this, async (msg) => + Mediator.Subscribe(this, (msg) => { Logger.LogDebug("Received Penumbra Mod settings change, updating player"); - await AddPlayerCacheToCreate(); + AddPlayerCacheToCreate().GetAwaiter().GetResult(); }); Mediator.Subscribe(this, (msg) => ProcessCacheCreation()); diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index ece2614..ecce971 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -34,9 +34,9 @@ public sealed class Plugin : IDalamudPlugin { private readonly IHost _host; -#pragma warning disable CA2211, CS8618 +#pragma warning disable CA2211, CS8618, MA0069, S1104, S2223 public static Plugin Self; -#pragma warning restore CA2211, CS8618 +#pragma warning restore CA2211, CS8618, MA0069, S1104, S2223 public Action? RealOnFrameworkUpdate { get; set; } // Proxy function in the LoporritSync namespace to avoid confusion in /xlstats @@ -203,16 +203,16 @@ public sealed class Plugin : IDalamudPlugin }) .Build(); - Task.Run(async () => { + _ = Task.Run(async () => { try { - await _host.StartAsync(); + await _host.StartAsync().ConfigureAwait(false); } catch (Exception e) { pluginLog.Error(e, "HostBuilder startup exception"); } - }); + }).ConfigureAwait(false); } public void Dispose() diff --git a/MareSynchronos/Services/CharaData/CharaDataCharacterHandler.cs b/MareSynchronos/Services/CharaData/CharaDataCharacterHandler.cs index 5fb87e2..e76d287 100644 --- a/MareSynchronos/Services/CharaData/CharaDataCharacterHandler.cs +++ b/MareSynchronos/Services/CharaData/CharaDataCharacterHandler.cs @@ -25,11 +25,11 @@ public sealed class CharaDataCharacterHandler : DisposableMediatorSubscriberBase _gameObjectHandlerFactory = gameObjectHandlerFactory; _dalamudUtilService = dalamudUtilService; _ipcManager = ipcManager; - mediator.Subscribe(this, (_) => + mediator.Subscribe(this, msg => { foreach (var chara in _handledCharaData) { - RevertHandledChara(chara, false); + _ = RevertHandledChara(chara, reapplyPose: false); } }); @@ -56,7 +56,7 @@ public sealed class CharaDataCharacterHandler : DisposableMediatorSubscriberBase base.Dispose(disposing); foreach (var chara in _handledCharaData) { - RevertHandledChara(chara, false); + _ = RevertHandledChara(chara, reapplyPose: false); } } diff --git a/MareSynchronos/Services/CharacterAnalyzer.cs b/MareSynchronos/Services/CharacterAnalyzer.cs index 70b3ece..26429d4 100644 --- a/MareSynchronos/Services/CharacterAnalyzer.cs +++ b/MareSynchronos/Services/CharacterAnalyzer.cs @@ -132,7 +132,7 @@ public sealed class CharacterAnalyzer : DisposableMediatorSubscriberBase { data[fileEntry.Hash] = new FileDataEntry(fileEntry.Hash, ext, [.. fileEntry.GamePaths], - fileCacheEntries.Select(c => c.ResolvedFilepath).Distinct().ToList(), + fileCacheEntries.Select(c => c.ResolvedFilepath).Distinct(StringComparer.Ordinal).ToList(), entry.Size > 0 ? entry.Size.Value : 0, entry.CompressedSize > 0 ? entry.CompressedSize.Value : 0, tris); diff --git a/MareSynchronos/Services/ChatService.cs b/MareSynchronos/Services/ChatService.cs index 2eda966..63d7358 100644 --- a/MareSynchronos/Services/ChatService.cs +++ b/MareSynchronos/Services/ChatService.cs @@ -31,7 +31,7 @@ public class ChatService : DisposableMediatorSubscriberBase private readonly Lazy _gameChatHooks; public ChatService(ILogger logger, DalamudUtilService dalamudUtil, MareMediator mediator, ApiController apiController, - PairManager pairManager, ILogger logger2, IGameInteropProvider gameInteropProvider, IChatGui chatGui, + PairManager pairManager, LoggerFactory loggerFactory, IGameInteropProvider gameInteropProvider, IChatGui chatGui, MareConfigService mareConfig, ServerConfigurationManager serverConfigurationManager) : base(logger, mediator) { _logger = logger; @@ -45,7 +45,7 @@ public class ChatService : DisposableMediatorSubscriberBase Mediator.Subscribe(this, HandleUserChat); Mediator.Subscribe(this, HandleGroupChat); - _gameChatHooks = new(() => new GameChatHooks(logger2, gameInteropProvider)); + _gameChatHooks = new(() => new GameChatHooks(loggerFactory.CreateLogger(), gameInteropProvider)); } protected override void Dispose(bool disposing) @@ -109,7 +109,7 @@ public class ChatService : DisposableMediatorSubscriberBase if (color != 0) msg.AddUiForeground((ushort)color); msg.AddText($"[SS{shellNumber}]<"); - if (message.ChatMsg.Sender.UID == _apiController.UID) + if (message.ChatMsg.Sender.UID.Equals(_apiController.UID, StringComparison.Ordinal)) { // Don't link to your own character msg.AddText(chatMsg.SenderName); @@ -137,7 +137,7 @@ public class ChatService : DisposableMediatorSubscriberBase foreach (var group in _pairManager.Groups) { - if (group.Key.GID == gid) + if (group.Key.GID.Equals(gid, StringComparison.Ordinal)) { int shellChatType = _serverConfigurationManager.GetShellConfigForGid(gid).LogKind; if (shellChatType != 0) @@ -166,7 +166,7 @@ public class ChatService : DisposableMediatorSubscriberBase if (_gameChatHooks.IsValueCreated && _gameChatHooks.Value.ChatChannelOverride != null) { // Very dumb and won't handle re-numbering -- need to identify the active chat channel more reliably later - if (_gameChatHooks.Value.ChatChannelOverride.ChannelName.StartsWith($"SS [{shellNumber}]")) + if (_gameChatHooks.Value.ChatChannelOverride.ChannelName.StartsWith($"SS [{shellNumber}]", StringComparison.Ordinal)) SwitchChatShell(shellNumber); } } @@ -207,8 +207,8 @@ public class ChatService : DisposableMediatorSubscriberBase var shellConfig = _serverConfigurationManager.GetShellConfigForGid(group.Key.GID); if (shellConfig.Enabled && shellConfig.ShellNumber == shellNumber) { - Task.Run(async () => { - // TODO: Cache the name and home world instead of fetching it every time + _ = Task.Run(async () => { + // Should cache the name and home world instead of fetching it every time var chatMsg = await _dalamudUtil.RunOnFrameworkThread(() => { return new ChatMessage() { @@ -216,9 +216,9 @@ public class ChatService : DisposableMediatorSubscriberBase SenderHomeWorldId = _dalamudUtil.GetHomeWorldId(), PayloadContent = chatBytes }; - }); - await _apiController.GroupChatSendMsg(new(group.Key), chatMsg); - }); + }).ConfigureAwait(false); + await _apiController.GroupChatSendMsg(new(group.Key), chatMsg).ConfigureAwait(false); + }).ConfigureAwait(false); return; } } diff --git a/MareSynchronos/Services/GuiHookService.cs b/MareSynchronos/Services/GuiHookService.cs index b6a81d2..6e72bcc 100644 --- a/MareSynchronos/Services/GuiHookService.cs +++ b/MareSynchronos/Services/GuiHookService.cs @@ -39,8 +39,6 @@ public class GuiHookService : DisposableMediatorSubscriberBase _namePlateGui.OnNamePlateUpdate += OnNamePlateUpdate; _namePlateGui.RequestRedraw(); - gameConfig.TryGet(Dalamud.Game.Config.UiConfigOption.NamePlateSetRoleColor, out bool isNameplateSetRoleColor); - Mediator.Subscribe(this, (_) => GameSettingsCheck()); Mediator.Subscribe(this, (_) => RequestRedraw()); Mediator.Subscribe(this, (_) => RequestRedraw()); @@ -55,8 +53,8 @@ public class GuiHookService : DisposableMediatorSubscriberBase _isModified = false; } - Task.Run(async () => { - await _dalamudUtil.RunOnFrameworkThread(() => _namePlateGui.RequestRedraw()); + _ = Task.Run(async () => { + await _dalamudUtil.RunOnFrameworkThread(() => _namePlateGui.RequestRedraw()).ConfigureAwait(false); }); } @@ -65,8 +63,8 @@ public class GuiHookService : DisposableMediatorSubscriberBase base.Dispose(disposing); _namePlateGui.OnNamePlateUpdate -= OnNamePlateUpdate; - Task.Run(async () => { - await _dalamudUtil.RunOnFrameworkThread(() => _namePlateGui.RequestRedraw()); + _ = Task.Run(async () => { + await _dalamudUtil.RunOnFrameworkThread(() => _namePlateGui.RequestRedraw()).ConfigureAwait(false); }); } diff --git a/MareSynchronos/Services/MareProfileManager.cs b/MareSynchronos/Services/MareProfileManager.cs index fdf0b9d..4fa66c2 100644 --- a/MareSynchronos/Services/MareProfileManager.cs +++ b/MareSynchronos/Services/MareProfileManager.cs @@ -61,7 +61,7 @@ public class MareProfileManager : MediatorSubscriberBase _mareProfiles[data] = _loadingProfileData; var profile = await _apiController.UserGetProfile(new API.Dto.User.UserDto(data)).ConfigureAwait(false); bool isSupporter = !string.Equals(data.Alias, data.UID, StringComparison.Ordinal); - if (_serverConfigurationManager.CurrentApiUrl != ApiController.MainServiceUri) + if (!_serverConfigurationManager.CurrentApiUrl.Equals(ApiController.MainServiceUri, StringComparison.Ordinal)) isSupporter = false; MareProfileData profileData = new(profile.Disabled, profile.IsNSFW ?? false, string.IsNullOrEmpty(profile.ProfilePictureBase64) ? _mareLogo : profile.ProfilePictureBase64, diff --git a/MareSynchronos/Services/Mediator/MareMediator.cs b/MareSynchronos/Services/Mediator/MareMediator.cs index 40561a4..ebd0617 100644 --- a/MareSynchronos/Services/Mediator/MareMediator.cs +++ b/MareSynchronos/Services/Mediator/MareMediator.cs @@ -9,8 +9,8 @@ namespace MareSynchronos.Services.Mediator; public sealed class MareMediator : IHostedService { - private readonly object _addRemoveLock = new(); - private readonly ConcurrentDictionary _lastErrorTime = []; + private readonly Lock _addRemoveLock = new(); + private readonly ConcurrentDictionary _lastErrorTime = []; private readonly ILogger _logger; private readonly CancellationTokenSource _loopCts = new(); private readonly ConcurrentQueue _messageQueue = new(); diff --git a/MareSynchronos/Services/PairAnalyzer.cs b/MareSynchronos/Services/PairAnalyzer.cs index a06e933..a745158 100644 --- a/MareSynchronos/Services/PairAnalyzer.cs +++ b/MareSynchronos/Services/PairAnalyzer.cs @@ -153,7 +153,7 @@ public sealed class PairAnalyzer : DisposableMediatorSubscriberBase { data[fileEntry.Hash] = new CharacterAnalyzer.FileDataEntry(fileEntry.Hash, ext, [.. fileEntry.GamePaths], - fileCacheEntries.Select(c => c.ResolvedFilepath).Distinct().ToList(), + fileCacheEntries.Select(c => c.ResolvedFilepath).Distinct(StringComparer.Ordinal).ToList(), entry.Size > 0 ? entry.Size.Value : 0, entry.CompressedSize > 0 ? entry.CompressedSize.Value : 0, tris); diff --git a/MareSynchronos/Services/PlayerPerformanceService.cs b/MareSynchronos/Services/PlayerPerformanceService.cs index 899800b..1f84327 100644 --- a/MareSynchronos/Services/PlayerPerformanceService.cs +++ b/MareSynchronos/Services/PlayerPerformanceService.cs @@ -184,7 +184,6 @@ public class PlayerPerformanceService : DisposableMediatorSubscriberBase public async Task ShrinkTextures(PairHandler pairHandler, CharacterData charaData, CancellationToken token) { var config = _playerPerformanceConfigService.Current; - var pair = pairHandler.Pair; if (config.TextureShrinkMode == MareConfiguration.Models.TextureShrinkMode.Never) return false; @@ -208,7 +207,7 @@ public class PlayerPerformanceService : DisposableMediatorSubscriberBase if (fileEntry == null) return; if (fileEntry.IsSubstEntry) return; - var texFormat = await Task.Run(() => _xivDataAnalyzer.GetTexFormatByHash(hash)); + var texFormat = _xivDataAnalyzer.GetTexFormatByHash(hash); var filePath = fileEntry.ResolvedFilepath; var tmpFilePath = _fileCacheManager.GetSubstFilePath(Guid.NewGuid().ToString(), "tmp"); var newFilePath = _fileCacheManager.GetSubstFilePath(hash, "tex"); @@ -295,7 +294,7 @@ public class PlayerPerformanceService : DisposableMediatorSubscriberBase outFile.Position = 80; inFile.Position = 80 + offsetDelta; - await inFile.CopyToAsync(outFile, 81920, token); + await inFile.CopyToAsync(outFile, 81920, token).ConfigureAwait(false); reader.Dispose(); writer.Dispose(); @@ -326,7 +325,7 @@ public class PlayerPerformanceService : DisposableMediatorSubscriberBase File.Delete(tmpFilePath); } } - ); + ).ConfigureAwait(false); return shrunken; } diff --git a/MareSynchronos/Services/PluginWatcherService.cs b/MareSynchronos/Services/PluginWatcherService.cs index 092c998..1707b38 100644 --- a/MareSynchronos/Services/PluginWatcherService.cs +++ b/MareSynchronos/Services/PluginWatcherService.cs @@ -42,6 +42,7 @@ public class PluginWatcherService : MediatorSubscriberBase private CapturedPluginState[] _prevInstalledPluginState = []; +#pragma warning disable private static bool ExposedPluginsEqual(IEnumerable plugins, IEnumerable other) { if (plugins.Count() != other.Count()) return false; @@ -58,6 +59,7 @@ public class PluginWatcherService : MediatorSubscriberBase if (enumeratorOriginal.Current.InternalName != enumeratorOther.Current.InternalName) return false; } } +#pragma warning restore public PluginWatcherService(ILogger logger, IDalamudPluginInterface pluginInterface, MareMediator mediator) : base(logger, mediator) { @@ -85,22 +87,22 @@ public class PluginWatcherService : MediatorSubscriberBase // The same plugin can be installed multiple times -- InternalName is not unique var oldDict = _prevInstalledPluginState.Where(x => x.InternalName.Length > 0) - .GroupBy(x => x.InternalName) - .ToDictionary(x => x.Key); + .GroupBy(x => x.InternalName, StringComparer.Ordinal) + .ToDictionary(x => x.Key, StringComparer.Ordinal); var newDict = state.Where(x => x.InternalName.Length > 0) - .GroupBy(x => x.InternalName) - .ToDictionary(x => x.Key); + .GroupBy(x => x.InternalName, StringComparer.Ordinal) + .ToDictionary(x => x.Key, StringComparer.Ordinal); _prevInstalledPluginState = state; - foreach (var internalName in newDict.Keys.Except(oldDict.Keys)) + foreach (var internalName in newDict.Keys.Except(oldDict.Keys, StringComparer.Ordinal)) { var p = newDict[internalName].OrderBy(p => (!p.IsLoaded, p.Version)).First(); Mediator.Publish(new PluginChangeMessage(internalName, p.Version, p.IsLoaded)); } - foreach (var internalName in oldDict.Keys.Except(newDict.Keys)) + foreach (var internalName in oldDict.Keys.Except(newDict.Keys, StringComparer.Ordinal)) { var p = newDict[internalName].OrderBy(p => (!p.IsLoaded, p.Version)).First(); Mediator.Publish(new PluginChangeMessage(p.InternalName, p.Version, p.IsLoaded)); diff --git a/MareSynchronos/Services/ServerConfiguration/ServerConfigurationManager.cs b/MareSynchronos/Services/ServerConfiguration/ServerConfigurationManager.cs index 757418b..75bd542 100644 --- a/MareSynchronos/Services/ServerConfiguration/ServerConfigurationManager.cs +++ b/MareSynchronos/Services/ServerConfiguration/ServerConfigurationManager.cs @@ -13,19 +13,17 @@ public class ServerConfigurationManager private readonly ServerConfigService _configService; private readonly DalamudUtilService _dalamudUtil; private readonly ILogger _logger; - private readonly MareMediator _mareMediator; private readonly NotesConfigService _notesConfig; private readonly ServerBlockConfigService _blockConfig; private readonly ServerTagConfigService _serverTagConfig; private readonly SyncshellConfigService _syncshellConfig; - private HashSet? CachedWhitelistedUIDs = null; - private HashSet? CachedBlacklistedUIDs = null; + private HashSet? _cachedWhitelistedUIDs = null; + private HashSet? _cachedBlacklistedUIDs = null; public ServerConfigurationManager(ILogger logger, ServerConfigService configService, ServerTagConfigService serverTagConfig, SyncshellConfigService syncshellConfig, NotesConfigService notesConfig, - ServerBlockConfigService blockConfig, - DalamudUtilService dalamudUtil, MareMediator mareMediator) + ServerBlockConfigService blockConfig, DalamudUtilService dalamudUtil) { _logger = logger; _configService = configService; @@ -34,7 +32,6 @@ public class ServerConfigurationManager _notesConfig = notesConfig; _blockConfig = blockConfig; _dalamudUtil = dalamudUtil; - _mareMediator = mareMediator; EnsureMainExists(); } @@ -49,8 +46,8 @@ public class ServerConfigurationManager set { _configService.Current.CurrentServer = value; - CachedWhitelistedUIDs = null; - CachedBlacklistedUIDs = null; + _cachedWhitelistedUIDs = null; + _cachedBlacklistedUIDs = null; _configService.Save(); } get @@ -399,7 +396,7 @@ public class ServerConfigurationManager { if (string.IsNullOrEmpty(uid)) return; - if (CurrentNotesStorage().UidLastSeenNames.TryGetValue(uid, out var currentName) && currentName == name) + if (CurrentNotesStorage().UidLastSeenNames.TryGetValue(uid, out var currentName) && currentName.Equals(name, StringComparison.Ordinal)) return; CurrentNotesStorage().UidLastSeenNames[uid] = name; @@ -418,24 +415,24 @@ public class ServerConfigurationManager internal bool IsUidWhitelisted(string uid) { - CachedWhitelistedUIDs ??= [.. CurrentBlockStorage().Whitelist]; - return CachedWhitelistedUIDs.Contains(uid); + _cachedWhitelistedUIDs ??= [.. CurrentBlockStorage().Whitelist]; + return _cachedWhitelistedUIDs.Contains(uid); } internal bool IsUidBlacklisted(string uid) { - CachedBlacklistedUIDs ??= [.. CurrentBlockStorage().Blacklist]; - return CachedBlacklistedUIDs.Contains(uid); + _cachedBlacklistedUIDs ??= [.. CurrentBlockStorage().Blacklist]; + return _cachedBlacklistedUIDs.Contains(uid); } internal void AddWhitelistUid(string uid) { if (IsUidWhitelisted(uid)) return; - if (CurrentBlockStorage().Blacklist.RemoveAll(u => u == uid) > 0) - CachedBlacklistedUIDs = null; + if (CurrentBlockStorage().Blacklist.RemoveAll(u => u.Equals(uid, StringComparison.Ordinal)) > 0) + _cachedBlacklistedUIDs = null; CurrentBlockStorage().Whitelist.Add(uid); - CachedWhitelistedUIDs = null; + _cachedWhitelistedUIDs = null; _blockConfig.Save(); } @@ -443,24 +440,24 @@ public class ServerConfigurationManager { if (IsUidBlacklisted(uid)) return; - if (CurrentBlockStorage().Whitelist.RemoveAll(u => u == uid) > 0) - CachedWhitelistedUIDs = null; + if (CurrentBlockStorage().Whitelist.RemoveAll(u => u.Equals(uid, StringComparison.Ordinal)) > 0) + _cachedWhitelistedUIDs = null; CurrentBlockStorage().Blacklist.Add(uid); - CachedBlacklistedUIDs = null; + _cachedBlacklistedUIDs = null; _blockConfig.Save(); } internal void RemoveWhitelistUid(string uid) { - if (CurrentBlockStorage().Whitelist.RemoveAll(u => u == uid) > 0) - CachedWhitelistedUIDs = null; + if (CurrentBlockStorage().Whitelist.RemoveAll(u => u.Equals(uid, StringComparison.Ordinal)) > 0) + _cachedWhitelistedUIDs = null; _blockConfig.Save(); } internal void RemoveBlacklistUid(string uid) { - if (CurrentBlockStorage().Blacklist.RemoveAll(u => u == uid) > 0) - CachedBlacklistedUIDs = null; + if (CurrentBlockStorage().Blacklist.RemoveAll(u => u.Equals(uid, StringComparison.Ordinal)) > 0) + _cachedBlacklistedUIDs = null; _blockConfig.Save(); } diff --git a/MareSynchronos/Services/VisibilityService.cs b/MareSynchronos/Services/VisibilityService.cs index 524eee1..232c615 100644 --- a/MareSynchronos/Services/VisibilityService.cs +++ b/MareSynchronos/Services/VisibilityService.cs @@ -8,8 +8,7 @@ namespace MareSynchronos.Services; public class VisibilityService : DisposableMediatorSubscriberBase { private readonly DalamudUtilService _dalamudUtil; - private ConcurrentDictionary _trackedPlayerVisibility = new(); - private ConcurrentQueue _removedPlayerMessageQueue = new(); + private readonly ConcurrentDictionary _trackedPlayerVisibility = new(StringComparer.Ordinal); public VisibilityService(ILogger logger, MareMediator mediator, DalamudUtilService dalamudUtil) : base(logger, mediator) @@ -20,7 +19,7 @@ public class VisibilityService : DisposableMediatorSubscriberBase public void StartTracking(string ident) { - _trackedPlayerVisibility.TryAdd(ident, false); + _trackedPlayerVisibility.TryAdd(ident, value: false); } public void StopTracking(string ident) diff --git a/MareSynchronos/Services/XivDataAnalyzer.cs b/MareSynchronos/Services/XivDataAnalyzer.cs index c988ec3..ca193e6 100644 --- a/MareSynchronos/Services/XivDataAnalyzer.cs +++ b/MareSynchronos/Services/XivDataAnalyzer.cs @@ -236,7 +236,7 @@ public sealed class XivDataAnalyzer using var r = new LuminaBinaryReader(stream); var texHeader = r.ReadStructure(); - if (texHeader.Format == 0 || texHeader.MipCount == 0 || texHeader.ArraySize != 0 || texHeader.MipCount > 13) + if (texHeader.Format == default || texHeader.MipCount == 0 || texHeader.ArraySize != 0 || texHeader.MipCount > 13) { _failedCalculatedTex.Add(hash); _configService.Current.TexDictionary[hash] = default; diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index deb90cf..dc647f3 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -39,7 +39,6 @@ public class CompactUi : WindowMediatorSubscriberBase private readonly GroupPanel _groupPanel; private readonly PairGroupsUi _pairGroupsUi; private readonly PairManager _pairManager; - private readonly ChatService _chatService; private readonly SelectGroupForPairUi _selectGroupForPairUi; private readonly SelectPairForGroupUi _selectPairsForGroupUi; private readonly ServerConfigurationManager _serverManager; @@ -68,14 +67,13 @@ public class CompactUi : WindowMediatorSubscriberBase _configService = configService; _apiController = apiController; _pairManager = pairManager; - _chatService = chatService; _serverManager = serverManager; _fileTransferManager = fileTransferManager; _uidDisplayHandler = uidDisplayHandler; _charaDataManager = charaDataManager; var tagHandler = new TagHandler(_serverManager); - _groupPanel = new(this, uiShared, _pairManager, _chatService, uidDisplayHandler, _configService, _serverManager, _charaDataManager); + _groupPanel = new(this, uiShared, _pairManager, chatService, uidDisplayHandler, _configService, _serverManager, _charaDataManager); _selectGroupForPairUi = new(tagHandler, uidDisplayHandler, _uiSharedService); _selectPairsForGroupUi = new(tagHandler, uidDisplayHandler); _pairGroupsUi = new(configService, tagHandler, uidDisplayHandler, apiController, _selectPairsForGroupUi, _uiSharedService); @@ -107,17 +105,10 @@ public class CompactUi : WindowMediatorSubscriberBase protected override void DrawInternal() { - /*if (_apiController.ServerInfo.AccentColor.HasValue) - { - UiSharedService.AccentColor = _apiController.ServerInfo.AccentColor.Value; - } - else*/ - { - if (_serverManager.CurrentApiUrl == ApiController.LoporritServiceUri) - UiSharedService.AccentColor = new Vector4(1.0f, 0.8666f, 0.06666f, 1.0f); - else - UiSharedService.AccentColor = ImGuiColors.ParsedGreen; - } + if (_serverManager.CurrentApiUrl.Equals(ApiController.LoporritServiceUri, StringComparison.Ordinal)) + UiSharedService.AccentColor = new Vector4(1.0f, 0.8666f, 0.06666f, 1.0f); + else + UiSharedService.AccentColor = ImGuiColors.ParsedGreen; ImGui.SetCursorPosY(ImGui.GetCursorPosY() - ImGui.GetStyle().WindowPadding.Y - 1f * ImGuiHelpers.GlobalScale + ImGui.GetStyle().ItemSpacing.Y); WindowContentWidth = UiSharedService.GetWindowContentRegionWidth(); if (!_apiController.IsCurrentVersion) @@ -292,7 +283,6 @@ public class CompactUi : WindowMediatorSubscriberBase private void DrawFilter() { - var buttonSize = _uiSharedService.GetIconButtonSize(FontAwesomeIcon.ArrowUp); var playButtonSize = _uiSharedService.GetIconButtonSize(FontAwesomeIcon.Play); var users = GetFilteredUsers(); @@ -371,7 +361,7 @@ public class CompactUi : WindowMediatorSubscriberBase var ySize = TransferPartHeight == 0 ? 1 : (ImGui.GetWindowContentRegionMax().Y - ImGui.GetWindowContentRegionMin().Y) - TransferPartHeight - ImGui.GetCursorPosY(); - var users = GetFilteredUsers().OrderBy(u => u.GetPairSortKey()); + var users = GetFilteredUsers().OrderBy(u => u.GetPairSortKey(), StringComparer.Ordinal); var onlineUsers = users.Where(u => u.UserPair!.OtherPermissions.IsPaired() && (u.IsOnline || u.UserPair!.OwnPermissions.IsPaused())).Select(c => new DrawUserPair("Online" + c.UserData.UID, c, _uidDisplayHandler, _apiController, Mediator, _selectGroupForPairUi, _uiSharedService, _charaDataManager)).ToList(); var visibleUsers = users.Where(u => u.IsVisible).Select(c => new DrawUserPair("Visible" + c.UserData.UID, c, _uidDisplayHandler, _apiController, Mediator, _selectGroupForPairUi, _uiSharedService, _charaDataManager)).ToList(); diff --git a/MareSynchronos/UI/DataAnalysisUi.cs b/MareSynchronos/UI/DataAnalysisUi.cs index 0197241..d083cea 100644 --- a/MareSynchronos/UI/DataAnalysisUi.cs +++ b/MareSynchronos/UI/DataAnalysisUi.cs @@ -460,8 +460,8 @@ public class DataAnalysisUi : WindowMediatorSubscriberBase if (_enableBc7ConversionMode) { ImGui.TableNextColumn(); - if (item.Format.Value.StartsWith("BC") || item.Format.Value.StartsWith("DXT") - || item.Format.Value.StartsWith("24864")) // BC4 + if (item.Format.Value.StartsWith("BC", StringComparison.Ordinal) || item.Format.Value.StartsWith("DXT", StringComparison.Ordinal) + || item.Format.Value.StartsWith("24864", StringComparison.Ordinal)) // BC4 { ImGui.TextUnformatted(""); continue; diff --git a/MareSynchronos/UI/EditProfileUi.cs b/MareSynchronos/UI/EditProfileUi.cs index 79db2d3..3e65865 100644 --- a/MareSynchronos/UI/EditProfileUi.cs +++ b/MareSynchronos/UI/EditProfileUi.cs @@ -123,7 +123,7 @@ public class EditProfileUi : WindowMediatorSubscriberBase ImGui.Checkbox("Is NSFW", ref nsfw); ImGui.EndDisabled(); - if (_serverConfigurationManager.CurrentApiUrl == ApiController.MainServiceUri) + if (_serverConfigurationManager.CurrentApiUrl.Equals(ApiController.MainServiceUri, StringComparison.Ordinal)) { ImGui.Separator(); _uiSharedService.BigText("Notes and Rules for Profiles"); diff --git a/MareSynchronos/UI/IntroUI.cs b/MareSynchronos/UI/IntroUI.cs index 9a9da8b..8caa35a 100644 --- a/MareSynchronos/UI/IntroUI.cs +++ b/MareSynchronos/UI/IntroUI.cs @@ -374,6 +374,8 @@ This service is provided as-is. } } +#pragma warning disable MA0009 [GeneratedRegex("^([A-F0-9]{2})+")] private static partial Regex HexRegex(); +#pragma warning restore MA0009 } diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index 29ab0f2..6d405b7 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -377,7 +377,7 @@ public class SettingsUi : WindowMediatorSubscriberBase } private static readonly List<(XivChatType, string)> _syncshellChatTypes = [ - (0, "(use global setting)"), + (XivChatType.None, "(use global setting)"), (XivChatType.Debug, "Debug"), (XivChatType.Echo, "Echo"), (XivChatType.StandardEmote, "Standard Emote"), @@ -448,20 +448,6 @@ public class SettingsUi : WindowMediatorSubscriberBase _uiShared.BigText("\"Chat 2\" Plugin Integration"); ImGui.SetWindowFontScale(1.0f); - // TODO: ExtraChat API impersonation - /* - var extraChatAPI = _configService.Current.ExtraChatAPI; - if (ImGui.Checkbox("ExtraChat replacement mode", ref extraChatAPI)) - { - _configService.Current.ExtraChatAPI = extraChatAPI; - if (extraChatAPI) - _configService.Current.ExtraChatTags = true; - _configService.Save(); - } - ImGui.EndDisabled(); - UiSharedService.DrawHelpText("Enable ExtraChat APIs for full Chat 2 plugin integration.\n\nDo not enable this if ExtraChat is also installed and running."); - */ - var extraChatTags = _configService.Current.ExtraChatTags; if (ImGui.Checkbox("Tag messages as ExtraChat", ref extraChatTags)) { @@ -488,7 +474,7 @@ public class SettingsUi : WindowMediatorSubscriberBase return; } - foreach (var group in _pairManager.Groups.OrderBy(k => k.Key.GID)) + foreach (var group in _pairManager.Groups.OrderBy(k => k.Key.GID, StringComparer.Ordinal)) { var gid = group.Key.GID; using var pushId = ImRaii.PushId(gid); @@ -514,11 +500,11 @@ public class SettingsUi : WindowMediatorSubscriberBase bool conflict = false; foreach (var otherGroup in _pairManager.Groups) { - if (gid == otherGroup.Key.GID) continue; + if (gid.Equals(otherGroup.Key.GID, StringComparison.Ordinal)) continue; var otherShellConfig = _serverConfigurationManager.GetShellConfigForGid(otherGroup.Key.GID); if (otherShellConfig.Enabled && otherShellConfig.ShellNumber == shellNumber) conflict = true; - nextNumber = System.Math.Max(nextNumber, otherShellConfig.ShellNumber) + 1; + nextNumber = Math.Max(nextNumber, otherShellConfig.ShellNumber) + 1; } if (conflict) shellConfig.ShellNumber = nextNumber; @@ -530,24 +516,6 @@ public class SettingsUi : WindowMediatorSubscriberBase ImGui.SetNextItemWidth(50 * ImGuiHelpers.GlobalScale); - var setSyncshellNumberFn = (int i) => { - // Find an active group with the same syncshell number as selected, and swap it - // This logic can leave duplicate IDs present in the config but its not critical - foreach (var otherGroup in _pairManager.Groups) - { - if (gid == otherGroup.Key.GID) continue; - var otherShellConfig = _serverConfigurationManager.GetShellConfigForGid(otherGroup.Key.GID); - if (otherShellConfig.Enabled && otherShellConfig.ShellNumber == i) - { - otherShellConfig.ShellNumber = shellNumber; - _serverConfigurationManager.SaveShellConfigForGid(otherGroup.Key.GID, otherShellConfig); - break; - } - } - shellConfig.ShellNumber = i; - _serverConfigurationManager.SaveShellConfigForGid(gid, shellConfig); - }; - // _uiShared.DrawCombo() remembers the selected option -- we don't want that, because the value can change if (ImGui.BeginCombo("Syncshell number##{gid}", $"{shellNumber}")) { @@ -560,7 +528,7 @@ public class SettingsUi : WindowMediatorSubscriberBase // This logic can leave duplicate IDs present in the config but its not critical foreach (var otherGroup in _pairManager.Groups) { - if (gid == otherGroup.Key.GID) continue; + if (gid.Equals(otherGroup.Key.GID, StringComparison.Ordinal)) continue; var otherShellConfig = _serverConfigurationManager.GetShellConfigForGid(otherGroup.Key.GID); if (otherShellConfig.Enabled && otherShellConfig.ShellNumber == i) { @@ -945,8 +913,6 @@ public class SettingsUi : WindowMediatorSubscriberBase } _lastTab = "General"; - //UiSharedService.FontText("Experimental", _uiShared.UidFont); - //ImGui.Separator(); _uiShared.BigText("Notes"); if (_uiShared.IconTextButton(FontAwesomeIcon.StickyNote, "Export all your user notes to clipboard")) @@ -1785,13 +1751,13 @@ public class SettingsUi : WindowMediatorSubscriberBase var postUri = MareAuth.AuthRegisterFullPath(new Uri(selectedServer.ServerUri .Replace("wss://", "https://", StringComparison.OrdinalIgnoreCase) .Replace("ws://", "http://", StringComparison.OrdinalIgnoreCase))); - _logger.LogInformation("Registering new account: " + postUri.ToString()); + _logger.LogInformation("Registering new account: {uri}", postUri.ToString()); var result = await httpClient.PostAsync(postUri, null).ConfigureAwait(false); result.EnsureSuccessStatusCode(); var reply = await result.Content.ReadFromJsonAsync().ConfigureAwait(false) ?? new(); if (!reply.Success) { - _logger.LogWarning("Registration failed: " + reply.ErrorMessage); + _logger.LogWarning("Registration failed: {err}", reply.ErrorMessage); _registrationMessage = reply.ErrorMessage; if (_registrationMessage.IsNullOrEmpty()) _registrationMessage = "An unknown error occured. Please try again later."; @@ -1816,7 +1782,7 @@ public class SettingsUi : WindowMediatorSubscriberBase { _registrationInProgress = false; } - }); + }, CancellationToken.None); } if (_registrationInProgress) { diff --git a/MareSynchronos/UI/SyncshellAdminUI.cs b/MareSynchronos/UI/SyncshellAdminUI.cs index 458e95f..e07c674 100644 --- a/MareSynchronos/UI/SyncshellAdminUI.cs +++ b/MareSynchronos/UI/SyncshellAdminUI.cs @@ -351,7 +351,7 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase using var pushId = ImRaii.PushId(bannedUser.UID); if (_uiSharedService.IconTextButton(FontAwesomeIcon.Check, "Unban")) { - Task.Run(async () => await _apiController.GroupUnbanUser(bannedUser)); + _ = Task.Run(async () => await _apiController.GroupUnbanUser(bannedUser).ConfigureAwait(false)); _bannedUsers.RemoveAll(b => string.Equals(b.UID, bannedUser.UID, StringComparison.Ordinal)); } } diff --git a/MareSynchronos/UI/UISharedService.cs b/MareSynchronos/UI/UISharedService.cs index 839db3d..63f7aac 100644 --- a/MareSynchronos/UI/UISharedService.cs +++ b/MareSynchronos/UI/UISharedService.cs @@ -35,7 +35,8 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase public static readonly ImGuiWindowFlags PopupWindowFlags = ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoScrollWithMouse; - public static Vector4 AccentColor = ImGuiColors.DalamudYellow; + + public static Vector4 AccentColor { get; set; } = ImGuiColors.DalamudYellow; public readonly FileDialogManager FileDialogManager; diff --git a/MareSynchronos/Utils/CountedStream.cs b/MareSynchronos/Utils/CountedStream.cs index 0f5e2e6..9c6dc2a 100644 --- a/MareSynchronos/Utils/CountedStream.cs +++ b/MareSynchronos/Utils/CountedStream.cs @@ -43,7 +43,7 @@ public class CountedStream : Stream public async override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { - int n = await _stream.ReadAsync(buffer, offset, count, cancellationToken); + int n = await _stream.ReadAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); BytesRead += n; return n; } @@ -66,7 +66,7 @@ public class CountedStream : Stream public async override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { - await _stream.WriteAsync(buffer, offset, count, cancellationToken); + await _stream.WriteAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); BytesWritten += count; } } diff --git a/MareSynchronos/Utils/HashingStream.cs b/MareSynchronos/Utils/HashingStream.cs index fe35f90..b03ed31 100644 --- a/MareSynchronos/Utils/HashingStream.cs +++ b/MareSynchronos/Utils/HashingStream.cs @@ -8,7 +8,7 @@ public class HashingStream : Stream private readonly Stream _stream; private readonly HashAlgorithm _hashAlgo; private bool _finished = false; - public bool DisposeUnderlying = true; + public bool DisposeUnderlying { get; set; } = true; public Stream UnderlyingStream { get => _stream; } @@ -20,6 +20,7 @@ public class HashingStream : Stream protected override void Dispose(bool disposing) { + base.Dispose(disposing); if (!DisposeUnderlying) return; if (!_finished) @@ -63,7 +64,6 @@ public class HashingStream : Stream { ObjectDisposedException.ThrowIf(_finished, this); _stream.Write(buffer, offset, count); - string x = new(System.Text.Encoding.ASCII.GetChars(buffer.AsSpan().Slice(offset, count).ToArray())); _hashAlgo.TransformBlock(buffer, offset, count, buffer, offset); } @@ -72,6 +72,7 @@ public class HashingStream : Stream if (_finished) return _hashAlgo.Hash!; _hashAlgo.TransformFinalBlock(Array.Empty(), 0, 0); + _finished = true; if (DisposeUnderlying) _stream.Dispose(); return _hashAlgo.Hash!; diff --git a/MareSynchronos/Utils/LimitedStream.cs b/MareSynchronos/Utils/LimitedStream.cs index 1561621..0202c07 100644 --- a/MareSynchronos/Utils/LimitedStream.cs +++ b/MareSynchronos/Utils/LimitedStream.cs @@ -4,9 +4,9 @@ namespace MareSynchronos.Utils; public class LimitedStream : Stream { private readonly Stream _stream; - public long _estimatedPosition = 0; + private long _estimatedPosition = 0; public long MaxPosition { get; private init; } - public bool DisposeUnderlying = true; + public bool DisposeUnderlying { get; set; } = true; public Stream UnderlyingStream { get => _stream; } @@ -15,7 +15,7 @@ public class LimitedStream : Stream _stream = underlyingStream; try { - _estimatedPosition = Position; + _estimatedPosition = _stream.Position; } catch { } MaxPosition = _estimatedPosition + byteLimit; @@ -23,6 +23,7 @@ public class LimitedStream : Stream protected override void Dispose(bool disposing) { + base.Dispose(disposing); if (!DisposeUnderlying) return; _stream.Dispose(); @@ -60,20 +61,20 @@ public class LimitedStream : Stream count = remainder; #pragma warning disable CA1835 - int n = await _stream.ReadAsync(buffer, offset, count, cancellationToken); + int n = await _stream.ReadAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); #pragma warning restore CA1835 _estimatedPosition += n; return n; } - public async override ValueTask ReadAsync(Memory buffer, CancellationToken cancellationToken) + public async override ValueTask ReadAsync(Memory buffer, CancellationToken cancellationToken = default) { int remainder = (int)long.Clamp(MaxPosition - _estimatedPosition, 0, int.MaxValue); if (buffer.Length > remainder) buffer = buffer[..remainder]; - int n = await _stream.ReadAsync(buffer, cancellationToken); + int n = await _stream.ReadAsync(buffer, cancellationToken).ConfigureAwait(false); _estimatedPosition += n; return n; } @@ -109,19 +110,19 @@ public class LimitedStream : Stream count = remainder; #pragma warning disable CA1835 - await _stream.WriteAsync(buffer, offset, count, cancellationToken); + await _stream.WriteAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); #pragma warning restore CA1835 _estimatedPosition += count; } - public async override ValueTask WriteAsync(ReadOnlyMemory buffer, CancellationToken cancellationToken) + public async override ValueTask WriteAsync(ReadOnlyMemory buffer, CancellationToken cancellationToken = default) { int remainder = (int)long.Clamp(MaxPosition - _estimatedPosition, 0, int.MaxValue); if (buffer.Length > remainder) buffer = buffer[..remainder]; - await _stream.WriteAsync(buffer, cancellationToken); + await _stream.WriteAsync(buffer, cancellationToken).ConfigureAwait(false); _estimatedPosition += buffer.Length; } } diff --git a/MareSynchronos/Utils/RollingList.cs b/MareSynchronos/Utils/RollingList.cs index 28cb5ca..977ec68 100644 --- a/MareSynchronos/Utils/RollingList.cs +++ b/MareSynchronos/Utils/RollingList.cs @@ -4,7 +4,7 @@ namespace MareSynchronos.Utils; public class RollingList : IEnumerable { - private readonly object _addLock = new(); + private readonly Lock _addLock = new(); private readonly LinkedList _list = new(); public RollingList(int maximumCount) diff --git a/MareSynchronos/Utils/VariousExtensions.cs b/MareSynchronos/Utils/VariousExtensions.cs index 153698b..c916593 100644 --- a/MareSynchronos/Utils/VariousExtensions.cs +++ b/MareSynchronos/Utils/VariousExtensions.cs @@ -97,7 +97,7 @@ public static class VariousExtensions logger.LogDebug("[BASE-{appBase}] Updating {object}/{kind} (FileReplacements not equal) => {change}", applicationBase, cachedPlayer, objectKind, PlayerChanges.ModFiles); charaDataToUpdate[objectKind].Add(PlayerChanges.ModFiles); // XXX: This logic is disabled disabled because it seems to skip redrawing for something as basic as toggling a gear mod - /* +#if false if (forceApplyMods || objectKind != ObjectKind.Player) { charaDataToUpdate[objectKind].Add(PlayerChanges.ForcedRedraw); @@ -135,7 +135,7 @@ public static class VariousExtensions charaDataToUpdate[objectKind].Add(PlayerChanges.ForcedRedraw); } } - */ +#endif // XXX: Redraw on mod file changes always charaDataToUpdate[objectKind].Add(PlayerChanges.ForcedRedraw); } diff --git a/MareSynchronos/WebAPI/Files/FileDownloadManager.cs b/MareSynchronos/WebAPI/Files/FileDownloadManager.cs index 757c79b..69439fa 100644 --- a/MareSynchronos/WebAPI/Files/FileDownloadManager.cs +++ b/MareSynchronos/WebAPI/Files/FileDownloadManager.cs @@ -323,7 +323,7 @@ public partial class FileDownloadManager : DisposableMediatorSubscriberBase fileBlockStream.Position += fileLengthBytes; while (tasks.Count > threadCount && tasks.Where(t => !t.IsCompleted).Count() > 4) - await Task.Delay(10, CancellationToken.None); + await Task.Delay(10, CancellationToken.None).ConfigureAwait(false); var fileExtension = fileReplacement.First(f => string.Equals(f.Hash, fileHash, StringComparison.OrdinalIgnoreCase)).GamePaths[0].Split(".")[^1]; var tmpPath = _fileDbManager.GetCacheFilePath(Guid.NewGuid().ToString(), "tmp"); @@ -362,7 +362,7 @@ public partial class FileDownloadManager : DisposableMediatorSubscriberBase string calculatedHash = BitConverter.ToString(tmpFileStream.Finish()).Replace("-", "", StringComparison.Ordinal); - if (calculatedHash != fileHash) + if (!calculatedHash.Equals(fileHash, StringComparison.Ordinal)) { Logger.LogError("Hash mismatch after extracting, got {hash}, expected {expectedHash}, deleting file", calculatedHash, fileHash); return; @@ -388,7 +388,7 @@ public partial class FileDownloadManager : DisposableMediatorSubscriberBase if (File.Exists(tmpPath)) File.Delete(tmpPath); } - })); + }, CancellationToken.None)); } Task.WaitAll([..tasks], CancellationToken.None); diff --git a/MareSynchronos/WebAPI/Files/FileTransferOrchestrator.cs b/MareSynchronos/WebAPI/Files/FileTransferOrchestrator.cs index 3732168..1735f72 100644 --- a/MareSynchronos/WebAPI/Files/FileTransferOrchestrator.cs +++ b/MareSynchronos/WebAPI/Files/FileTransferOrchestrator.cs @@ -15,7 +15,7 @@ public class FileTransferOrchestrator : DisposableMediatorSubscriberBase private readonly ConcurrentDictionary _downloadReady = new(); private readonly HttpClient _httpClient; private readonly MareConfigService _mareConfig; - private readonly object _semaphoreModificationLock = new(); + private readonly Lock _semaphoreModificationLock = new(); private readonly TokenProvider _tokenProvider; private int _availableDownloadSlots; private SemaphoreSlim _downloadSemaphore; diff --git a/MareSynchronos/WebAPI/Files/FileUploadManager.cs b/MareSynchronos/WebAPI/Files/FileUploadManager.cs index 1fb7dba..ced2615 100644 --- a/MareSynchronos/WebAPI/Files/FileUploadManager.cs +++ b/MareSynchronos/WebAPI/Files/FileUploadManager.cs @@ -182,27 +182,19 @@ public sealed class FileUploadManager : DisposableMediatorSubscriberBase try { - await UploadFileStream(compressedFile, fileHash, false, postProgress, uploadToken).ConfigureAwait(false); + await UploadFileStream(compressedFile, fileHash, munged: false, postProgress, uploadToken).ConfigureAwait(false); _verifiedUploadedHashes[fileHash] = DateTime.UtcNow; } catch (Exception ex) { - if (false && ex is not OperationCanceledException) - { - Logger.LogWarning(ex, "[{hash}] Error during file upload, trying alternative file upload", fileHash); - await UploadFileStream(compressedFile, fileHash, munged: true, postProgress, uploadToken).ConfigureAwait(false); - } - else - { - Logger.LogWarning(ex, "[{hash}] File upload cancelled", fileHash); - } + Logger.LogWarning(ex, "[{hash}] File upload cancelled", fileHash); } } private async Task UploadFileStream(byte[] compressedFile, string fileHash, bool munged, bool postProgress, CancellationToken uploadToken) { if (munged) - throw new NotImplementedException(); + throw new InvalidOperationException(); using var ms = new MemoryStream(compressedFile); diff --git a/MareSynchronos/WebAPI/Files/ThrottledStream.cs b/MareSynchronos/WebAPI/Files/ThrottledStream.cs index b0ceeda..a3b5c48 100644 --- a/MareSynchronos/WebAPI/Files/ThrottledStream.cs +++ b/MareSynchronos/WebAPI/Files/ThrottledStream.cs @@ -102,7 +102,7 @@ #pragma warning restore CA1835 } - public override async ValueTask ReadAsync(Memory buffer, CancellationToken cancellationToken) + public override async ValueTask ReadAsync(Memory buffer, CancellationToken cancellationToken = default) { await Throttle(buffer.Length, cancellationToken).ConfigureAwait(false); return await _baseStream.ReadAsync(buffer, cancellationToken).ConfigureAwait(false); @@ -125,7 +125,7 @@ } /// - public override async ValueTask WriteAsync(ReadOnlyMemory buffer, CancellationToken cancellationToken) + public override async ValueTask WriteAsync(ReadOnlyMemory buffer, CancellationToken cancellationToken = default) { await Throttle(buffer.Length, cancellationToken).ConfigureAwait(false); await _baseStream.WriteAsync(buffer, cancellationToken).ConfigureAwait(false); diff --git a/MareSynchronos/WebAPI/SignalR/ApiController.cs b/MareSynchronos/WebAPI/SignalR/ApiController.cs index f618c46..ac90cbc 100644 --- a/MareSynchronos/WebAPI/SignalR/ApiController.cs +++ b/MareSynchronos/WebAPI/SignalR/ApiController.cs @@ -179,7 +179,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM if (token.IsCancellationRequested) break; - _mareHub = await _hubFactory.GetOrCreate(token); + _mareHub = await _hubFactory.GetOrCreate(token).ConfigureAwait(false); InitializeApiHooks(); await _mareHub.StartAsync(token).ConfigureAwait(false); diff --git a/MareSynchronos/WebAPI/SignalR/HubFactory.cs b/MareSynchronos/WebAPI/SignalR/HubFactory.cs index 8fb3f22..a48ddd8 100644 --- a/MareSynchronos/WebAPI/SignalR/HubFactory.cs +++ b/MareSynchronos/WebAPI/SignalR/HubFactory.cs @@ -57,7 +57,7 @@ public class HubFactory : MediatorSubscriberBase { if (!_isDisposed && _instance != null) return _instance; - _cachedConfig = await ResolveHubConfig(); + _cachedConfig = await ResolveHubConfig().ConfigureAwait(false); _cachedConfigFor = _serverConfigurationManager.CurrentApiUrl; return BuildHubConnection(_cachedConfig, ct); @@ -71,7 +71,7 @@ public class HubFactory : MediatorSubscriberBase HubConnectionConfig defaultConfig; - if (_cachedConfig != null && _serverConfigurationManager.CurrentApiUrl == _cachedConfigFor) + if (_cachedConfig != null && _serverConfigurationManager.CurrentApiUrl.Equals(_cachedConfigFor, StringComparison.Ordinal)) { defaultConfig = _cachedConfig; } @@ -84,7 +84,7 @@ public class HubFactory : MediatorSubscriberBase }; } - if (_serverConfigurationManager.CurrentApiUrl == ApiController.LoporritServiceUri) + if (_serverConfigurationManager.CurrentApiUrl.Equals(ApiController.LoporritServiceUri, StringComparison.Ordinal)) defaultConfig.HubUrl = ApiController.LoporritServiceHubUri; string jsonResponse; @@ -126,7 +126,7 @@ public class HubFactory : MediatorSubscriberBase var contentType = response.Content.Headers.ContentType?.MediaType; - if (contentType == null || contentType != "application/json") + if (contentType == null || !contentType.Equals("application/json", StringComparison.Ordinal)) return defaultConfig; jsonResponse = await response.Content.ReadAsStringAsync().ConfigureAwait(false); diff --git a/MareSynchronos/WebAPI/SignalR/TokenProvider.cs b/MareSynchronos/WebAPI/SignalR/TokenProvider.cs index b8b47aa..2f89b94 100644 --- a/MareSynchronos/WebAPI/SignalR/TokenProvider.cs +++ b/MareSynchronos/WebAPI/SignalR/TokenProvider.cs @@ -21,7 +21,7 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber private readonly ILogger _logger; private readonly ServerConfigurationManager _serverManager; private readonly ConcurrentDictionary _tokenCache = new(); - private readonly ConcurrentDictionary _wellKnownCache = new(); + private readonly ConcurrentDictionary _wellKnownCache = new(StringComparer.Ordinal); public TokenProvider(ILogger logger, ServerConfigurationManager serverManager, DalamudUtilService dalamudUtil, MareMediator mareMediator) { @@ -70,22 +70,20 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber .Replace("ws://", "http://", StringComparison.OrdinalIgnoreCase))); var secretKey = _serverManager.GetSecretKey(out _)!; var auth = secretKey.GetHash256(); - result = await _httpClient.PostAsync(tokenUri, new FormUrlEncodedContent(new[] - { - new KeyValuePair("auth", auth), - new KeyValuePair("charaIdent", await _dalamudUtil.GetPlayerNameHashedAsync().ConfigureAwait(false)), - }), token).ConfigureAwait(false); + result = await _httpClient.PostAsync(tokenUri, new FormUrlEncodedContent([ + new("auth", auth), + new("charaIdent", await _dalamudUtil.GetPlayerNameHashedAsync().ConfigureAwait(false)), + ]), token).ConfigureAwait(false); if (result.StatusCode == HttpStatusCode.NotFound) { tokenUri = MareAuth.AuthFullPath(new Uri(_serverManager.CurrentApiUrl .Replace("wss://", "https://", StringComparison.OrdinalIgnoreCase) .Replace("ws://", "http://", StringComparison.OrdinalIgnoreCase))); - result = await _httpClient.PostAsync(tokenUri, new FormUrlEncodedContent(new[] - { - new KeyValuePair("auth", auth), - new KeyValuePair("charaIdent", await _dalamudUtil.GetPlayerNameHashedAsync().ConfigureAwait(false)), - }), token).ConfigureAwait(false); + result = await _httpClient.PostAsync(tokenUri, new FormUrlEncodedContent([ + new("auth", auth), + new("charaIdent", await _dalamudUtil.GetPlayerNameHashedAsync().ConfigureAwait(false)), + ]), token).ConfigureAwait(false); var textResponse = await result.Content.ReadAsStringAsync(token).ConfigureAwait(false) ?? string.Empty; result.EnsureSuccessStatusCode();