【问题标题】:How to create an embedded Queue list for discord bot the updates如何为不和谐机器人更新创建嵌入式队列列表
【发布时间】:2021-11-24 00:59:02
【问题描述】:

我正在制作一个播放音乐的不和谐机器人。目前,嵌入列表工作正常,每次我将歌曲添加到队列时,列表都会自行删除并创建一个新的嵌入队列列表,并使用新歌曲进行更新。但是,当我使用已实现的跳过按钮时(我是编程新手),我无法弄清楚如何使此队列列表自行更新。

现在如何工作的示例:

按按钮跳过歌曲,但如前所述,每次按按钮时如何刷新列表?

const ytdl = require('ytdl-core');
const ytSearch = require('yt-search');
process.setMaxListeners(1000000000000);
const { MessageEmbed } = require('discord.js');

ffmpeg_options = {
    'options': '-vn',
    "before_options": "-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5"
}

//Global queue for your bot. Every server will have a key and value pair in this map. { guild.id, queue_constructor{} }
const queue = new Map();

module.exports = {
    name: 'play',
    aliases: ['skip', 'stop'], //We are using aliases to run the skip and stop command follow this tutorial if lost: https://www.youtube.com/watch?v=QBUJ3cdofqc
    cooldown: 0,
    description: 'Advanced music bot',
    async execute(message, args, cmd, button, skip, client, Discord){


        //Checking for the voicechannel and permissions (you can add more permissions if you like).
        const voice_channel = message.member.voice.channel;
        if (!voice_channel) return message.channel.send('You need to be in a channel to execute this command!');
        const permissions = voice_channel.permissionsFor(message.client.user);
        if (!permissions.has('CONNECT')) return message.channel.send('You dont have the correct permissions.');
        if (!permissions.has('SPEAK')) return message.channel.send('You dont have the correct permissions.');
        
        //This is our server queue. We are getting this server queue from the global queue.
        const server_queue = queue.get(message.guild.id);
        let checker = false;

        if (cmd === 'stop' && !server_queue){
            return message.channel.send("The bot is not in the channel, you dont have to stop him.");
        }
        
        //If the user has used the play command
        if (cmd === 'stop') stop_song(message, server_queue);
        else if(skip === true) {
          skip_song(message, server_queue);
        }
        else if (cmd === message.content){
            //if (!args.length) return message.channel.send('You need to send the second argument!');
            let song = {};

            //If the first argument is a link. Set the song object to have two keys. Title and URl.
            if (ytdl.validateURL(args[0])) {
                const song_info = await ytdl.getInfo(args[0]);
                song = { title: song_info.videoDetails.title, url: song_info.videoDetails.video_url }
                message.delete({ timeout:1000 })
            } else {
                //If there was no link, we use keywords to search for a video. Set the song object to have two keys. Title and URl.
                const video_finder = async (query) =>{
                    const video_result = await ytSearch(query);
                    return (video_result.videos.length > 1) ? video_result.videos[0] : null;
                }

                const video = await video_finder(args.join(' '));
                if (video){
                    song = { title: video.title, url: video.url }
                } else {
                     message.channel.send('Error finding video.');
                }
                message.delete({ timeout:1000 })
            }
            
            if (skip === true && server_queue) {
              
            }
            //If the server queue does not exist (which doesn't for the first video queued) then create a constructor to be added to our global queue.
            if (!server_queue){

                const queue_constructor = {
                    voice_channel: voice_channel,
                    text_channel: message.channel,
                    connection: null,
                    songs: []
                }
                
                //Add our key and value pair into the global queue. We then use this to get our server queue.
                queue.set(message.guild.id, queue_constructor);
                queue_constructor.songs.push(song);
    
                //Establish a connection and play the song with the vide_player function.
                try {
                    const connection = await voice_channel.join();
                    queue_constructor.connection = connection;
                    video_player(message.guild, queue_constructor.songs[0]);
                } catch (err) {
                    queue.delete(message.guild.id);
                    message.channel.send('There was an error connecting!');
                    throw err;
                }
            } else {
              server_queue.songs.push(song);
              message.channel.bulkDelete(2)
                .then(messages => console.log(`Bulk deleted ${messages.size} messages`))
                .catch(console.error);
                 
                //where I actually make the embeded queue list
                const queueList = server_queue.songs.map((song, i) => `[${++i}] - ${song.title}`);
                const queueEmbed = new MessageEmbed()
                 .setDescription(queueList);
                 return message.channel.send(queueEmbed, button);
                
            }
        }
    
        
    }
    
}

const video_player = async (guild, song) => {
    const song_queue = queue.get(guild.id);

    //If no song is left in the server queue. Leave the voice channel and delete the key and value pair from the global queue.
    if (!song) {
        song_queue.voice_channel.leave();
        queue.delete(guild.id);
        return;
    }
    const stream = ytdl(song.url, { filter: 'audioonly' });
    song_queue.connection.play(stream, { seek: 0, volume: 0.5 })
    .on('finish', () => {
        song_queue.songs.shift();
        video_player(guild, song_queue.songs[0]);
    });
    //await song_queue.text_channel.send(`???? Now playing **${song.title}**`)
}

const skip_song = (message, server_queue) => {
    if (!message.member.voice.channel) return message.channel.send('You need to be in a channel to execute this command!');
    if(!server_queue){
        return message.channel.send(`There are no songs in queue ????`,);
    }
    server_queue.connection.dispatcher.end();
    //message.delete({ timeout:20000})
}

const stop_song = (message, server_queue) => {
    if (!message.member.voice.channel) return message.channel.send('You need to be in a channel to execute this command!');
    server_queue.songs = [];
    server_queue.connection.dispatcher.end();
    //message.delete({ timeout:20000})
}

【问题讨论】:

    标签: discord discord.js


    【解决方案1】:
     return message.channel.send(queueEmbed, button);
    

    上面那一行返回一个 Promise,它解析为一个 Message 对象。把它改成这样:

    const embeddedMessage = await message.channel.send(queueEmbed, button);
    return embeddedMessage;
    

    因此,当用户单击跳过按钮时,您可以简单地调用

    embeddedMessage.edit(your_new_embed, button)
    

    【讨论】:

    • 这没有帮助。 OP对此语句没有问题,这只是一个回调,而且return不需要await。结果是一样的。
    • 感谢您的建议,但正如神话所说,我尝试了这个,不幸的是得到了相同的结果。
    猜你喜欢
    • 2020-09-23
    • 2021-08-27
    • 2020-04-29
    • 2020-09-06
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2021-01-21
    相关资源
    最近更新 更多