using Dalamud.Game.Text.SeStringHandling; using Dalamud.Interface.ImGuiNotification; using Dalamud.Plugin.Services; using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Services.Mediator; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using NotificationType = MareSynchronos.MareConfiguration.Models.NotificationType; namespace MareSynchronos.Services; public class NotificationService : DisposableMediatorSubscriberBase, IHostedService { private readonly DalamudUtilService _dalamudUtilService; private readonly INotificationManager _notificationManager; private readonly IChatGui _chatGui; private readonly MareConfigService _configurationService; public NotificationService(ILogger logger, MareMediator mediator, DalamudUtilService dalamudUtilService, INotificationManager notificationManager, IChatGui chatGui, MareConfigService configurationService) : base(logger, mediator) { _dalamudUtilService = dalamudUtilService; _notificationManager = notificationManager; _chatGui = chatGui; _configurationService = configurationService; } public Task StartAsync(CancellationToken cancellationToken) { Mediator.Subscribe(this, ShowNotification); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } private void PrintErrorChat(string? message) { SeStringBuilder se = new SeStringBuilder().AddText("[ElezenSync] Error: " + message); _chatGui.PrintError(se.BuiltString); } private void PrintInfoChat(string? message) { SeStringBuilder se = new SeStringBuilder().AddText("[ElezenSync] Info: ").AddItalics(message ?? string.Empty); _chatGui.Print(se.BuiltString); } private void PrintWarnChat(string? message) { SeStringBuilder se = new SeStringBuilder().AddText("[ElezenSync] ").AddUiForeground("Warning: " + (message ?? string.Empty), 31).AddUiForegroundOff(); _chatGui.Print(se.BuiltString); } private void ShowChat(NotificationMessage msg) { switch (msg.Type) { case NotificationType.Info: PrintInfoChat(msg.Message); break; case NotificationType.Warning: PrintWarnChat(msg.Message); break; case NotificationType.Error: PrintErrorChat(msg.Message); break; } } private void ShowNotification(NotificationMessage msg) { Logger.LogInformation("{msg}", msg.ToString()); if (!_dalamudUtilService.IsLoggedIn) return; switch (msg.Type) { case NotificationType.Info: ShowNotificationLocationBased(msg, _configurationService.Current.InfoNotification); break; case NotificationType.Warning: ShowNotificationLocationBased(msg, _configurationService.Current.WarningNotification); break; case NotificationType.Error: ShowNotificationLocationBased(msg, _configurationService.Current.ErrorNotification); break; } } private void ShowNotificationLocationBased(NotificationMessage msg, NotificationLocation location) { switch (location) { case NotificationLocation.Toast: ShowToast(msg); break; case NotificationLocation.Chat: ShowChat(msg); break; case NotificationLocation.Both: ShowToast(msg); ShowChat(msg); break; case NotificationLocation.Nowhere: break; } } private void ShowToast(NotificationMessage msg) { Dalamud.Interface.ImGuiNotification.NotificationType dalamudType = msg.Type switch { NotificationType.Error => Dalamud.Interface.ImGuiNotification.NotificationType.Error, NotificationType.Warning => Dalamud.Interface.ImGuiNotification.NotificationType.Warning, NotificationType.Info => Dalamud.Interface.ImGuiNotification.NotificationType.Info, _ => Dalamud.Interface.ImGuiNotification.NotificationType.Info }; _notificationManager.AddNotification(new Notification() { Content = msg.Message ?? string.Empty, Title = msg.Title, Type = dalamudType, Minimized = false, InitialDuration = msg.TimeShownOnScreen ?? TimeSpan.FromSeconds(3) }); } }