簡體   English   中英

DSharpPlus - 對現有消息的 WaitForReaction

[英]DSharpPlus - WaitForReaction on existing Messages

我正在嘗試使用 DSharpPlus 庫創建一個不和諧的機器人,如果您對帶有特定表情符號的消息做出反應,您將獲得特定的角色。 這個概念非常簡單,但我無法弄清楚一個相當重要的概念。 也就是說,我如何讓機器人一直監聽對現有消息的反應。

我嘗試通過命令來完成它並且我讓它工作了,但是我了解到這種方法的問題是機器人只在我輸入命令后監聽反應並且它只持續一分鍾左右(基於配置)。

public class RoleCommands : BaseCommandModule
{
    [Command("join")]
    public async Task Join(CommandContext ctx)
    {
        var joinEmbed = new DiscordEmbedBuilder
        {
            Title = "Reaction with thumbs up!",
            Color = DiscordColor.Green
        };

        var joinMessage = await ctx.Channel.SendMessageAsync(embed: joinEmbed).ConfigureAwait(false);

        var thumbsUpEmoji = DiscordEmoji.FromName(ctx.Client, ":+1:");
        var thumbsDownEmoji = DiscordEmoji.FromName(ctx.Client, ":-1:");

        await joinMessage.CreateReactionAsync(thumbsUpEmoji).ConfigureAwait(false);
        await joinMessage.CreateReactionAsync(thumbsDownEmoji).ConfigureAwait(false);

        var interactivity = ctx.Client.GetInteractivity();

        var reactionResult = await interactivity.WaitForReactionAsync(x =>
            x.Message == joinMessage
            && x.User == ctx.User
            && x.Emoji == thumbsUpEmoji);

        if (reactionResult.Result.Emoji == thumbsUpEmoji)
        {
            var role = ctx.Guild.GetRole(773965440913375282);
            await ctx.Member.GrantRoleAsync(role).ConfigureAwait(false);

            await joinMessage.DeleteAsync().ConfigureAwait(false);
        }
    }
}

如何在命令之外執行此操作,在該命令中我可以將消息 Id 傳遞給它,然后它會一直偵聽該消息以進行反應,而不是在有限的時間內?

將消息 ID 存儲在某處,然后在DiscordClient上掛鈎MessageReactionAdded事件並在DiscordClient執行邏輯。

我的問題的完整答案是使用DiscordClient.MessageReactionAdded += OnReactionAdded; 並實現該方法:

private async Task OnReactionAdded(DiscordClient sender, MessageReactionRemoveEventArgs e)
{
    var messageId = e.Message.Id;
    var guild = e.Message.Channel.Guild;
    var reactionName = e.Emoji.GetDiscordName();

    var reactionDetail = ReactionDetails.FirstOrDefault(x =>
        x.MessageId == messageId
        && x.GuildId == guild.Id
        && x.ReactionName == reactionName);

    if (reactionDetail != null)
    {
        var member = e.User as DiscordMember;
        if (member != null)
        {
            var role = guild.Roles.FirstOrDefault(x => x.Value.Id == reactionDetail.RoleId).Value;
            await member.GrantRoleAsync(role).ConfigureAwait(false);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM