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

Discord.py 带冷却机制的低概率角色授予命令故障排查及代码优化求助

问题排查与代码优化

我帮你梳理下代码里的几个关键问题,这些正是导致命令无法正常工作的核心原因:

  • 权限校验逻辑矛盾:你给命令加了@commands.has_role("Mod"),这意味着只有已经拥有"Mod"角色的用户才能执行这个命令,但你的需求是给用户授予该角色,这完全相悖,必须移除这个装饰器。
  • 过时的API调用:Discord.py v1.x及之后的版本里,member.server已被替换为member.guild,旧写法会触发属性错误;同时bot.add_roles也已过时,应该使用member.add_roles()方法。
  • 错误的消息发送方式:bot.channel.send是无效调用,正确的做法是用ctx.send()或ctx.channel.send()回复用户。
  • 缺少角色存在性校验:如果服务器里不存在名为"Mod"的角色,代码会直接报错,最好添加判断处理这种边界情况。

修正后的完整代码

import discord
from discord.ext import commands
import random

# 初始化Bot,适配Discord.py v2.x版本的Intents要求
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix=">", intents=intents)

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.CommandOnCooldown):
        msg = f'请等待 {error.retry_after:.2f} 秒后再试'
        await ctx.send(msg)
    elif isinstance(error, commands.CommandError):
        await ctx.send(f"命令执行出错:{str(error)}")
    else:
        print(f"未处理的错误: {error}")

@bot.command()
@commands.cooldown(1, 86400, commands.BucketType.user)  # 单用户每日冷却
async def addrole(ctx):
    # 0.01%概率:1-10000中仅随机到1时触发(1/10000=0.01%)
    if random.randint(1, 10000) == 1:
        member = ctx.author
        # 获取目标角色
        role = discord.utils.get(ctx.guild.roles, name="Mod")
        if not role:
            await ctx.send("服务器中不存在名为「Mod」的角色,请检查角色名称拼写!")
            return
        # 为用户添加角色
        await member.add_roles(role)
        await ctx.send(f"恭喜 {member.mention}!你成功获得了Mod角色!")
    else:
        await ctx.send("很遗憾,这次没有抽到Mod角色,明天再来试试吧!")

# 替换为你的Bot Token
bot.run("YOUR_BOT_TOKEN_HERE")

关键修改说明

  1. 移除矛盾的权限装饰器:删掉@commands.has_role("Mod"),确保所有用户都能参与抽奖。
  2. 适配新版本API:
    • 用ctx.guild替代过时的member.server
    • 使用member.add_roles(role)替代废弃的bot.add_roles
  3. 修复消息发送逻辑:用ctx.send()替代无效的bot.channel.send
  4. 优化概率逻辑:把<2改成==1,更直观地体现0.01%的概率逻辑
  5. 添加角色存在校验:如果目标角色不存在,会给用户明确提示,避免代码崩溃
  6. 启用Intents配置:Discord.py v2.x版本要求必须开启消息内容意图,否则无法读取用户发送的命令

修改后命令就能正常工作了:用户每天可执行一次,有0.01%概率获得Mod角色,冷却机制也会正常触发提示。

内容的提问来源于stack exchange,提问作者outflit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:27:36