一种向所有服务器成员发送直接消息的方法? Java Discord API

时间:2020-05-03 21:02:08

标签: java discord-jda

我想编写脚本以向所有服务器成员发送私人消息,这可能吗? 我知道如何将DM发送给邮件的作者,而不是发送给所有服务器成员。

1 个答案:

答案 0 :(得分:1)

是的,假设您拥有目标服务器的ID,就可以调用bot的jda实例

jda.getGuildById(<ID>);

或者,只要您有名字,

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

一个名字会返回一个包含所有匹配名字的列表,这很不切实际,因为获取ID很容易。

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

现在您可以致电guild.getMembers()guild.getMemberCache(),您应该选择哪个? guild.getMemberCache()默认情况下效率更高,并且最终实现了Iterable接口,因此出于您的所有意图和目的,使用getMemberCache()应该更好,{{ 1}}是,您将以列表的形式获得它,使得进行更多处理变得微不足道。

现在您有了getMembers()List<Member>,让我们遍历它 这里最简单的选择是MemberCacheView方法,或者对于每个循环来说只是一个:

forEach()

或者:

for (Member member : guild.getMemberCache())

(如果您选择使用guild.getMemberCache().forEach(member -> <DO_SOMETHING>) ,则完全相同)

现在可以实际发送您的消息了:

请记住,我们正在遍历guild.getMembers()对象,但是JDA不允许我们通过它打开私有通道,所以我们需要

Member

请注意,在这里您需要等待同步的PrivateChannel channel = member.getUser().openPrivateChannel().complete(); 并正常接收complete()对象,或者可以在打开PrivateChannel时将使用者传递给queue方法。通道可用后将立即执行:

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();