From 88d0ab2d99f583bd30937eb2f0df53d0ca8d5f9f Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Fri, 31 Jan 2025 23:10:11 +0100 Subject: [PATCH] don't check for updated token during zoning --- MareSynchronos/Services/DalamudUtilService.cs | 4 ++-- MareSynchronos/WebAPI/SignalR/ApiController.cs | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/MareSynchronos/Services/DalamudUtilService.cs b/MareSynchronos/Services/DalamudUtilService.cs index e906b8b..8825f4c 100644 --- a/MareSynchronos/Services/DalamudUtilService.cs +++ b/MareSynchronos/Services/DalamudUtilService.cs @@ -673,7 +673,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber _lastZone = zone; if (!_sentBetweenAreas) { - _logger.LogDebug("Zone switch/Gpose start"); + _logger.LogDebug("Zone switch start"); _sentBetweenAreas = true; Mediator.Publish(new ZoneSwitchStartMessage()); Mediator.Publish(new HaltScanMessage(nameof(ConditionFlag.BetweenAreas))); @@ -685,7 +685,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber if (_sentBetweenAreas) { - _logger.LogDebug("Zone switch/Gpose end"); + _logger.LogDebug("Zone switch end"); _sentBetweenAreas = false; Mediator.Publish(new ZoneSwitchEndMessage()); Mediator.Publish(new ResumeScanMessage(nameof(ConditionFlag.BetweenAreas))); diff --git a/MareSynchronos/WebAPI/SignalR/ApiController.cs b/MareSynchronos/WebAPI/SignalR/ApiController.cs index 62b7237..6d6a0ff 100644 --- a/MareSynchronos/WebAPI/SignalR/ApiController.cs +++ b/MareSynchronos/WebAPI/SignalR/ApiController.cs @@ -39,6 +39,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM private HubConnection? _mareHub; private ServerState _serverState; private CensusUpdateMessage? _lastCensus; + private readonly SemaphoreSlim _zoneSwitchSemaphore = new(1, 1); public ApiController(ILogger logger, HubFactory hubFactory, DalamudUtilService dalamudUtil, PairManager pairManager, ServerConfigurationManager serverManager, MareMediator mediator, @@ -60,6 +61,8 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM Mediator.Subscribe(this, (msg) => _ = CyclePauseAsync(msg.UserData)); Mediator.Subscribe(this, (msg) => _lastCensus = msg); Mediator.Subscribe(this, (msg) => _ = PauseAsync(msg.UserData)); + Mediator.Subscribe(this, (msg) => _zoneSwitchSemaphore.Wait()); + Mediator.Subscribe(this, (msg) => _zoneSwitchSemaphore.Release()); ServerState = ServerState.Offline; @@ -363,6 +366,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM _healthCheckTokenSource?.Cancel(); _ = Task.Run(async () => await StopConnectionAsync(ServerState.Disconnected).ConfigureAwait(false)); + _zoneSwitchSemaphore.Dispose(); _connectionCancellationTokenSource?.Cancel(); } @@ -532,6 +536,13 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM private async Task RefreshTokenAsync(CancellationToken ct) { + int zoneSwitchWaitAttempts = 0; + while (_zoneSwitchSemaphore.CurrentCount == 0 && zoneSwitchWaitAttempts <= 15) + { + Logger.LogTrace("Refresh Token - Waiting for Zone Switch Semaphore, attempt {attempt}", zoneSwitchWaitAttempts++); + await Task.Delay(TimeSpan.FromSeconds(1), ct).ConfigureAwait(false); + } + Logger.LogDebug("Checking token"); bool requireReconnect = false;