C# 如何检测对DM消息的反应-Dsharplus

C# 如何检测对DM消息的反应-Dsharplus,c#,discord,dsharp+,C#,Discord,Dsharp+,最近,我一直在尝试学习C#,为此我使用DSharpPlus制作了一个Discord机器人。我使用这个机器人的计划是做很多事情,但其中一个主要的事情是创建一种方法来确保我的服务器中的每个人都“同意规则”。我希望这看起来不错,所以我把一个discorded放在一起,开始尝试在这个API中使用交互性的方法。我想直接向用户(DMChannel)发送一条消息,询问他们是否接受使用reactionsyesReaction&norreaction的规则。我已经尝试了很多方法,但由于某些原因,一旦做出反应,我就

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

一般问题:这可能吗?如果可能的话,我做错了什么,因为这在我的公会正常渠道中起作用

        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;
            }
        }
OnMemberJoin上的公共异步任务(GuildMemberAddEventArgs e)
{
var thumbnail=newembedThumbnail{Url=e.Client.CurrentUser.AvatarUrl,};
var rulesEmbed=新的DiscordEmbedBuilder
{
Title=“您接受这些规则吗?”,
Description=“通过接受这些规则,您同意如果上述任何一项被违反,可能/将导致G Hub的烫发禁令。”,
缩略图=缩略图,
颜色=不协调的颜色。红色,
};
var message=await e.Member.SendMessageAsync(嵌入:rulesEmbed);
var yesEmoji=DiscordEmoji.FromName(例如客户机:“:白色复选标记:”);
var noEmoji=DiscordEmoji.FromName(e.Client,“:x:”);
等待任务。延迟(1000);
等待消息。CreateReactionSync(YesMoji);
等待消息。CreateReactionAsync(noEmoji);
等待任务。延迟(1000);
var interactivity=e.Client.GetInteractivity();
var reactionResult=wait interactivity.waitforreactionsync(x=>
x、 消息==消息,
e、 委员:,
时间跨度。从秒(60)
);
if(reactionResult.TimedOut)
{
var reactionMember=e.成员;
等待e.Guild.BanMemberAsync(reactionMember,0,“因拒绝规则而被踢”);
等待e.Guild.UnbanMemberAsync(e.Member);
等待消息。DeleteAsync();
返回Task.CompletedTask;
}
if(reactionResult.Result.Emoji==YesMoji)
{
//来宾角色
var-role=e.Guild.GetRole(742143094761324565);
var roleMember=e.成员;
等待角色成员GrantRoleAsync(角色);
等待消息。DeleteAsync();
返回Task.CompletedTask;
}
else if(reactionResult.Result.Emoji==noEmoji)
{
var-role=e.Guild.GetRole(742143094761324565);
var roleMember=e.成员;
if(rolememember.Roles.Contains(role))
{
等待roleMember.RevokeRoleAsync(角色);
等待e.Guild.BanMemberAsync(roleMember,0,“因拒绝规则而被踢”);
等待e.Guild.UnbanMemberAsync(roleMember);
等待消息。DeleteAsync();
}
返回Task.CompletedTask;
}
其他的
{
var-role=e.Guild.GetRole(742143094761324565);
var roleMember=e.成员;
等待roleMember.RevokeRoleAsync(角色);
等待e.Guild.BanMemberAsync(roleMember,0,“因为在接受规则时使用不同的表情符号而被踢了一脚”);
等待e.Guild.UnbanMemberAsync(roleMember);
等待消息。DeleteAsync();
返回Task.CompletedTask;
}
}

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

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

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

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

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