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

Discord.NET实现仅管理员可运行命令的方法及示例

Discord.NET 实现管理员专属自定义命令

两种常用实现方案,按需选择即可。


方案1:原生权限特性标记(推荐,代码最简洁)

Discord.NET 的命令模块原生提供RequireUserPermission前置校验特性,直接标记在命令类或方法上,框架会自动在执行命令前完成权限校验,权限不满足的请求不会进入业务逻辑。

using Discord;
using Discord.Commands;
using System.Threading.Tasks;

// 特性打在类上:当前模块下所有命令都要求管理员权限
[Group("manage")]
[RequireUserPermission(GuildPermission.Administrator)]
public class AdminModule : ModuleBase<SocketCommandContext>
{
    // 示例:管理员专用清消息命令
    [Command("purge")]
    [Summary("批量删除当前频道消息,仅管理员可调用")]
    public async Task PurgeAsync(int deleteCount)
    {
        // 执行到这里的用户已经过管理员权限校验,直接写业务逻辑即可
        var msgCollection = await Context.Channel.GetMessagesAsync(deleteCount + 1).FlattenAsync();
        if (Context.Channel is ITextChannel textChannel)
        {
            await textChannel.DeleteMessagesAsync(msgCollection);
            await ReplyAsync($"已删除{deleteCount}条消息");
        }
    }
}

注意:该特性默认仅在服务器频道场景生效,私信场景触发会直接判定校验失败。如果模块整体加了管理员权限限制,单个普通命令要放开权限,可以在对应方法上标记新的RequireUserPermission覆盖上层规则。


方案2:逻辑内手动校验(灵活度更高)

如果需要叠加自定义权限规则(比如额外加白名单、特定身份组判断),可以直接在命令方法内手动拉取用户权限做判断:

[Command("announce")]
[Summary("发布服务器公告")]
public async Task AnnounceAsync([Remainder] string announceContent)
{
    // 先过滤私信场景
    if (Context.Guild == null)
    {
        await ReplyAsync("该命令仅支持在服务器内使用");
        return;
    }
    // 获取当前用户在服务器内的权限信息
    var executor = Context.Guild.GetUser(Context.User.Id);
    // 校验管理员权限
    if (!executor.GuildPermissions.Administrator)
    {
        await ReplyAsync("❌ 你没有管理员权限,无法执行该命令");
        return;
    }

    // 校验通过后执行业务逻辑
    // ...... 你的公告发布代码
    await ReplyAsync("公告已发布");
}

自定义权限不足提示

默认权限校验失败不会主动发提示,可以在初始化CommandService时监听命令执行事件,统一返回权限不足的提示:

// 放在CommandService初始化逻辑后即可
_commandService.CommandExecuted += async (_, context, result) =>
{
    if (!result.IsSuccess && result.Error == CommandError.UnmetPrecondition)
    {
        await context.Channel.SendMessageAsync("操作失败:你需要拥有服务器管理员权限才能执行该命令");
    }
};

注意事项

  • 不要在客户端做权限校验,所有权限判断必须放在Bot服务端逻辑里,避免被恶意篡改请求绕过
  • 如果你的命令支持斜杠命令(Slash Command),同样可以用RequireUserPermission特性做权限校验,框架会自动同步权限配置到Discord后台
  • 管理员权限是服务器级最高权限,如果只需要给用户某类操作权限(比如管理消息、踢人),可以把GuildPermission.Administrator换成对应细分权限枚举值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:27:26