因此,我尝试使用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文档,但仍未找到解决方案。
有什么解决办法吗?
答案 0 :(得分:1)
IRole中的Permissions
属性只有一个吸气剂,这意味着一旦创建Permissions
对象,就无法设置权限对象或其中的任何属性。您只能从对象获取数据。您可以从下图看到:
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
}
注意: 它将角色添加到服务器中的每个频道。