是的,你可以,假设你有你的目标服务器的 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> 或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的时候给queue方法传一个consumer,马上执行该频道可用:
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();
}