88using System . Runtime . CompilerServices ;
99using System . Text ;
1010using System . Threading . Tasks ;
11+
1112using DSharpPlus . AsyncEvents ;
1213using DSharpPlus . Commands . ContextChecks ;
1314using DSharpPlus . Commands . ContextChecks . ParameterChecks ;
2324using DSharpPlus . Commands . Trees . Metadata ;
2425using DSharpPlus . Entities ;
2526using DSharpPlus . Exceptions ;
27+
2628using Microsoft . Extensions . DependencyInjection ;
2729using Microsoft . Extensions . Logging ;
28- using Microsoft . Extensions . Logging . Abstractions ;
30+
2931using CheckFunc = System . Func
3032<
3133 object ,
3234 DSharpPlus . Commands . ContextChecks . ContextCheckAttribute ,
3335 DSharpPlus . Commands . CommandContext ,
3436 System . Threading . Tasks . ValueTask < string ? >
3537> ;
38+
3639using ParameterCheckFunc = System . Func
3740<
3841 object ,
@@ -49,8 +52,8 @@ namespace DSharpPlus.Commands;
4952/// </summary>
5053public sealed class CommandsExtension : BaseExtension
5154{
52- /// <inheritdoc cref="CommandsConfiguration .ServiceProvider"/>
53- public IServiceProvider ServiceProvider { get ; init ; }
55+ /// <inheritdoc cref="DiscordClient .ServiceProvider"/>
56+ public IServiceProvider ServiceProvider { get ; private set ; }
5457
5558 /// <inheritdoc cref="CommandsConfiguration.DebugGuildId"/>
5659 public ulong DebugGuildId { get ; init ; }
@@ -84,19 +87,29 @@ public sealed class CommandsExtension : BaseExtension
8487 /// <summary>
8588 /// Executed everytime a command is finished executing.
8689 /// </summary>
87- public event AsyncEventHandler < CommandsExtension , CommandExecutedEventArgs > CommandExecuted { add => this . commandExecuted . Register ( value ) ; remove => this . commandExecuted . Unregister ( value ) ; }
88- internal readonly AsyncEvent < CommandsExtension , CommandExecutedEventArgs > commandExecuted = new ( "COMMANDS_COMMAND_EXECUTED" , EverythingWentWrongErrorHandler ) ;
90+ public event AsyncEventHandler < CommandsExtension , CommandExecutedEventArgs > CommandExecuted
91+ {
92+ add => this . commandExecuted . Register ( value ) ;
93+ remove => this . commandExecuted . Unregister ( value ) ;
94+ }
95+
96+ internal AsyncEvent < CommandsExtension , CommandExecutedEventArgs > commandExecuted ;
8997
9098 /// <summary>
9199 /// Executed everytime a command has errored.
92100 /// </summary>
93- public event AsyncEventHandler < CommandsExtension , CommandErroredEventArgs > CommandErrored { add => this . commandErrored . Register ( value ) ; remove => this . commandErrored . Unregister ( value ) ; }
94- internal readonly AsyncEvent < CommandsExtension , CommandErroredEventArgs > commandErrored = new ( "COMMANDS_COMMAND_ERRORED" , EverythingWentWrongErrorHandler ) ;
101+ public event AsyncEventHandler < CommandsExtension , CommandErroredEventArgs > CommandErrored
102+ {
103+ add => this . commandErrored . Register ( value ) ;
104+ remove => this . commandErrored . Unregister ( value ) ;
105+ }
106+
107+ internal AsyncEvent < CommandsExtension , CommandErroredEventArgs > commandErrored ;
95108
96109 /// <summary>
97110 /// Used to log messages from this extension.
98111 /// </summary>
99- private readonly ILogger < CommandsExtension > logger ;
112+ private ILogger < CommandsExtension > logger ;
100113
101114 /// <summary>
102115 /// Creates a new instance of the <see cref="CommandsExtension"/> class.
@@ -106,18 +119,10 @@ internal CommandsExtension(CommandsConfiguration configuration)
106119 {
107120 ArgumentNullException . ThrowIfNull ( configuration ) ;
108121
109- this . ServiceProvider = configuration . ServiceProvider ;
110122 this . DebugGuildId = configuration . DebugGuildId ;
111123 this . UseDefaultCommandErrorHandler = configuration . UseDefaultCommandErrorHandler ;
112124 this . RegisterDefaultCommandProcessors = configuration . RegisterDefaultCommandProcessors ;
113125 this . CommandExecutor = configuration . CommandExecutor ;
114- if ( this . UseDefaultCommandErrorHandler )
115- {
116- this . CommandErrored += DefaultCommandErrorHandlerAsync ;
117- }
118-
119- // Attempt to get the user defined logging, otherwise setup a null logger since the D#+ Default Logger is internal.
120- this . logger = this . ServiceProvider . GetService < ILogger < CommandsExtension > > ( ) ?? NullLogger < CommandsExtension > . Instance ;
121126 }
122127
123128 /// <summary>
@@ -136,8 +141,20 @@ protected override void Setup(DiscordClient client)
136141 }
137142
138143 this . Client = client ;
144+ this . ServiceProvider = client . ServiceProvider ;
139145 this . Client . SessionCreated += async ( _ , _ ) => await RefreshAsync ( ) ;
140146
147+ this . logger = client . ServiceProvider . GetService < ILogger < CommandsExtension > > ( ) ;
148+
149+ DefaultClientErrorHandler errorHandler = new ( client . Logger ) ;
150+ this . commandErrored = new ( errorHandler ) ;
151+ this . commandExecuted = new ( errorHandler ) ;
152+
153+ if ( this . UseDefaultCommandErrorHandler )
154+ {
155+ this . CommandErrored += DefaultCommandErrorHandlerAsync ;
156+ }
157+
141158 AddCheck < DirectMessageUsageCheck > ( ) ;
142159 AddCheck < RequireApplicationOwnerCheck > ( ) ;
143160 AddCheck < RequireGuildCheck > ( ) ;
0 commit comments