示例#1
0
        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());
        }
示例#2
0
        /// <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
                   ));
        }
示例#3
0
        /// <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());
        }