Discord.py(非Rewrite版本)如何添加Mute(禁言)命令
嘿,我来帮你搞定Discord.py非Rewrite版本的Mute命令!我整理了一套完整的实现方案,涵盖基础禁言、解除禁言,甚至扩展的临时禁言功能,你可以直接参考调整:
Discord.py非Rewrite版Mute命令实现
核心思路
老版Discord.py里的禁言逻辑,最稳妥的方式是用专属禁言角色控制权限:先在服务器创建一个没有发言权限的角色,通过给用户添加/移除这个角色来实现禁言/解除禁言。同时要做好权限校验,避免误操作(比如禁言管理员、机器人自己)。
完整代码示例
下面是可直接运行的代码,我已经加了详细注释,你只需要替换对应的ID和Token即可:
import discord from discord.ext import commands import asyncio # 初始化机器人,命令前缀可根据你的需求修改 bot = commands.Bot(command_prefix='!') # 替换成你服务器中提前创建好的禁言角色ID MUTE_ROLE_ID = 123456789012345678 @bot.event async def on_ready(): print(f'机器人已登录:{bot.user.name}') # 基础禁言命令 @bot.command(pass_context=True) @commands.has_permissions(manage_roles=True) async def mute(ctx, member: discord.Member, *, reason=None): # 校验:不能禁言权限比自己高/同级的用户 if member.top_role >= ctx.author.top_role: await ctx.send("你没法禁言权限比你高或者和你同级的用户哦!") return # 校验:不能禁言机器人自己 if member == bot.user: await ctx.send("我可不能禁言我自己😅") return # 获取禁言角色 mute_role = ctx.guild.get_role(MUTE_ROLE_ID) if not mute_role: await ctx.send("服务器里找不到指定的禁言角色!请先创建一个无发言权限的角色,再更新ID。") return # 检查用户是否已被禁言 if mute_role in member.roles: await ctx.send(f"{member.mention} 已经处于禁言状态啦!") return # 添加禁言角色 await member.add_roles(mute_role, reason=reason) await ctx.send(f"{member.mention} 已被禁言!\n原因:{reason if reason else '未填写'}") # 解除禁言命令 @bot.command(pass_context=True) @commands.has_permissions(manage_roles=True) async def unmute(ctx, member: discord.Member): mute_role = ctx.guild.get_role(MUTE_ROLE_ID) if not mute_role: await ctx.send("服务器里找不到指定的禁言角色!") return if mute_role not in member.roles: await ctx.send(f"{member.mention} 没有被禁言哦!") return await member.remove_roles(mute_role) await ctx.send(f"{member.mention} 已解除禁言!") # 禁言命令的错误处理 @mute.error async def mute_error(ctx, error): if isinstance(error, commands.MissingPermissions): await ctx.send("你没有管理角色的权限,无法使用禁言命令!") elif isinstance(error, commands.MissingRequiredArgument): await ctx.send("使用格式错误!正确格式:`!mute @目标用户 [禁言原因]`") elif isinstance(error, commands.BadArgument): await ctx.send("找不到这个用户,请确认输入正确!") # 解除禁言命令的错误处理 @unmute.error async def unmute_error(ctx, error): if isinstance(error, commands.MissingPermissions): await ctx.send("你没有管理角色的权限,无法使用解除禁言命令!") elif isinstance(error, commands.MissingRequiredArgument): await ctx.send("使用格式错误!正确格式:`!unmute @目标用户`") elif isinstance(error, commands.BadArgument): await ctx.send("找不到这个用户,请确认输入正确!") # 替换成你的机器人Token,然后运行 bot.run('YOUR_BOT_TOKEN_HERE')
关键细节补充
禁言角色准备:
- 在Discord服务器创建新角色,命名比如「Muted」
- 批量设置所有频道的权限:给这个角色关闭「发送消息」「添加反应」等发言相关权限
- 复制该角色的ID,替换代码中的
MUTE_ROLE_ID
临时禁言扩展:
如果需要临时禁言功能,可以添加这个命令(在上面的代码基础上补充):# 临时禁言命令,时间单位为分钟 @bot.command(pass_context=True) @commands.has_permissions(manage_roles=True) async def tempmute(ctx, member: discord.Member, time: int, *, reason=None): # 重复前面的权限校验和角色检查逻辑 if member.top_role >= ctx.author.top_role: await ctx.send("你没法禁言权限比你高或者和你同级的用户哦!") return if member == bot.user: await ctx.send("我可不能禁言我自己😅") return mute_role = ctx.guild.get_role(MUTE_ROLE_ID) if not mute_role: await ctx.send("服务器里找不到指定的禁言角色!") return if mute_role in member.roles: await ctx.send(f"{member.mention} 已经处于禁言状态啦!") return # 添加禁言角色 await member.add_roles(mute_role, reason=reason) await ctx.send(f"{member.mention} 已被临时禁言 {time} 分钟!\n原因:{reason if reason else '未填写'}") # 等待指定时间后自动解除禁言 await asyncio.sleep(time * 60) if mute_role in member.roles: await member.remove_roles(mute_role) await ctx.send(f"{member.mention} 的临时禁言已到期,已解除禁言!")这个命令的使用格式是:
!tempmute @目标用户 10 刷屏违规(表示禁言10分钟,原因是刷屏违规)
内容的提问来源于stack exchange,提问作者Moog




