如何使用 DiscordSocketClient 获取用户的角色
How To Get a User's Role with a 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.");
}
}
}
}
我收到的错误是未将对象引用设置为对象的实例。我一直试图找到它的来源,但我做不到。谢谢
(是的,我还没有摆脱多余的使用。这段代码还没有完成。)
我也遇到了同样的问题...
据我所知,Linq 需要与 IGuildUser 或 SocketGuildUser 一起使用。
我还无法创建功能代码来检查执行命令的人是否确实具有名为 "Admin" 或其他名称的角色
编辑:这可能有帮助
https://discord.foxbot.me/docs/api/Discord.WebSocket.SocketGuildUser.html
如果您想尝试获取用户的角色,请尝试使用 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();
}
}
}
}
}
这是我踢球的大部分代码。
使用 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();
}
}
}
}
我已经锁定了很长时间如何获得用户的角色,以便我可以设置命令的权限。这是我的代码。我在较新版本中使用 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.");
}
}
}
}
我收到的错误是未将对象引用设置为对象的实例。我一直试图找到它的来源,但我做不到。谢谢
(是的,我还没有摆脱多余的使用。这段代码还没有完成。)
我也遇到了同样的问题... 据我所知,Linq 需要与 IGuildUser 或 SocketGuildUser 一起使用。 我还无法创建功能代码来检查执行命令的人是否确实具有名为 "Admin" 或其他名称的角色 编辑:这可能有帮助 https://discord.foxbot.me/docs/api/Discord.WebSocket.SocketGuildUser.html
如果您想尝试获取用户的角色,请尝试使用 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();
}
}
}
}
}
这是我踢球的大部分代码。
使用 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();
}
}
}
}