Использование CTX в событии on_reaction_add — Discord.py

#discord.py

#discord.py

Вопрос:

 async def on_reaction_add(reaction, user):
    emoji = reaction.emoji
    if emoji == "💌":
    await user.channel.send("HI")
 

У меня здесь проблема user .
Я хочу использовать здесь с ctx, как ctx.channel.send .
но также возникла ошибка, как использовать ctx здесь?

Ответ №1:

on_reaction_add В этом случае вместо использования события лучше использовать wait_for событие command . Это означало бы, что событие может быть запущено только один раз и только при вызове команды. Однако с вашим текущим событием это позволяет любому пользователю реагировать на сообщение с этим смайликом, и бот ответит.

При использовании client.wait_for("reaction_add") это позволит вам контролировать, когда пользователь может реагировать на смайлики. Вы также можете добавить проверки, это означает, что только пользователь сможет использовать реакции на сообщение, которое отправляет бот. Другие параметры могут быть переданы, но вам решать, как вы хотите его оформить.

В приведенном ниже примере показано, что пользователь может вызвать команду, затем ему предлагается отреагировать. Бот уже добавляет эти реакции, поэтому пользователю нужно будет только отреагировать. wait_for Атрибут будет ждать, пока пользователь либо отреагирует указанными смайликами, либо ваша команда отправит сообщение.

 @client.command()
async def react(ctx):
    message = await ctx.send('React to this message!')

    mail = '💌'
    post = '📮'

    await message.add_reaction(mail)
    await message.add_reaction(post)

    def check(reaction, user):
        return user == ctx.author and str(
            reaction.emoji) in [mail, post]

    member = ctx.author

    while True:
        try:
            reaction, user = await client.wait_for("reaction_add", timeout=10.0, check=check)

            if str(reaction.emoji) == mail:
                await ctx.send('Hi you just received')


            if str(reaction.emoji) == post:
                await ctx.send('Hi you just posted...')
 

Комментарии:

1. Привет, у меня проблема, и я попробую. но если я делаю await client.wait_for(«сообщение», тайм-аут = 10.0, проверка = проверка) вот так, как я должен это сделать? я сделаю, если кто-то что-то скажет, сохраните это в базе данных. если я установлю что-то в конкретное слово, я могу создать код, подобный if message == specfic msg, но я не знаю, как это сделать при НЕ Specfic msg. например, a = ctx.message.content ожидает клиента.wait_for(«сообщение», тайм-аут = 10.0, проверка = проверка), если message == a: этот пример не сработает, но я хочу работать так.

2. @HWS я не совсем уверен, что ты имеешь в виду. В вашем вопросе вы просто хотели узнать, как использовать ctx в реакции add , и приведенный выше ответ позволяет это. Вы хотите знать, как выполнить on_message?

3. Можете ли вы дать мне discord или telegram и т. Д.? Я могу рассказать больше там

4. Вы просто хотите сделать wait_for для сообщения?

5. ДА. Я хочу сделать вот так. Если бот спросит «как тебя зовут?» Затем пользователь говорит ответ, затем бот сохраняет ответ в базе данных. Но я не знаю, как я получаю ответ с помощью wait_for.

Ответ №2:

Вам нужно использовать reaction.message.channel.send

 async def on_reaction_add(reaction, user):
    emoji = reaction.emoji
    if str(emoji) == "💌": await reaction.message.channel.send("HI")
 

Комментарии:

1. Я попробовал, ошибки нет, но это не сработало

2. вероятно, ваш оператор if не запускается, попробуйте отредактированный код