You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 14:06:02