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

如何实现Discord音乐机器人点击跳过按钮时自动更新嵌入式队列列表

Discord音乐机器人跳过按钮刷新队列解决方案

你当前的问题根源是队列嵌入式消息的生成逻辑仅在新增歌曲时触发,跳过/自动切歌场景下没有调用对应的更新逻辑。可按以下步骤修改代码:


步骤1:新增公共更新函数,抽离队列渲染逻辑

将队列嵌入式消息的生成、旧消息删除逻辑抽为独立函数,方便所有场景复用,在你的代码任意位置新增以下代码:

// 队列嵌入式消息更新公共函数
const updateQueueEmbed = async (server_queue, button) => {
    // 删除已存在的旧队列消息
    if (server_queue.queueEmbedMessage) {
        try {
            await server_queue.queueEmbedMessage.delete();
        } catch (err) {
            console.log('旧队列消息已删除,无需重复操作');
        }
    }
    // 队列非空时生成新的嵌入式队列
    if (server_queue.songs.length > 0) {
        const queueList = server_queue.songs.map((song, i) => `[${++i}] - ${song.title}`);
        const queueEmbed = new MessageEmbed()
         .setDescription(queueList);
        // 存储新的队列消息,方便后续更新/删除
        server_queue.queueEmbedMessage = await server_queue.text_channel.send(queueEmbed, button);
    }
}

步骤2:修改队列构造器,新增队列消息存储字段

找到初始化队列构造器的代码,新增字段存储当前队列的消息对象,方便后续定位操作:

const queue_constructor = {
    voice_channel: voice_channel,
    text_channel: message.channel,
    connection: null,
    songs: [],
    queueEmbedMessage: null // 新增字段:存储当前队列嵌入式消息
}

步骤3:替换原有新增歌曲的队列生成逻辑

找到原来添加歌曲时生成队列的代码段,替换为调用公共更新函数:

// 删掉原来你写的embed生成代码,替换为下面这行
await updateQueueEmbed(server_queue, button);
return;

步骤4:修改跳过/切歌/停止逻辑,触发队列更新

4.1 跳过操作更新队列

修改skip_song函数,跳过完成后调用更新函数:

const skip_song = async (message, server_queue, button) => {
    if (!message.member.voice.channel) return message.channel.send('你需要在语音频道才能执行该命令!');
    if(!server_queue){
        return message.channel.send(`队列里没有歌曲 😔`);
    }
    server_queue.connection.dispatcher.end();
    // 跳过完成后更新队列
    await updateQueueEmbed(server_queue, button);
}

注意修改skip_song的调用处,传入你定义的按钮变量。

4.2 歌曲自动播放完成后更新队列

修改video_player函数中的播放完成回调:

.on('finish', async () => {
    song_queue.songs.shift();
    // 自动切歌后更新队列,button替换为你实际的按钮变量
    await updateQueueEmbed(song_queue, button);
    video_player(guild, song_queue.songs[0]);
});

4.3 停止播放时清空队列消息

修改stop_song函数,停止后删除已有的队列消息:

const stop_song = async (message, server_queue) => {
    if (!message.member.voice.channel) return message.channel.send('你需要在语音频道才能执行该命令!');
    // 删除已有的队列消息
    if (server_queue.queueEmbedMessage) {
        try {
            await server_queue.queueEmbedMessage.delete();
        } catch (err) {
            console.log('旧队列消息已删除,无需重复操作');
        }
    }
    server_queue.songs = [];
    server_queue.connection.dispatcher.end();
}

额外优化建议

  • 你当前设置的process.setMaxListeners(1000000000000)没有必要,过大的数值会隐藏内存泄漏风险,建议调整为20即可
  • 尽量不要用bulkDelete批量删除消息,容易误删用户正常聊天内容,现在通过存储消息id定向删除更安全

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:48:04