如何在discord.js机器人自定义状态中显示对应服务器使用的分片编号
实现方案
完全可以实现该需求,以下为discord.js v14 版本的可落地实现逻辑:
实现原理
Discord本身会根据用户所在 guild 对应的分片,向用户展示对应分片实例的机器人状态。只需要在每个分片的客户端实例就绪后,将自身分片编号配置到自定义状态中即可。
代码示例
1. 分片管理主进程代码(sharder.js)
const { ShardingManager } = require('discord.js'); const TOKEN = '你的机器人令牌'; const manager = new ShardingManager('./index.js', { token: TOKEN, // 分片数量填auto会自动根据服务器数量计算最优分片数 totalShards: 'auto' }); manager.on('shardCreate', shard => { console.log(`分片 ${shard.id} 已启动`); }); manager.spawn();
2. 机器人客户端核心代码(index.js)
const { Client, ActivityType } = require('discord.js'); const client = new Client({ intents: [/* 你的意图配置 */] }); client.on('ready', () => { // 读取当前分片编号,单进程单分片场景下直接取第一个值即可 const currentShardId = client.shard.ids[0]; // 设置自定义状态 client.user.setActivity({ name: `Shard ${currentShardId}`, type: ActivityType.Watching }); // 可选:每10分钟刷新一次状态,避免异常丢失 setInterval(() => { client.user.setActivity({ name: `Shard ${currentShardId}`, type: ActivityType.Watching }); }, 10 * 60 * 1000); console.log(`分片 ${currentShardId} 对应的客户端已就绪`); }); client.login();
注意事项
- 如果你使用单进程多分片配置,
client.shard.ids会返回当前进程承载的所有分片编号数组,可自行拼接后展示 - 若使用discord.js v13及更早版本,不需要导入
ActivityType,直接将type属性替换为字符串'WATCHING'即可 - 启动机器人时直接运行sharder.js即可,不需要单独运行index.js
内容的提问来源于stack exchange,提问作者Kris_Zhang
相关产品推荐
相关产品推荐

