using Dalamud.Game.Command; using Dalamud.Plugin; using Dalamud.Interface.ImGuiFileDialog; using MareSynchronos.Managers; using MareSynchronos.WebAPI; using Dalamud.Interface.Windowing; using MareSynchronos.UI; using MareSynchronos.Utils; using MareSynchronos.FileCache; using MareSynchronos.MareConfiguration; using MareSynchronos.Mediator; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace MareSynchronos; /* (..,,...,,,,,+/, ,,.....,,+ ..,,+++/((###%%%&&%%#(+,,.,,,+++,,,,//,,#&@@@@%+. ...+//////////(/,,,,++,.,(###((//////////,.. .,#@@%/./ ,..+/////////+///,.,. ,&@@@@,,/////////////+,.. ,(##+,. ,,.+//////////++++++.. ./#%#,+/////////////+,....,/((,.., +..////////////+++++++... .../##(,,////////////////++,,,+/(((+, +,.+//////////////+++++++,.,,,/(((+.,////////////////////////((((#/,, /+.+//////////++++/++++++++++,,...,++///////////////////////////((((##, /,.////////+++++++++++++++++++++////////+++//////++/+++++//////////((((#(+, /+.+////////+++++++++++++++++++++++++++++++++++++++++++++++++++++/////((((##+ +,.///////////////+++++++++++++++++++++++++++++++++++++++++++++++++++///((((%/ /.,/////////////////+++++++++++++++++++++++++++++++++++++++++++++++++++///+/(#+ +,./////////////////+++++++++++++++++++++++++++++++++++++++++++++++,,+++++///((, ...////////++/++++++++++++++++++++++++,,++++++++++++++++++++++++++++++++++++//(,, ..//+,+///++++++++++++++++++,,,,+++,,,,,,,,,,,,++++++++,,+++++++++++++++++++//,,+ ..,++,.++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,++++++++,,,,,,,,,,++++++++++... ..+++,.+++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++,..,. ..,++++,,+++++++++++,+,,,,,,,,,,..,+++++++++,,,,,,.....................,//+,+ ....,+++++,.,+++++++++++,,,,,,,,.+///(((((((((((((///////////////////////(((+,,, .....,++++++++++..,+++++++++++,,.,,,.////////(((((((((((((((////////////////////+,,/ .....,++++++++++++,..,,+++++++++,,.,../////////////////((((((((((//////////////////,,+ ...,,+++++++++++++,.,,.,,,+++++++++,.,/////////////////(((//++++++++++++++//+++++++++/,, ....,++++++++++++++,.,++.,++++++++++++.,+////////////////////+++++++++++++++++++++++++///,,.. ...,++++++++++++++++..+++..+++++++++++++.,//////////////////////////++++++++++++///////++++...... ...++++++++++++++++++..++++.,++,++++++++++.+///////////////////////////////////////////++++++..,,,.. ...+++++++++++++++++++..+++++..,+,,+++++++++.+//////////////////////////////////////////+++++++...,,,,.. ..++++++++++++++++++++..++++++..,+,,+++++++++.+//////////////////////////////////////++++++++++,....,,,,.. ...+++//(//////+++++++++..++++++,.,+++++++++++++,..,....,,,+++///////////////////////++++++++++++..,,,,,,,,... ..,++/(((((//////+++++++,.,++++++,,.,,,+++++++++++++++++++++++,.++////////////////////+++++++++++.....,,,,,,,... ..,//#(((((///////+++++++..++++++++++,...,++,++++++++++++++++,...+++/////////////////////+,,,+++... ....,,,,,,... ...+//(((((//////////++++++..+++++++++++++++,......,,,,++++++,,,..+++////////////////////////+,.... ...,,,,,,,... ..,//((((////////////++++++..++++++/+++++++++++++,,...,,........,+/+//////////////////////((((/+,.. ....,.,,,,.. ...+/////////////////////+++..++++++/+///+++++++++++++++++++++///+/+////////////////////////(((((/+... .......,,... ..++////+++//////////////++++.+++++++++///////++++++++////////////////////////////////////+++/(((((/+.. .....,,... .,++++++++///////////////++++..++++//////////////////////////////////////////////////////++++++/((((++.. ........ .+++++++++////////////////++++,.+++/////////////////////////////////////////////////////+++++++++/((/++.. .,++++++++//////////////////++++,.+++//////////////////////////////////////////////////+++++++++++++//+++.. .++++++++//////////////////////+/,.,+++////((((////////////////////////////////////////++++++++++++++++++... .++++++++///////////////////////+++..++++//((((((((///////////////////////////////////++++++++++++++++++++ . .++++++///////////////////////////++,.,+++++/(((((((((/////////////////////////////+++++++++++++++++++++++,.. .++++++////////////////////////////+++,.,+++++++/((((((((//////////////////////////++++++++++++++++++++++++.. .+++++++///////////////////++////////++++,.,+++++++++///////////+////////////////+++++++++++++++++++++++++,.. ..++++++++++//////////////////////+++++++..+...,+++++++++++++++/++++++++++++++++++++++++++++++++++++++++++,... ..++++++++++++///////////////+++++++,...,,,,,.,....,,,,+++++++++++++++++++++++++++++++++++++++++++++++,,,,... ...++++++++++++++++++++++++++,,,,...,,,,,,,,,..,,++,,,.,,,,,,,,,,,,,,,,,,+++++++++++++++++++++++++,,,,,,,,.. ...+++++++++++++++,,,,,,,,....,,,,,,,,,,,,,,,..,,++++++,,,,,,,,,,,,,,,,+++++++++++++++++++++++++,,,,,,,,,.. ...++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...,++++++++++++++++++++++++++++++++++++++++++++,,,,,,,,,,... ,....,++++++++++++++,,,+++++++,,,,,,,,,,,,,,,,,.,++++++++++++++++++++++++++++++++++++++++++++,,,,,,,,.. */ public class MarePlugin : MediatorSubscriberBase, IDisposable { private readonly ServiceProvider _serviceProvider; private const string _commandName = "/mare"; private IServiceScope? _runtimeServiceScope; public MarePlugin(ILogger logger, ServiceProvider serviceProvider, MareMediator mediator) : base(logger, mediator) { _serviceProvider = serviceProvider; _serviceProvider.GetRequiredService().Migrate(); mediator.Subscribe(this, (_) => Task.Run(WaitForPlayerAndLaunchCharacterManager)); mediator.Subscribe(this, (_) => DalamudUtilOnLogIn()); mediator.Subscribe(this, (_) => DalamudUtilOnLogOut()); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); } public override void Dispose() { base.Dispose(); _serviceProvider.GetRequiredService().RemoveHandler(_commandName); _runtimeServiceScope?.Dispose(); _serviceProvider.Dispose(); _logger.LogDebug("Shut down"); } private void DalamudUtilOnLogIn() { _logger?.LogDebug("Client login"); var pi = _serviceProvider.GetRequiredService(); pi.UiBuilder.Draw += Draw; pi.UiBuilder.OpenConfigUi += OpenUi; _serviceProvider.GetRequiredService().AddHandler(_commandName, new CommandInfo(OnCommand) { HelpMessage = "Opens the Mare Synchronos UI", }); if (!_serviceProvider.GetRequiredService().Current.HasValidSetup() || !_serviceProvider.GetRequiredService().HasValidConfig()) { _serviceProvider.GetRequiredService().Publish(new SwitchToIntroUiMessage()); return; } _serviceProvider.GetRequiredService().StartScan(); Task.Run(WaitForPlayerAndLaunchCharacterManager); } private void DalamudUtilOnLogOut() { _logger?.LogDebug("Client logout"); _runtimeServiceScope?.Dispose(); var pi = _serviceProvider.GetRequiredService(); pi.UiBuilder.Draw -= Draw; pi.UiBuilder.OpenConfigUi -= OpenUi; _serviceProvider.GetRequiredService().RemoveHandler(_commandName); } private async Task WaitForPlayerAndLaunchCharacterManager() { var dalamudUtil = _serviceProvider.GetRequiredService(); while (!dalamudUtil.IsPlayerPresent) { await Task.Delay(100).ConfigureAwait(false); } try { _logger?.LogDebug("Launching Managers"); _runtimeServiceScope?.Dispose(); _runtimeServiceScope = _serviceProvider.CreateScope(); _runtimeServiceScope.ServiceProvider.GetRequiredService(); _runtimeServiceScope.ServiceProvider.GetRequiredService(); _runtimeServiceScope.ServiceProvider.GetRequiredService(); } catch (Exception ex) { _logger?.LogCritical(ex, "Error during launch of managers"); } } private void Draw() { _serviceProvider.GetRequiredService().Draw(); _serviceProvider.GetRequiredService().Draw(); } 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 OpenUi(); return; } if (string.Equals(splitArgs[0], "toggle", StringComparison.OrdinalIgnoreCase)) { var serverConfigurationManager = _serviceProvider.GetRequiredService(); 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(); _ = _serviceProvider.GetRequiredService().CreateConnections(); } } else if (string.Equals(splitArgs[0], "gpose", StringComparison.OrdinalIgnoreCase)) { _serviceProvider.GetRequiredService().Toggle(); } else if (string.Equals(splitArgs[0], "rescan", StringComparison.OrdinalIgnoreCase)) { _serviceProvider.GetRequiredService().InvokeScan(forced: true); } else if (string.Equals(splitArgs[0], "perf", StringComparison.OrdinalIgnoreCase)) { if (splitArgs.Length > 1 && int.TryParse(splitArgs[1], out var limitBySeconds)) { _serviceProvider.GetRequiredService().PrintPerformanceStats(limitBySeconds); } else { _serviceProvider.GetRequiredService().PrintPerformanceStats(); } } else if (string.Equals(splitArgs[0], "medi", StringComparison.OrdinalIgnoreCase)) { _serviceProvider.GetRequiredService().PrintSubscriberInfo(); } } private void OpenUi() { if (_serviceProvider.GetRequiredService().Current.HasValidSetup()) _serviceProvider.GetRequiredService().Toggle(); else _serviceProvider.GetRequiredService().Toggle(); } }