首页 > 解决方案 > on_raw_reaction_add(payload) 故障排除

问题描述

嘿,我正在用 Python 开发一个 Discord Bot。这是文档:https ://discordpy.readthedocs.io/en/latest/index.html

如果用户对消息做出反应,该程序应该给他一个角色

我试图在函数本身中定义 ctx

@client.event
async def on_raw_reaction_add(payload):
    member = discord.utils.get(client.get_all_members())
    role = discord.utils.find(lambda r: r.name == "check-in", ctx.guild.roles)
    check_in = ["612637944544624690"]
    if str(payload.channel_id) in check_in:
        await client.add_roles(member, role, reason="check-in")

那就是函数本身没有 ctx 的错误:

Ignoring exception in on_raw_reaction_add
Traceback (most recent call last):
  File "C:\Users\kaitr\Anaconda3\envs\tutorial\lib\site-packages\discord\client.py", line 270, in _run_event
    await coro(*args, **kwargs)
  File "C:/Users/kaitr/PycharmProjects/Discord Tutorial/bot.py", line 39, in on_raw_reaction_add
    role = discord.utils.find(lambda r: r.name == "check-in", ctx.guild.roles)
NameError: name 'ctx' is not defined

那是函数本身的 ctx 错误:

Ignoring exception in on_raw_reaction_add
Traceback (most recent call last):
  File "C:\Users\kaitr\Anaconda3\envs\tutorial\lib\site-packages\discord\client.py", line 270, in _run_event
    await coro(*args, **kwargs)
TypeError: on_raw_reaction_add() missing 1 required positional argument: 'ctx'

标签: pythondiscord.py

解决方案


您无权访问调用上下文,因为这不是命令。您只能使用有效负载的属性,即RawReactionActionEvent对象。这包括一个guild_id可用于获取公会的属性:

@client.event
async def on_raw_reaction_add(payload):
    if payload.guild_id is None:
        return  # Reaction is on a private message
    guild = client.get_guild(payload.guild_id)
    role = discord.utils.get(guild.roles, name="check-in")
    member = guild.get_member(payload.user_id)
    if str(payload.channel_id) in check_in:
        await member.add_roles(role, reason="check-in")

推荐阅读