private async Task <EventResponseResult> ExecuteCommandAsync ( string content, ICommandContext commandContext, CancellationToken ct = default ) { // Strip off the prefix if (_options.Prefix is not null) { content = content.Substring ( content.IndexOf(_options.Prefix, StringComparison.Ordinal) + _options.Prefix.Length ); } var additionalParameters = new object[] { commandContext }; // Run any user-provided pre execution events var preExecution = await _eventCollector.RunPreExecutionEvents(commandContext, ct); if (!preExecution.IsSuccess) { return(EventResponseResult.FromError(preExecution)); } // Run the actual command var executeResult = await _commandService.TryExecuteAsync ( content, _services, additionalParameters, ct : ct ); if (!executeResult.IsSuccess) { return(EventResponseResult.FromError(executeResult)); } // Run any user-provided post execution events var postExecution = await _eventCollector.RunPostExecutionEvents ( commandContext, executeResult.InnerResult !, ct ); if (!postExecution.IsSuccess) { return(EventResponseResult.FromError(postExecution)); } return(EventResponseResult.FromSuccess()); }
/// <inheritdoc /> public async Task <Result> RespondAsync ( IInteractionCreate?gatewayEvent, CancellationToken ct = default ) { if (gatewayEvent is null) { return(Result.FromSuccess()); } if (gatewayEvent.Type != InteractionType.ApplicationCommand) { return(Result.FromSuccess()); } if (!gatewayEvent.Data.HasValue) { return(Result.FromSuccess()); } if (!gatewayEvent.ChannelID.HasValue) { return(Result.FromSuccess()); } var user = gatewayEvent.User.HasValue ? gatewayEvent.User.Value : gatewayEvent.Member.HasValue ? gatewayEvent.Member.Value.User.HasValue ? gatewayEvent.Member.Value.User.Value : null : null; if (user is null) { return(Result.FromSuccess()); } // Signal Discord that we'll be handling this one asynchronously var response = new InteractionResponse(InteractionCallbackType.DeferredChannelMessageWithSource); var interactionResponse = await _interactionAPI.CreateInteractionResponseAsync ( gatewayEvent.ID, gatewayEvent.Token, response, ct ); if (!interactionResponse.IsSuccess) { return(interactionResponse); } var interactionData = gatewayEvent.Data.Value !; interactionData.UnpackInteraction(out var command, out var parameters); var context = new InteractionContext ( gatewayEvent.GuildID, gatewayEvent.ChannelID.Value, user, gatewayEvent.Member, gatewayEvent.Token, gatewayEvent.ID, gatewayEvent.ApplicationID, interactionData.Resolved ); // Provide the created context to any services inside this scope _contextInjection.Context = context; // Run any user-provided pre execution events var preExecution = await _eventCollector.RunPreExecutionEvents(context, ct); if (!preExecution.IsSuccess) { return(preExecution); } // Run the actual command var searchOptions = new TreeSearchOptions(StringComparison.OrdinalIgnoreCase); var executeResult = await _commandService.TryExecuteAsync ( command, parameters, _services, searchOptions : searchOptions, ct : ct ); if (!executeResult.IsSuccess) { return(Result.FromError(executeResult)); } // Run any user-provided post execution events return(await _eventCollector.RunPostExecutionEvents ( context, executeResult.Entity, ct )); }
/// <inheritdoc /> public async Task <EventResponseResult> RespondAsync ( IInteractionCreate?gatewayEvent, CancellationToken ct = default ) { if (gatewayEvent is null) { return(EventResponseResult.FromSuccess()); } if (!gatewayEvent.Data.HasValue) { return(EventResponseResult.FromSuccess()); } if (!gatewayEvent.Member.User.HasValue) { return(EventResponseResult.FromSuccess()); } // Signal Discord that we'll be handling this one asynchronously var response = new InteractionResponse(InteractionResponseType.Acknowledge, default); var interactionResponse = await _interactionAPI.CreateInteractionResponseAsync ( gatewayEvent.ID, gatewayEvent.Token, response, ct ); if (!interactionResponse.IsSuccess) { return(EventResponseResult.FromError(interactionResponse)); } var interactionData = gatewayEvent.Data.Value !; interactionData.UnpackInteraction(out var command, out var parameters); var context = new InteractionContext ( gatewayEvent.ChannelID, gatewayEvent.Member.User.Value !, gatewayEvent.Member, gatewayEvent.Token, gatewayEvent.ID, gatewayEvent.GuildID ); // Run any user-provided pre execution events var preExecution = await _eventCollector.RunPreExecutionEvents(context, ct); if (!preExecution.IsSuccess) { return(EventResponseResult.FromError(preExecution)); } // Run the actual command var searchOptions = new TreeSearchOptions(StringComparison.OrdinalIgnoreCase); var executeResult = await _commandService.TryExecuteAsync ( command, parameters, _services, new object[] { context }, searchOptions, ct ); if (!executeResult.IsSuccess) { return(EventResponseResult.FromError(executeResult)); } // Run any user-provided post execution events var postExecution = await _eventCollector.RunPostExecutionEvents ( context, executeResult.InnerResult !, ct ); if (!postExecution.IsSuccess) { return(EventResponseResult.FromError(postExecution)); } return(EventResponseResult.FromSuccess()); }