From 6567c4debad68684c54f89904544715c8cc1b455 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Wed, 4 Sep 2024 17:10:54 +0200 Subject: [PATCH] fix some of the impl --- .../Factories/PairHandlerFactory.cs | 4 +- .../PlayerData/Handlers/PairHandler.cs | 50 ++++++++++--------- .../PlayerData/Pairs/OnlinePlayerManager.cs | 2 +- MareSynchronos/PlayerData/Pairs/Pair.cs | 5 +- .../PlayerData/Pairs/PairManager.cs | 6 ++- MareSynchronos/Services/Mediator/Messages.cs | 1 + .../Services/PlayerPerformanceService.cs | 21 ++------ .../WebAPI/Files/FileDownloadManager.cs | 4 +- .../WebAPI/SignalR/ApiController.cs | 13 ++++- 9 files changed, 55 insertions(+), 51 deletions(-) diff --git a/MareSynchronos/PlayerData/Factories/PairHandlerFactory.cs b/MareSynchronos/PlayerData/Factories/PairHandlerFactory.cs index d4476df..ee4b49e 100644 --- a/MareSynchronos/PlayerData/Factories/PairHandlerFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PairHandlerFactory.cs @@ -42,9 +42,9 @@ public class PairHandlerFactory _playerPerformanceService = playerPerformanceService; } - public PairHandler Create(OnlineUserIdentDto onlineUserIdentDto) + public PairHandler Create(Pair pair) { - return new PairHandler(_loggerFactory.CreateLogger(), onlineUserIdentDto, _gameObjectHandlerFactory, + return new PairHandler(_loggerFactory.CreateLogger(), pair, _gameObjectHandlerFactory, _ipcManager, _fileDownloadManagerFactory.Create(), _pluginWarningNotificationManager, _dalamudUtilService, _hostApplicationLifetime, _fileCacheManager, _mareMediator, _xivDataAnalyzer, _playerPerformanceService); } diff --git a/MareSynchronos/PlayerData/Handlers/PairHandler.cs b/MareSynchronos/PlayerData/Handlers/PairHandler.cs index 8f3592f..a4d7b80 100644 --- a/MareSynchronos/PlayerData/Handlers/PairHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/PairHandler.cs @@ -46,7 +46,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase public long LastAppliedDataTris { get; private set; } public long LastAppliedApproximateVRAMBytes { get; private set; } - public PairHandler(ILogger logger, OnlineUserIdentDto onlineUser, + public PairHandler(ILogger logger, Pair pair, GameObjectHandlerFactory gameObjectHandlerFactory, IpcManager ipcManager, FileDownloadManager transferManager, PluginWarningNotificationService pluginWarningNotificationManager, @@ -54,7 +54,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase FileCacheManager fileDbManager, MareMediator mediator, XivDataAnalyzer modelAnalyzer, PlayerPerformanceService playerPerformanceService) : base(logger, mediator) { - OnlineUser = onlineUser; + OnlineUser = pair; _gameObjectHandlerFactory = gameObjectHandlerFactory; _ipcManager = ipcManager; _downloadManager = transferManager; @@ -64,7 +64,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase _fileDbManager = fileDbManager; _xivDataAnalyzer = modelAnalyzer; _playerPerformanceService = playerPerformanceService; - _penumbraCollection = _ipcManager.Penumbra.CreateTemporaryCollectionAsync(logger, OnlineUser.User.UID).ConfigureAwait(false).GetAwaiter().GetResult(); + _penumbraCollection = _ipcManager.Penumbra.CreateTemporaryCollectionAsync(logger, OnlineUser.UserData.UID).ConfigureAwait(false).GetAwaiter().GetResult(); Mediator.Subscribe(this, (_) => FrameworkUpdate()); Mediator.Subscribe(this, (_) => @@ -75,7 +75,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase }); Mediator.Subscribe(this, (_) => { - _penumbraCollection = _ipcManager.Penumbra.CreateTemporaryCollectionAsync(logger, OnlineUser.User.UID).ConfigureAwait(false).GetAwaiter().GetResult(); + _penumbraCollection = _ipcManager.Penumbra.CreateTemporaryCollectionAsync(logger, OnlineUser.UserData.UID).ConfigureAwait(false).GetAwaiter().GetResult(); if (!IsVisible && _charaHandler != null) { PlayerName = string.Empty; @@ -119,13 +119,13 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase { _isVisible = value; string text = "User Visibility Changed, now: " + (_isVisible ? "Is Visible" : "Is not Visible"); - Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.User, nameof(PairHandler), + Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.UserData, nameof(PairHandler), EventSeverity.Informational, text))); Mediator.Publish(new RefreshUiMessage()); } } } - public OnlineUserIdentDto OnlineUser { get; private set; } + public Pair OnlineUser { get; private set; } public nint PlayerCharacter => _charaHandler?.Address ?? nint.Zero; public unsafe uint PlayerCharacterId => (_charaHandler?.Address ?? nint.Zero) == nint.Zero ? uint.MaxValue @@ -137,7 +137,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase { if (_dalamudUtil.IsInCombatOrPerforming) { - Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.User, nameof(PairHandler), EventSeverity.Warning, + Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.UserData, nameof(PairHandler), EventSeverity.Warning, "Cannot apply character data: you are in combat or performing music, deferring application"))); Logger.LogDebug("[BASE-{appBase}] Received data but player is in combat or performing", applicationBase); _dataReceivedInDowntime = new(applicationBase, characterData, forceApplyCustomization); @@ -147,7 +147,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase if (_charaHandler == null || (PlayerCharacter == IntPtr.Zero)) { - Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.User, nameof(PairHandler), EventSeverity.Warning, + Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.UserData, nameof(PairHandler), EventSeverity.Warning, "Cannot apply character data: Receiving Player is in an invalid state, deferring application"))); Logger.LogDebug("[BASE-{appBase}] Received data but player was in invalid state, charaHandlerIsNull: {charaIsNull}, playerPointerIsNull: {ptrIsNull}", applicationBase, _charaHandler == null, PlayerCharacter == IntPtr.Zero); @@ -169,13 +169,13 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase if (_dalamudUtil.IsInCutscene || _dalamudUtil.IsInGpose || !_ipcManager.Penumbra.APIAvailable || !_ipcManager.Glamourer.APIAvailable) { - Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.User, nameof(PairHandler), EventSeverity.Warning, + Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.UserData, nameof(PairHandler), EventSeverity.Warning, "Cannot apply character data: you are in GPose, a Cutscene or Penumbra/Glamourer is not available"))); Logger.LogInformation("[BASE-{appbase}] Application of data for {player} while in cutscene/gpose or Penumbra/Glamourer unavailable, returning", applicationBase, this); return; } - Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.User, nameof(PairHandler), EventSeverity.Informational, + Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.UserData, nameof(PairHandler), EventSeverity.Informational, "Applying Character Data"))); _forceApplyMods |= forceApplyCustomization; @@ -195,7 +195,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase if (charaDataToUpdate.TryGetValue(ObjectKind.Player, out var playerChanges)) { - _pluginWarningNotificationManager.NotifyForMissingPlugins(OnlineUser.User, PlayerName!, playerChanges); + _pluginWarningNotificationManager.NotifyForMissingPlugins(OnlineUser.UserData, PlayerName!, playerChanges); } Logger.LogDebug("[BASE-{appbase}] Downloading and applying character for {name}", applicationBase, this); @@ -207,7 +207,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase { return OnlineUser == null ? base.ToString() ?? string.Empty - : OnlineUser.User.AliasOrUID + ":" + PlayerName + ":" + (PlayerCharacter != nint.Zero ? "HasChar" : "NoChar"); + : OnlineUser.UserData.AliasOrUID + ":" + PlayerName + ":" + (PlayerCharacter != nint.Zero ? "HasChar" : "NoChar"); } internal void SetUploading(bool isUploading = true) @@ -239,19 +239,19 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase if (!string.IsNullOrEmpty(name)) { - Mediator.Publish(new EventMessage(new Event(name, OnlineUser.User, nameof(PairHandler), EventSeverity.Informational, "Disposing User"))); + Mediator.Publish(new EventMessage(new Event(name, OnlineUser.UserData, nameof(PairHandler), EventSeverity.Informational, "Disposing User"))); } if (_lifetime.ApplicationStopping.IsCancellationRequested) return; if (_dalamudUtil is { IsZoning: false, IsInCutscene: false } && !string.IsNullOrEmpty(name)) { - Logger.LogTrace("[{applicationId}] Restoring state for {name} ({OnlineUser})", applicationId, name, OnlineUser); - Logger.LogDebug("[{applicationId}] Removing Temp Collection for {name} ({user})", applicationId, name, OnlineUser); + Logger.LogTrace("[{applicationId}] Restoring state for {name} ({OnlineUser})", applicationId, name, OnlineUser.UserPair); + Logger.LogDebug("[{applicationId}] Removing Temp Collection for {name} ({user})", applicationId, name, OnlineUser.UserPair); _ipcManager.Penumbra.RemoveTemporaryCollectionAsync(Logger, applicationId, _penumbraCollection).GetAwaiter().GetResult(); if (!IsVisible) { - Logger.LogDebug("[{applicationId}] Restoring Glamourer for {name} ({user})", applicationId, name, OnlineUser); + Logger.LogDebug("[{applicationId}] Restoring Glamourer for {name} ({user})", applicationId, name, OnlineUser.UserPair); _ipcManager.Glamourer.RevertByNameAsync(Logger, name, applicationId).GetAwaiter().GetResult(); } else @@ -259,6 +259,8 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(60)); + Logger.LogInformation("[{applicationId}] CachedData is null {isNull}, contains things: {contains}", applicationId, _cachedData == null, _cachedData?.FileReplacements.Any() ?? false); + foreach (KeyValuePair> item in _cachedData?.FileReplacements ?? []) { try @@ -394,7 +396,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase _downloadManager.CancelDownload(); Logger.LogDebug("[BASE-{appBase}] Downloading missing files for player {name}, {kind}", applicationBase, PlayerName, updatedData); - Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.User, nameof(PairHandler), EventSeverity.Informational, + Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.UserData, nameof(PairHandler), EventSeverity.Informational, $"Starting download for {toDownloadReplacements.Count} files"))); var toDownloadFiles = await _downloadManager.InitiateDownloadList(_charaHandler!, toDownloadReplacements, downloadToken).ConfigureAwait(false); @@ -531,7 +533,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase Logger.LogDebug("One-Time Initializing {this}", this); Initialize(pc.Name); Logger.LogDebug("One-Time Initialized {this}", this); - Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.User, nameof(PairHandler), EventSeverity.Informational, + Mediator.Publish(new EventMessage(new Event(PlayerName, OnlineUser.UserData, nameof(PairHandler), EventSeverity.Informational, $"Initializing User For Character {pc.Name}"))); } @@ -584,7 +586,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase nint address = _dalamudUtil.GetPlayerCharacterFromCachedTableByIdent(OnlineUser.Ident); if (address == nint.Zero) return; - Logger.LogDebug("[{applicationId}] Reverting all Customization for {alias}/{name} {objectKind}", applicationId, OnlineUser.User.AliasOrUID, name, objectKind); + Logger.LogDebug("[{applicationId}] Reverting all Customization for {alias}/{name} {objectKind}", applicationId, OnlineUser.UserData.AliasOrUID, name, objectKind); if (_customizeIds.TryGetValue(objectKind, out var customizeId)) { @@ -595,18 +597,18 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase { using GameObjectHandler tempHandler = await _gameObjectHandlerFactory.Create(ObjectKind.Player, () => address, isWatched: false).ConfigureAwait(false); tempHandler.CompareNameAndThrow(name); - Logger.LogDebug("[{applicationId}] Restoring Customization and Equipment for {alias}/{name}", applicationId, OnlineUser.User.AliasOrUID, name); + Logger.LogDebug("[{applicationId}] Restoring Customization and Equipment for {alias}/{name}", applicationId, OnlineUser.UserData.AliasOrUID, name); await _ipcManager.Glamourer.RevertAsync(Logger, name, tempHandler, applicationId, cancelToken).ConfigureAwait(false); tempHandler.CompareNameAndThrow(name); - Logger.LogDebug("[{applicationId}] Restoring Heels for {alias}/{name}", applicationId, OnlineUser.User.AliasOrUID, name); + Logger.LogDebug("[{applicationId}] Restoring Heels for {alias}/{name}", applicationId, OnlineUser.UserData.AliasOrUID, name); await _ipcManager.Heels.RestoreOffsetForPlayerAsync(address).ConfigureAwait(false); tempHandler.CompareNameAndThrow(name); - Logger.LogDebug("[{applicationId}] Restoring C+ for {alias}/{name}", applicationId, OnlineUser.User.AliasOrUID, name); + Logger.LogDebug("[{applicationId}] Restoring C+ for {alias}/{name}", applicationId, OnlineUser.UserData.AliasOrUID, name); await _ipcManager.CustomizePlus.RevertByIdAsync(customizeId).ConfigureAwait(false); tempHandler.CompareNameAndThrow(name); - Logger.LogDebug("[{applicationId}] Restoring Honorific for {alias}/{name}", applicationId, OnlineUser.User.AliasOrUID, name); + Logger.LogDebug("[{applicationId}] Restoring Honorific for {alias}/{name}", applicationId, OnlineUser.UserData.AliasOrUID, name); await _ipcManager.Honorific.ClearTitleAsync(address).ConfigureAwait(false); - Logger.LogDebug("[{applicationId}] Restoring Moodles for {alias}/{name}", applicationId, OnlineUser.User.AliasOrUID, name); + Logger.LogDebug("[{applicationId}] Restoring Moodles for {alias}/{name}", applicationId, OnlineUser.UserData.AliasOrUID, name); await _ipcManager.Moodles.RevertStatusAsync(address).ConfigureAwait(false); } else if (objectKind == ObjectKind.MinionOrMount) diff --git a/MareSynchronos/PlayerData/Pairs/OnlinePlayerManager.cs b/MareSynchronos/PlayerData/Pairs/OnlinePlayerManager.cs index 197eaef..d314151 100644 --- a/MareSynchronos/PlayerData/Pairs/OnlinePlayerManager.cs +++ b/MareSynchronos/PlayerData/Pairs/OnlinePlayerManager.cs @@ -53,7 +53,7 @@ public class OnlinePlayerManager : DisposableMediatorSubscriberBase var newVisiblePlayers = _newVisiblePlayers.ToList(); _newVisiblePlayers.Clear(); Logger.LogTrace("Has new visible players, pushing character data"); - PushCharacterData(newVisiblePlayers.Select(c => c.OnlineUser.User).ToList()); + PushCharacterData(newVisiblePlayers.Select(c => c.OnlineUser.UserData).ToList()); } private void PlayerManagerOnPlayerHasChanged() diff --git a/MareSynchronos/PlayerData/Pairs/Pair.cs b/MareSynchronos/PlayerData/Pairs/Pair.cs index 9e63c22..6bfb274 100644 --- a/MareSynchronos/PlayerData/Pairs/Pair.cs +++ b/MareSynchronos/PlayerData/Pairs/Pair.cs @@ -47,6 +47,7 @@ public class Pair public long LastAppliedDataBytes => CachedPlayer?.LastAppliedDataBytes ?? -1; public long LastAppliedDataTris => CachedPlayer?.LastAppliedDataTris ?? -1; public long LastAppliedApproximateVRAMBytes => CachedPlayer?.LastAppliedApproximateVRAMBytes ?? -1; + public string Ident => _onlineUserIdentDto?.Ident ?? string.Empty; public UserData UserData => UserPair.User; @@ -161,7 +162,7 @@ public class Pair } CachedPlayer?.Dispose(); - CachedPlayer = _cachedPlayerFactory.Create(new OnlineUserIdentDto(UserData, _onlineUserIdentDto!.Ident)); + CachedPlayer = _cachedPlayerFactory.Create(this); } finally { @@ -189,11 +190,11 @@ public class Pair try { _creationSemaphore.Wait(); - _onlineUserIdentDto = null; LastReceivedCharacterData = null; var player = CachedPlayer; CachedPlayer = null; player?.Dispose(); + _onlineUserIdentDto = null; } finally { diff --git a/MareSynchronos/PlayerData/Pairs/PairManager.cs b/MareSynchronos/PlayerData/Pairs/PairManager.cs index 20f8a88..e553e4e 100644 --- a/MareSynchronos/PlayerData/Pairs/PairManager.cs +++ b/MareSynchronos/PlayerData/Pairs/PairManager.cs @@ -244,7 +244,8 @@ public sealed class PairManager : DisposableMediatorSubscriberBase pair.UserPair.OtherPermissions.IsDisableSounds(), pair.UserPair.OtherPermissions.IsDisableVFX()); - pair.ApplyLastReceivedData(); + if (!pair.IsPaused) + pair.ApplyLastReceivedData(); RecreateLazy(); } @@ -269,7 +270,8 @@ public sealed class PairManager : DisposableMediatorSubscriberBase pair.UserPair.OwnPermissions.IsDisableSounds(), pair.UserPair.OwnPermissions.IsDisableVFX()); - pair.ApplyLastReceivedData(); + if (!pair.IsPaused) + pair.ApplyLastReceivedData(); RecreateLazy(); } diff --git a/MareSynchronos/Services/Mediator/Messages.cs b/MareSynchronos/Services/Mediator/Messages.cs index 9e6ac12..e2ded6a 100644 --- a/MareSynchronos/Services/Mediator/Messages.cs +++ b/MareSynchronos/Services/Mediator/Messages.cs @@ -65,6 +65,7 @@ public record UiToggleMessage(Type UiType) : MessageBase; public record PlayerUploadingMessage(GameObjectHandler Handler, bool IsUploading) : MessageBase; public record ClearProfileDataMessage(UserData? UserData = null) : MessageBase; public record CyclePauseMessage(UserData UserData) : MessageBase; +public record PauseMessage(UserData UserData) : MessageBase; public record ProfilePopoutToggle(Pair? Pair) : MessageBase; public record CompactUiChange(Vector2 Size, Vector2 Position) : MessageBase; public record ProfileOpenStandaloneMessage(Pair Pair) : MessageBase; diff --git a/MareSynchronos/Services/PlayerPerformanceService.cs b/MareSynchronos/Services/PlayerPerformanceService.cs index 2f00302..a080fd2 100644 --- a/MareSynchronos/Services/PlayerPerformanceService.cs +++ b/MareSynchronos/Services/PlayerPerformanceService.cs @@ -1,13 +1,9 @@ using MareSynchronos.API.Data; -using MareSynchronos.API.Data.Extensions; using MareSynchronos.FileCache; using MareSynchronos.MareConfiguration; using MareSynchronos.PlayerData.Handlers; -using MareSynchronos.PlayerData.Pairs; using MareSynchronos.Services.Mediator; using MareSynchronos.UI; -using MareSynchronos.Utils; -using MareSynchronos.WebAPI; using MareSynchronos.WebAPI.Files.Models; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -20,19 +16,14 @@ public class PlayerPerformanceService : IHostedService private readonly MareMediator _mediator; private readonly PlayerPerformanceConfigService _playerPerformanceConfigService; private readonly FileCacheManager _fileCacheManager; - private readonly PairManager _pairManager; - private readonly ApiController _apiController; public PlayerPerformanceService(ILogger logger, MareMediator mediator, - PlayerPerformanceConfigService playerPerformanceConfigService, FileCacheManager fileCacheManager, - PairManager pairManager, ApiController apiController) + PlayerPerformanceConfigService playerPerformanceConfigService, FileCacheManager fileCacheManager) { _logger = logger; _mediator = mediator; _playerPerformanceConfigService = playerPerformanceConfigService; _fileCacheManager = fileCacheManager; - _pairManager = pairManager; - _apiController = apiController; } public Task StartAsync(CancellationToken cancellationToken) @@ -48,7 +39,7 @@ public class PlayerPerformanceService : IHostedService public bool TryCalculateVRAMUsage(PairHandler pairHandler, CharacterData charaData, List toDownloadFiles, out long vramUsage) { var config = _playerPerformanceConfigService.Current; - var pair = _pairManager.GetOnlineUserPairs().First(p => string.Equals(p.UserData.UID, pairHandler.OnlineUser.User.UID, StringComparison.OrdinalIgnoreCase)); + var pair = pairHandler.OnlineUser; vramUsage = 0; @@ -68,6 +59,7 @@ public class PlayerPerformanceService : IHostedService if (download != null) { fileSize = download.Total; + // todo: use TotalRaw after updating API } else { @@ -105,12 +97,7 @@ public class PlayerPerformanceService : IHostedService $" and has been automatically paused.", MareConfiguration.Models.NotificationType.Warning)); - // pause - var perm = pair.UserPair.OwnPermissions.DeepClone(); - perm.SetPaused(paused: true); - _ = _apiController.SetBulkPermissions(new( - new(StringComparer.Ordinal) { { pair.UserData.UID, perm } }, - new(StringComparer.Ordinal))); + _mediator.Publish(new PauseMessage(pair.UserData)); return false; } diff --git a/MareSynchronos/WebAPI/Files/FileDownloadManager.cs b/MareSynchronos/WebAPI/Files/FileDownloadManager.cs index 5a8ade1..bc2999b 100644 --- a/MareSynchronos/WebAPI/Files/FileDownloadManager.cs +++ b/MareSynchronos/WebAPI/Files/FileDownloadManager.cs @@ -229,8 +229,10 @@ public partial class FileDownloadManager : DisposableMediatorSubscriberBase } } - return CurrentDownloads = downloadFileInfoFromService.Distinct().Select(d => new DownloadFileTransfer(d)) + CurrentDownloads = downloadFileInfoFromService.Distinct().Select(d => new DownloadFileTransfer(d)) .Where(d => d.CanBeTransferred).ToList(); + + return CurrentDownloads; } private async Task DownloadFilesInternal(GameObjectHandler gameObjectHandler, List fileReplacement, CancellationToken ct) diff --git a/MareSynchronos/WebAPI/SignalR/ApiController.cs b/MareSynchronos/WebAPI/SignalR/ApiController.cs index c32a2a2..2d134e5 100644 --- a/MareSynchronos/WebAPI/SignalR/ApiController.cs +++ b/MareSynchronos/WebAPI/SignalR/ApiController.cs @@ -59,6 +59,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM Mediator.Subscribe(this, (msg) => MareHubOnReconnecting(msg.Exception)); Mediator.Subscribe(this, (msg) => _ = CyclePause(msg.UserData)); Mediator.Subscribe(this, (msg) => _lastCensus = msg); + Mediator.Subscribe(this, (msg) => _ = Pause(msg.UserData)); ServerState = ServerState.Offline; @@ -277,7 +278,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM var pair = _pairManager.GetOnlineUserPairs().Single(p => p.UserPair != null && p.UserData == userData); var perm = pair.UserPair!.OwnPermissions; perm.SetPaused(paused: true); - await UserSetPairPermissions(new API.Dto.User.UserPermissionsDto(userData, perm)).ConfigureAwait(false); + await UserSetPairPermissions(new UserPermissionsDto(userData, perm)).ConfigureAwait(false); // wait until it's changed while (pair.UserPair!.OwnPermissions != perm) { @@ -285,12 +286,20 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM Logger.LogTrace("Waiting for permissions change for {data}", userData); } perm.SetPaused(paused: false); - await UserSetPairPermissions(new API.Dto.User.UserPermissionsDto(userData, perm)).ConfigureAwait(false); + await UserSetPairPermissions(new UserPermissionsDto(userData, perm)).ConfigureAwait(false); }, cts.Token).ContinueWith((t) => cts.Dispose()); return Task.CompletedTask; } + public async Task Pause(UserData userData) + { + var pair = _pairManager.GetOnlineUserPairs().Single(p => p.UserPair != null && p.UserData == userData); + var perm = pair.UserPair!.OwnPermissions; + perm.SetPaused(paused: true); + await UserSetPairPermissions(new UserPermissionsDto(userData, perm)).ConfigureAwait(false); + } + public Task GetConnectionDto() => GetConnectionDto(true); public async Task GetConnectionDto(bool publishConnected = true)