C# Discord.net任务调用问题
我正在尝试在.NET中创建一个discord bot,使用命令将用户置于标记上。例如,服务器管理员给用户50个标记,用户将删除其所有角色,并将获得一个名为“标记”的角色。然后,会出现一个文本频道,用户需要发送50条垃圾邮件来删除标记,然后他就可以取回所有东西。我已经发出了给出标记和删除标记的命令,但是当我试图通过调用Program.cs中的函数来删除某人的标记时,出于某种原因,它会给出一个空指针异常。代码如下: Program.cs事件:C# Discord.net任务调用问题,c#,.net,discord,discord.net,C#,.net,Discord,Discord.net,我正在尝试在.NET中创建一个discord bot,使用命令将用户置于标记上。例如,服务器管理员给用户50个标记,用户将删除其所有角色,并将获得一个名为“标记”的角色。然后,会出现一个文本频道,用户需要发送50条垃圾邮件来删除标记,然后他就可以取回所有东西。我已经发出了给出标记和删除标记的命令,但是当我试图通过调用Program.cs中的函数来删除某人的标记时,出于某种原因,它会给出一个空指针异常。代码如下: Program.cs事件: private async Task MessageRe
private async Task MessageRecieved(SocketMessage arg)
{
//Checking if the user has markers
var roles = (arg.Author as SocketGuildUser).Roles;
bool imaMarkere = false;
foreach (var role in roles)
{
if (role.Id == 844558286611152917)
imaMarkere = true;
}
if (arg.Channel.Id == 844558185024585770 && imaMarkere)
{
int markerCount = 0;
using (SqliteConnection con = new SqliteConnection(connectionString))
{
con.Open();
string query = $"select markercount from markers";
var com = con.CreateCommand();
com.CommandText = query;
var rdr = com.ExecuteReader();
if (rdr.Read())
{
markerCount += Convert.ToInt32(rdr["markercount"]) - 1;
}
rdr.Close();
//Removing 1 marker per message recieved
if (markerCount > 0)
{
com.CommandText = $"update markers set markercount={markerCount} where userid='{arg.Author.Id}'";
com.ExecuteNonQuery();
}
//If no markers are left returning the user roles
else
{
Commands c = new Commands();
await c.Skini(arg.Author as IGuildUser);
}
con.Close();
}
}
else return;
}
Commands.cs
[Command("skini"), RequireUserPermission(GuildPermission.Administrator, ErrorMessage = "Nemate potrebnu dozvolu ``ADMINISTRATOR``")]
public async Task Skini(IGuildUser user = null)
{
if(user == null)
{
await ReplyAsync($"{Context.User.Mention},kome da skinem?");
}
string rolesString = "";
string[] roles;
using (SqliteConnection con = new SqliteConnection(connectionString))
{
con.Open();
var com = con.CreateCommand();
string readQuery = "select pastroles from markers";
com.CommandText = readQuery;
var rdr = com.ExecuteReader();
if (rdr.Read())
{
rolesString += rdr["pastroles"].ToString();
}
rdr.Close();
string deleteQuery = $"delete from markers where userid = '{user.Id}'";
com.CommandText = deleteQuery;
com.ExecuteNonQuery();
con.Close();
}
roles = rolesString.Split(",");
foreach (var roleid in roles)
{
var role = Context.Guild.GetRole(Convert.ToUInt64(roleid));//this line is where the exception happens
if(!role.IsEveryone)
await user.AddRoleAsync(role);
}
var roleMarkeri = Context.Guild.GetRole(844558286611152917);
await user.RemoveRoleAsync(roleMarkeri);
var EmbedBuilder = new EmbedBuilder()
.WithTitle("**MARKERI**")
.WithColor(Color.Blue)
.WithDescription($":white_check_mark: {Context.User.Mention} je **skinuo** markere {user.Username}")
.WithFooter(footer =>
{
footer
.WithText("Marker log");
});
Embed embed = EmbedBuilder.Build();
await ReplyAsync(embed: embed);
}
您应该尝试创建一个用于SQL连接的字段。如果(arg.Channel.Id==844558185024585770&&imarkere)为真,则在程序开始时初始化连接,这样您就不必每次都连接到它。还有,程序.cs的功能是什么?你能说明代码的哪一部分出错吗?具体哪一行并提供内部异常。错误消息说错误在哪一行?