Это на самом деле сложнее, чем кажется, из-за 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):
...
Если это кажется сложным, вы также можете просто отследить все возможности для пользователя до ввода запроса, который возвращает только один результат.