我的情况如下:我在 Discord 服务器上有一条消息,其中有一个反应表情符号,我希望对那个表情符号做出反应的用户获得一个角色。
然而,当用户对表情符号做出反应时,它似乎并没有产生任何效果,我一直在尝试不同的东西,但始终没有达到预期的效果。
我的代码是:
@commands.Cog.listener()
async def on_reaction_add(self,reaction):
role = discord.utils.get(reaction.message.channel.guild.roles, id=820934815217221671)
if reaction.message_id == 820972326878969866:
if reaction.emoji == "✅":
reaction.author.add_roles(role)
但是没有任何反应,我也尝试使用 on_raw_reaction_add 和有效载荷参数,但这会出错: 类型错误:on_raw_reaction_add() 需要 1 个位置参数,但给出了 2 个
我的逻辑有什么问题?我一直在查看不同的例子,但无法得出结论。
答案 0 :(得分:0)
根据 Łukasz Kwieciński 的评论,这是一个可能的答案。
您需要事件的其他“值”。它不是 reaction
,而是 payload
,请参阅文档:on_raw_reaction_add。
然后你还必须首先定义一个频道或至少是正确的消息 ID,你这样做:
@commands.Cog.listener()
async def on_raw_reaction_add(self, payload): # added payload
guild = self.bot.get_guild(payload.guild_id)
member = get(guild.members, id=payload.user_id)
# channel and message IDs should be integer:
if payload.channel_id == ChannelID and payload.message_id == messageID:
接下来您需要包含 payload.emoji
并将其粘贴为典型格式,例如:
if str(payload.emoji) == "YourEmoji": # Make sure it is a string
role = get(payload.member.guild.roles, name='NameOfTheRole') # ID is also possible
如果角色存在,我们当然必须添加它,我们这样做:
if role is not None:
await payload.member.add_roles(role)
当然,因为这只是一个例子,还有一些东西需要内置,但这将是事件的近似外壳。
有关更多信息,请参阅文档中的以下内容:RawReactionActionEvent