【问题标题】:A way to send Direct Message to all Server Members? Java Discord Api一种向所有服务器成员发送直接消息的方法? Java 不和谐 API
【发布时间】:2020-08-18 06:01:11
【问题描述】:

我想编写一个命令来向所有服务器成员发送私人消息,这可能吗? 我知道如何将 DM 发送给消息的作者,但不知道发送给所有服务器成员。

【问题讨论】:

  • 是的,您可以获取每个公会成员并通过循环向他们发送消息。顺便说一句,您使用的是 JDA 还是 Discord4J?
  • @AnimeshSahu JDA=Java Discord Api.
  • @KlemensMorbe 是的
  • 如果你实现了任何监听器,检查事件。该事件有一个 JDA 实例,它有一个所有公会/服务器成员的列表。见ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/api/JDA.html
  • 大声笑我没有问这个问题xDD

标签: java discord-jda


【解决方案1】:

是的,你可以,假设你有你的目标服务器的 ID,你可以调用你的机器人的 jda 实例

jda.getGuildById(<ID>);

或者如果你只有名字,也可以用

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

name one 将返回一个包含所有匹配名称的列表,这是非常不切实际的,因为获取 ID 非常容易。

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

现在您可以拨打guild.getMembers()guild.getMemberCache() 选择哪一个? guild.getMemberCache() 默认情况下更高效,最终它实现了Iterable 接口,因此对于您的所有意图和目的,最好使用getMemberCache()getMembers() 的好处是您将把它作为一个列表,做更多的处理是微不足道的。

现在你有了List&lt;Member&gt;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();
}

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2020-03-13
    相关资源
    最近更新 更多