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 音乐机器人上的跳过功能会删除所有数组条目的主要内容,如果未能解决你的问题,请参考以下文章