根据用户反应发送消息 discord.py

时间:2021-02-19 09:32:23

标签: python discord.py

我希望我的不和谐机器人根据用户给出的反应在服务器内回复一条特定的消息:? 或 ?。

我对 discord.py 不太熟悉,我读过的文档有点令人困惑,我遵循了 youtube 教程并进行了编辑。我可以看到控制台中打印的反应,但是我收到错误消息:

Instance of 'Bot' has no 'channel' member

这是我的代码:

import os
import datetime
import discord
from discord.ext import commands
from dotenv import load_dotenv

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')

client = commands.Bot(command_prefix = '!')

@client.event
async def on_ready():
    print('Bot is logged in.')

@client.command(name='feedback', help='Ask person for feedback')
async def roll(ctx):
    await ctx.send('Are you enjoying this bot? \n :thumbsup: :-1: ')

@client.event
async def on_raw_reaction_add(reaction, user):
    print(reaction.emoji)
    channel = reaction.message.channel
    await client.channel.send_message(channel, reaction.emoji)
    if reaction.emoji == ':thumbsup:':
        await client.channel.send_message(channel, 'Thank you for your feedback')
    elif reaction.emoji == ':-1:':
        await client.channel.send_message(channel, 'Sorry you feel that way')

client.run(TOKEN)

非常感谢所有帮助

1 个答案:

答案 0 :(得分:1)

在这种情况下,最好使用 on_raw_reaction_add 命令事件而不是使用 wait_for 事件。这意味着该事件只能触发一次,并且只能在调用命令时触发。但是,对于您当前的事件,这允许任何人对带有该表情符号的消息做出反应,机器人会做出响应。

通过使用 client.wait_for("reaction_add"),您可以控制用户何时可以对表情符号做出反应。您还可以添加检查,这意味着只有用户才能使用对机器人发送的消息的反应。可以传递其他参数,但这取决于您想要如何设置它的样式。

在下面的示例中,用户可以调用命令,然后被要求用拇指向上或向下拇指做出反应。机器人已经添加了这些反应,所以用户只需要做出反应。 wait_for 属性将等待用户对指定的表情符号做出反应,您的命令将发送一条消息。

这是在您的代码中应用的示例。

@client.command(name='feedback', help='Ask person for feedback')
async def roll(ctx):
    message = await ctx.send('Are you enjoying this bot? \n :thumbsup: :-1: ')

    thumb_up = '?'
    thumb_down = '?'

    await message.add_reaction(thumb_up)
    await message.add_reaction(thumb_down)

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

    member = ctx.author

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

            if str(reaction.emoji) == thumb_up:
                await ctx.send('Thank you for your feedback')


            if str(reaction.emoji) == thumb_down:
                await ctx.send('Sorry you feel that way')

您还收到错误 Instance of 'Bot' has no 'channel' member,因为您使用的事件限制了“Bot”的属性。但是,在命令中使用它允许您使用 ctx.send