长 ID 未正确转换

Long id not being converted correctly

我正在制作一个 discord 机器人,其功能可以接受 id 或提到的用户。但是,当我尝试从 id 获取输入时,我必须将其转换为用户,但转换不正确并且用户无效,因为从用户对象获取值会给我一个错误: 对象引用未设置为对象的实例。

命令用法:

[Command("Add")]
[Summary("Adds a user")]
public async Task BlacklistUser(Discord.WebSocket.SocketGuildUser user)
{
    User_Flow_control userFlow = new User_Flow_control(Context.Client);

    if (await userFlow.AddUser(user.Id, "New User"))
        await ReplyAsync($"Successfully added <@!{user.Id}> as New User");
    else
    {
        await userFlow.UpdateUser(user.Id, "New User");
        await ReplyAsync($"Successfully updated <@!{user.Id}> as New USer");
    }
}
[Command("Add")]
[Summary("Adds a user")]
public async Task BlacklistUser(ulong userId)
{
     User_Flow_control userFlow = new User_Flow_control(Context.Client);

     SocketUser user = Context.Client.GetUser(userId);

    if (await userFlow.AddUser(user.Id, "New User"))
        await ReplyAsync($"Successfully added <@!{userId}> as New User");
    else
    {
        await userFlow.UpdateUser(user.Id, "New User");
        await ReplyAsync($"Successfully updated <@!{userId}> as New User");
    }
}

函数:

public async Task<bool> AddUser(ulong userId, string status = "New User")
{
    Console.WriteLine($"Adding user {_client.GetUser(userId).ToString() /* It would fail here */} ({userId}) to the database.");

    // Ensure that a user profile has not already been created.
    List<DataRow> serverUsers = new List<DataRow>();

    // Start REading database.

    using (SqlConnection connection = new SqlConnection(connectionString))
    using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM MemberServerStatus", connectionString))
    {
        await connection.OpenAsync();

        //get the infraction data
        DataTable serverUsersTable = new DataTable();
        adapter.Fill(serverUsersTable);

        serverUsers.Capacity = serverUsersTable.Rows.Count; //resize it to minimum size

        foreach (DataRow row in serverUsersTable.Rows)
        {
            serverUsers.Add(row);
        }
    }

    // Do the check
    foreach (DataRow row in serverUsers)
    {
        if (Convert.ToUInt64(row[1]) == userId)
            return false;
    }

    // Verified not a duplicate

    // Add the new user

    string query = "INSERT INTO MemberServerStatus VALUES (@Username, @UserId, @Status)";

    using (SqlConnection connection = new SqlConnection(connectionString))
    using (SqlCommand command = new SqlCommand(query, connection))
    {
        await connection.OpenAsync();

        //convert user id
        long longId = Convert.ToInt64(userId);

        //set the values
        command.Parameters.AddWithValue("@Username", _client.GetUser(userId).ToString()); // Fail here.
        command.Parameters.AddWithValue("@UserId", longId);
        command.Parameters.AddWithValue("@Status", status);

        //Execute and add the user into the db
        command.ExecuteNonQuery();
    }

    return true;
}
public async Task UpdateUser(ulong userId, string status)
{
    Console.WriteLine($"Updating user {_client.GetUser(userId).ToString() /* It would fail here */} ({userId}) from the database.");

    string query = "UPDATE MemberServerStatus SET Username = @Username, Status = @Status WHERE UserID = @UserId";

    using (SqlConnection connection = new SqlConnection(connectionString))
    using (SqlCommand command = new SqlCommand(query, connection))
    {
        await connection.OpenAsync();

        //convert user id
        long longId = Convert.ToInt64(userId);

        //set the values
        command.Parameters.AddWithValue("@Username", _client.GetUser(userId).Username); // Fail here.
        command.Parameters.AddWithValue("@UserId", longId);
        command.Parameters.AddWithValue("@Status", status);

        //Execute and add the user into the db
        command.ExecuteNonQuery();
    }
}

我发现我的功能有效,但是,用户需要在同一台服务器上才能进行 ID -> 用户转换。因此,我将不得不更改我的代码以适应这一点。如果有人确实知道如何从机器人与目标用户没有共同服务器的 id 中获取用户,请告诉我。

编辑: 感谢@Anu6is 告诉我有关其余客户端的信息。现在即使没有互通服务器也能获取到用户

我获取没有相互服务器的用户的新代码将使用:

_client.Rest.GetUserAsync(userId).Result

而不是:

_client.GetUser(userId)