长 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)
我正在制作一个 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)