Как мне сделать так, чтобы сообщение discord api ожидало для A или B?

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

Я пробовал разные синтаксисы, такие как (content=('m!mode computer' or 'm!mode player')), и ни один из них не работает.

 async def AgainstWho():
    global mode
    await client.send_message(message.channel, content='Play against the computer or another player?\n')
    mode = await client.wait_for_message(content=('m!mode computer' or 'm!mode player'))
    if mode == 'm!mode computer':
      mode = 1
    if mode == 'm!mode player':
      mode = 2

Если пользователь вводит m!mode player, код ничего не делает, но m!mode computer работает отлично.


person MasterPooka    schedule 05.02.2019    source источник


Ответы (2)


>>> 'm!mode computer' or 'm!mode player'
'm!mode computer'

Вот почему. Я предполагаю, что это discord.py, в соответствии с документами то, что вам нужно, это:

mode = await client.wait_for_message(check=lambda m: return m.content.startswith('m!mode'))

или тому подобное.

person Vetsin    schedule 05.02.2019

При выполнении 'm!mode computer' or 'm!mode player'; or просто вернет первую строку с True в качестве логического значения, то есть любую непустую строку; поэтому по умолчанию будет использоваться первый (здесь 'm!mode computer').

Вам необходимо убедиться, что контент начинается с 'm!mode ' и что следующее «слово» в точности соответствует любому из ваших вариантов:

 async def AgainstWho():
    global mode
    await client.send_message(message.channel, content='Play against the computer or another player?\n')
    mode = await client.wait_for_message(check=lambda m: return m.content.startswith('m!mode ') and m.content.split(' ')[1] in ('player', 'computer'))
    if mode == 'm!mode computer':
      mode = 1
    if mode == 'm!mode player':
      mode = 2

Это проверяет только первые два «слова» команды. 'm! mode player' будет работать; но то же самое будет с игроком m! mode за всем остальным ». Если вы хотите избежать этого поведения и свести его к строгим вызовам команд; вы также можете проверить, что len(m.content.split(' ')) == 2.

Также избегайте использования global. Передайте переменную в качестве аргумента функции или сделайте ее методом объекта с переменной в качестве атрибута.

person FrenchMasterSword    schedule 05.02.2019