如何用discord.js实现多服务器下动态获取服务器名称变量
Discord.js 自动警告系统:获取服务器名称并发送私信警告
问题描述
我想基于discord.js开发一个多服务器可用的自动警告系统:当用户发送屏蔽词时,会通过私信收到警告,警告内容需要显示「你在{服务器名称}因{原因}被警告」,但不知道如何获取服务器名称变量。相关代码片段如下:
var array = ['blocked words one','blocked words two','etc'] if(msg.author.hasPermission('VIEW_AUDIT_LOG')) return; if(array.some(w => `${msg.content.toLowerCase()}`.includes(`${w}`))) { msg.delete(); msg.reply('Please do not send flagged words, you have been muted for 2 minutes') } var servername = **I do now know how to do it** var reason = (`*__Warning from Auto-Mod__** | **__Reason:__** Using filtered words | **__Your Message:__**\n${msg.content}`) var filterEmbed = new Discord.MessageEmbed() .setTitle(`You were warned in ${servername}`)
(尚未完成向用户发送该警告的步骤,仅展示需要帮助的部分)
解决方案
获取服务器名称
直接通过msg.guild.name即可获取消息所在服务器的名称,msg对象的guild属性对应当前服务器实例,name属性就是服务器的名称。完善私信警告发送逻辑
使用msg.author.send()方法给触发规则的用户发送私信,同时建议添加错误捕获,避免因用户关闭私信导致机器人报错。
修改后的完整代码示例
const array = ['blocked words one', 'blocked words two', 'etc']; // 跳过有权限查看审计日志的用户 if (msg.author.hasPermission('VIEW_AUDIT_LOG')) return; // 检查消息是否包含屏蔽词 if (array.some(word => msg.content.toLowerCase().includes(word))) { msg.delete(); msg.reply('Please do not send flagged words, you have been muted for 2 minutes'); // 获取服务器名称 const serverName = msg.guild.name; const reason = `*__Warning from Auto-Mod__** | **__Reason:__** Using filtered words | **__Your Message:__**\n${msg.content}`; // 创建警告Embed const filterEmbed = new Discord.MessageEmbed() .setTitle(`You were warned in ${serverName}`) .setDescription(reason) .setColor('#ff0000'); // 可选:设置警告颜色为红色 // 发送私信警告并处理可能的错误 msg.author.send({ embeds: [filterEmbed] }) .catch(err => { console.log(`无法给用户 ${msg.author.tag} 发送私信: ${err}`); // 可选:如果私信失败,在频道内提示用户(注意不要泄露屏蔽内容) msg.channel.send(`${msg.author}, 无法向你发送私信警告,请检查你的隐私设置。`); }); }
注意事项
- 确保机器人拥有
SEND_MESSAGES和EMBED_LINKS权限,才能正常发送Embed私信。 - 若使用discord.js v14及以上版本,创建Embed需使用
EmbedBuilder而非MessageEmbed,导入方式为const { EmbedBuilder } = require('discord.js');。
内容的提问来源于stack exchange,提问作者Fear
相关产品推荐
相关产品推荐

