【问题标题】:Discord.NET better way of comparing rolesDiscord.NET 比较角色的更好方法
【发布时间】:2018-11-12 09:39:37
【问题描述】:

因此,在我的 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
        }
    }

如果您知道更好的方法或更有效的方法,请分享,将不胜感激。谢谢。

【问题讨论】:

  • 顺便说一句,您可以通过user.RoleIds.Count 获取用户拥有的角色数量。虽然这包括@everyone 角色。您可以在此处查看IGuildUser.RoleIds 属性:discord.foxbot.me/docs/api/…

标签: c# warnings bots discord discord.net


【解决方案1】:

如果您将用户强制转换为 SocketGuilderUser,那么您可以比较 Hierarchy 属性。 它基本上与您已经在做的事情相同,只是避免了角色循环。

【讨论】:

    【解决方案2】:

    据我所知,我的做法似乎是实际比较角色的唯一方法。过去 4 个小时都在寻找替代方案,但没有找到任何东西。

    我的方法是简单地遍历每个角色并进行比较,我相信 API 已经将角色从高到低排序。然后,您可以使用计数器来比较分配给用户的最高角色的数量。

    比较权限并不总是有效,尤其是在我的情况下,因此我也无法使用该方法。这似乎对我最有效。如果有人有更好的东西可以随意分享,我很想看看我可以如何改进它。

    【讨论】:

      【解决方案3】:

      首先,我想指出 discord.py 有自己的权限比较方法。您可以尝试在您的 C# 代码中运行他们的 python 脚本,或者将其从 python '翻译'成 C#。
      您可以查看他们的源代码以比较权限 here

      就我个人而言,由于我的机器人并不是真正为审核而设计的,所以我采取了一种懒惰的方式,并制作了一个简单的函数,使用嵌套的 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;
      }
      

      如果它们看起来更好,我个人会建议使用其他方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-31
        • 2019-02-08
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        相关资源
        最近更新 更多