c# - 尝试从 IGuild 获取 IGuildUser 时如何修复 "Nullpointer Exception"

标签 c# discord.net

我不知道我从根本上做错了什么。

我正在尝试检查用户是否在某个服务器上(通过 UserID 和 ServerID),然后检查他的权限。

使用后DiscordSocketClient.GetGuild(serverid)我得到一个 IGuild(它不是空的,我可以看到它的 ID)。但是当我尝试通过 IGuild.Users 获取用户时我得到一个空列表(IGuild.GetUserAsync() 返回一个空的 GuildUser)。

我必须先做些什么来加载它们吗?

    public IGuildUser GetUserFromServer(ulong userid, ulong serverid) {
        IGuildUser gu = null;
        try {
            IGuild g = _client.GetGuild(serverid);
            Console.WriteLine("GuildID: "+g.Id);
            gu=g.GetUserAsync(userid).Result;
            Console.WriteLine("UserID: "+gu.Id);
            } catch(Exception e) { 
                Console.WriteLine(e.Message); 
            }
        return gu;
    }

编辑 1:gu 为空且 Task<IGuildUser>.Status返回 RanToCompletion

最佳答案

你的代码可以这样写

public IGuildUser GetUserFromServer(ulong userid, ulong serverid) 
{ 
    return _client.GetGuild(serverid)?.GetUser(userid); 
}

如果找不到给定 id 的公会,则返回 null,否则尝试检索用户。该方法将返回 null(如果未找到用户)或将用户作为 IGuildUser。
有可能用户实际上在公会中,但他们不在缓存中,在这种情况下,您可以回退到休息请求。

public async Task<IGuildUser> GetUserFromServer(ulong userid, ulong serverid)
{
    return _client.GetGuild(serverid)?.GetUser(userid) ?? await _client.Rest.GetGuildUserAsync(serverid, userid);
}

使用此选项,如果您无法从缓存中检索用户,则执行休息请求以确认用户确实不是公会成员。您可以通过访问作为 DiscordSocketClient

上的属性公开的 DiscordSocketRestClient 来执行此操作

关于c# - 尝试从 IGuild 获取 IGuildUser 时如何修复 "Nullpointer Exception",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57923738/

相关文章:

c# - 将 Identity 2.0 角色添加到自定义身份

c# - 网络表单 MVP : What is presenters responsibility

C# 显式类型转换枚举

c# - C#中的连续消息发送

c# - 从 System.Net.WebRequest 获取完整的响应正文

c# - 更改机器人discordbot C#上的昵称

c# - 除非在一定时间内未调用函数,否则计时器不会启动

c# - 将 guildUserProperties.Mute 设置为 false 时,Bot 不会取消用户静音

c# - Discord.net 服务器响应错误 50001 : Missing Access

c# - 是否保证 Dictionary.Values 按添加顺序返回元素?