Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Discord.NET比较角色的更好方法_C#_Warnings_Bots_Discord_Discord.net - Fatal编程技术网

C# Discord.NET比较角色的更好方法

C# Discord.NET比较角色的更好方法,c#,warnings,bots,discord,discord.net,C#,Warnings,Bots,Discord,Discord.net,因此,在我的Discord机器人中,我正在创建一个完整的调节系统,在该系统中,具有适当权限的用户可以向其他用户发出警告,这些警告将被记录,一旦命中3个警告,用户将在设置的时间内静音,这可能会发生5次,并在更长的时间内静音,在第五次静音后,当用户达到3个以上的警告时,它们将被永久禁止。因此,我几乎完成了整个过程,这对于用户的历史查看器等来说没有问题,但我遇到的问题是比较角色。我已经找到了一个解决方案,我不确定它是否能在长期内正常工作,但这是我能想到的唯一方法。我希望它不允许用户警告那些级别高于自己

因此,在我的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
属性: