From 6d01d47c2f883158e3346292ff45c41012e69fd4 Mon Sep 17 00:00:00 2001 From: choco Date: Thu, 16 Oct 2025 22:13:40 +0200 Subject: [PATCH] broadcast notifications, action button for reconnecting once expired --- LightlessSync/Services/BroadcastService.cs | 84 +++++++++++++++++++++- 1 file changed, 81 insertions(+), 3 deletions(-) diff --git a/LightlessSync/Services/BroadcastService.cs b/LightlessSync/Services/BroadcastService.cs index 0cdd3c0..cad09dd 100644 --- a/LightlessSync/Services/BroadcastService.cs +++ b/LightlessSync/Services/BroadcastService.cs @@ -1,4 +1,8 @@ -using LightlessSync.API.Dto.Group; +using Dalamud.Interface; +using LightlessSync.LightlessConfiguration.Models; +using LightlessSync.UI; +using LightlessSync.UI.Models; +using LightlessSync.API.Dto.Group; using LightlessSync.API.Dto.User; using LightlessSync.LightlessConfiguration; using LightlessSync.Services.Mediator; @@ -140,6 +144,11 @@ public class BroadcastService : IHostedService, IMediatorSubscriber IsLightFinderAvailable = false; ApplyBroadcastDisabled(forcePublish: true); _logger.LogDebug("Cleared Lightfinder state due to disconnect."); + + _mediator.Publish(new NotificationMessage( + "Disconnected from Server", + "Your Lightfinder broadcast has been disabled due to disconnection.", + NotificationType.Warning)); } public Task StartAsync(CancellationToken cancellationToken) @@ -236,6 +245,11 @@ public class BroadcastService : IHostedService, IMediatorSubscriber { _logger.LogInformation("Auto-enabling Lightfinder broadcast after reconnect."); _mediator.Publish(new EnableBroadcastMessage(hashedCid, true)); + + _mediator.Publish(new NotificationMessage( + "Broadcast Auto-Enabled", + "Your Lightfinder broadcast has been automatically enabled.", + NotificationType.Info)); } } catch (OperationCanceledException) @@ -389,20 +403,29 @@ public class BroadcastService : IHostedService, IMediatorSubscriber - public async void ToggleBroadcast() + public async void ToggleBroadcast(bool bypassCooldown = false) { + if (!IsLightFinderAvailable) { _logger.LogWarning("ToggleBroadcast - Lightfinder is not available."); + _mediator.Publish(new NotificationMessage( + "Broadcast Unavailable", + "Lightfinder is not available on this server.", + NotificationType.Error)); return; } await RequireConnectionAsync(nameof(ToggleBroadcast), async () => { var cooldown = RemainingCooldown; - if (!_config.Current.BroadcastEnabled && cooldown is { } cd && cd > TimeSpan.Zero) + if (!bypassCooldown && !_config.Current.BroadcastEnabled && cooldown is { } cd && cd > TimeSpan.Zero) { _logger.LogWarning("Cooldown active. Must wait {Remaining}s before re-enabling.", cd.TotalSeconds); + _mediator.Publish(new NotificationMessage( + "Broadcast Cooldown", + $"Please wait {cd.TotalSeconds:F0} seconds before re-enabling broadcast.", + NotificationType.Warning)); return; } @@ -427,10 +450,19 @@ public class BroadcastService : IHostedService, IMediatorSubscriber _logger.LogDebug("Toggling broadcast. Server currently broadcasting: {ServerStatus}, setting to: {NewStatus}", isCurrentlyBroadcasting, newStatus); _mediator.Publish(new EnableBroadcastMessage(hashedCid, newStatus)); + + _mediator.Publish(new NotificationMessage( + newStatus ? "Broadcast Enabled" : "Broadcast Disabled", + newStatus ? "Your Lightfinder broadcast has been enabled." : "Your Lightfinder broadcast has been disabled.", + NotificationType.Info)); } catch (Exception ex) { _logger.LogError(ex, "Failed to determine current broadcast status for toggle"); + _mediator.Publish(new NotificationMessage( + "Broadcast Toggle Failed", + $"Failed to toggle broadcast: {ex.Message}", + NotificationType.Error)); } }).ConfigureAwait(false); } @@ -493,6 +525,7 @@ public class BroadcastService : IHostedService, IMediatorSubscriber { _logger.LogDebug("Broadcast TTL expired. Disabling broadcast locally."); ApplyBroadcastDisabled(forcePublish: true); + ShowBroadcastExpiredNotification(); } } else @@ -501,4 +534,49 @@ public class BroadcastService : IHostedService, IMediatorSubscriber } }).ConfigureAwait(false); } + + private void ShowBroadcastExpiredNotification() + { + var notification = new LightlessNotification + { + Id = "broadcast_expired", + Title = "Broadcast Expired", + Message = "Your Lightfinder broadcast has expired after 3 hours. Would you like to re-enable it?", + Type = NotificationType.PairRequest, + Duration = TimeSpan.FromSeconds(180), + Actions = new List + { + new() + { + Id = "re_enable", + Label = "Re-enable", + Icon = FontAwesomeIcon.Plus, + Color = UIColors.Get("PairBlue"), + IsPrimary = true, + OnClick = (n) => + { + _logger.LogInformation("Re-enabling broadcast from notification"); + ToggleBroadcast(bypassCooldown: true); + n.IsDismissed = true; + n.IsAnimatingOut = true; + } + }, + new() + { + Id = "close", + Label = "Close", + Icon = FontAwesomeIcon.Times, + Color = UIColors.Get("DimRed"), + OnClick = (n) => + { + _logger.LogInformation("Broadcast expiration notification dismissed"); + n.IsDismissed = true; + n.IsAnimatingOut = true; + } + } + } + }; + + _mediator.Publish(new LightlessNotificationMessage(notification)); + } } \ No newline at end of file