【问题标题】:How to detect reactions on a DM message? -DSharpPlus如何检测对 DM 消息的反应? -DSharpPlus
【发布时间】:2020-12-03 01:19:25
【问题描述】:

最近,我一直在尝试学习 C#,因此我正在使用 DSharpPlus 来制作 Discord Bot。我对这个机器人的计划是做很多事情,但主要的事情之一是创建一种方法来确保我服务器中的每个人都“同意规则”。我希望它看起来不错,所以我组装了一个 DiscordEmbed 并开始尝试在这个 API 中使用交互性的方法。我想直接向用户 (DMChannel) 发送一条消息,询问他们是否接受使用反应 yesReaction & noReaction 的规则。我尝试了很多方法,但由于某种原因,一旦做出反应,我就无法让WaitForReactionAsync() 继续。下面是我的代码的 sn-p。

一般问题:这可能吗?如果可以,我做错了什么,因为这在我的公会中的正常渠道上有效。

        public async Task<Task> OnMemberJoin(GuildMemberAddEventArgs e)
        {
            var thumbnail = new EmbedThumbnail { Url = e.Client.CurrentUser.AvatarUrl, };
            var rulesEmbed = new DiscordEmbedBuilder
            {
                Title = "Do you accept these rules?",
                Description = "By accepting these rules you agree that if any of the above are broken, it could/will result in a perm ban from G Hub.",
                Thumbnail = thumbnail,
                Color = DiscordColor.Red,
            };

            var message = await e.Member.SendMessageAsync(embed: rulesEmbed);

            var yesEmoji = DiscordEmoji.FromName(e.Client, ":white_check_mark:");
            var noEmoji = DiscordEmoji.FromName(e.Client, ":x:");

            await Task.Delay(1000);

            await message.CreateReactionAsync(yesEmoji);
            await message.CreateReactionAsync(noEmoji);

            await Task.Delay(1000);
            var interactivity = e.Client.GetInteractivity();
            var reactionResult = await interactivity.WaitForReactionAsync(x => 
                x.Message == message, 
                e.Member,
                TimeSpan.FromSeconds(60)
            );

            if (reactionResult.TimedOut)
            {
                var reactionMember = e.Member;
                await e.Guild.BanMemberAsync(reactionMember, 0, "Kicked for declining Rules.");
                await e.Guild.UnbanMemberAsync(e.Member);
                await message.DeleteAsync();
                return Task.CompletedTask;
            }

            if (reactionResult.Result.Emoji == yesEmoji)
            {
                //Guest Role
                var role = e.Guild.GetRole(742143094761324565);
                var roleMember = e.Member;
                await roleMember.GrantRoleAsync(role);
                await message.DeleteAsync();
                return Task.CompletedTask;
            }
            else if (reactionResult.Result.Emoji == noEmoji)
            {
                var role = e.Guild.GetRole(742143094761324565);
                var roleMember = e.Member;
                if (roleMember.Roles.Contains(role))
                {
                    await roleMember.RevokeRoleAsync(role);
                    await e.Guild.BanMemberAsync(roleMember, 0, "Kicked for declining Rules.");
                    await e.Guild.UnbanMemberAsync(roleMember);
                    await message.DeleteAsync();
                }
                return Task.CompletedTask;
            }
            else
            {
                var role = e.Guild.GetRole(742143094761324565);
                var roleMember = e.Member;
                await roleMember.RevokeRoleAsync(role);
                await e.Guild.BanMemberAsync(roleMember, 0, "Kicked for using different emoji in Accepting Rules.");
                await e.Guild.UnbanMemberAsync(roleMember);
                await message.DeleteAsync();
                return Task.CompletedTask;
            }
        }

【问题讨论】:

  • 注意:不需要在任务中返回任务。你的返回类型可以是Task,这意味着你不需要返回Task.CompletedTask。显然,如果您希望它在那时返回,请保留 return;
  • 谢谢,我是这么想的,只是不想搞砸任何事情,因为我对 C# 知之甚少。

标签: c# discord dsharp+


【解决方案1】:

e.Member 在 DM 中不起作用。请改用 e.Message.Author。

var reactionResult = await interactivity.WaitForReactionAsync(x => 
            x.Message == message, 
            e.Message.Author,
            TimeSpan.FromSeconds(60)
        );

【讨论】:

    【解决方案2】:

    你必须在创建机器人后使用DiscordClient.UseInteractivity(),像这样

    var discord = new DiscordClient();
    
    discord.UseInteractivity(new InteractivityConfiguration() 
    { 
        PollBehaviour = PollBehaviour.KeepEmojis,
        Timeout = TimeSpan.FromSeconds(30)
    });
    

    【讨论】:

      猜你喜欢
      • 2021-06-09
      • 2020-06-13
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2021-04-02
      • 2021-10-28
      相关资源
      最近更新 更多