Discord 音乐机器人上的跳过功能会删除所有数组条目

Posted

技术标签:

【中文标题】Discord 音乐机器人上的跳过功能会删除所有数组条目【英文标题】:Skip function on Discord music bot removes all array entries 【发布时间】:2018-08-26 15:10:25 【问题描述】:

如果我们的音乐机器人不恐慌并删除整个播放列表,我无法让曲目跳过。更多详情如下。

根据命令,此机器人将使用 YouTube-DL 从 YouTube 下载视频或从 BandCamp 下载曲目,然后通过语音通道播放。曲目被下载,加载到一个数组中,然后一个接一个地播放。当轨道完成时,它会毫无问题地继续下一个。但是当涉及到手动跳过曲目时,就像整个功能出现错误并重复运行,直到播放列表为空并且文件已被删除。

一些变量让我们开始:

// References
var VC;
var TC;
var AS;
var DS;
var playlist = new Array();
var reqlist = new Array();
var volume = 100;
var fulltitle;

这是转到下一个曲目的函数:

function Next()

  if(!(DS===undefined)) DS.pause();

  if (playlist.length > 0)
  
    // Delete the first audio file in the list (the one that just finished)
        var fileRemove = false
        try 
            fs.remove(playlist[0].file)
            console.log('File removed!');

            fileRemove = true
         catch(e) 
            fileRemove = false
            console.err(e)
        

        if (fileRemove = true) 
            playlist.splice(0, 1);
            console.log('Spliced!');
         else 
            console.err('Could not splice or file not removed.')
        

        //console.log(playlist)
        //fulltitle = playlist[0].info.fulltitle
        return StartPlay();
  

    console.log('Length: ' + playlist.length)

    if(playlist.length === 0) 
        client.user.setPresence(  status: 'idle', game:  name: null   )
    // else 
    //   // Start playing
    //   return StartPlay();
    // 

这是StartPlay()

function StartPlay() // Automatically plays queue once a song has been added successfully

  if (playlist.length >= 1) 
    // Play the audio file
    DS = AS.playFile(playlist[0].file);
    DS.passes = 12;
    DS.setVolume(volume/200.0);
    //fulltitle = playlist[0].info.fulltitle

        // Display song title in 'Game played'
    client.user.setPresence( status: 'online', game:  type:2, name: fulltitle  );

        // Once the song is done
    DS.on('end', reason => 
      // Go to the next track
      Next();
    );
  

下面是让它跳过的命令:

  case 'skip':
    if(VC===undefined) return;
    if(TC===undefined) return;
    if(!CheckTCVC(message)) return;
    if(playlist.length === 0) return message.channel.send('There is nothing to skip.');
    if(playlist.length === 1) return message.channel.send('There is nothing to skip to. Queue something else first or use `' + prefix + 'leave`.')

        if(message.content.length > 5) 
            const trackNumber = parseInt(message.content.split(' ')[1])

            if (trackNumber !== 1) 
                fs.remove(playlist[trackNumber-1].file).then(() => 
                    console.log('File removed!');
                    playlist.splice(0, trackNumber-1)
                    message.channel.send('Future song skipped!')
                ).catch(err => 
                    console.error(err)
                )
             else 
                Next();
                message.channel.send('Current song skipped!')
            
         else 
            Next();
            message.channel.send('Song skipped!')
        

        break;

我不确定其他人还需要从代码中获得什么。请告诉我,我会粘贴进去。

这里是 Discord.JS 文档的链接,我认为这里并不是真的需要它:https://discord.js.org/#/docs/main/stable/general/welcome

提前致谢!

【问题讨论】:

【参考方案1】:

当您致电playlist.splice(0, trackNumber-1) 时,我相信您使用拼接错误。根据MDN documentation,splice 有两个参数:起始位置和要删除的元素数量。您已将 0 作为您的位置,并将 trackNumber 作为要删除的数量。因此,如果轨道编号为 42,您将从数组中删除 42 个元素。尝试使用playlist.splice(trackNumber-1, 1) 看看是否能达到您想要的效果。

【讨论】:

以上是关于Discord 音乐机器人上的跳过功能会删除所有数组条目的主要内容,如果未能解决你的问题,请参考以下文章

Discord 音乐机器人:未定义前缀

Discord.py 删除除 pin 消息之外的所有消息

是否可以通过安装在 Heroku 上的不和谐机器人播放音乐/声音?

Discord.js 音乐机器人加入然后离开

找不到 Discord.js 音乐机器人 ffmpeg?

C# .NET Core Discord 音乐机器人