如何使用 Discord.NET 配置 Discord 角色权限?

How do I configure Discord role permissions using Discord.NET?

所以我尝试在 C# 中使用 Discord.NET API 编写 Discord 机器人代码,但我遇到了使用机器人配置角色权限的问题。

我正在尝试通过创建“Muted”角色来执行文本频道静音命令。但是,我不能拒绝 Send Messages 的权限。这是我尝试过的:

// Mute Command:
[Command("mute")]
[RequireUserPermission(GuildPermission.KickMembers)]
[RequireBotPermission(GuildPermission.KickMembers)]
public async Task Mute(IGuildUser user, int duration, string reason)
{
    var role = await Context.Guild.CreateRoleAsync("Muted");
    role.Permissions.SendMessages = false;
    Threading.Sleep(duration);
    await role.DeleteAsync();
}

这是行不通的。

我也试过更换

role.Permissions.SendMessages = false;

role.Permissions.SendMessages.Equal(false);

这也没有用。我查看了 API 文档,但仍未找到解决方案。

有什么解决办法吗?

IRole 中的 Permissions 属性 只有一个 getter,这意味着您不能设置 Permissions 对象或 Permissions 对象中的任何属性,一旦它是被创建。您只能从对象中获取数据。从下图可以看出:

IRole definition

CreateRoleAsync 函数有一个 GuildPermissions 参数(第二个参数),您可以将自定义 GuildPermissions 对象传递给该参数。创建新的 GuildPermissions 实例时,您将需要使用接受大约 20 个参数的构造函数,这些参数都设置了不同的权限。

下面是一些示例代码:

public void CreateRoleWithCustomPermissions()
{
   var myCustomPermissions = new GuildPermissions(false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false, // this one is for sendMessages
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                true,
                                                false,
                                                false,
                                                true,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false,
                                                false);

   var role = await Context.Guild.CreateRoleAsync("Muted", myCustomPermissions);
}

这是一个较短的版本:

foreach (var channel in Context.Guild.Channels)
{
    await channel.AddPermissionOverwriteAsync(role, OverwritePermissions.DenyAll(channel).Modify(viewChannel: PermValue.Allow, readMessageHistory: PermValue.Allow ....and so on));
}

这里是较长的版本:

bool rExist=false;
ulong roleID=0;
   //Check if the role exist
foreach(var gRole in Context.Guild.Roles)
{
 if(gRole.Name.Equals("role name here"))
 {
   rExist=true;
   roleID=gRole.Id;
   break;
 }
}
if(!rExist)
{
  //if the roles doesnt exist u create it and set the perms of the channels
   var mRole = await Context.Guild.CreateRoleAsync(
    "MuteRole", Discord.GuildPermissions.None, 
     Discord.Color.DarkTeal/*what ever color*/,false,null
     );
   try
   {
     await user.AddRoleAsync(mRole);
     foreach (var channel in Context.Guild.Channels)
     {
        await channel.AddPermissionOverwriteAsync(mRole,
        OverwritePermissions.DenyAll(channel).Modify(
        viewChannel:PermValue.Allow, readMessageHistory: PermValue.Allow)
        );
     }
  }
  catch (Exception e)
  {
     //handel error if occures
  }
}else
{
  //if it exist just add it to the user
  var role= Context.Guild.GetRole(roleID);
  await user.AddRoleAsync(role);
  //Check if the role is added to every channel. Same as above
}

注意: 它会将角色添加到服务器中的 EVERY 频道。