【问题标题】:How to make a bot react to **only one** specific emoji?如何让机器人对**只有一个**特定的表情符号做出反应?
【发布时间】:2021-06-27 04:58:38
【问题描述】:

我是一个绝对的初学者。因此,机器人应该了解(显示为消息“ThumbUp/ThumbDown”)用户已对现有反应作出反应。我的问题是,如果我对这两种反应之一做出反应,两条消息都会发出,所以我认为我需要以某种方式将它们分开。谁能帮我解决这个问题?

  @client.event
        async def on_reaction_add(reaction, user):

            reaction == get(message.reactions, emoji='????')
            if reaction.count > 1:
                    await message.channel.send('ThumbUp')
                    await helpmessage.delete()
            else:
                    await asyncio.sleep(30)
                    await helpmessage.delete()

            reaction == get(message.reactions, emoji='????')
            if reaction.count > 1:
                    await message.channel.send('ThumbDown')
                    await helpmessage.delete()
            else:
                    await asyncio.sleep(30)
                    await helpmessage.delete()

【问题讨论】:

  • 不熟悉不和谐,但您是否尝试在 get 中的 emoji 之后添加一个额外的 =
  • 然后它给出了这个错误:NameError: name 'emoji' is not defined

标签: python discord bots


【解决方案1】:

有几种方法:

  1. 使用其他:
@client.event
async def on_reaction_add(reaction, user):
    reaction = get(message.reactions, emoji='?')
    if reaction.count > 1:
        await message.channel.send('ThumbUp')
    else:
        reaction = get(message.reactions, emoji='?')
        if reaction.count > 1:
            await message.channel.send('ThumbDown')
        else:
            await asyncio.sleep(30)

    await helpmessage.delete()
  1. 使用字典:
@client.event
async def on_reaction_add(reaction, user):
    checks = {'?': 'ThumbUp', '?': 'ThumbDown'}
    for emoji, msg in checks.items():
        reaction = get(message.reactions, emoji=emoji)
        if reaction.count > 1:
            await message.channel.send(msg)
            break
    else:
        await asyncio.sleep(30)

    await helpmessage.delete()

【讨论】:

  • 两个版本我都试过了,都给我同样的错误:Ignoring exception in on_reaction_add Traceback (most recent call last): File "C:\Users\PycharmProjects\EmoteBot\venv\lib\site-packages\discord\client.py", line 343, in _run_event await coro(*args, **kwargs) File "C:/Users/PycharmProjects/EmoteBot/main.py", line 42, in on_reaction_add if reaction.count > 1: AttributeError: 'NoneType' object has no attribute 'count' 这不是说反应有问题,需要定义什么的吗?
  • 您可以将所有if reaction.count > 1: 替换为if reaction is not None and reaction.count > 1:,看看是否有效。
  • 起初没有错误,但也没有文本发送出去。但是一旦消息被删除,它就会发出一个错误:Ignoring exception in on_reaction_add Traceback (most recent call last): File "", line 343, in _run_event await coro(*args, **kwargs) File "", line 51, in on_reaction_add await helpmessage.delete() File "", line 1023, in delete await self._state.http.delete_message(self.channel.id, self.id) File "", line 250, in request raise NotFound(r, data) discord.errors.NotFound: 404 Not Found (error code: 10008): Unknown Message
  • 我不知道你将helpmessage 变量存储在哪里,但是这个错误意味着helpmessage 表示的消息不存在(可能它已经被删除了,你可能想要在 await helpmessage.delete() 周围添加一个 try-except 块。另外,我看不到您将 message 变量存储在哪里。根据the docs,如果你想得到被响应的消息,你应该使用reaction.message而不是只使用message
  • 我的helpmessage 存储在这里:helpmessage = await message.channel.send(embed=embed) 之后只有添加的反应和事件,我的问题是关于。所以我在 try-except 块中构建了这样的 ``` try: await helpmessage.delete() except: helpmessage.content == None ``` 我还尝试对reaction1reaction2做出反应,所以他们不会以某种方式相互影响。但是现在我既没有收到消息,也没有收到错误,它仍然会在 30 秒后自行删除。
【解决方案2】:

似乎修复是在该行中添加第二个=,其中reaction 被确定。所以是 reaction == get(helpmessage.reactions, emoji="?")

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 1970-01-01
    • 2021-04-30
    • 2020-10-11
    • 2020-08-06
    • 2021-08-11
    • 1970-01-01
    • 2021-05-14
    • 2019-09-06
    相关资源
    最近更新 更多