Discord .NET лучший способ сравнения ролей - PullRequest
0 голосов
/ 02 июня 2018

Итак, в моем боте 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
        }
    }

Если вы знаете лучший способ или более эффективный способ сделать это, пожалуйста, поделитесь, будет очень признателен.Спасибо.

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

Кажется, способ, которым я это сделал, - единственный способ сравнить роли, насколько я могу судить.Потратил последние 4 часа на поиски альтернатив, но ничего не нашел.

Мой метод просто просматривает каждую роль и сравнивает, я считаю, что API уже сортирует роли по возрастанию с наименьшего на наименьшее.Затем вы можете использовать счетчик для сравнения номеров, для которых найдена самая высокая роль, назначенная пользователю.

Сравнение разрешений не всегда работает, особенно в моем случае, поэтому я не мог использовать этот методили.Кажется, это работает лучше всего для меня.Если у кого-то есть что-то лучше, не стесняйтесь поделиться, я хотел бы посмотреть, как я могу улучшить это.

0 голосов
/ 02 июля 2018

Если вы приведете пользователя к SocketGuilderUser, вы сможете сравнить свойство Hierarchy.По сути, это то же самое, что вы уже делаете, просто избегаете повторения ролей.

0 голосов
/ 02 июня 2018

Прежде всего, я хотел бы отметить, что у discord.py есть свой собственный метод сравнения разрешений.Вы можете попробовать запустить их скрипт на языке Python в своем коде на C # или «перевести» его с языка Python на C #.
Вы можете проверить их исходный код для сравнения разрешений здесь .

Лично для меня, так как мой бот на самом деле не создан для модерации, я выбрал ленивый выход и сделал простую функцию, которая сравнивает разрешения, используя вложенные операторы 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;
}

Я бы лично предложил использоватьдругие методы вместо этого, если они кажутся лучше.

...