【问题标题】:How to send a DM to someone WITH response in JDA如何在 JDA 中向有响应的人发送 DM
【发布时间】:2021-11-28 23:32:46
【问题描述】:

我正在我的 Discord Bot 中编写反馈功能,当有人离开时,应该向他们发送一条消息,询问他们离开的原因。

event.getUser().openPrivateChannel()
                .flatMap(channel -> channel.sendMessage("Hello, we are sorry you're leaving "+event.getGuild().getName()+", if you don't mind, please tell us why you left or leave any other feedback here, it'll help us improve the server and improve experience for you if you re-join again in the future.\n\nThank you ❤."))
                .queue();

上面的代码负责发送,我尝试在私有通道中创建状态机但没有成功:


import bot.Main;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;

public class Feedback extends ListenerAdapter {
    private final long channelId, authorId;

    public Feedback(MessageChannel channel, User author) {
        this.channelId = channel.getIdLong();
        this.authorId = author.getIdLong();
    }

    @Override
    public void onMessageReceived(MessageReceivedEvent event) {
        if (event.getAuthor().isBot()) return;
        if (event.getAuthor().getIdLong() != authorId) return;
        if (event.getChannel().getIdLong() != channelId) return;
        MessageChannel channel = event.getChannel();
        String content = event.getMessage().getContentRaw();
        event.getChannel().sendMessage("Thanks for your feedback!").queue();
        EmbedBuilder feedback = new EmbedBuilder();
        feedback.setTitle("Automated System Operations - Leaving Feedback");
        feedback.addField("Feedback", content, false);
        feedback.setColor(0xC90004);
        feedback.setAuthor(event.getAuthor().getAsTag()+" - "+event.getAuthor().getId(), "https://support.discord.com/hc/en-us/articles/209572128-How-do-I-log-out-", event.getAuthor().getAvatarUrl());
        feedback.setImage("https://media.discordapp.net/attachments/894913784823566428/896323821336948736/unknown.png?width=384&height=192");
        Main.jda.getGuildById("894913620868202506").getTextChannelById("896322509874540545").sendMessage(feedback.build()).queue();
    }
}

我得到了这个事件状态机频道,但我不知道如何在 DMs 中addListener

接受任何帮助

【问题讨论】:

    标签: java discord discord-jda


    【解决方案1】:

    您永远不必猜测如何使用库 - 这就是文档的用途。任何值得一提的库都有文档列出您需要担心的每个类、方法和属性。

    在 Google 上快速搜索“discord-jda docs”会将我们带到 JavaDoc:https://ci.dv8tion.net/job/JDA/javadoc/index.html

    您想向用户发送消息,对吗?所以让我们使用搜索栏并找到用户。类型下的第一个结果是net.dv8tion.jda.API.entities.User。我们现在在https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/api/entities/User.html

    如果您想知道如何与用户做某事,我们会查看每个用户拥有的方法。两个立刻引起了我的注意:User.hasPrivateChannel()User.openPrivateChannel()。我们将点击第二个,因为它看起来很相关。

    瞧,文档有示例用法!我将在下面引用它:

    // Send message without response handling
    public void sendMessage(User user, String content) {
        user.openPrivateChannel()
            .flatMap(channel -> channel.sendMessage(content))
            .queue();
    

    } 这似乎很简单。所以你正在寻找的基本用法(假设eventMessageReceivedEvent)是这样的:

    event.getAuthor().openPrivateChannel().flatMap(channel -> channel.sendMessage("hello")).queue();
    

    【讨论】:

    • 你复制了一个答案..?
    • 抱歉,这并不能解决我的问题,我希望用户能够回复并发送用户的反馈(如果他发送任何反馈)。
    【解决方案2】:

    您可以使用JDA#addEventListener添加状态机事件监听器:

    event.getUser().openPrivateChannel().flatMap(channel -> {
      event.getJDA().addEventListener(new Feedback(channel, event.getUser()));
      return channel.sendMessage("hello");
    }).queue();
    

    我建议您在收到event.getJDA().removeEventListener(this); 的回复后删除您的事件监听器

    【讨论】:

    • 谢谢!有帮助!
    猜你喜欢
    • 2021-12-22
    • 2020-06-12
    • 2021-03-03
    • 2017-10-21
    • 2021-06-13
    • 2019-09-09
    • 2022-01-11
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多