Discord锦标赛机器人优化:实现用户换行列表与无提醒提及
解决锦标赛机器人的两个问题:换行显示用户列表与无通知提及
1. 让每个用户单独显示在新行
你当前的代码里,直接把users数组拼进字符串时,数组会默认调用toString()方法生成逗号分隔的列表,这就是为什么换行符只在标题后生效的原因。要让每个用户单独占一行,得手动把数组元素用换行符\n连接起来。
修改后的代码可以这样写:
// 先获取有效用户(过滤掉不存在的用户,避免报错) const users = data.players.map(userId => client.users.get(userId)).filter(user => user); // 将每个用户转换为字符串,并用换行符连接 const userList = users.map(user => `<@!${user.id}>`).join('\n'); // 发送消息 message.channel.send(`Current Participants:\n${userList}`);
如果更习惯用for循环,也可以调整成:
var users = []; for (let i = 0; i < data.players.length; i++) { const user = client.users.get(data.players[i]); if (user) { // 确保用户存在再添加,避免无效数据干扰 users.push(user); } } const userList = users.map(user => `<@!${user.id}>`).join('\n'); message.channel.send(`Current Participants:\n${userList}`);
2. 实现无通知的用户提及
要达成类似Discord客户端中\@Username的无通知提及效果,你需要在标准的用户提及格式前加一个反斜杠。标准用户提及格式是<@!用户ID>,在JavaScript字符串里需要转义反斜杠,所以写成<\\@!${user.id}>。
把上面的userList生成代码修改一下就行:
const userList = users.map(user => `<\\@!${user.id}>`).join('\n');
这样发送后,消息会显示成@用户名的样式,但不会触发用户的通知提醒,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Chris T-Pot




