Discord.py Извлечь пользователя из реакции - PullRequest
0 голосов
/ 02 августа 2020
• 1000 определенный смайлик в сообщении, и первый участник дуэли реагирует на сообщение побеждает. Это простая идея, но я не могу понять, как узнать, отреагировал ли определенный пользователь на сообщение. У меня вопрос - возможно ли это, или мне нужно придумать другой подход к этому?

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

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

Она принимает три параметра Event, Check (optional) и timeout(optional)

в документации есть примеры, но для вас это будет примерно так:

bot = commands.Bot(command_prefix='.', case_insensitive=True)

@bot.command()
async def game(ctx):
    # Whatever you want here
    msg = await ctx.send("React first to win")
    await msg.add_reaction('?')

    def check(reaction, user):
        return str(reaction.emoji) == '?' and user != bot.user

    try:
        # Timeout parameter is optional but sometimes can be useful
        reaction, user = await bot.wait_for('reaction_add', timeout=30, check=check)
        
        # Will wait until a user reacts with the specified checks then continue on with the code
        await ctx.send(f"Congratulations {user.name} you won!")
    except asyncio.TimeoutError:

        # when wait_for reaches specified timeout duration (in this example it is 30 seconds)
        await ctx.send("You ran out of time!")

Параметр Timeout=30 является на 100% необязательным, вы можете удалить его, чтобы он ждал вечно (или пока вы не выключите своего бота ). Параметр check также является необязательным.

PS Я предполагаю, что вы используете python 3 или более, следовательно, F-строки

0 голосов
/ 02 августа 2020

Да, это точно возможно, есть несколько способов сделать это, я никогда не пробовал это раньше, так как я не создавал ботов с реакциями, но это должно работать.

с использованием on_reaction_add

@client.event
async def on_reaction_add(reaction, user):
    channel = client.get_channel('123')
    if reaction.message.channel.id != channel.id:
        return
    else:
        if reaction.emoji == "✅":
            #Do something
            print(user.name)
            print(user.discriminator)
            await channel.send(f"{user} has won the game")

Обязательно ознакомьтесь с документацией on_reaction_add и response one

...