You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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;
};

关键逻辑说明

  1. 消息引用存储:通过player.nowPlayingMessage = newMessage将新消息对象绑定到播放器实例上,切换歌曲时可直接获取上一条消息的引用。
  2. 旧消息删除:发送新消息前先检查player.nowPlayingMessage是否存在,存在则调用delete()方法删除,用try/catch处理删除失败的异常情况。
  3. 轻量实现:无需额外数据库,直接利用播放器实例的属性临时存储消息引用,适合单服务器音乐机器人场景。

内容的提问来源于stack exchange,提问作者sametkarapinar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:35:19