using Dalamud.Game.Command; using Dalamud.Interface.ImGuiNotification; using Dalamud.Plugin.Services; using MareSynchronos.FileCache; using MareSynchronos.MareConfiguration; using MareSynchronos.Services.Mediator; using MareSynchronos.Services.ServerConfiguration; using MareSynchronos.UI; using MareSynchronos.WebAPI; using System.Globalization; namespace MareSynchronos.Services; public sealed class CommandManagerService : IDisposable { private const string _commandName = "/sync"; private const string _commandName2 = "/loporrit"; private readonly ApiController _apiController; private readonly ICommandManager _commandManager; private readonly MareMediator _mediator; private readonly MareConfigService _mareConfigService; private readonly PerformanceCollectorService _performanceCollectorService; private readonly PeriodicFileScanner _periodicFileScanner; private readonly ServerConfigurationManager _serverConfigurationManager; public CommandManagerService(ICommandManager commandManager, PerformanceCollectorService performanceCollectorService, ServerConfigurationManager serverConfigurationManager, PeriodicFileScanner periodicFileScanner, ApiController apiController, MareMediator mediator, MareConfigService mareConfigService) { _commandManager = commandManager; _performanceCollectorService = performanceCollectorService; _serverConfigurationManager = serverConfigurationManager; _periodicFileScanner = periodicFileScanner; _apiController = apiController; _mediator = mediator; _mareConfigService = mareConfigService; _commandManager.AddHandler(_commandName, new CommandInfo(OnCommand) { HelpMessage = "Opens the Loporrit UI" }); _commandManager.AddHandler(_commandName2, new CommandInfo(OnCommand) { HelpMessage = "Opens the Loporrit UI" }); } public void Dispose() { _commandManager.RemoveHandler(_commandName); _commandManager.RemoveHandler(_commandName2); } private void OnCommand(string command, string args) { var splitArgs = args.ToLowerInvariant().Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries); if (splitArgs == null || splitArgs.Length == 0) { // Interpret this as toggling the UI if (_mareConfigService.Current.HasValidSetup()) _mediator.Publish(new UiToggleMessage(typeof(CompactUi))); else _mediator.Publish(new UiToggleMessage(typeof(IntroUi))); return; } if (string.Equals(splitArgs[0], "toggle", StringComparison.OrdinalIgnoreCase)) { if (_apiController.ServerState == WebAPI.SignalR.Utils.ServerState.Disconnecting) { _mediator.Publish(new NotificationMessage("Loporrit disconnecting", "Cannot use /toggle while Loporrit 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.CreateConnections(); } } else if (string.Equals(splitArgs[0], "gpose", StringComparison.OrdinalIgnoreCase)) { _mediator.Publish(new UiToggleMessage(typeof(GposeUi))); } else if (string.Equals(splitArgs[0], "rescan", StringComparison.OrdinalIgnoreCase)) { _periodicFileScanner.InvokeScan(forced: true); } 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))); } } }