如何解决如何检测对DM消息的反应? -DSharpPlus
最近,我一直在尝试学习C#,因此我正在使用DSharpPlus制作Discord Bot。我对该机器人的计划是做很多事情,但是主要的事情之一是创建一种方法来确保服务器中的每个人都“同意规则”。我希望它看起来不错,所以我整理了一个DiscordEmbed,并开始尝试可以在此API中使用交互性的方式。我想直接向用户(DMChannel)发送一条消息,询问他们是否使用反应yesReaction & noReaction
接受规则。我已经尝试了很多方法,但是由于某种原因,一旦做出反应,我就无法继续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,"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,"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,"Kicked for using different emoji in Accepting Rules.");
await e.Guild.UnbanMemberAsync(roleMember);
await message.DeleteAsync();
return Task.CompletedTask;
}
}
解决方法
e.Member
在DM中不起作用。改用e.Message.Author。
var reactionResult = await interactivity.WaitForReactionAsync(x =>
x.Message == message,e.Message.Author,TimeSpan.FromSeconds(60)
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。