using MareSynchronos.API.Data; using MareSynchronos.API.Data.Comparer; using MareSynchronos.Interop.Ipc; using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Services.Mediator; using System.Collections.Concurrent; namespace MareSynchronos.PlayerData.Pairs; public class PluginWarningNotificationService { private readonly ConcurrentDictionary _cachedOptionalPluginWarnings = new(UserDataComparer.Instance); private readonly IpcManager _ipcManager; private readonly MareConfigService _mareConfigService; private readonly MareMediator _mediator; public PluginWarningNotificationService(MareConfigService mareConfigService, IpcManager ipcManager, MareMediator mediator) { _mareConfigService = mareConfigService; _ipcManager = ipcManager; _mediator = mediator; } public void NotifyForMissingPlugins(UserData user, string playerName, HashSet changes) { if (!_cachedOptionalPluginWarnings.TryGetValue(user, out var warning)) { _cachedOptionalPluginWarnings[user] = warning = new() { ShownCustomizePlusWarning = _mareConfigService.Current.DisableOptionalPluginWarnings, ShownHeelsWarning = _mareConfigService.Current.DisableOptionalPluginWarnings, ShownHonorificWarning = _mareConfigService.Current.DisableOptionalPluginWarnings, ShowPetNicknamesWarning = _mareConfigService.Current.DisableOptionalPluginWarnings, ShownMoodlesWarning = _mareConfigService.Current.DisableOptionalPluginWarnings }; } List missingPluginsForData = []; if (changes.Contains(PlayerChanges.Heels) && !warning.ShownHeelsWarning && !_ipcManager.Heels.APIAvailable) { missingPluginsForData.Add("SimpleHeels"); warning.ShownHeelsWarning = true; } if (changes.Contains(PlayerChanges.Customize) && !warning.ShownCustomizePlusWarning && !_ipcManager.CustomizePlus.APIAvailable) { missingPluginsForData.Add("Customize+"); warning.ShownCustomizePlusWarning = true; } if (changes.Contains(PlayerChanges.Honorific) && !warning.ShownHonorificWarning && !_ipcManager.Honorific.APIAvailable) { missingPluginsForData.Add("Honorific"); warning.ShownHonorificWarning = true; } if (changes.Contains(PlayerChanges.PetNames) && !warning.ShowPetNicknamesWarning && !_ipcManager.PetNames.APIAvailable) { missingPluginsForData.Add("PetNicknames"); warning.ShowPetNicknamesWarning = true; } if (changes.Contains(PlayerChanges.Moodles) && !warning.ShownMoodlesWarning && !_ipcManager.Moodles.APIAvailable) { missingPluginsForData.Add("Moodles"); warning.ShownMoodlesWarning = true; } if (missingPluginsForData.Any()) { _mediator.Publish(new NotificationMessage("Missing plugins for " + playerName, $"Received data for {playerName} that contained information for plugins you have not installed. Install {string.Join(", ", missingPluginsForData)} to experience their character fully.", NotificationType.Warning, TimeSpan.FromSeconds(10))); } } }