python - 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'
解决方案
您无权访问调用上下文,因为这不是命令。您只能使用有效负载的属性,即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")
推荐阅读
- typescript - 打字稿错误地抱怨条件永远是真的
- c# - Azure Pipelines 上的 C# 编译器 (csc.exe)
- angular - ngFor循环索引生成formControl名称,创建动态表单
- oracle - SQL Oracle - 仅显示前 15 天的数据
- azure - Azure 读取 API 是否可配置?
- python - 关于如何使用 smtplib 在 python 中欺骗电子邮件发件人的任何想法?
- android - 自定义侦听器在 Android Kotlin 中不起作用
- clojure - 在列表中查找元素并保留相邻元素
- postgresql - Liquibase:如何使用 CURRENT_TIMESTAMP 加载数据?
- sql - 尝试每天获得 1 场比赛 SQL Server