Discord.js v13 实现announce公告命令及参数拼接、权限校验问题咨询
实现方案与问题修复
核心问题原因
你遇到的参数拼接格式错乱问题,是因为框架传入的args是默认按空格拆分后的字符串数组,直接拼接会丢失原有空格,拆分逻辑也会把单词和紧邻的标点拆分为独立元素,导致格式不符合预期。不需要拼接args,直接从原始消息内容中剔除命令前缀和触发词即可完整保留原始格式。
完整实现代码
module.exports = { name: 'announce', description: '管理员发送公告到指定频道', aliases: [], usage: '!announce <#频道/频道ID> [公告内容],公告内容可放在代码块中', guildOnly: true, args: true, permissions: { bot: ['SEND_MESSAGES', 'VIEW_CHANNEL'], user: ['ADMINISTRATOR'], }, execute: (message, args, client) => { // 1. 管理员权限校验 if (!message.member.permissions.has('ADMINISTRATOR')) { return message.reply('你没有管理员权限,无法使用该命令') } // 2. 解析目标发送频道 let targetChannel = message.mentions.channels.first() || client.channels.cache.get(args[0]) if (!targetChannel) { return message.reply('请指定有效的目标频道,可@频道或输入频道ID') } // 3. 提取公告原始内容(剔除命令和频道参数部分) const rawContent = message.content.slice( message.content.indexOf(args[0]) + args[0].length ).trim() // 4. 可选:读取代码块内容作为公告 const codeBlockReg = /```(?:[a-zA-Z0-9]*?\n)?([\s\S]*?)```/ const codeMatch = rawContent.match(codeBlockReg) const announceContent = codeMatch ? codeMatch[1].trim() : rawContent if (!announceContent) { return message.reply('请输入要发送的公告内容') } // 5. 发送公告到目标频道 targetChannel.send(announceContent) .then(() => message.reply(`公告已成功发送到${targetChannel}`)) .catch(err => message.reply('公告发送失败,请检查机器人是否有对应频道的发言权限')) }, };
功能说明
- 命令使用示例:
!announce #公告频道 Hello World!,会直接把Hello World!原格式发送到指定的公告频道 - 如果要发送的内容有复杂格式,可以放在代码块中,例如:
代码会自动提取代码块内的原格式内容发送,保留换行、空格、标点格式!announce #公告频道 ``` 这是第一行公告 这是第二行公告 末尾标点不需要空格!
内容的提问来源于stack exchange,提问作者Lixt
相关产品推荐
相关产品推荐

