Python3 и MariaDB с использованием Discord Py

Я запрограммировал бота, который вставляет вещи в базу данных с входа пользователя, и он отлично работает. Тем не менее, бывают случаи, когда база данных возвращает несколько одинаковых строк, а бот просто использует первый. Каким будет лучший способ сделать это, чтобы пользователь мог выбрать правильный вариант, а не бот, только используя первый выбор.

Изменить для дальнейшего уточнения:

cursor.execute("SELECT name FROM forts WHERE name LIKE '" + str(arg) + "%';")
gym_title = str(cursor.fetchall())

Иногда бывает несколько таких же, как, например, Starbucks. Вместо того, чтобы изменять их, мне было интересно, могу ли я сделать это так, чтобы бот раздора отвечал каждому, и пользователь выбирает правильный вариант.

python-3.x,mariadb,mysql-python,discord.py,

1

Ответов: 1


3 принят

Это на самом деле сложнее, чем кажется, из-за discord.pyмодели, управляемой событиями. Наша команда примет некоторый аргумент в нашем запросе и вернет пользователю список из списка. Мы сохраним этот пользователь и этот список в словаре. Затем, в нашем on_messageслучае, мы проверим каждое сообщение в соответствии с требованиями авторов, которым мы заботимся, и попытаемся интерпретировать их сообщения как варианты в списке, пока они не сделают правильный выбор.

waiting_for = {}

@bot.command(pass_context=True)
async def fort(ctx, arg):
    # database setup stuff
    names = cursor.execute("SELECT name FROM forts WHERE name LIKE '" + str(arg) + "%';")
    if not names:
        await bot.say("That fort does not exist")
    elif len(names) == 1:
        await process_fort(name)
    else:
        choices = "
".join("{}. {}".format(i, x) for i, x in enumerate(names, start=1))
        await bot.say("Your choices are")
        await bot.say(choices)
        waiting_for[ctx.message.author.id] = names


@bot.event
async def on_message(message):
    id = message.author.id
    if id in waiting_for:
        if message.content.isdigit():
            names = waiting_for[id]
            selection = int(message.content)
            if 0 < selection < len(names):
                del waiting_for[id]
                await process_fort(name)
                return
    await bot.process_commands(message)

# Whatever you want to do with the name once you have it
async def process_fort(name):
    ...

Если это кажется сложным, вы также можете просто отследить все возможности для пользователя до ввода запроса, который возвращает только один результат.

питон-3.x, MariaDB, MySQL-питон, discord.py,
Похожие вопросы