我想编写一个向所有服务器成员发送私人消息的命令,这是可能的吗?我知道如何将DM发送给消息的作者,但不知道如何发送给所有服务器成员。
发布于 2020-05-15 04:46:04
是的,假设你有你的目标服务器的ID,你可以用它来调用你的机器人的jda实例
jda.getGuildById(<ID>);
或者,如果您只知道名称,也可以使用
jda.getGuildsByName(<NAME>, <CASE_SENSITIVE>)
name one将返回一个包含所有匹配名称的列表,这是非常不切实际的,因为获取ID非常容易。
您可能已经通过其他方式获得了Guild
对象(可能是通过侦听器?),但这并不重要。
Now you can either call guild.getMembers()
or guild.getMemberCache()
which one should you choose? guild.getMemberCache()
is, by default more efficient and in the end it implements the Iterable
interface, so for all your intents and purposes, it should be better to use getMemberCache()
, the benefit of getMembers()
is that you'll get it as a list, making is trivial to do more processing.
现在您有了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<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();
}
https://stackoverflow.com/questions/61581581
复制