Как получить роль пользователя с помощью DiscordSocketClient

Я долгое время блокировал, как получить роль пользователя, чтобы я мог устанавливать разрешения для команд. Это мой код. Я использую Discord.NET в более новой версии.

using Discord.Commands;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AmberScript2.Modules
{
    public class Kick : ModuleBase<SocketCommandContext>
    {
        [Command("kick")]
        public async Task KickUser(string userName)
        {
            if (Context.Guild.GetRole(Context.Message.Author.Id).Name == "Administrator")
            {
                await Context.Channel.SendMessageAsync("Success!");
            }
            else
            {
                await Context.Channel.SendMessageAsync("Inadequate permisions.");
            }
        }
    }
}

Ошибка, которую я получаю, - это ссылка на объект, которая не соответствует экземпляру объекта. Я пытался найти его источник и не могу. Спасибо.

(И да, мне еще предстоит избавиться от лишнего использования. Этот код еще не готов.)


person ComedicChimera    schedule 18.07.2017    source источник


Ответы (3)


Если вы хотите попытаться получить роль пользователя, попробуйте использовать SocketGuildUser вместо строки. (Используйте var role = (user as IGuildUser) .Guild.Roles.FirstOrDefault (x => x.Name == "Role");)

using Discord.Commands;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AmberScript2.Modules
{
    public class Kick : ModuleBase<SocketCommandContext>
    {
        [Command("kick")]
        public async Task KickUser(SocketGuildUser userName)
        {
             var user = Context.User as SocketGuildUser;
             var role = (user as IGuildUser).Guild.Roles.FirstOrDefault(x => x.Name == "Role");
             if (!userName.Roles.Contains(role))
             {
            // Do Stuff
            if (user.GuildPermissions.KickMembers)
            {
            await userName.KickAsync();
            }
        }
    }
}
}

Это большая часть моего кода для ударов ногами.

person dVenom HD    schedule 19.07.2017

С помощью строки RequireUserPermission (GuildPermission.KickMembers) вы проверяете, есть ли у пользователя разрешение на удаление участников.

В GuildPermission есть много разных разрешений. Например, GuildPermission.ManageRoles и т. Д.

using Discord.Commands;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AmberScript2.Modules
{
    public class Kick : ModuleBase<SocketCommandContext>
    {
        [Command("kick"), RequireUserPermission(GuildPermission.KickMembers)]
        public async Task KickUser(SocketGuildUser userName)
        {
             var user = Context.User as SocketGuildUser;
             var role = (user as IGuildUser).Guild.Roles.FirstOrDefault(x => x.Name == "Role");
             if (!userName.Roles.Contains(role))
             {
            // Do Stuff
            if (user.GuildPermissions.KickMembers)
            {
            await userName.KickAsync();
            }
        }
    }
}
person D4ryB3rry    schedule 28.04.2018

У меня такая же проблема ... Насколько мне известно, Linq необходимо использовать с IGuildUser или SocketGuildUser. Мне еще не удалось создать работающий код, чтобы проверить, есть ли у человека, выполняющего команду, роль с именем «Admin» или какое-то другое имя. Изменить: это может быть полезно https://discord.foxbot.me/docs/api/Discord.WebSocket.SocketGuildUser.html

person Campiotti    schedule 18.07.2017
comment
Пожалуйста, попробуйте добавить образец кода, подробности в свой ответ. - person Yawar Murtaza; 18.07.2017