C# Discord.NET比较角色的更好方法
因此,在我的Discord机器人中,我正在创建一个完整的调节系统,在该系统中,具有适当权限的用户可以向其他用户发出警告,这些警告将被记录,一旦命中3个警告,用户将在设置的时间内静音,这可能会发生5次,并在更长的时间内静音,在第五次静音后,当用户达到3个以上的警告时,它们将被永久禁止。因此,我几乎完成了整个过程,这对于用户的历史查看器等来说没有问题,但我遇到的问题是比较角色。我已经找到了一个解决方案,我不确定它是否能在长期内正常工作,但这是我能想到的唯一方法。我希望它不允许用户警告那些级别高于自己的人。这是我的代码:C# Discord.NET比较角色的更好方法,c#,warnings,bots,discord,discord.net,C#,Warnings,Bots,Discord,Discord.net,因此,在我的Discord机器人中,我正在创建一个完整的调节系统,在该系统中,具有适当权限的用户可以向其他用户发出警告,这些警告将被记录,一旦命中3个警告,用户将在设置的时间内静音,这可能会发生5次,并在更长的时间内静音,在第五次静音后,当用户达到3个以上的警告时,它们将被永久禁止。因此,我几乎完成了整个过程,这对于用户的历史查看器等来说没有问题,但我遇到的问题是比较角色。我已经找到了一个解决方案,我不确定它是否能在长期内正常工作,但这是我能想到的唯一方法。我希望它不允许用户警告那些级别高于自己
public class Warn : ModuleBase<SocketCommandContext>
{
[Command("Warn")]
public async Task WarnMain([Remainder, Summary("Warn a user for a reason.")] IGuildUser user, string warnInfo)
{
var userRole = -1;
var victimRole = -1;
var counter = 0;
foreach(var role in Context.Guild.Roles)
{
if (Context.Guild.GetUser(Context.User.Id).Roles.Contains(role) && userRole == -1)
{
userRole = counter;
}
if (Context.Guild.GetUser(user.Id).Roles.Contains(role) && victimRole == -1)
{
victimRole = counter;
}
}
if (userRole < victimRole)
// blah blah
}
}
公共类警告:ModuleBase
{
[命令(“警告”)]
公共异步任务WarnMain([余数,摘要(“警告用户原因”)]IGuildUser用户,字符串warnInfo)
{
var userRole=-1;
var victimRole=-1;
var计数器=0;
foreach(Context.Guild.Roles中的var角色)
{
if(Context.Guild.GetUser(Context.User.Id).Roles.Contains(role)&&userRole==-1)
{
userRole=计数器;
}
if(Context.Guild.GetUser(user.Id).Roles.Contains(role)&&victimRole==-1)
{
受害者角色=计数器;
}
}
如果(用户角色<受害者角色)
//废话
}
}
如果您知道更好的方法或更有效的方法,请分享,将不胜感激。谢谢。首先,我想指出discord.py有自己的权限比较方法。您可以尝试在C#代码中运行他们的python脚本,或者将其从python“翻译”为C#。
您可以查看他们的源代码以比较权限 就我个人而言,由于我的bot并不是真正为调节而设计的,所以我采取了懒惰的方式,制作了一个简单的函数,使用嵌套的if-else语句比较权限
private static bool PermissionComparison(GuildPermissions targetGuildPerms, GuildPermissions userGuildPerms)
{
//True if the target has a higher role.
bool targetHasHigherPerms = false;
//If the user is not admin but target is.
if(!userGuildPerms.Administrator && targetGuildPerms.Administrator) {
//The target has higher permission than the user.
targetHasHigherPerms = true;
} else if(!userGuildPerms.ManageGuild && targetGuildPerms.ManageGuild) {
targetHasHigherPerms = true;
} else if(!userGuildPerms.ManageChannels && targetGuildPerms.ManageChannels) {
targetHasHigherPerms = true;
} else if(!userGuildPerms.BanMembers && targetGuildPerms.BanMembers) {
targetHasHigherPerms = true;
} else if(!userGuildPerms.KickMembers && targetGuildPerms.KickMembers) {
targetHasHigherPerms = true;
}
return targetHasHigherPerms;
}
我个人建议,如果其他方法看起来更好的话,可以使用其他方法。就我所知,我这样做似乎是真正比较角色的唯一方法。在过去的4个小时里,他一直在寻找替代品,但没有发现任何问题 我的方法是简单地遍历每个角色并进行比较,我相信API已经将角色从最高的第一个排序到最低的最后一个。然后,您可以使用计数器比较分配给用户的最高角色所在的编号
比较权限并不总是有效的,特别是在我的情况下,因此我也不能使用该方法。这似乎对我最有效。如果任何人有更好的东西可以随意分享,我很想看看如何改进它。如果将用户强制转换为SocketGuiderUser,则可以比较Hierarchy属性。
这基本上与您正在做的相同,只是避免了角色循环。顺便说一句,您可以执行
user.RoleIds.Count
来获取用户拥有的角色数量。尽管这包括@everyone
角色。您可以在此处检查IGuildUser.RoleIds
属性: