broadcast notifications, action button for reconnecting once expired

This commit is contained in:
choco
2025-10-16 22:13:40 +02:00
parent 92b8d4a1cd
commit 6d01d47c2f

View File

@@ -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.API.Dto.User;
using LightlessSync.LightlessConfiguration; using LightlessSync.LightlessConfiguration;
using LightlessSync.Services.Mediator; using LightlessSync.Services.Mediator;
@@ -140,6 +144,11 @@ public class BroadcastService : IHostedService, IMediatorSubscriber
IsLightFinderAvailable = false; IsLightFinderAvailable = false;
ApplyBroadcastDisabled(forcePublish: true); ApplyBroadcastDisabled(forcePublish: true);
_logger.LogDebug("Cleared Lightfinder state due to disconnect."); _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) public Task StartAsync(CancellationToken cancellationToken)
@@ -236,6 +245,11 @@ public class BroadcastService : IHostedService, IMediatorSubscriber
{ {
_logger.LogInformation("Auto-enabling Lightfinder broadcast after reconnect."); _logger.LogInformation("Auto-enabling Lightfinder broadcast after reconnect.");
_mediator.Publish(new EnableBroadcastMessage(hashedCid, true)); _mediator.Publish(new EnableBroadcastMessage(hashedCid, true));
_mediator.Publish(new NotificationMessage(
"Broadcast Auto-Enabled",
"Your Lightfinder broadcast has been automatically enabled.",
NotificationType.Info));
} }
} }
catch (OperationCanceledException) catch (OperationCanceledException)
@@ -389,20 +403,29 @@ public class BroadcastService : IHostedService, IMediatorSubscriber
public async void ToggleBroadcast() public async void ToggleBroadcast(bool bypassCooldown = false)
{ {
if (!IsLightFinderAvailable) if (!IsLightFinderAvailable)
{ {
_logger.LogWarning("ToggleBroadcast - Lightfinder is not available."); _logger.LogWarning("ToggleBroadcast - Lightfinder is not available.");
_mediator.Publish(new NotificationMessage(
"Broadcast Unavailable",
"Lightfinder is not available on this server.",
NotificationType.Error));
return; return;
} }
await RequireConnectionAsync(nameof(ToggleBroadcast), async () => await RequireConnectionAsync(nameof(ToggleBroadcast), async () =>
{ {
var cooldown = RemainingCooldown; 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); _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; return;
} }
@@ -427,10 +450,19 @@ public class BroadcastService : IHostedService, IMediatorSubscriber
_logger.LogDebug("Toggling broadcast. Server currently broadcasting: {ServerStatus}, setting to: {NewStatus}", isCurrentlyBroadcasting, newStatus); _logger.LogDebug("Toggling broadcast. Server currently broadcasting: {ServerStatus}, setting to: {NewStatus}", isCurrentlyBroadcasting, newStatus);
_mediator.Publish(new EnableBroadcastMessage(hashedCid, 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) catch (Exception ex)
{ {
_logger.LogError(ex, "Failed to determine current broadcast status for toggle"); _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); }).ConfigureAwait(false);
} }
@@ -493,6 +525,7 @@ public class BroadcastService : IHostedService, IMediatorSubscriber
{ {
_logger.LogDebug("Broadcast TTL expired. Disabling broadcast locally."); _logger.LogDebug("Broadcast TTL expired. Disabling broadcast locally.");
ApplyBroadcastDisabled(forcePublish: true); ApplyBroadcastDisabled(forcePublish: true);
ShowBroadcastExpiredNotification();
} }
} }
else else
@@ -501,4 +534,49 @@ public class BroadcastService : IHostedService, IMediatorSubscriber
} }
}).ConfigureAwait(false); }).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<LightlessNotificationAction>
{
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));
}
} }