Я пытаюсь настроить бота Discord, будучи относительно новым для discord.py (и на самом деле, Python 3). Я хочу добавить команду «приветствовать», которая предложит пользователю сказать «привет». Однако он отвечает только на «привет», когда я хочу, чтобы он отвечал и на «привет», и на «привет».
Единственное, что я мог подумать об исправлении, — это поместить их в оператор or
, что теоретически должно было заставить Python 3 и бота выбирать между двумя ответами (как показано ниже).
@client.event
async def on_message(message):
if message.content.startswith('~greet'):
await client.send_message(message.channel, 'Say hello')
msg = await client.wait_for_message(author=message.author, content=('hello' or 'Hello'))
await client.send_message(message.channel, 'Hello.')
Исходный код, который у меня был, был простым и допускал только один ответ hello
.
@client.event
async def on_message(message):
if message.content.startswith('~greet'):
await client.send_message(message.channel, 'Say hello')
msg = await client.wait_for_message(author=message.author, content=('hello' or 'Hello'))
await client.send_message(message.channel, 'Hello.')
У меня почему-то не укладывается в голове, он до сих пор не распознает 'Hello'
, а только позволяет сказать 'hello'
в ответ.
Вы должны использовать нотацию command
вместо проверки каждого сообщения с помощью on_message
, потому что это сделает ваш код более читаемым. Что произойдет, если у вас будет 10 команд? Вы проверите наличие 10 строк в своем on_message
?
Если это ветка перезаписи, то commands.Bot
принимает параметр без учета регистра:
bot = commands.Bot(command_prefix='!', case_insensitive=True)
В качестве альтернативы, если вы хотите использовать несколько слов для одной и той же команды, вы можете использовать псевдонимы, например:
@bot.command(aliases=['info', 'stats', 'status'])
async def about(self):
# your code here
or
ведет себя не так, как вы думаете. 'hello' or 'Hello'
оценивается перед передачей в wait_for_message
и равно 'hello'
.
Вместо этого вы можете предоставить функцию check
для wait_for_message
:
def is_hello(message):
return message.content.lower() == 'hello'
msg = await client.wait_for_message(author=message.author, check=is_hello)
Спасибо! Этот ответ определенно наиболее непосредственно решает мою проблему.
Это переписываемая или асинхронная ветвь?