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")
关键修改说明
- 移除矛盾的权限装饰器:删掉
@commands.has_role("Mod"),确保所有用户都能参与抽奖。 - 适配新版本API:
- 用
ctx.guild替代过时的member.server - 使用
member.add_roles(role)替代废弃的bot.add_roles
- 用
- 修复消息发送逻辑:用
ctx.send()替代无效的bot.channel.send - 优化概率逻辑:把
<2改成==1,更直观地体现0.01%的概率逻辑 - 添加角色存在校验:如果目标角色不存在,会给用户明确提示,避免代码崩溃
- 启用Intents配置:Discord.py v2.x版本要求必须开启消息内容意图,否则无法读取用户发送的命令
修改后命令就能正常工作了:用户每天可执行一次,有0.01%概率获得Mod角色,冷却机制也会正常触发提示。
内容的提问来源于stack exchange,提问作者outflit
相关产品推荐
相关产品推荐

