我使用的是当前最新版本的 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));
});
你能告诉我如何达到这个目标的正确方向吗?谢谢
答案 0 :(得分:0)
您可以从 message
本身获取您正在发送消息的当前服务器。 message.guild
返回发送消息的 guild
。
guild
有一个 members
属性,它返回属于这个公会的成员的经理。要获取所有成员,您可以使用 fetch()
方法返回一个承诺并解析为 collection 的成员。集合具有 map()
方法,可用于创建用户名数组。
检查用户是否在线有点棘手。你可以查看他们的presence
。它的 status
属性可以是 online
、idle
、offline
或 dnd
。您可以 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 文档中没有链接或宣传,所以有点混乱。