2025-08-22 02:19:48 +01:00
using MareSynchronos.FileCache ;
using MareSynchronos.MareConfiguration ;
using MareSynchronos.PlayerData.Pairs ;
using MareSynchronos.PlayerData.Services ;
using MareSynchronos.Services ;
using MareSynchronos.Services.Mediator ;
using MareSynchronos.Services.ServerConfiguration ;
using Microsoft.Extensions.DependencyInjection ;
using Microsoft.Extensions.Hosting ;
using Microsoft.Extensions.Logging ;
using System.Reflection ;
namespace MareSynchronos ;
#pragma warning disable S125 // Sections of code should not be commented out
/ *
( . . , , . . . , , , , , + / , , , . . . . . , , +
. . , , + + + / ( ( # # # % % % & & % % # ( + , , . , , , + + + , , , , //,,#&@@@@%+.
. . . + //////////(/,,,,++,.,(###((//////////,.. .,#@@%/./
, . . + /////////+///,.,. ,&@@@@,,/////////////+,.. ,(##+,.
, , . + //////////++++++.. ./#%#,+/////////////+,....,/((,..,
+ . . ////////////+++++++... .../##(,,////////////////++,,,+/(((+,
+ , . + //////////////+++++++,.,,,/(((+.,////////////////////////((((#/,,
/ + . + //////////++++/++++++++++,,...,++///////////////////////////((((##,
/ , . ////////+++++++++++++++++++++////////+++//////++/+++++//////////((((#(+,
/ + . + ////////+++++++++++++++++++++++++++++++++++++++++++++++++++++/////((((##+
+ , . ///////////////+++++++++++++++++++++++++++++++++++++++++++++++++++///((((%/
/ . , /////////////////+++++++++++++++++++++++++++++++++++++++++++++++++++///+/(#+
+ , . /////////////////+++++++++++++++++++++++++++++++++++++++++++++++,,+++++///((,
. . . ////////++/++++++++++++++++++++++++,,++++++++++++++++++++++++++++++++++++//(,,
. . //+,+///++++++++++++++++++,,,,+++,,,,,,,,,,,,++++++++,,+++++++++++++++++++//,,+
. . , + + , . + + + + + + + + + + + + + + + + + + + + + + , , , , , , , , , , , , , , , , , , , + + + + + + + + , , , , , , , , , , + + + + + + + + + + . . .
. . + + + , . + + + + + + + + + + + + + + + + + + + , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , + + , . . , .
. . , + + + + , , + + + + + + + + + + + , + , , , , , , , , , , . . , + + + + + + + + + , , , , , , . . . . . . . . . . . . . . . . . . . . . , //+,+
. . . . , + + + + + , . , + + + + + + + + + + + , , , , , , , , . + ///(((((((((((((///////////////////////(((+,,,
. . . . . , + + + + + + + + + + . . , + + + + + + + + + + + , , . , , , . ////////(((((((((((((((////////////////////+,,/
. . . . . , + + + + + + + + + + + + , . . , , + + + + + + + + + , , . , . . /////////////////((((((((((//////////////////,,+
. . . , , + + + + + + + + + + + + + , . , , . , , , + + + + + + + + + , . , /////////////////(((//++++++++++++++//+++++++++/,,
. . . . , + + + + + + + + + + + + + + , . , + + . , + + + + + + + + + + + + . , + ////////////////////+++++++++++++++++++++++++///,,..
. . . , + + + + + + + + + + + + + + + + . . + + + . . + + + + + + + + + + + + + . , //////////////////////////++++++++++++///////++++......
. . . + + + + + + + + + + + + + + + + + + . . + + + + . , + + , + + + + + + + + + + . + ///////////////////////////////////////////++++++..,,,..
. . . + + + + + + + + + + + + + + + + + + + . . + + + + + . . , + , , + + + + + + + + + . + //////////////////////////////////////////+++++++...,,,,..
. . + + + + + + + + + + + + + + + + + + + + . . + + + + + + . . , + , , + + + + + + + + + . + //////////////////////////////////////++++++++++,....,,,,..
. . . + + + //(//////+++++++++..++++++,.,+++++++++++++,..,....,,,+++///////////////////////++++++++++++..,,,,,,,,...
. . , + + / ( ( ( ( ( //////+++++++,.,++++++,,.,,,+++++++++++++++++++++++,.++////////////////////+++++++++++.....,,,,,,,...
. . , //#(((((///////+++++++..++++++++++,...,++,++++++++++++++++,...+++/////////////////////+,,,+++... ....,,,,,,...
. . . + //(((((//////////++++++..+++++++++++++++,......,,,,++++++,,,..+++////////////////////////+,.... ...,,,,,,,...
. . , //((((////////////++++++..++++++/+++++++++++++,,...,,........,+/+//////////////////////((((/+,.. ....,.,,,,..
. . . + /////////////////////+++..++++++/+///+++++++++++++++++++++///+/+////////////////////////(((((/+... .......,,...
. . + + ////+++//////////////++++.+++++++++///////++++++++////////////////////////////////////+++/(((((/+.. .....,,...
. , + + + + + + + + ///////////////++++..++++//////////////////////////////////////////////////////++++++/((((++.. ........
. + + + + + + + + + ////////////////++++,.+++/////////////////////////////////////////////////////+++++++++/((/++..
. , + + + + + + + + //////////////////++++,.+++//////////////////////////////////////////////////+++++++++++++//+++..
. + + + + + + + + //////////////////////+/,.,+++////((((////////////////////////////////////////++++++++++++++++++...
. + + + + + + + + ///////////////////////+++..++++//((((((((///////////////////////////////////++++++++++++++++++++ .
. + + + + + + ///////////////////////////++,.,+++++/(((((((((/////////////////////////////+++++++++++++++++++++++,..
. + + + + + + ////////////////////////////+++,.,+++++++/((((((((//////////////////////////++++++++++++++++++++++++..
. + + + + + + + ///////////////////++////////++++,.,+++++++++///////////+////////////////+++++++++++++++++++++++++,..
. . + + + + + + + + + + //////////////////////+++++++..+...,+++++++++++++++/++++++++++++++++++++++++++++++++++++++++++,...
. . + + + + + + + + + + + + ///////////////+++++++,...,,,,,.,....,,,,+++++++++++++++++++++++++++++++++++++++++++++++,,,,...
. . . + + + + + + + + + + + + + + + + + + + + + + + + + + , , , , . . . , , , , , , , , , . . , , + + , , , . , , , , , , , , , , , , , , , , , , + + + + + + + + + + + + + + + + + + + + + + + + + , , , , , , , , . .
. . . + + + + + + + + + + + + + + + , , , , , , , , . . . . , , , , , , , , , , , , , , , . . , , + + + + + + , , , , , , , , , , , , , , , , + + + + + + + + + + + + + + + + + + + + + + + + + , , , , , , , , , . .
. . . + + + + + + + + + + + + , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , . . . , + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + , , , , , , , , , , . . .
, . . . . , + + + + + + + + + + + + + + , , , + + + + + + + , , , , , , , , , , , , , , , , , . , + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + , , , , , , , , . .
* /
#pragma warning restore S125 // Sections of code should not be commented out
public class MarePlugin : MediatorSubscriberBase , IHostedService
{
private readonly DalamudUtilService _dalamudUtil ;
private readonly MareConfigService _mareConfigService ;
private readonly ServerConfigurationManager _serverConfigurationManager ;
private readonly IServiceScopeFactory _serviceScopeFactory ;
private IServiceScope ? _runtimeServiceScope ;
private Task ? _launchTask = null ;
public MarePlugin ( ILogger < MarePlugin > logger , MareConfigService mareConfigService ,
ServerConfigurationManager serverConfigurationManager ,
DalamudUtilService dalamudUtil ,
IServiceScopeFactory serviceScopeFactory , MareMediator mediator ) : base ( logger , mediator )
{
_mareConfigService = mareConfigService ;
_serverConfigurationManager = serverConfigurationManager ;
_dalamudUtil = dalamudUtil ;
_serviceScopeFactory = serviceScopeFactory ;
}
public Task StartAsync ( CancellationToken cancellationToken )
{
var version = Assembly . GetExecutingAssembly ( ) . GetName ( ) . Version ! ;
2025-08-22 21:17:09 +01:00
Logger . LogInformation ( "Launching {name} {major}.{minor}.{build}.{rev}" , "Snowcloak Sync" , version . Major , version . Minor , version . Build , version . Revision ) ;
2025-08-22 02:19:48 +01:00
Mediator . Publish ( new EventMessage ( new Services . Events . Event ( nameof ( MarePlugin ) , Services . Events . EventSeverity . Informational ,
2025-08-22 21:17:09 +01:00
$"Starting Snowcloak Sync {version.Major}.{version.Minor}.{version.Build}.{version.Revision}" ) ) ) ;
2025-08-22 02:19:48 +01:00
Mediator . Subscribe < SwitchToMainUiMessage > ( this , ( msg ) = > { if ( _launchTask = = null | | _launchTask . IsCompleted ) _launchTask = Task . Run ( WaitForPlayerAndLaunchCharacterManager ) ; } ) ;
Mediator . Subscribe < DalamudLoginMessage > ( this , ( _ ) = > DalamudUtilOnLogIn ( ) ) ;
Mediator . Subscribe < DalamudLogoutMessage > ( this , ( _ ) = > DalamudUtilOnLogOut ( ) ) ;
Mediator . StartQueueProcessing ( ) ;
return Task . CompletedTask ;
}
public Task StopAsync ( CancellationToken cancellationToken )
{
UnsubscribeAll ( ) ;
DalamudUtilOnLogOut ( ) ;
Logger . LogDebug ( "Halting MarePlugin" ) ;
return Task . CompletedTask ;
}
private void DalamudUtilOnLogIn ( )
{
Logger ? . LogDebug ( "Client login" ) ;
if ( _launchTask = = null | | _launchTask . IsCompleted ) _launchTask = Task . Run ( WaitForPlayerAndLaunchCharacterManager ) ;
}
private void DalamudUtilOnLogOut ( )
{
Logger ? . LogDebug ( "Client logout" ) ;
_runtimeServiceScope ? . Dispose ( ) ;
}
private async Task WaitForPlayerAndLaunchCharacterManager ( )
{
while ( ! await _dalamudUtil . GetIsPlayerPresentAsync ( ) . ConfigureAwait ( false ) )
{
await Task . Delay ( 100 ) . ConfigureAwait ( false ) ;
}
try
{
Logger ? . LogDebug ( "Launching Managers" ) ;
_runtimeServiceScope ? . Dispose ( ) ;
_runtimeServiceScope = _serviceScopeFactory . CreateScope ( ) ;
_runtimeServiceScope . ServiceProvider . GetRequiredService < UiService > ( ) ;
_runtimeServiceScope . ServiceProvider . GetRequiredService < CommandManagerService > ( ) ;
if ( ! _mareConfigService . Current . HasValidSetup ( ) | | ! _serverConfigurationManager . HasValidConfig ( ) )
{
Mediator . Publish ( new SwitchToIntroUiMessage ( ) ) ;
return ;
}
_runtimeServiceScope . ServiceProvider . GetRequiredService < CacheCreationService > ( ) ;
_runtimeServiceScope . ServiceProvider . GetRequiredService < TransientResourceManager > ( ) ;
_runtimeServiceScope . ServiceProvider . GetRequiredService < OnlinePlayerManager > ( ) ;
_runtimeServiceScope . ServiceProvider . GetRequiredService < NotificationService > ( ) ;
_runtimeServiceScope . ServiceProvider . GetRequiredService < ChatService > ( ) ;
_runtimeServiceScope . ServiceProvider . GetRequiredService < GuiHookService > ( ) ;
#if ! DEBUG
if ( _mareConfigService . Current . LogLevel ! = LogLevel . Information )
{
Mediator . Publish ( new NotificationMessage ( "Abnormal Log Level" ,
2025-08-22 21:17:09 +01:00
$"Your log level is set to '{_mareConfigService.Current.LogLevel}' which is not recommended for normal usage. Set it to '{LogLevel.Information}' in \" Snowcloak Settings - > Debug \ " unless instructed otherwise." ,
2025-08-22 02:19:48 +01:00
MareConfiguration . Models . NotificationType . Error , TimeSpan . FromSeconds ( 15000 ) ) ) ;
}
#endif
}
catch ( Exception ex )
{
Logger ? . LogCritical ( ex , "Error during launch of managers" ) ;
}
}
}