Python3 и MariaDB с использованием Discord Py - PullRequest
0 голосов
/ 29 июня 2018

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

Изменить для уточнения:

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

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

1 Ответ

0 голосов
/ 30 июня 2018

Это на самом деле сложнее, чем кажется, из-за событийной модели 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 = "\n".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):
    ...

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

...