using System; using System.Threading; using System.Threading.Tasks; using Discord; using DiscordNotifier.Discord; using PhoenixLib.ServiceBus; using WingsAPI.Communication.Services.Messages; namespace DiscordNotifier.Consumers.Maintenance { public class ServiceMaintenanceNotificationMessageConsumer : IMessageConsumer { private const string ThumbnailUrl = "https://friends111.nostale.club/list/ip/1117.png"; private static readonly EmbedAuthorBuilder Author = new() { IconUrl = StaticHardcodedCode.AvatarUrl }; private static readonly EmbedFooterBuilder DefaultFooter = new EmbedFooterBuilder().WithIconUrl(StaticHardcodedCode.AvatarUrl).WithText("Timestamp:"); private static readonly EmbedFooterBuilder FooterForSchedule = new EmbedFooterBuilder().WithIconUrl(StaticHardcodedCode.AvatarUrl).WithText("Maintenance scheduled for:"); private readonly IDiscordWebhookLogsService _discordWebhook; public ServiceMaintenanceNotificationMessageConsumer(IDiscordWebhookLogsService discordWebhook) => _discordWebhook = discordWebhook; public async Task HandleAsync(ServiceMaintenanceNotificationMessage notification, CancellationToken token) { DateTime scheduledMaintenanceDateTime = DateTime.UtcNow + notification.TimeLeft; EmbedBuilder embedBuilder = notification.NotificationType switch { ServiceMaintenanceNotificationType.Rescheduled => new EmbedBuilder { Author = Author, Title = "[NosWings Maintenance] The maintenance has been re-scheduled!", Description = GenerateScheduleDescription(scheduledMaintenanceDateTime, notification.Reason), Color = Color.Gold, ThumbnailUrl = ThumbnailUrl, Footer = FooterForSchedule, Timestamp = new DateTimeOffset(scheduledMaintenanceDateTime, TimeSpan.Zero) }, ServiceMaintenanceNotificationType.ScheduleStopped => new EmbedBuilder { Author = Author, Title = "[NosWings Maintenance] Maintenance canceled!", Description = string.IsNullOrEmpty(notification.Reason) ? string.Empty : $"Reason: {notification.Reason}", Color = Color.Red, ThumbnailUrl = ThumbnailUrl, Footer = DefaultFooter, Timestamp = new DateTimeOffset(scheduledMaintenanceDateTime, TimeSpan.Zero) }, ServiceMaintenanceNotificationType.Executed => new EmbedBuilder { Author = Author, Title = "[NosWings Maintenance] The Server is now in Maintenance mode!", Color = Color.DarkBlue, ThumbnailUrl = ThumbnailUrl, Footer = DefaultFooter, Timestamp = new DateTimeOffset(scheduledMaintenanceDateTime, TimeSpan.Zero) }, ServiceMaintenanceNotificationType.EmergencyExecuted => new EmbedBuilder { Author = Author, Title = "[NosWings Maintenance] An emergency maintenance has been called!", Description = $"An unexpected maintenance has been executed, sorry for any inconvenience it may have cause.\n**Reason:** {notification.Reason}", Color = Color.Purple, ThumbnailUrl = ThumbnailUrl, Footer = DefaultFooter, Timestamp = new DateTimeOffset(scheduledMaintenanceDateTime, TimeSpan.Zero) }, ServiceMaintenanceNotificationType.Lifted => new EmbedBuilder { Author = Author, Title = "[NosWings Maintenance] The Server's maintenance has been lifted!", Color = Color.Green, ThumbnailUrl = ThumbnailUrl, Footer = DefaultFooter, Timestamp = new DateTimeOffset(scheduledMaintenanceDateTime, TimeSpan.Zero) }, _ => null }; if (embedBuilder == null) { return; } await _discordWebhook.PublishLogEmbedded(LogType.PLAYERS_EVENTS_CHANNEL, embedBuilder); } private static string GenerateScheduleDescription(DateTime scheduledMaintenanceDateTime, string reason) => $"**Date and time:** {scheduledMaintenanceDateTime:U} (UTC)\n**Reason:** {reason}"; } }