@@ -41,7 +41,7 @@ public sealed class Bot
41
41
private readonly ConfBot config ;
42
42
private readonly TickWorker idleTickWorker ;
43
43
44
- internal bool IsDisposed { get ; private set ; }
44
+ private bool isClosed ;
45
45
internal BotInjector Injector { get ; }
46
46
internal DedicatedTaskScheduler Scheduler { get ; }
47
47
@@ -76,15 +76,17 @@ public Bot(Id id, ConfBot config, BotInjector injector)
76
76
config . Events . OnIdle . Changed += ( s , e ) => EnableIdleTickWorker ( ) ;
77
77
78
78
var builder = new DependencyBuilder ( Injector ) ;
79
- builder . AddModule ( this ) ;
80
- builder . AddModule ( config ) ;
81
- builder . AddModule ( Injector ) ;
82
- builder . AddModule ( config . Playlists ) ;
79
+ Injector . HideParentModule < CommandManager > ( ) ;
80
+ Injector . HideParentModule < DedicatedTaskScheduler > ( ) ;
81
+ Injector . AddModule ( this ) ;
82
+ Injector . AddModule ( config ) ;
83
+ Injector . AddModule ( Injector ) ;
84
+ Injector . AddModule ( config . Playlists ) ;
85
+ Injector . AddModule ( config . History ) ;
86
+ Injector . AddModule ( Id ) ;
83
87
builder . RequestModule < PlaylistIO > ( ) ;
84
88
builder . RequestModule < PlaylistManager > ( ) ;
85
- builder . AddModule ( Id ) ;
86
89
builder . RequestModule < DedicatedTaskScheduler > ( ) ;
87
- builder . RequestModule < TaskScheduler , DedicatedTaskScheduler > ( ) ;
88
90
builder . RequestModule < TsFullClient > ( ) ;
89
91
builder . RequestModule < TsBaseFunctions , TsFullClient > ( ) ;
90
92
builder . RequestModule < Ts3Client > ( ) ;
@@ -93,12 +95,9 @@ public Bot(Id id, ConfBot config, BotInjector injector)
93
95
builder . RequestModule < IVoiceTarget , CustomTargetPipe > ( ) ;
94
96
builder . RequestModule < SessionManager > ( ) ;
95
97
builder . RequestModule < ResolveContext > ( ) ;
96
- if ( ! builder . TryCreate < CommandManager > ( out var commandManager ) )
97
- throw new Exception ( "Failed to create commandManager" ) ;
98
- builder . AddModule ( commandManager ) ;
98
+ builder . RequestModule < CommandManager > ( ) ;
99
99
if ( config . History . Enabled )
100
100
{
101
- builder . AddModule ( config . History ) ;
102
101
builder . RequestModule < HistoryManager > ( ) ;
103
102
}
104
103
builder . RequestModule < PlayManager > ( ) ;
@@ -108,6 +107,7 @@ public Bot(Id id, ConfBot config, BotInjector injector)
108
107
Log . Error ( "Missing bot module dependency" ) ;
109
108
throw new Exception ( "Could not load all bot modules" ) ;
110
109
}
110
+ Injector . ClearHiddenParentModules ( ) ;
111
111
112
112
resourceResolver = Injector . GetModuleOrThrow < ResolveContext > ( ) ;
113
113
ts3FullClient = Injector . GetModuleOrThrow < TsFullClient > ( ) ;
@@ -121,6 +121,7 @@ public Bot(Id id, ConfBot config, BotInjector injector)
121
121
targetManager = Injector . GetModuleOrThrow < IVoiceTarget > ( ) ;
122
122
sessionManager = Injector . GetModuleOrThrow < SessionManager > ( ) ;
123
123
stats = Injector . GetModuleOrThrow < Stats > ( ) ;
124
+ var commandManager = Injector . GetModuleOrThrow < CommandManager > ( ) ;
124
125
125
126
idleTickWorker = Scheduler . Invoke ( ( ) => Scheduler . CreateTimer ( OnIdle , TimeSpan . MaxValue , false ) ) . Result ;
126
127
@@ -152,10 +153,12 @@ public Bot(Id id, ConfBot config, BotInjector injector)
152
153
ts3client . OnMessageReceived += OnMessageReceived ;
153
154
// Register callback to remove open private sessions, when user disconnects
154
155
ts3FullClient . OnEachClientLeftView += OnClientLeftView ;
155
- ts3client . OnBotDisconnect += OnBotDisconnect ;
156
+ ts3client . OnBotConnected += OnBotConnected ;
157
+ ts3client . OnBotDisconnected += OnBotDisconnected ;
158
+ ts3client . OnBotStoppedReconnecting += OnBotStoppedReconnecting ;
156
159
// Alone mode
157
160
ts3client . OnAloneChanged += OnAloneChanged ;
158
- ts3client . OnAloneChanged += ( s , e ) => customTarget . Alone = e . Alone ;
161
+ ts3client . OnAloneChanged += ( s , e ) => { customTarget . Alone = e . Alone ; return Task . CompletedTask ; } ;
159
162
// Whisper stall
160
163
ts3client . OnWhisperNoTarget += ( s , e ) => player . SetStall ( ) ;
161
164
@@ -170,36 +173,21 @@ public Bot(Id id, ConfBot config, BotInjector injector)
170
173
commandManager . RegisterAlias ( alias . Key , alias . Value ) . UnwrapToLog ( Log ) ;
171
174
}
172
175
173
- public async Task < E < string > > Run ( )
176
+ public Task < E < string > > Run ( )
174
177
{
175
- Log . Info ( "Bot \" {0}\" connecting to \" {1}\" " , config . Name , config . Connect . Address ) ;
176
- var result = await ts3client . Connect ( ) ;
177
- if ( ! result . Ok )
178
- return result ;
179
-
180
- EnableIdleTickWorker ( ) ;
181
-
182
- var badges = config . Connect . Badges . Value ;
183
- if ( ! string . IsNullOrEmpty ( badges ) )
184
- ts3client ? . ChangeBadges ( badges ) ;
178
+ Scheduler . VerifyOwnThread ( ) ;
185
179
186
- var onStart = config . Events . OnConnect . Value ;
187
- if ( ! string . IsNullOrEmpty ( onStart ) )
188
- {
189
- var info = CreateExecInfo ( ) ;
190
- await CallScript ( info , onStart , false , true ) ;
191
- }
192
-
193
- return R . Ok ;
180
+ Log . Info ( "Bot \" {0}\" connecting to \" {1}\" " , config . Name , config . Connect . Address ) ;
181
+ return Task . FromResult ( ts3client . Connect ( ) ) ;
194
182
}
195
183
196
184
public async Task Stop ( )
197
185
{
198
- ValidateScheduler ( ) ;
186
+ Scheduler . VerifyOwnThread ( ) ;
199
187
200
188
Injector . GetModule < BotManager > ( ) ? . RemoveBot ( this ) ;
201
189
202
- if ( ! IsDisposed ) IsDisposed = true ;
190
+ if ( ! isClosed ) isClosed = true ;
203
191
else return ;
204
192
205
193
Log . Info ( "Bot ({0}) disconnecting." , Id ) ;
@@ -216,7 +204,23 @@ public async Task Stop()
216
204
config . ClearEvents ( ) ;
217
205
}
218
206
219
- private async void OnBotDisconnect ( object ? sender , DisconnectEventArgs e )
207
+ private async Task OnBotConnected ( object ? sender , EventArgs e )
208
+ {
209
+ EnableIdleTickWorker ( ) ;
210
+
211
+ var badges = config . Connect . Badges . Value ;
212
+ if ( ! string . IsNullOrEmpty ( badges ) )
213
+ ts3client ? . ChangeBadges ( badges ) ;
214
+
215
+ var onStart = config . Events . OnConnect . Value ;
216
+ if ( ! string . IsNullOrEmpty ( onStart ) )
217
+ {
218
+ var info = CreateExecInfo ( ) ;
219
+ await CallScript ( info , onStart , false , true ) ;
220
+ }
221
+ }
222
+
223
+ private async Task OnBotDisconnected ( object ? sender , DisconnectEventArgs e )
220
224
{
221
225
DisableIdleTickWorker ( ) ;
222
226
@@ -226,11 +230,14 @@ private async void OnBotDisconnect(object? sender, DisconnectEventArgs e)
226
230
var info = CreateExecInfo ( ) ;
227
231
await CallScript ( info , onStop , false , true ) ;
228
232
}
233
+ }
229
234
230
- await Stop ( ) ;
235
+ private Task OnBotStoppedReconnecting ( object ? sender , EventArgs e )
236
+ {
237
+ return Stop ( ) ;
231
238
}
232
239
233
- private async void OnMessageReceived ( object ? sender , TextMessage textMessage )
240
+ private async Task OnMessageReceived ( object ? sender , TextMessage textMessage )
234
241
{
235
242
if ( textMessage ? . Message == null )
236
243
{
@@ -332,9 +339,9 @@ public Task UpdateBotStatus()
332
339
333
340
public async Task UpdateBotStatusInternal ( )
334
341
{
335
- ValidateScheduler ( ) ;
342
+ Scheduler . VerifyOwnThread ( ) ;
336
343
337
- if ( IsDisposed )
344
+ if ( isClosed )
338
345
return ;
339
346
340
347
if ( ! config . SetStatusDescription )
@@ -362,9 +369,9 @@ public Task GenerateStatusImage(bool playing, PlayInfoEventArgs? startEvent)
362
369
363
370
public async Task GenerateStatusImageInternal ( bool playing , PlayInfoEventArgs ? startEvent )
364
371
{
365
- ValidateScheduler ( ) ;
372
+ Scheduler . VerifyOwnThread ( ) ;
366
373
367
- if ( ! config . GenerateStatusAvatar || IsDisposed )
374
+ if ( ! config . GenerateStatusAvatar || isClosed )
368
375
return ;
369
376
370
377
static Stream ? GetRandomFile ( string ? basePath , string prefix )
@@ -524,9 +531,9 @@ private void EnableIdleTickWorker()
524
531
525
532
#region Event: Alone/Party
526
533
527
- private async void OnAloneChanged ( object ? sender , AloneChanged e )
534
+ private async Task OnAloneChanged ( object ? sender , AloneChanged e )
528
535
{
529
- ValidateScheduler ( ) ;
536
+ Scheduler . VerifyOwnThread ( ) ;
530
537
531
538
string script ;
532
539
TimeSpan delay ;
@@ -579,19 +586,6 @@ await info.Write(TextMod.Format(config.Commands.Color, strings.error_call_unexpe
579
586
}
580
587
}
581
588
582
- private void ValidateScheduler ( )
583
- {
584
- if ( TaskScheduler . Current != Scheduler )
585
- {
586
- var stack = new System . Diagnostics . StackTrace ( ) ;
587
- Log . Error ( "Current call is not scheduled correctly. Sched: {0}, Own: {1}. Stack: {2}" ,
588
- TaskScheduler . Current . Id ,
589
- Scheduler . Id ,
590
- stack
591
- ) ;
592
- }
593
- }
594
-
595
589
public BotInfo GetInfo ( ) => new BotInfo
596
590
{
597
591
Id = Id ,
0 commit comments