如何使用 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 频道。
所以我尝试在 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 频道。