Ejemplo n.º 1
0
        /// <inheritdoc />
        public async ValueTask <Result> CheckAsync(RequireOwnerAttribute attribute, CancellationToken ct = default)
        {
            var getApplication = await _oauth2API.GetCurrentApplicationInformationAsync(ct);

            if (!getApplication.IsSuccess)
            {
                return(Result.FromError(getApplication));
            }

            var application = getApplication.Entity;

            if (!application.Owner.ID.HasValue)
            {
                return(new GenericError("The application owner's ID was not present."));
            }

            return(application.Owner.ID.Value == _context.User.ID
                ? Result.FromSuccess()
                : new ConditionNotSatisfiedError("You need to be the bot owner to do that."));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Updates the application's slash commands.
        /// </summary>
        /// <param name="guildID">The ID of the guild to update slash commands in, if any.</param>
        /// <param name="ct">The cancellation token for this operation.</param>
        /// <returns>A result which may or may not have succeeded.</returns>
        public async Task <Result> UpdateSlashCommandsAsync
        (
            Snowflake?guildID    = null,
            CancellationToken ct = default
        )
        {
            var getApplication = await _oauth2API.GetCurrentApplicationInformationAsync(ct);

            if (!getApplication.IsSuccess)
            {
                return(Result.FromError(getApplication));
            }

            var application    = getApplication.Entity;
            var createCommands = _commandTree.CreateApplicationCommands();

            if (!createCommands.IsSuccess)
            {
                return(Result.FromError(createCommands));
            }

            CreateInteractionMethods
            (
                guildID,
                application,
                out var updateMethod,
                ct
            );

            var commands = createCommands.Entity;

            // Upsert the current valid command set
            var updateCommands = await updateMethod(commands);

            return(updateCommands.IsSuccess
                ? Result.FromSuccess()
                : Result.FromError(updateCommands));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Updates the application's slash commands.
        /// </summary>
        /// <param name="guildID">The ID of the guild to update slash commands in, if any.</param>
        /// <param name="ct">The cancellation token for this operation.</param>
        /// <returns>A result which may or may not have succeeded.</returns>
        public async Task<UpdateCommandsResult> UpdateSlashCommandsAsync
        (
            Snowflake? guildID = null,
            CancellationToken ct = default
        )
        {
            var getApplication = await _oauth2API.GetCurrentApplicationInformationAsync(ct);
            if (!getApplication.IsSuccess)
            {
                return UpdateCommandsResult.FromError(getApplication);
            }

            var application = getApplication.Entity;
            var createCommands = _commandTree.CreateApplicationCommands(out var commands);
            if (!createCommands.IsSuccess)
            {
                return UpdateCommandsResult.FromError(createCommands);
            }

            CreateInteractionMethods
            (
                guildID,
                ct,
                application,
                out var deleteMethod,
                out var getMethod,
                out var updateMethod
            );

            // Upsert the current valid command set
            var currentValidCommands = new List<string>();
            foreach (var command in commands!)
            {
                var updateResult = await updateMethod(command);
                if (!updateResult.IsSuccess)
                {
                    return UpdateCommandsResult.FromError(updateResult);
                }

                currentValidCommands.Add(command.Name);
            }

            // Clear out old and invalid commands
            var getCurrentCommands = await getMethod();
            if (!getCurrentCommands.IsSuccess)
            {
                return UpdateCommandsResult.FromError(getCurrentCommands);
            }

            var currentCommands = getCurrentCommands.Entity;
            var invalidCommands = currentCommands.Where(c => currentValidCommands.All(n => c.Name != n));

            foreach (var invalidCommand in invalidCommands)
            {
                var deleteResult = await deleteMethod(invalidCommand.ID);
                if (!deleteResult.IsSuccess)
                {
                    return UpdateCommandsResult.FromError(deleteResult);
                }
            }

            return UpdateCommandsResult.FromSuccess();
        }