You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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')

关键细节补充

  1. 禁言角色准备

    • 在Discord服务器创建新角色,命名比如「Muted」
    • 批量设置所有频道的权限:给这个角色关闭「发送消息」「添加反应」等发言相关权限
    • 复制该角色的ID,替换代码中的MUTE_ROLE_ID
  2. 临时禁言扩展
    如果需要临时禁言功能,可以添加这个命令(在上面的代码基础上补充):

    # 临时禁言命令,时间单位为分钟
    @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

火山引擎 最新活动