【问题标题】:How do I configure Discord role permissions using Discord.NET?如何使用 Discord.NET 配置 Discord 角色权限?
【发布时间】:2020-07-17 08:32:48
【问题描述】:

所以我尝试在 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 文档,但仍然没有找到解决方案。

有什么解决办法吗?

【问题讨论】:

  • 您似乎只是在创建角色,并没有将角色分配给任何人。

标签: c# discord discord.net


【解决方案1】:

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);
}

【讨论】:

  • 您可以使用命名参数,而不是在构造函数中列出所有这些布尔参数。
  • 这是我见过的最糟糕的构造函数膨胀案例之一。
【解决方案2】:

这是一个较短的版本:

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
}

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

【讨论】:

    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 2019-02-08
    • 2020-07-17
    • 2020-10-16
    • 2014-01-09
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    相关资源
    最近更新 更多