如何在discord.js v12的!announce公告命令中添加图片附件支持?
修改思路
你需要做两处核心调整:
- 修正附件图片的取值逻辑:discord.js v12的
setImage()方法只接收图片URL字符串,不能直接传入附件对象,需要取附件的url属性 - 新增内容中的图片链接提取逻辑:用正则匹配公告内容中符合图片格式的URL,优先取上传的附件,附件不存在的情况下自动取内容中匹配到的第一张图片链接
修改后完整代码
const {MessageEmbed} = require('discord.js'); module.exports = { name: 'announce', description: "Does announcements in an embed", // 用法更新,支持附加图片或在内容里加图片链接 usage: "<channel id> <公告内容> [可选:图片链接] 或直接在命令后附加图片", execute(message, args){ if(!message.member.permissions.has(["MANAGE_MESSAGES"])) return message.reply("You don't have the required permissions to run this command.") let userArray = message.content.split(" "); let userArgs = userArray.slice(1); let member = message.mentions.members.first() || message.guild.members.cache.get(userArgs[0]) || message.guild.members.cache.find(x => x.user.username.toLowerCase() === userArgs.slice(0).join(" ") || x.user.username === userArgs[0]) || message.member; let rChannel = message.guild.channels.cache.get(args[0]) // 注意这里你的代码里命令前缀是;,如果你实际用的是!记得替换 if(!rChannel)return message.channel.send('Please specify the channel ID. Usage is: !announce <channelID> <message>') let MSG = message.content.split(`;announce ${rChannel.id} `).join("") if(!MSG)return message.reply('Please specify a message. Usage is: !announce <channelID> <message>') // 新增图片获取逻辑 let imageUrl = null; // 优先取上传的附件 if (message.attachments.size > 0) { const attachment = message.attachments.first(); // 判断附件是否为图片 if (attachment.height && attachment.width) { imageUrl = attachment.url; } } // 没有附件的情况下从内容提取图片链接 if (!imageUrl) { // 匹配常见图片格式的URL正则 const imgRegex = /(https?:\/\/.*\.(?:png|jpg|jpeg|gif|webp))/i; const matchRes = MSG.match(imgRegex); if (matchRes) { imageUrl = matchRes[0]; // 如果不需要在公告内容里保留图片链接,就取消注释下面这行 // MSG = MSG.replace(imgRegex, '').trim(); } } const embed = new MessageEmbed() .setTitle('Announcement') .setDescription(`${MSG}`) // 只有拿到图片链接的时候才设置image,避免报错 .setImage(imageUrl || '') .setFooter(message.author.tag, message.author.displayAvatarURL()) .setTimestamp(Date.now()) .setColor(0xA20B31) rChannel.send(embed); } }
功能验证
修改完成后支持两种使用方式:
- 发送
!announce <频道ID> 公告内容同时直接上传图片附件,图片会自动插入公告嵌入 - 发送
!announce <频道ID> 公告内容 图片链接,链接会自动识别为嵌入图片
如果不需要在公告正文中保留图片链接,取消代码中对应注释即可。
内容的提问来源于stack exchange,提问作者ActuallyProject
相关产品推荐
相关产品推荐

