如何实现Discord.js音乐机器人切换歌曲时删除旧消息
解决方案
要解决切换歌曲时重复发送播放消息的问题,核心是记录上一条播放状态消息的引用,每次发送新消息前先删除旧消息,具体修改如下:
修改步骤
- 发送新消息前,检查播放器实例中是否存储了上一条消息,若存在则尝试删除
- 发送新消息后,将新消息的引用保存到播放器实例中,供下次切换歌曲时使用
- 增加错误捕获,避免因权限不足、消息已被手动删除等情况导致代码崩溃
修改后的完整代码
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, Client } = require('discord.js'); const ms = require('ms'); /** * @param {Client} client */ module.exports.run = async (client, player, track) => { function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); } const row = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('loop') .setEmoji(`🔁`) .setStyle(ButtonStyle.Secondary), new ButtonBuilder() .setCustomId('volume-') .setEmoji(`🔉`) .setStyle(ButtonStyle.Danger), new ButtonBuilder() .setCustomId('p/p') .setEmoji(`⏯️`) .setStyle(ButtonStyle.Secondary), new ButtonBuilder() .setCustomId('volume+') .setEmoji(`🔊`) .setStyle(ButtonStyle.Success), new ButtonBuilder() .setCustomId('skip') .setEmoji(`⏭️`) .setStyle(ButtonStyle.Secondary), ); const embed = new EmbedBuilder() .setAuthor({ name: `Now Playing`, iconURL: track.info.requester.displayAvatarURL(), }) .setColor('Blue') .setDescription( ` **Track**: [${track.info.title}](${track.info.uri}) `, ) const channel = client.channels.cache.get(player.textChannel); if (!channel) return; // 删除上一条播放状态消息 try { if (player.nowPlayingMessage) { await player.nowPlayingMessage.delete(); } } catch (err) { console.log('删除旧播放消息失败:', err.message); } // 发送新的播放状态消息 const newMessage = await channel.send({ embeds: [embed], components: [row] }); // 将新消息引用存入播放器实例,供下次使用 player.nowPlayingMessage = newMessage; };
关键逻辑说明
- 消息引用存储:通过
player.nowPlayingMessage = newMessage将新消息对象绑定到播放器实例上,切换歌曲时可直接获取上一条消息的引用。 - 旧消息删除:发送新消息前先检查
player.nowPlayingMessage是否存在,存在则调用delete()方法删除,用try/catch处理删除失败的异常情况。 - 轻量实现:无需额外数据库,直接利用播放器实例的属性临时存储消息引用,适合单服务器音乐机器人场景。
内容的提问来源于stack exchange,提问作者sametkarapinar
相关产品推荐
相关产品推荐

