微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Discord.Net 角色不会在机器人中更新

如何解决Discord.Net 角色不会在机器人中更新

我正在为 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 个角色,但不是我正在寻找的角色。如果我在使用此命令后重新启动机器人,它只能找到角色。

提前致谢。

解决方法

尝试启用服务器成员意图 - stackoverflow.com/a/64571478/11159372 – Anu6is

谢谢,效果很好^^。

感谢 Anu6is ^^

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。