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 ^^