@@ -25,25 +25,28 @@ public sealed class AuroraIcueServer : IDisposable, IAsyncDisposable
2525
2626 public event EventHandler ? StatusChanged ;
2727
28- private IcueServerStatus _serverStatus = IcueServerStatus . Disabled ;
29-
3028 public IcueServerStatus ServerStatus
3129 {
32- get => _serverStatus ;
30+ get ;
3331 private set
3432 {
35- if ( _serverStatus == value ) return ;
36- _serverStatus = value ;
33+ if ( field == value ) return ;
34+ field = value ;
3735 StatusChanged ? . Invoke ( this , EventArgs . Empty ) ;
3836 }
39- }
37+ } = IcueServerStatus . Disabled ;
4038
4139 private IcueServer ? _icueServer ;
4240 private GameHandler ? _gameHandler ;
41+ private RunningProcessMonitor ? _processMonitor ;
4342
4443 public void RunServer ( RunningProcessMonitor processMonitor )
4544 {
46- Sdk . RunningProcessMonitor = processMonitor ;
45+ _processMonitor = processMonitor ;
46+
47+ processMonitor . ProcessStarted += ProcessMonitorOnProcessStarted ;
48+ processMonitor . ProcessStopped += ProcessMonitorOnProcessStopped ;
49+
4750 var runApproved = IcueInstallationUtils . IsIcueInstalled ( ) && IcueInstallationUtils . IsIcueAutorunEnabled ( ) ;
4851 if ( runApproved || processMonitor . IsProcessRunning ( IcueInstallationUtils . IcueExe ) )
4952 {
@@ -54,6 +57,58 @@ public void RunServer(RunningProcessMonitor processMonitor)
5457 TryStartServer ( ) ;
5558 }
5659
60+ private void ProcessMonitorOnProcessStarted ( object ? sender , ProcessStarted e )
61+ {
62+ if ( e . ProcessName != IcueInstallationUtils . IcueExe )
63+ {
64+ return ;
65+ }
66+
67+ switch ( ServerStatus )
68+ {
69+ case IcueServerStatus . Conflicted :
70+ case IcueServerStatus . Disabled :
71+ case IcueServerStatus . PipesInUse :
72+ return ;
73+ case IcueServerStatus . Waiting :
74+ // proceed to close the server
75+ break ;
76+ }
77+ ServerStatus = IcueServerStatus . Conflicted ;
78+
79+ if ( _icueServer == null ) return ;
80+ _icueServer . GameConnected -= OnGameConnected ;
81+ _icueServer . Dispose ( ) ;
82+ _icueServer = null ;
83+ }
84+
85+ private void ProcessMonitorOnProcessStopped ( object ? sender , ProcessStopped e )
86+ {
87+ if ( e . ProcessName != IcueInstallationUtils . IcueExe )
88+ {
89+ return ;
90+ }
91+
92+ switch ( ServerStatus )
93+ {
94+ case IcueServerStatus . Waiting :
95+ case IcueServerStatus . Disabled :
96+ return ;
97+ case IcueServerStatus . Conflicted :
98+ case IcueServerStatus . PipesInUse :
99+ // Aurora's turn to use the pipes
100+ break ;
101+ }
102+
103+ var runApproved = IcueInstallationUtils . IsIcueInstalled ( ) && IcueInstallationUtils . IsIcueAutorunEnabled ( ) ;
104+ if ( runApproved )
105+ {
106+ ServerStatus = IcueServerStatus . Conflicted ;
107+ }
108+
109+ TryStartServer ( ) ;
110+ }
111+
57112 private void TryStartServer ( )
58113 {
59114 try
@@ -118,23 +173,43 @@ private void OnGameDisconnected(object? sender, EventArgs e)
118173 Sdk . ClearSdkHandler ( ) ;
119174 }
120175
121- public void Dispose ( )
176+ public void Stop ( )
122177 {
178+ if ( _processMonitor != null )
179+ {
180+ _processMonitor . ProcessStarted -= ProcessMonitorOnProcessStarted ;
181+ _processMonitor . ProcessStopped -= ProcessMonitorOnProcessStopped ;
182+ }
183+
123184 ServerStatus = IcueServerStatus . Disabled ;
124185 if ( _icueServer == null ) return ;
125186 _icueServer . GameConnected -= OnGameConnected ;
126187 _icueServer . Dispose ( ) ;
188+ _icueServer = null ;
127189 }
128190
129- public async ValueTask DisposeAsync ( )
191+ public async Task StopAsync ( )
130192 {
131- ServerStatus = IcueServerStatus . Disabled ;
132- if ( _icueServer == null )
193+ if ( _processMonitor != null )
133194 {
134- return ;
195+ _processMonitor . ProcessStarted -= ProcessMonitorOnProcessStarted ;
196+ _processMonitor . ProcessStopped -= ProcessMonitorOnProcessStopped ;
135197 }
136198
199+ ServerStatus = IcueServerStatus . Disabled ;
200+ if ( _icueServer == null ) return ;
137201 _icueServer . GameConnected -= OnGameConnected ;
138202 await _icueServer . DisposeAsync ( ) ;
203+ _icueServer = null ;
204+ }
205+
206+ public void Dispose ( )
207+ {
208+ Stop ( ) ;
209+ }
210+
211+ public async ValueTask DisposeAsync ( )
212+ {
213+ await StopAsync ( ) ;
139214 }
140215}
0 commit comments