using Dalamud.Game.Command; using Dalamud.Plugin.Services; using LightlessSync.FileCache; using LightlessSync.LightlessConfiguration; using LightlessSync.LightlessConfiguration.Models; using LightlessSync.Services.Mediator; using LightlessSync.Services.ServerConfiguration; using LightlessSync.UI; using LightlessSync.WebAPI; using System.Globalization; namespace LightlessSync.Services; public sealed class CommandManagerService : IDisposable { private const string _commandName = "/light"; private readonly ApiController _apiController; private readonly ICommandManager _commandManager; private readonly LightlessMediator _mediator; private readonly LightlessConfigService _lightlessConfigService; private readonly PerformanceCollectorService _performanceCollectorService; private readonly CacheMonitor _cacheMonitor; private readonly ServerConfigurationManager _serverConfigurationManager; public CommandManagerService(ICommandManager commandManager, PerformanceCollectorService performanceCollectorService, ServerConfigurationManager serverConfigurationManager, CacheMonitor periodicFileScanner, ApiController apiController, LightlessMediator mediator, LightlessConfigService lightlessConfigService) { _commandManager = commandManager; _performanceCollectorService = performanceCollectorService; _serverConfigurationManager = serverConfigurationManager; _cacheMonitor = periodicFileScanner; _apiController = apiController; _mediator = mediator; _lightlessConfigService = lightlessConfigService; _commandManager.AddHandler(_commandName, new CommandInfo(OnCommand) { HelpMessage = "Opens the Lightless Sync UI" + Environment.NewLine + Environment.NewLine + "Additionally possible commands:" + Environment.NewLine + "\t /light toggle - Disconnects from Lightless, if connected. Connects to Lightless, if disconnected" + Environment.NewLine + "\t /light toggle on|off - Connects or disconnects to Lightless respectively" + Environment.NewLine + "\t /light gpose - Opens the Lightless Character Data Hub window" + Environment.NewLine + "\t /light analyze - Opens the Lightless Character Data Analysis window" + Environment.NewLine + "\t /light settings - Opens the Lightless Settings window" + Environment.NewLine + "\t /light settings - Opens the Lightfinder window" }); } public void Dispose() { _commandManager.RemoveHandler(_commandName); } private void OnCommand(string command, string args) { var splitArgs = args.ToLowerInvariant().Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries); if (splitArgs.Length == 0) { // Interpret this as toggling the UI if (_lightlessConfigService.Current.HasValidSetup()) _mediator.Publish(new UiToggleMessage(typeof(CompactUi))); else _mediator.Publish(new UiToggleMessage(typeof(IntroUi))); return; } if (!_lightlessConfigService.Current.HasValidSetup()) return; if (string.Equals(splitArgs[0], "toggle", StringComparison.OrdinalIgnoreCase)) { if (_apiController.ServerState == WebAPI.SignalR.Utils.ServerState.Disconnecting) { _mediator.Publish(new NotificationMessage("Lightless disconnecting", "Cannot use /toggle while Lightless Sync is still disconnecting", NotificationType.Error)); } if (_serverConfigurationManager.CurrentServer == null) return; var fullPause = splitArgs.Length > 1 ? splitArgs[1] switch { "on" => false, "off" => true, _ => !_serverConfigurationManager.CurrentServer.FullPause, } : !_serverConfigurationManager.CurrentServer.FullPause; if (fullPause != _serverConfigurationManager.CurrentServer.FullPause) { _serverConfigurationManager.CurrentServer.FullPause = fullPause; _serverConfigurationManager.Save(); _ = _apiController.CreateConnectionsAsync(); } } else if (string.Equals(splitArgs[0], "gpose", StringComparison.OrdinalIgnoreCase)) { _mediator.Publish(new UiToggleMessage(typeof(CharaDataHubUi))); } else if (string.Equals(splitArgs[0], "rescan", StringComparison.OrdinalIgnoreCase)) { _cacheMonitor.InvokeScan(); } else if (string.Equals(splitArgs[0], "perf", StringComparison.OrdinalIgnoreCase)) { if (splitArgs.Length > 1 && int.TryParse(splitArgs[1], CultureInfo.InvariantCulture, out var limitBySeconds)) { _performanceCollectorService.PrintPerformanceStats(limitBySeconds); } else { _performanceCollectorService.PrintPerformanceStats(); } } else if (string.Equals(splitArgs[0], "medi", StringComparison.OrdinalIgnoreCase)) { _mediator.PrintSubscriberInfo(); } else if (string.Equals(splitArgs[0], "analyze", StringComparison.OrdinalIgnoreCase)) { _mediator.Publish(new UiToggleMessage(typeof(DataAnalysisUi))); } else if (string.Equals(splitArgs[0], "settings", StringComparison.OrdinalIgnoreCase)) { _mediator.Publish(new UiToggleMessage(typeof(SettingsUi))); } else if (string.Equals(splitArgs[0], "lightfinder", StringComparison.OrdinalIgnoreCase)) { _mediator.Publish(new UiToggleMessage(typeof(BroadcastUI))); } } }