discord.py判断消息发送者角色失效,自制Nitro替代机器人无法运行
代码问题分析与修复方案
核心错误原因
- 类型不匹配:你定义的
role是存储字符串的列表,而msg.author.roles返回的是Discord.py库的Role对象集合,直接判断role in msg.author.roles的条件永远不成立,所以功能不会触发。 - 写法逻辑错误:即使你要判断用户是否持有对应名称的角色,也需要提取角色的
name属性进行字符串匹配,不能直接拿字符串/字符串列表和Role对象做包含判断。
修复后的代码示例
# 目标角色名去掉外层列表,直接存字符串 allow_role = "-『🦾』· 𝙽𝙴𝙾𝙽-𝚂𝚝𝚊𝚏𝚏" @bot.listen("on_message") async def nitro(msg): # 先过滤机器人自己发的消息,避免循环触发 if msg.author.bot: return # 判断消息格式符合表情格式,且用户持有指定角色 if msg.content.startswith(":") and msg.content.endswith(":") and any(role.name == allow_role for role in msg.author.roles): emoji_name = msg.content.strip(":") target_emoji = next((e for e in msg.guild.emojis if e.name == emoji_name), None) if target_emoji: await msg.channel.send(f"{msg.author.mention} {str(target_emoji)}") await msg.delete()
额外优化说明
- 增加了机器人自身消息的过滤,避免机器人自己发的消息触发逻辑导致死循环
- 用生成器表达式替换遍历循环匹配表情,匹配效率更高
- 如果你的需求是给没有Nitro的用户开放功能,而非给指定角色用户开放,可以把角色判断条件替换为
not msg.author.premium_since即可。
内容的提问来源于stack exchange,提问作者Mihai Cristian
相关产品推荐
相关产品推荐

