Discord.js 获取当前所有公会在线会员用户名

时间:2021-07-25 09:26:49

标签: node.js discord.js

我使用的是当前最新版本的 Discord.js 12.5.3,并针对不同版本尝试了几种不同的方法。

documentation 中我可以看到有两个参数,第一个是“客户端”,第二个是“数据”,它没有指定它需要哪些数据,所以作为第一个有点奇怪是时候构建一个 Discord 机器人了。

我尝试仅在此代码中使用第一个参数:

bot.on("message", async (msg) => {
  if (!isCommand(msg) || msg.author.bot) return;

  const guild = new Discord.Guild(bot);
  console.log(guild);

});

然后我明白了:

<ref *1> Guild {
  members: GuildMemberManager {
    cacheType: [class Collection extends Collection],
    cache: Collection(0) [Map] {},
    guild: [Circular *1]
  },
  channels: GuildChannelManager {
    cacheType: [class Collection extends Collection],
    cache: Collection(0) [Map] {},
    guild: [Circular *1]
  },
  roles: RoleManager {
    cacheType: [class Collection extends Collection],
    cache: Collection(0) [Map] {},
    guild: [Circular *1]
  },
  presences: PresenceManager {
    cacheType: [class Collection extends Collection],
    cache: Collection(0) [Map] {}
  },
  voiceStates: VoiceStateManager {
    cacheType: [class Collection extends Collection],
    cache: Collection(0) [Map] {},
    guild: [Circular *1]
  },
  deleted: false
}

然后我尝试console.log(guild.members);

我明白了

<ref *1> GuildMemberManager {
  cacheType: [class Collection extends Collection],
  cache: Collection(0) [Map] {},
  guild: <ref *2> Guild {
    members: [Circular *1],
    channels: GuildChannelManager {
      cacheType: [class Collection extends Collection],
      cache: Collection(0) [Map] {},
      guild: [Circular *2]
    },
    roles: RoleManager {
      cacheType: [class Collection extends Collection],
      cache: Collection(0) [Map] {},
      guild: [Circular *2]
    },
    presences: PresenceManager {
      cacheType: [class Collection extends Collection],
      cache: Collection(0) [Map] {}
    },
    voiceStates: VoiceStateManager {
      cacheType: [class Collection extends Collection],
      cache: Collection(0) [Map] {},
      guild: [Circular *2]
    },
    deleted: false
  }
}

其中缓存是 Collection(0) [Map] {}

console.log(guild.members.guild.members);

给出与 console.log(guild.members); 相同的输出

所有标记为有效的代码块都来自旧版本或对我不起作用。

我在猜测是否需要在其他地方登录机器人,但只要消息回复有效......这是参考代码:

const Discord = require("discord.js");
const bot = new Discord.Client({ disableMentions: "everyone" });
const dotenv = require("dotenv");
dotenv.config();

bot.login(process.env.token);

// event handlers
bot.once("ready", () => {
  console.log("Ready!");
});

bot.on("message", async (msg) => {
  if (!isCommand(msg) || msg.author.bot) return;

  /* 
  // get guild online member usernames
  
  const guild = new Discord.Guild(bot);
  console.log(guild.members);
   */

  msg.reply(handle(msg.content, msg.author.username));
});

你能告诉我如何达到这个目标的正确方向吗?谢谢

2 个答案:

答案 0 :(得分:0)

您可以从 message 本身获取您正在发送消息的当前服务器。 message.guild 返回发送消息的 guild

guild 有一个 members 属性,它返回属于这个公会的成员的经理。要获取所有成员,您可以使用 fetch() 方法返回一个承诺并解析为 collection 的成员。集合具有 map() 方法,可用于创建用户名数组。

检查用户是否在线有点棘手。你可以查看他们的presence。它的 status 属性可以是 onlineidleofflinednd。您可以 filter 上面创建的数组,并且只返回状态不是 offline 的数组。

这样的事情应该可以工作:

bot.on('message', async (msg) => {
  if (!isCommand(msg) || msg.author.bot) return;

  let { guild: { members } } = msg;
  let allMembers = await members.fetch();
  let onlineUsers = allMembers.filter((member) => member.presence.status !== 'offline');
  let usernames = onlineUsers.map((member) => member.displayName);

  // array of usernames of users who are not offline
  console.log(usernames);
});

答案 1 :(得分:0)

已解决:

我发现我需要在 Discord 开发者门户 -> bot 中启用 Privileged Gateway Intents

然后像这样设置机器人:

const Discord = require("discord.js");
const bot = new Discord.Client({ disableMentions: "everyone", ws: { Intents: ["GUILD_MEMBERS", "GUILD_PRESENCES"] } });

最后我可以让在线公会用户不是机器人

bot.on("message", async (msg) => {
  if (!isCommand(msg) || msg.author.bot) return;

  let {
    guild: { members },
  } = msg;

  let allMembers = await members.fetch();
  let onlineUsers = allMembers.filter((member) => member.presence.status !== "offline");
  let availableUsers = onlineUsers.filter((member) => !member.user.bot);
  let usernames = availableUsers.map((member) => member.displayName);

  console.log(usernames);

  msg.reply(handle(msg.content, msg.author.username));
});

所以这是关于权限和一些调整。这在 Discord.js 文档中没有链接或宣传,所以有点混乱。