diff --git a/LightlessSync/Plugin.cs b/LightlessSync/Plugin.cs index 9ec4bed..01a4de4 100644 --- a/LightlessSync/Plugin.cs +++ b/LightlessSync/Plugin.cs @@ -255,9 +255,9 @@ public sealed class Plugin : IDalamudPlugin collection.AddScoped((s) => new BroadcastUI(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); collection.AddScoped((s) => new SyncshellFinderUI(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); collection.AddScoped(); - collection.AddScoped((s) => - new LightlessNotificationUI( - s.GetRequiredService>(), + collection.AddScoped((s) => + new LightlessNotificationUi( + s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); @@ -269,8 +269,7 @@ public sealed class Plugin : IDalamudPlugin s.GetRequiredService(), s.GetServices(), s.GetRequiredService(), s.GetRequiredService(), - s.GetRequiredService(), - s.GetRequiredService())); + s.GetRequiredService())); collection.AddScoped((s) => new CommandManagerService(commandManager, s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); diff --git a/LightlessSync/Services/Mediator/Messages.cs b/LightlessSync/Services/Mediator/Messages.cs index 8a724b4..79434c2 100644 --- a/LightlessSync/Services/Mediator/Messages.cs +++ b/LightlessSync/Services/Mediator/Messages.cs @@ -108,7 +108,9 @@ public record OpenCharaDataHubWithFilterMessage(UserData UserData) : MessageBase public record EnableBroadcastMessage(string HashedCid, bool Enabled) : MessageBase; public record BroadcastStatusChangedMessage(bool Enabled, TimeSpan? Ttl) : MessageBase; public record SyncshellBroadcastsUpdatedMessage : MessageBase; +public record PairRequestReceivedMessage(string HashedCid, string Message) : MessageBase; public record PairRequestsUpdatedMessage : MessageBase; +public record PairDownloadStatusMessage(List<(string PlayerName, float Progress, string Status)> DownloadStatus, int QueueWaiting) : MessageBase; public record VisibilityChange : MessageBase; #pragma warning restore S2094 #pragma warning restore MA0048 // File name must match type name \ No newline at end of file diff --git a/LightlessSync/Services/NotificationService.cs b/LightlessSync/Services/NotificationService.cs index 755e756..72f4a16 100644 --- a/LightlessSync/Services/NotificationService.cs +++ b/LightlessSync/Services/NotificationService.cs @@ -45,7 +45,9 @@ public class NotificationService : DisposableMediatorSubscriberBase, IHostedServ public Task StartAsync(CancellationToken cancellationToken) { Mediator.Subscribe(this, HandleNotificationMessage); + Mediator.Subscribe(this, HandlePairRequestReceived); Mediator.Subscribe(this, HandlePairRequestsUpdated); + Mediator.Subscribe(this, HandlePairDownloadStatus); Mediator.Subscribe(this, HandlePerformanceNotification); return Task.CompletedTask; } @@ -293,33 +295,8 @@ public class NotificationService : DisposableMediatorSubscriberBase, IHostedServ return actions; } - public void ShowPairDownloadNotification(List<(string playerName, float progress, string status)> downloadStatus, - int queueWaiting = 0) - { - var userDownloads = downloadStatus.Where(x => x.playerName != "Pair Queue").ToList(); - var totalProgress = userDownloads.Count > 0 ? userDownloads.Average(x => x.progress) : 0f; - var message = BuildPairDownloadMessage(userDownloads, queueWaiting); - var notification = new LightlessNotification - { - Id = "pair_download_progress", - Title = "Downloading Pair Data", - Message = message, - Type = NotificationType.Download, - Duration = TimeSpan.FromSeconds(_configService.Current.DownloadNotificationDurationSeconds), - ShowProgress = true, - Progress = totalProgress - }; - - Mediator.Publish(new LightlessNotificationMessage(notification)); - - if (AreAllDownloadsCompleted(userDownloads)) - { - DismissPairDownloadNotification(); - } - } - - private string BuildPairDownloadMessage(List<(string playerName, float progress, string status)> userDownloads, + private string BuildPairDownloadMessage(List<(string PlayerName, float Progress, string Status)> userDownloads, int queueWaiting) { var messageParts = new List(); @@ -331,7 +308,7 @@ public class NotificationService : DisposableMediatorSubscriberBase, IHostedServ if (userDownloads.Count > 0) { - var completedCount = userDownloads.Count(x => x.progress >= 1.0f); + var completedCount = userDownloads.Count(x => x.Progress >= 1.0f); messageParts.Add($"Progress: {completedCount}/{userDownloads.Count} completed"); } @@ -344,29 +321,29 @@ public class NotificationService : DisposableMediatorSubscriberBase, IHostedServ return string.Join("\n", messageParts); } - private string BuildActiveDownloadLines(List<(string playerName, float progress, string status)> userDownloads) + private string BuildActiveDownloadLines(List<(string PlayerName, float Progress, string Status)> userDownloads) { var activeDownloads = userDownloads - .Where(x => x.progress < 1.0f) + .Where(x => x.Progress < 1.0f) .Take(_configService.Current.MaxConcurrentPairApplications); if (!activeDownloads.Any()) return string.Empty; - return string.Join("\n", activeDownloads.Select(x => $"• {x.playerName}: {FormatDownloadStatus(x)}")); + return string.Join("\n", activeDownloads.Select(x => $"• {x.PlayerName}: {FormatDownloadStatus(x)}")); } - private string FormatDownloadStatus((string playerName, float progress, string status) download) => - download.status switch + private string FormatDownloadStatus((string PlayerName, float Progress, string Status) download) => + download.Status switch { - "downloading" => $"{download.progress:P0}", + "downloading" => $"{download.Progress:P0}", "decompressing" => "decompressing", "queued" => "queued", "waiting" => "waiting for slot", - _ => download.status + _ => download.Status }; - private bool AreAllDownloadsCompleted(List<(string playerName, float progress, string status)> userDownloads) => - userDownloads.Any() && userDownloads.All(x => x.progress >= 1.0f); + private bool AreAllDownloadsCompleted(List<(string PlayerName, float Progress, string Status)> userDownloads) => + userDownloads.Any() && userDownloads.All(x => x.Progress >= 1.0f); public void DismissPairDownloadNotification() => Mediator.Publish(new LightlessNotificationDismissMessage("pair_download_progress")); @@ -581,12 +558,25 @@ public class NotificationService : DisposableMediatorSubscriberBase, IHostedServ _chatGui.Print(se.BuiltString); } + private void HandlePairRequestReceived(PairRequestReceivedMessage msg) + { + var request = _pairRequestService.RegisterIncomingRequest(msg.HashedCid, msg.Message); + var senderName = string.IsNullOrEmpty(request.DisplayName) ? "Unknown User" : request.DisplayName; + + _shownPairRequestNotifications.Add(request.HashedCid); + ShowPairRequestNotification( + senderName, + request.HashedCid, + onAccept: () => _pairRequestService.AcceptPairRequest(request.HashedCid, senderName), + onDecline: () => _pairRequestService.DeclinePairRequest(request.HashedCid, senderName)); + } + private void HandlePairRequestsUpdated(PairRequestsUpdatedMessage _) { var activeRequests = _pairRequestService.GetActiveRequests(); var activeRequestIds = activeRequests.Select(r => r.HashedCid).ToHashSet(); - // Dismiss notifications for requests that are no longer active + // Dismiss notifications for requests that are no longer active (expired) var notificationsToRemove = _shownPairRequestNotifications .Where(hashedCid => !activeRequestIds.Contains(hashedCid)) .ToList(); @@ -597,17 +587,30 @@ public class NotificationService : DisposableMediatorSubscriberBase, IHostedServ Mediator.Publish(new LightlessNotificationDismissMessage(notificationId)); _shownPairRequestNotifications.Remove(hashedCid); } + } - // Show/update notifications for all active requests - foreach (var request in activeRequests) + private void HandlePairDownloadStatus(PairDownloadStatusMessage msg) + { + var userDownloads = msg.DownloadStatus.Where(x => x.PlayerName != "Pair Queue").ToList(); + var totalProgress = userDownloads.Count > 0 ? userDownloads.Average(x => x.Progress) : 0f; + var message = BuildPairDownloadMessage(userDownloads, msg.QueueWaiting); + + var notification = new LightlessNotification { - _shownPairRequestNotifications.Add(request.HashedCid); - ShowPairRequestNotification( - request.DisplayName, - request.HashedCid, - () => _pairRequestService.AcceptPairRequest(request.HashedCid, request.DisplayName), - () => _pairRequestService.DeclinePairRequest(request.HashedCid) - ); + Id = "pair_download_progress", + Title = "Downloading Pair Data", + Message = message, + Type = NotificationType.Download, + Duration = TimeSpan.FromSeconds(_configService.Current.DownloadNotificationDurationSeconds), + ShowProgress = true, + Progress = totalProgress + }; + + Mediator.Publish(new LightlessNotificationMessage(notification)); + + if (userDownloads.Count == 0 || AreAllDownloadsCompleted(userDownloads)) + { + Mediator.Publish(new LightlessNotificationDismissMessage("pair_download_progress")); } } diff --git a/LightlessSync/Services/PairRequestService.cs b/LightlessSync/Services/PairRequestService.cs index 92294e2..7190825 100644 --- a/LightlessSync/Services/PairRequestService.cs +++ b/LightlessSync/Services/PairRequestService.cs @@ -19,7 +19,12 @@ public sealed class PairRequestService : DisposableMediatorSubscriberBase private static readonly TimeSpan Expiration = TimeSpan.FromMinutes(5); - public PairRequestService(ILogger logger, LightlessMediator mediator, DalamudUtilService dalamudUtil, PairManager pairManager, Lazy apiController) + public PairRequestService( + ILogger logger, + LightlessMediator mediator, + DalamudUtilService dalamudUtil, + PairManager pairManager, + Lazy apiController) : base(logger, mediator) { _dalamudUtil = dalamudUtil; @@ -215,9 +220,13 @@ public sealed class PairRequestService : DisposableMediatorSubscriberBase }); } - public void DeclinePairRequest(string hashedCid) + public void DeclinePairRequest(string hashedCid, string displayName) { RemoveRequest(hashedCid); + Mediator.Publish(new NotificationMessage("Pair request declined", + "Declined " + displayName + "'s pending pair request.", + NotificationType.Info, + TimeSpan.FromSeconds(3))); Logger.LogDebug("Declined pair request from {HashedCid}", hashedCid); } diff --git a/LightlessSync/Services/UiService.cs b/LightlessSync/Services/UiService.cs index 3740114..f08b1fc 100644 --- a/LightlessSync/Services/UiService.cs +++ b/LightlessSync/Services/UiService.cs @@ -23,8 +23,7 @@ public sealed class UiService : DisposableMediatorSubscriberBase LightlessConfigService lightlessConfigService, WindowSystem windowSystem, IEnumerable windows, UiFactory uiFactory, FileDialogManager fileDialogManager, - LightlessMediator lightlessMediator, - NotificationService notificationService) : base(logger, lightlessMediator) + LightlessMediator lightlessMediator) : base(logger, lightlessMediator) { _logger = logger; _logger.LogTrace("Creating {type}", GetType().Name); diff --git a/LightlessSync/UI/DownloadUi.cs b/LightlessSync/UI/DownloadUi.cs index 1b1ec16..a592e43 100644 --- a/LightlessSync/UI/DownloadUi.cs +++ b/LightlessSync/UI/DownloadUi.cs @@ -22,13 +22,12 @@ public class DownloadUi : WindowMediatorSubscriberBase private readonly UiSharedService _uiShared; private readonly PairProcessingLimiter _pairProcessingLimiter; private readonly ConcurrentDictionary _uploadingPlayers = new(); - private readonly NotificationService _notificationService; private bool _notificationDismissed = true; private int _lastDownloadStateHash = 0; public DownloadUi(ILogger logger, DalamudUtilService dalamudUtilService, LightlessConfigService configService, PairProcessingLimiter pairProcessingLimiter, FileUploadManager fileTransferManager, LightlessMediator mediator, UiSharedService uiShared, - PerformanceCollectorService performanceCollectorService, NotificationService notificationService) + PerformanceCollectorService performanceCollectorService) : base(logger, mediator, "Lightless Sync Downloads", performanceCollectorService) { _dalamudUtilService = dalamudUtilService; @@ -36,7 +35,6 @@ public class DownloadUi : WindowMediatorSubscriberBase _pairProcessingLimiter = pairProcessingLimiter; _fileTransferManager = fileTransferManager; _uiShared = uiShared; - _notificationService = notificationService; SizeConstraints = new WindowSizeConstraints() { @@ -359,7 +357,7 @@ public class DownloadUi : WindowMediatorSubscriberBase _lastDownloadStateHash = currentHash; if (downloadStatus.Count > 0 || queueWaiting > 0) { - _notificationService.ShowPairDownloadNotification(downloadStatus, queueWaiting); + Mediator.Publish(new PairDownloadStatusMessage(downloadStatus, queueWaiting)); } } } diff --git a/LightlessSync/UI/LightlessNotificationUI.cs b/LightlessSync/UI/LightlessNotificationUI.cs index 2ac26b7..3d2d748 100644 --- a/LightlessSync/UI/LightlessNotificationUI.cs +++ b/LightlessSync/UI/LightlessNotificationUI.cs @@ -15,17 +15,17 @@ using Dalamud.Bindings.ImGui; namespace LightlessSync.UI; -public class LightlessNotificationUI : WindowMediatorSubscriberBase +public class LightlessNotificationUi : WindowMediatorSubscriberBase { - private const float NotificationMinHeight = 60f; - private const float NotificationMaxHeight = 250f; - private const float WindowPaddingOffset = 6f; - private const float SlideAnimationDistance = 100f; - private const float OutAnimationSpeedMultiplier = 0.7f; - private const float ContentPaddingX = 10f; - private const float ContentPaddingY = 6f; - private const float TitleMessageSpacing = 4f; - private const float ActionButtonSpacing = 8f; + private const float _notificationMinHeight = 60f; + private const float _notificationMaxHeight = 250f; + private const float _windowPaddingOffset = 6f; + private const float _slideAnimationDistance = 100f; + private const float _outAnimationSpeedMultiplier = 0.7f; + private const float _contentPaddingX = 10f; + private const float _contentPaddingY = 6f; + private const float _titleMessageSpacing = 4f; + private const float _actionButtonSpacing = 8f; private readonly List _notifications = new(); private readonly object _notificationLock = new(); @@ -33,7 +33,7 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase private readonly Dictionary _notificationYOffsets = new(); private readonly Dictionary _notificationTargetYOffsets = new(); - public LightlessNotificationUI(ILogger logger, LightlessMediator mediator, PerformanceCollectorService performanceCollector, LightlessConfigService configService) + public LightlessNotificationUi(ILogger logger, LightlessMediator mediator, PerformanceCollectorService performanceCollector, LightlessConfigService configService) : base(logger, mediator, "Lightless Notifications##LightlessNotifications", performanceCollector) { _configService = configService; @@ -155,8 +155,8 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase var width = _configService.Current.NotificationWidth; float posX = corner == NotificationCorner.Left - ? viewport.WorkPos.X + offsetX - WindowPaddingOffset - : viewport.WorkPos.X + viewport.WorkSize.X - width - offsetX - WindowPaddingOffset; + ? viewport.WorkPos.X + offsetX - _windowPaddingOffset + : viewport.WorkPos.X + viewport.WorkSize.X - width - offsetX - _windowPaddingOffset; return new Vector2(posX, viewport.WorkPos.Y); } @@ -274,7 +274,7 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase else if (notification.IsAnimatingOut && notification.AnimationProgress > 0f) { notification.AnimationProgress = Math.Max(0f, - notification.AnimationProgress - deltaTime * _configService.Current.NotificationAnimationSpeed * OutAnimationSpeedMultiplier); + notification.AnimationProgress - deltaTime * _configService.Current.NotificationAnimationSpeed * _outAnimationSpeedMultiplier); } else if (!notification.IsAnimatingOut && !notification.IsDismissed) { @@ -289,7 +289,7 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase private Vector2 CalculateSlideOffset(float alpha) { - var distance = (1f - alpha) * SlideAnimationDistance; + var distance = (1f - alpha) * _slideAnimationDistance; var corner = _configService.Current.NotificationCorner; return corner == NotificationCorner.Left ? new Vector2(-distance, 0) : new Vector2(distance, 0); } @@ -466,7 +466,7 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase private void DrawNotificationText(LightlessNotification notification, float alpha) { - var contentPos = new Vector2(ContentPaddingX, ContentPaddingY); + var contentPos = new Vector2(_contentPaddingX, _contentPaddingY); var windowSize = ImGui.GetWindowSize(); var contentWidth = CalculateContentWidth(windowSize.X); @@ -483,7 +483,7 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase } private float CalculateContentWidth(float windowWidth) => - windowWidth - (ContentPaddingX * 2); + windowWidth - (_contentPaddingX * 2); private bool HasActions(LightlessNotification notification) => notification.Actions.Count > 0; @@ -491,9 +491,9 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase private void PositionActionsAtBottom(float windowHeight) { var actionHeight = ImGui.GetFrameHeight(); - var bottomY = windowHeight - ContentPaddingY - actionHeight; + var bottomY = windowHeight - _contentPaddingY - actionHeight; ImGui.SetCursorPosY(bottomY); - ImGui.SetCursorPosX(ContentPaddingX); + ImGui.SetCursorPosX(_contentPaddingX); } private float DrawTitle(LightlessNotification notification, float contentWidth, float alpha) @@ -530,7 +530,7 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase { if (string.IsNullOrEmpty(notification.Message)) return; - var messagePos = contentPos + new Vector2(0f, titleHeight + TitleMessageSpacing); + var messagePos = contentPos + new Vector2(0f, titleHeight + _titleMessageSpacing); var messageColor = new Vector4(0.9f, 0.9f, 0.9f, alpha); ImGui.SetCursorPos(messagePos); @@ -563,13 +563,13 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase private float CalculateActionButtonWidth(int actionCount, float availableWidth) { - var totalSpacing = (actionCount - 1) * ActionButtonSpacing; + var totalSpacing = (actionCount - 1) * _actionButtonSpacing; return (availableWidth - totalSpacing) / actionCount; } private void PositionActionButton(int index, float startX, float buttonWidth) { - var xPosition = startX + index * (buttonWidth + ActionButtonSpacing); + var xPosition = startX + index * (buttonWidth + _actionButtonSpacing); ImGui.SetCursorPosX(xPosition); } @@ -687,7 +687,7 @@ public class LightlessNotificationUI : WindowMediatorSubscriberBase height += 12f; } - return Math.Clamp(height, NotificationMinHeight, NotificationMaxHeight); + return Math.Clamp(height, _notificationMinHeight, _notificationMaxHeight); } private float CalculateTitleHeight(LightlessNotification notification, float contentWidth) diff --git a/LightlessSync/UI/SettingsUi.cs b/LightlessSync/UI/SettingsUi.cs index 3b87baa..febc142 100644 --- a/LightlessSync/UI/SettingsUi.cs +++ b/LightlessSync/UI/SettingsUi.cs @@ -63,7 +63,6 @@ public class SettingsUi : WindowMediatorSubscriberBase private readonly IProgress<(int, int, FileCacheEntity)> _validationProgress; private readonly NameplateService _nameplateService; private readonly NameplateHandler _nameplateHandler; - private readonly NotificationService _lightlessNotificationService; private (int, int, FileCacheEntity) _currentProgress; private bool _deleteAccountPopupModalShown = false; private bool _deleteFilesPopupModalShown = false; @@ -107,8 +106,7 @@ public class SettingsUi : WindowMediatorSubscriberBase IpcManager ipcManager, CacheMonitor cacheMonitor, DalamudUtilService dalamudUtilService, HttpClient httpClient, NameplateService nameplateService, - NameplateHandler nameplateHandler, - NotificationService lightlessNotificationService) : base(logger, mediator, "Lightless Sync Settings", + NameplateHandler nameplateHandler) : base(logger, mediator, "Lightless Sync Settings", performanceCollector) { _configService = configService; @@ -130,7 +128,6 @@ public class SettingsUi : WindowMediatorSubscriberBase _uiShared = uiShared; _nameplateService = nameplateService; _nameplateHandler = nameplateHandler; - _lightlessNotificationService = lightlessNotificationService; AllowClickthrough = false; AllowPinning = true; _validationProgress = new Progress<(int, int, FileCacheEntity)>(v => _currentProgress = v); @@ -3616,20 +3613,7 @@ public class SettingsUi : WindowMediatorSubscriberBase { if (ImGui.Button($"{FontAwesomeIcon.Play.ToIconString()}##test_pair", new Vector2(availableWidth, 0))) { - _lightlessNotificationService.ShowPairRequestNotification( - "Test User", - "test-uid-123", - () => - { - Mediator.Publish(new NotificationMessage("Accepted", "You accepted the test pair request.", - NotificationType.Info)); - }, - () => - { - Mediator.Publish(new NotificationMessage("Declined", "You declined the test pair request.", - NotificationType.Info)); - } - ); + Mediator.Publish(new PairRequestReceivedMessage("test-uid-123", "Test User wants to pair with you.")); } } UiSharedService.AttachToolTip("Test pair request notification"); @@ -3652,15 +3636,14 @@ public class SettingsUi : WindowMediatorSubscriberBase { if (ImGui.Button($"{FontAwesomeIcon.Play.ToIconString()}##test_download", new Vector2(availableWidth, 0))) { - _lightlessNotificationService.ShowPairDownloadNotification( - new List<(string playerName, float progress, string status)> - { + Mediator.Publish(new PairDownloadStatusMessage( + [ ("Player One", 0.35f, "downloading"), ("Player Two", 0.75f, "downloading"), ("Player Three", 1.0f, "downloading") - }, - queueWaiting: 2 - ); + ], + 2 + )); } } UiSharedService.AttachToolTip("Test download progress notification"); diff --git a/LightlessSync/UI/UpdateNotesUi.cs b/LightlessSync/UI/UpdateNotesUi.cs index f7544e1..bc60ab5 100644 --- a/LightlessSync/UI/UpdateNotesUi.cs +++ b/LightlessSync/UI/UpdateNotesUi.cs @@ -52,12 +52,12 @@ public class UpdateNotesUi : WindowMediatorSubscriberBase private float _particleSpawnTimer; private readonly Random _random = new(); - private const float HeaderHeight = 150f; - private const float ParticleSpawnInterval = 0.2f; - private const int MaxParticles = 50; - private const int MaxTrailLength = 50; - private const float EdgeFadeDistance = 30f; - private const float ExtendedParticleHeight = 40f; + private const float _headerHeight = 150f; + private const float _particleSpawnInterval = 0.2f; + private const int _maxParticles = 50; + private const int _maxTrailLength = 50; + private const float _edgeFadeDistance = 30f; + private const float _extendedParticleHeight = 40f; public UpdateNotesUi(ILogger logger, LightlessMediator mediator, @@ -111,16 +111,16 @@ public class UpdateNotesUi : WindowMediatorSubscriberBase var headerWidth = (800f * ImGuiHelpers.GlobalScale) - (windowPadding.X * 2); var headerStart = windowPos + new Vector2(windowPadding.X, windowPadding.Y); - var headerEnd = headerStart + new Vector2(headerWidth, HeaderHeight); + var headerEnd = headerStart + new Vector2(headerWidth, _headerHeight); - var extendedParticleSize = new Vector2(headerWidth, HeaderHeight + ExtendedParticleHeight); + var extendedParticleSize = new Vector2(headerWidth, _headerHeight + _extendedParticleHeight); DrawGradientBackground(headerStart, headerEnd); DrawHeaderText(headerStart); DrawHeaderButtons(headerStart, headerWidth); DrawBottomGradient(headerStart, headerEnd, headerWidth); - ImGui.SetCursorPosY(windowPadding.Y + HeaderHeight + 5); + ImGui.SetCursorPosY(windowPadding.Y + _headerHeight + 5); ImGui.SetCursorPosX(20); using (ImRaii.PushFont(UiBuilder.IconFont)) { @@ -260,7 +260,7 @@ public class UpdateNotesUi : WindowMediatorSubscriberBase var deltaTime = ImGui.GetIO().DeltaTime; _particleSpawnTimer += deltaTime; - if (_particleSpawnTimer > ParticleSpawnInterval && _particles.Count < MaxParticles) + if (_particleSpawnTimer > _particleSpawnInterval && _particles.Count < _maxParticles) { SpawnParticle(bannerSize); _particleSpawnTimer = 0f; @@ -282,7 +282,7 @@ public class UpdateNotesUi : WindowMediatorSubscriberBase if (particle.Type == ParticleType.ShootingStar && particle.Trail != null) { particle.Trail.Insert(0, particle.Position); - if (particle.Trail.Count > MaxTrailLength) + if (particle.Trail.Count > _maxTrailLength) particle.Trail.RemoveAt(particle.Trail.Count - 1); } @@ -316,12 +316,12 @@ public class UpdateNotesUi : WindowMediatorSubscriberBase var lifeFade = Math.Min(fadeIn, fadeOut); var edgeFadeX = Math.Min( - Math.Min(1f, (particle.Position.X + EdgeFadeDistance) / EdgeFadeDistance), - Math.Min(1f, (bannerSize.X - particle.Position.X + EdgeFadeDistance) / EdgeFadeDistance) + Math.Min(1f, (particle.Position.X + _edgeFadeDistance) / _edgeFadeDistance), + Math.Min(1f, (bannerSize.X - particle.Position.X + _edgeFadeDistance) / _edgeFadeDistance) ); var edgeFadeY = Math.Min( - Math.Min(1f, (particle.Position.Y + EdgeFadeDistance) / EdgeFadeDistance), - Math.Min(1f, (bannerSize.Y - particle.Position.Y + EdgeFadeDistance) / EdgeFadeDistance) + Math.Min(1f, (particle.Position.Y + _edgeFadeDistance) / _edgeFadeDistance), + Math.Min(1f, (bannerSize.Y - particle.Position.Y + _edgeFadeDistance) / _edgeFadeDistance) ); var edgeFade = Math.Min(edgeFadeX, edgeFadeY); diff --git a/LightlessSync/WebAPI/SignalR/ApiController.Functions.Callbacks.cs b/LightlessSync/WebAPI/SignalR/ApiController.Functions.Callbacks.cs index da07460..8323fc3 100644 --- a/LightlessSync/WebAPI/SignalR/ApiController.Functions.Callbacks.cs +++ b/LightlessSync/WebAPI/SignalR/ApiController.Functions.Callbacks.cs @@ -107,17 +107,17 @@ public partial class ApiController } public Task Client_ReceiveBroadcastPairRequest(UserPairNotificationDto dto) { - if (dto == null) + Logger.LogDebug("Client_ReceiveBroadcastPairRequest: {dto}", dto); + + if (dto is null) + { return Task.CompletedTask; + } - var request = _pairRequestService.RegisterIncomingRequest(dto.myHashedCid, dto.message ?? string.Empty); - var senderName = string.IsNullOrEmpty(request.DisplayName) ? "Unknown User" : request.DisplayName; - - _lightlessNotificationService.ShowPairRequestNotification( - senderName, - request.HashedCid, - onAccept: () => _pairRequestService.AcceptPairRequest(request.HashedCid, senderName), - onDecline: () => _pairRequestService.DeclinePairRequest(request.HashedCid)); + ExecuteSafely(() => + { + Mediator.Publish(new PairRequestReceivedMessage(dto.myHashedCid, dto.message ?? string.Empty)); + }); return Task.CompletedTask; } diff --git a/LightlessSync/WebAPI/SignalR/ApiController.cs b/LightlessSync/WebAPI/SignalR/ApiController.cs index 56ab36e..15aef29 100644 --- a/LightlessSync/WebAPI/SignalR/ApiController.cs +++ b/LightlessSync/WebAPI/SignalR/ApiController.cs @@ -32,7 +32,6 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IL private readonly ServerConfigurationManager _serverManager; private readonly TokenProvider _tokenProvider; private readonly LightlessConfigService _lightlessConfigService; - private readonly NotificationService _lightlessNotificationService; private CancellationTokenSource _connectionCancellationTokenSource; private ConnectionDto? _connectionDto; private bool _doNotNotifyOnNextInfo = false; @@ -54,7 +53,6 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IL _serverManager = serverManager; _tokenProvider = tokenProvider; _lightlessConfigService = lightlessConfigService; - _lightlessNotificationService = lightlessNotificationService; _connectionCancellationTokenSource = new CancellationTokenSource(); Mediator.Subscribe(this, (_) => DalamudUtilOnLogIn());