discord.js 如何为所有服务器成员设置10000初始银行数据库值
原有代码问题
- 未正确获取服务器成员列表,
guild.member为无效属性,无法对应到单个用户的唯一标识 - 没有遍历所有成员单独写入数据库,单次写入只能修改一个键值对,无法批量覆盖所有成员的银行数据
- 未做权限校验,任意用户发送指令都可以触发数据修改,存在安全风险
可用实现代码
// discord.js v13+ 需在实例化client时开启GUILD_MEMBERS意图,示例: // const { Client, Intents } = require('discord.js'); // const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS] }); client.on('messageCreate', async message => { // 过滤机器人自身消息,避免重复触发 if (message.author.bot) return; // 仅管理员可触发指令,可根据需求调整权限要求 if (!message.member.permissions.has('ADMINISTRATOR')) return; if (message.content === '#bank') { const targetGuildId = '644523866638647316'; const guild = client.guilds.cache.get(targetGuildId); if (!guild) return message.reply('未找到目标服务器'); try { // 强制拉取全量成员列表,绕过本地缓存限制 const allMembers = await guild.members.fetch({ force: true }); // 遍历所有成员写入数据库 for (const [memberId, member] of allMembers) { // 不需要给机器人设置余额可以保留下面这行,否则删除即可 if (member.user.bot) continue; await db.set(`bank_${memberId}`, 10000); } message.reply('已完成所有成员银行余额设置'); } catch (err) { console.error('批量设置失败:', err); message.reply('设置失败,请检查机器人权限和配置'); } } })
注意事项
- 必须开启
GUILD_MEMBERS特权网关意图:前往Discord开发者平台的机器人管理页,在「Privileged Gateway Intents」分类下开启Server Members Intent,否则无法拉取完整成员列表 - 如果服务器成员数量超过1000,建议增加分批延迟逻辑,每处理100个成员等待1秒,避免触发数据库或Discord API的限流规则
- 如果你使用的是v12及以下版本的discord.js,将事件名改回
message,权限判断调整为message.member.hasPermission('ADMINISTRATOR')即可
内容的提问来源于stack exchange,提问作者Mrburuto Gt
相关产品推荐
相关产品推荐

