Как обрабатывать множественные реакции в Discord py (Bot) - PullRequest
0 голосов
/ 16 марта 2020

Попытка заставить моего бота обрабатывать несколько реакций на сообщение.

Я могу заставить работать эту версию, если проверю только одну реакцию, такую ​​как:

reaction, user = await bot.wait_for('reaction_add', timeout=5, check=checkR)

но когда я проверяю наличие нескольких реакций (например, бумаги и ножниц), код просто не будет работать.

Я искал всюду помощь по этому вопросу и не могу найти ничего, что было бы переписано после Discord. .

Любая помощь приветствуется!

# test rps
@bot.command()
async def test(ctx):

    eb = await getEmbed(ctx, "Rock, Paper, Scissors", "", {}, "", "Choose one:", discord.Colour.gold())

    msg = await ctx.message.channel.send(embed = eb)
    channel = msg.channel
    for emoji in ('?', '?', "✂"):
        await msg.add_reaction(emoji)

    # now check for response
    def checkR(reaction, user):
        return user == ctx.message.author and str(reaction.emoji) == '?'
    def checkP(reaction, user):
        print("in paper")
        return user == ctx.message.author and str(reaction.emoji) == '?'
    def checkS(reaction, user):
        return user == ctx.message.author and str(reaction.emoji) == '✂'

    try:
        reaction, user = await bot.wait_for('reaction_add', timeout=5, check=checkR)
        reaction, user = await bot.wait_for('reaction_add', timeout=5, check=checkP)
        reaction, user = await bot.wait_for('reaction_add', timeout=5, check=checkS)
    except asyncio.TimeoutError:
        await embed(ctx, "Game timed out.")
        return
    else:
        # we got a reaction
        await embed(ctx, "GOT A REACTION")
        await discord.Message.delete(msg)
        pass

1 Ответ

0 голосов
/ 16 марта 2020
reaction, user = await bot.wait_for('reaction_add', timeout=5, check=checkR)
reaction, user = await bot.wait_for('reaction_add', timeout=5, check=checkP)
reaction, user = await bot.wait_for('reaction_add', timeout=5, check=checkS)

Это ждет, когда кто-то отреагирует Камнем, Бумагой, Ножницами в таком порядке. Он не принимает только бумагу или только ножницы. Он хочет все 3 реакции и в этом порядке.

Вам нужно написать что-то вроде этого:

def check(reaction, user):
  return user == ctx.message.author and str(reaction.emoji) in ['?', '?', '✂']

reaction, user = await bot.wait_for('reaction_add', timeout=5, check=check)

Это будет искать одну реакцию, которая является либо каменной, бумажной или ножничной.

...