首页 > 解决方案 > 一种向所有服务器成员发送直接消息的方法?Java 不和谐 API

问题描述

我想编写一个命令来向所有服务器成员发送私人消息,这可能吗?我知道如何将 DM 发送给消息的作者,但不知道发送给所有服务器成员。

标签: javadiscord-jda

解决方案


是的,你可以,假设你有你的目标服务器的 ID,你可以用它来调用你的机器人的 jda 实例

jda.getGuildById(<ID>);

或者,如果您只有名称,也可以使用

jda.getGuildsByName(<NAME>, <CASE_SENSITIVE>)

name one 将返回一个包含所有匹配名称的列表,这是非常不切实际的,因为获取 ID 非常容易。

您可能以Guild其他方式获得了您的对象(可能是通过侦听器?),这没关系。

现在您既可以打电话,guild.getMembers()guild.getMemberCache()可以选择哪一个? guild.getMemberCache()是,默认情况下更高效,最终它实现了Iterable接口,因此对于您的所有意图和目的,使用它应该更好,这样做getMemberCache()的好处getMembers()是您将它作为一个列表获得,做更多事情是微不足道的加工。

现在你有了List<Member>or MemberCacheView,让我们在这里迭代它,最简单的选择是forEach()方法,或者只是一个 for each 循环:

for (Member member : guild.getMemberCache())

或者:

guild.getMemberCache().forEach(member -> <DO_SOMETHING>)

(如果你选择使用guild.getMembers()它会完全一样)

现在实际发送您的消息:

请记住,我们正在迭代Member对象,但 JDA 不允许我们通过它打开私有通道,所以我们需要

PrivateChannel channel = member.getUser().openPrivateChannel().complete();

注意这里需要等待同步complete()并正常接收PrivateChannel对象,也可以在打开时将消费者传递给队列方法PrivateChannel,该方法将在通道可用时立即执行:

Consumer<PrivateChannel> messageSender = channel -> channel.sendMessage("Hey~~!").queue();
user.openPrivateChannel().queue(messageSender);

或者:

user.openPrivateChannel().queue(channel -> channel.sendMessage("Hey~~!").queue());

现在我们有了频道,发送消息很简单

channel.sendMessage("Hey~~!").queue();

所以把它们放在一起,我们得到:

Guild guild; //Guild you got from a listener, or from the JDA pool

for(Member member : guild.getMemberCache()) { //Iterating over cached members in the guild
   User user = member.getUser(); //Converting the member object to a User

  user.openPrivateChannel().queue(channel->
             channel.sendMessage("Hey~~!").queue()); //Opening the channel and sending the message

   /*  Now you can optionally close the channel to remove it from the JDA's mapping */
   channel.close().queue();
}

推荐阅读