java - 一种向所有服务器成员发送直接消息的方法?Java 不和谐 API
问题描述
我想编写一个命令来向所有服务器成员发送私人消息,这可能吗?我知道如何将 DM 发送给消息的作者,但不知道发送给所有服务器成员。
解决方案
是的,你可以,假设你有你的目标服务器的 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();
}
推荐阅读
- node.js - Node.js - AWS - 程序在上传到 S3 存储桶完成之前终止
- rosie-pattern-language - 如何在 Rosie 中匹配一种或另一种模式?
- python-3.x - 在同一行中对变量进行多次赋值(Python 3)
- laravel - 我在终端执行命令,得到这个错误来构建产品表
- xml - 在 emx 文件 (UML2) 中的序列图中使用的标签
- javascript - 在 Array.find() 中使用异步函数
- reactjs - 尝试为权重对象创建唯一 ID
- arrays - Swift Struct 实例在更新其值时发生更改
- django - 没有自定义用户模型的 Django 中的 Authy/Twilio OTP
- unity3d - 由于新版MRTK无法搭建场景