我想编写脚本以向所有服务器成员发送私人消息,这可能吗? 我知道如何将DM发送给邮件的作者,而不是发送给所有服务器成员。
答案 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();