Discord.Net 机器人中的角色不更新
Discord.Net Roles don´t Update in the Bot
我正在为 rainbow6 锦标赛编写 DiscordBot,用户可以使用该机器人创建团队,向其中添加玩家,并且只有团队队长可以编辑团队。如果团队需要更换队长,我写了一个命令 -givecaptian 来更改团队队长和数据库中的一些相关数据。
[Command("givecaptain")]
public async Task givecaptain(string UplayName, [Remainder] string mention = null)
{
if (Context.Channel.Id == TextChannels.TurnierCommands)
{
var guildUser = Context.Guild.GetUser(Context.Message.Author.Id);
if (guildUser.Roles.Contains(Context.Guild.GetRole(Roles.TeamCaptain)))
{
var helper = new SpaceCupDataSetHelper();
var dataSet = helper.GetSpaceCupDataSet();
helper.FillDataSet(dataSet);
SpaceCupDataSet.TeamCaptainRow captain = null;
try
{
captain = dataSet.TeamCaptain.Single(x => x.DCUserID == (long)guildUser.Id);
}
catch
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Du konntest in der Datenbank nicht gefunden werden. Kontaktiere bitte den Support. (-support Grund)");
await Task.Delay(5000);
await m.DeleteAsync();
return;
}
var team = dataSet.Team.Single(x => x.TeamCaptain == captain.CaptainID);
var spieler = dataSet.Spieler.Where(x => x.TeamID == team.TeamID);
SpaceCupDataSet.SpielerRow newCaptainSpieler = null;
SpaceCupDataSet.TeamCaptainRow newCaptain = null;
try
{
if (mention != null)
{
var mentionedID = Convert.ToInt64(mention.Split('!')[1].TrimEnd('>'));
newCaptainSpieler = spieler.Single(x => x.DCUserId == mentionedID);
captain.CaptainName = newCaptainSpieler.UplayName;
captain.DCUserID = mentionedID;
newCaptain = captain;
}
}
catch { }
try
{
if (newCaptain == null)
{
newCaptainSpieler = spieler.Single(x => x.UplayName.TrimEnd(' ') == UplayName);
if (newCaptainSpieler.DCUserId != 0)
{
captain.CaptainName = newCaptainSpieler.UplayName;
captain.DCUserID = newCaptainSpieler.DCUserId;
newCaptain = captain;
}
}
}
catch { }
if (newCaptain != null)
{
try
{
var newUser = Context.Guild.GetUser((ulong)newCaptain.DCUserID);
await newUser.AddRoleAsync(Context.Guild.GetRole(Roles.TeamCaptain));
await guildUser.RemoveRoleAsync(Context.Guild.GetRole(Roles.TeamCaptain));
helper.saveChanges(dataSet);
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Die Rolle wurde erfolgreich übergeben.");
await Task.Delay(3000);
await m.DeleteAsync();
}
catch
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Du musst mit dem Spieler in einem Voicechannel auf diesem Discord sein, um die Rolle zu übergeben.");
await Task.Delay(5000);
await m.DeleteAsync();
}
}
else
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Es konnte kein Spieler gefunden werden. Der Spieler muss bereits in deinem Team sein, damit du die TeamCaptain Rolle übergeben kannst.");
await Task.Delay(5000);
await m.DeleteAsync();
}
}
else
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Du musst der Captain deines Teams sein um die Captainrolle zu übergeben.");
await Task.Delay(5000);
await m.DeleteAsync();
}
}
else
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Bitte nutze den turnier-commands Channel um mit mir zu schreiben.");
await Task.Delay(5000);
await m.DeleteAsync();
}
}
该命令完成了它应该做的事情,它取消了角色并将其重新分配给新的 Discord 用户(如果他在 Discord 上)。
但是如果我之后尝试使用任何其他命令,它就无法在 SocketGuildUser(新的 Teamcaptain)上找到角色。如果我调试它 SocketGuildUser.roles 显示计数为 3,但如果我打开列表它只显示 2 个角色,而不是我正在寻找的角色。使用该命令后重启bot才能找到角色
提前致谢。
尝试启用服务器成员意图 - Whosebug。com/a/64571478/11159372 – Anu6is
感谢完美解决^^。
感谢 Anu6is ^^
我正在为 rainbow6 锦标赛编写 DiscordBot,用户可以使用该机器人创建团队,向其中添加玩家,并且只有团队队长可以编辑团队。如果团队需要更换队长,我写了一个命令 -givecaptian 来更改团队队长和数据库中的一些相关数据。
[Command("givecaptain")]
public async Task givecaptain(string UplayName, [Remainder] string mention = null)
{
if (Context.Channel.Id == TextChannels.TurnierCommands)
{
var guildUser = Context.Guild.GetUser(Context.Message.Author.Id);
if (guildUser.Roles.Contains(Context.Guild.GetRole(Roles.TeamCaptain)))
{
var helper = new SpaceCupDataSetHelper();
var dataSet = helper.GetSpaceCupDataSet();
helper.FillDataSet(dataSet);
SpaceCupDataSet.TeamCaptainRow captain = null;
try
{
captain = dataSet.TeamCaptain.Single(x => x.DCUserID == (long)guildUser.Id);
}
catch
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Du konntest in der Datenbank nicht gefunden werden. Kontaktiere bitte den Support. (-support Grund)");
await Task.Delay(5000);
await m.DeleteAsync();
return;
}
var team = dataSet.Team.Single(x => x.TeamCaptain == captain.CaptainID);
var spieler = dataSet.Spieler.Where(x => x.TeamID == team.TeamID);
SpaceCupDataSet.SpielerRow newCaptainSpieler = null;
SpaceCupDataSet.TeamCaptainRow newCaptain = null;
try
{
if (mention != null)
{
var mentionedID = Convert.ToInt64(mention.Split('!')[1].TrimEnd('>'));
newCaptainSpieler = spieler.Single(x => x.DCUserId == mentionedID);
captain.CaptainName = newCaptainSpieler.UplayName;
captain.DCUserID = mentionedID;
newCaptain = captain;
}
}
catch { }
try
{
if (newCaptain == null)
{
newCaptainSpieler = spieler.Single(x => x.UplayName.TrimEnd(' ') == UplayName);
if (newCaptainSpieler.DCUserId != 0)
{
captain.CaptainName = newCaptainSpieler.UplayName;
captain.DCUserID = newCaptainSpieler.DCUserId;
newCaptain = captain;
}
}
}
catch { }
if (newCaptain != null)
{
try
{
var newUser = Context.Guild.GetUser((ulong)newCaptain.DCUserID);
await newUser.AddRoleAsync(Context.Guild.GetRole(Roles.TeamCaptain));
await guildUser.RemoveRoleAsync(Context.Guild.GetRole(Roles.TeamCaptain));
helper.saveChanges(dataSet);
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Die Rolle wurde erfolgreich übergeben.");
await Task.Delay(3000);
await m.DeleteAsync();
}
catch
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Du musst mit dem Spieler in einem Voicechannel auf diesem Discord sein, um die Rolle zu übergeben.");
await Task.Delay(5000);
await m.DeleteAsync();
}
}
else
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Es konnte kein Spieler gefunden werden. Der Spieler muss bereits in deinem Team sein, damit du die TeamCaptain Rolle übergeben kannst.");
await Task.Delay(5000);
await m.DeleteAsync();
}
}
else
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Du musst der Captain deines Teams sein um die Captainrolle zu übergeben.");
await Task.Delay(5000);
await m.DeleteAsync();
}
}
else
{
await Context.Message.DeleteAsync();
var m = await Context.Channel.SendMessageAsync("Bitte nutze den turnier-commands Channel um mit mir zu schreiben.");
await Task.Delay(5000);
await m.DeleteAsync();
}
}
该命令完成了它应该做的事情,它取消了角色并将其重新分配给新的 Discord 用户(如果他在 Discord 上)。
但是如果我之后尝试使用任何其他命令,它就无法在 SocketGuildUser(新的 Teamcaptain)上找到角色。如果我调试它 SocketGuildUser.roles 显示计数为 3,但如果我打开列表它只显示 2 个角色,而不是我正在寻找的角色。使用该命令后重启bot才能找到角色
提前致谢。
尝试启用服务器成员意图 - Whosebug。com/a/64571478/11159372 – Anu6is
感谢完美解决^^。
感谢 Anu6is ^^