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

时间:2020-04-05 10:34:24

标签: c# discord discord.net

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

我正在尝试通过创建“ 静音”角色来使文本频道静音命令。但是,我不能拒绝对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文档,但仍未找到解决方案。

有什么解决办法吗?

2 个答案:

答案 0 :(得分:1)

IRole中的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);
}

答案 1 :(得分:0)

这是一个简短的版本:

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;
 }else
 {
  continue;
 }
}
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
}

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