Отмена команд - PullRequest
0 голосов
/ 31 мая 2019

Я делаю команду для включения / выключения команд бота для каждого канала.Хотя возникают проблемы при отмене команды, если она найдена в базе данных.

@Nao.event
async def on_command(ctx):
    if ctx.command.parent is None:
        database = mysql.connector.connect(
            host='',
            user='',
            passwd='',
            database=''
        )
        cursor = database.cursor()
        query = "SELECT command FROM cmdsdisabled WHERE channel = %s AND command = %s"
        values = (ctx.channel.id, ctx.command.name,)
        cursor.execute(query, values)
        result = cursor.fetchall()
        for command in result:
            await ctx.send('That command is disabled in this channel.')
        cursor.close()
        return

Код работает, он проверяет, находится ли команда в базе данных, и если да, бот говорит: «Эта команда отключена в этом канале."однако, продолжает выполнять фактическую команду.

Я хочу, чтобы она не продолжала выполнять фактическую команду и говорила только: «Эта команда отключена в этом канале».если команда найдена в базе данных.

1 Ответ

1 голос
/ 31 мая 2019

Вы можете написать проверку, которая вызывает пользовательское исключение, а затем обработать это исключение в обработчике пользовательских исключений для всех ваших команд.Приведенный ниже код просто требует от вас написать некоторую функцию command_is_disabled, чтобы фактически определить, отключена ли команда.

from discord.ext.commands import DisabledCommand, check, Bot

bot = Bot("!")

class DisabledInChannel(DisabledCommand):
    pass

def check_disabled():
    def predicate(ctx):
        if command_is_disabled(ctx.command.name, ctx.channel.id):
            raise DisabledInChannel(f"{ctx.command.name} is disabled in {ctx.channel.name}")
        return True
    return check(predicate)

@bot.command()
@check_disabled()
async def some_command(ctx):
    ...

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, DisabledInChannel):
        await ctx.send(error.message)
    else:
        raise error
...