0
好吧,我的問題是如何從我的play.js文件中訪問我的skip.js文件中的函數。我真的很新的JavaScript,所以你可能不得不真的愚蠢讓我明白。 但我的主要目標是在skip.js使用我的play.getQueue()函數。我想我會理解其餘的。從nodejs中的其他js文件訪問其他js功能
這是play.js文件。
const commando = require('discord.js-commando');
var YoutubeDL = require('youtube-dl');
const ytdl = require('ytdl-core');
var bot;
let queues = {};
let MAX_QUEUE_SIZE = 20;
let DEFAULT_VOLUME = 50;
let ALLOW_ALL_SKIP = true;
let CLEAR_INVOKER = false;
class playCommand extends commando.Command {
constructor(client) {
bot = client;
super(client, {
name: 'play',
group: 'music',
memberName: 'play',
description: 'Plays x Song'
});
}
async run(msg, args) {
msg.delete(5000);
// Make sure the user is in a voice channel.
if (msg.member.voiceChannel === undefined) return msg.channel.sendMessage(wrap('You\'re not in a voice channel.')).then(msg => {
msg.delete(5000);
});
// Get the queue.
const queue = getQueue(msg.guild.id);
// Check if the queue has reached its maximum size.
if (queue.length >= MAX_QUEUE_SIZE) {
return msg.channel.sendMessage(wrap('Maximum queue size reached!')).then(msg => {
msg.delete(5000);
});
}
// Get the video information.
msg.channel.sendMessage(wrap('Searching...')).then(response => {
var searchstring = args
if (!args.toLowerCase().startsWith('http')) {
searchstring = 'gvsearch1:' + args;
}
YoutubeDL.getInfo(searchstring, ['-q', '--no-warnings', '--force-ipv4'], (err, info) => {
// Verify the info.
if (err || info.format_id === undefined || info.format_id.startsWith('0')) {
return response.edit(wrap('Invalid video!'));
}
info.requester = msg.author.id;
// Queue the video.
response.edit(wrap('Queued: ' + info.title)).then(() => {
queue.push(info);
// Play if only one element in the queue.
if (queue.length === 1) executeQueue(msg, queue);
}).catch(console.log);
});
}).catch(console.log);
}
}
/**
* Checks if a user is an admin.
*
* @param {GuildMember} member - The guild member
* @returns {boolean} -
*/
function isAdmin(member) {
return member.hasPermission("ADMINISTRATOR");
}
/**
* Checks if the user can skip the song.
*
* @param {GuildMember} member - The guild member
* @param {array} queue - The current queue
* @returns {boolean} - If the user can skip
*/
function canSkip(member, queue) {
if (ALLOW_ALL_SKIP) return true;
else if (queue[0].requester === member.id) return true;
else if (isAdmin(member)) return true;
else return false;
}
function getQueue (server) {
// Return the queue.
if (!queues[server]) queues[server] = [];
return queues[server];
}
function queue(msg, args) {
// Get the queue.
const queue = getQueue(msg.guild.id);
// Get the queue text.
const text = queue.map((video, index) => (
(index + 1) + ': ' + video.title
)).join('\n');
// Get the status of the queue.
let queueStatus = 'Stopped';
const voiceConnection = bot.voiceConnections.find(val => val.channel.guild.id == msg.guild.id);
if (voiceConnection !== null) {
const dispatcher = voiceConnection.player.dispatcher;
queueStatus = dispatcher.paused ? 'Paused' : 'Playing';
}
// Send the queue and status.
msg.channel.sendMessage(wrap('Queue (' + queueStatus + '):\n' + text));
}
function executeQueue(msg, queue) {
// If the queue is empty, finish.
if (queue.length === 0) {
msg.channel.sendMessage(wrap('Playback finished.')).then(msg => {
msg.delete(5000);
});
// Leave the voice channel.
const voiceConnection = bot.voiceConnections.find(val => val.channel.guild.id == msg.guild.id);
if (voiceConnection !== null) return voiceConnection.disconnect();
}
new Promise((resolve, reject) => {
// Join the voice channel if not already in one.
const voiceConnection = bot.voiceConnections.find(val => val.channel.guild.id == msg.guild.id);
if (voiceConnection === null) {
// Check if the user is in a voice channel.
if (msg.member.voiceChannel) {
msg.member.voiceChannel.join().then(connection => {
resolve(connection);
}).catch((error) => {
console.log(error);
});
} else {
// Otherwise, clear the queue and do nothing.
queue.splice(0, queue.length);
reject();
}
} else {
resolve(voiceConnection);
}
}).then(connection => {
// Get the first item in the queue.
const video = queue[0];
console.log(video.webpage_url);
// Play the video.
msg.channel.sendMessage(wrap('Now Playing: ' + video.title)).then(msg => {
msg.delete(5000);
let dispatcher = connection.playStream(ytdl(video.webpage_url, {
filter: 'audioonly'
}), {
seek: 0,
volume: (DEFAULT_VOLUME/100)
});
connection.on('error', (error) => {
// Skip to the next song.
console.log(error);
queue.shift();
executeQueue(msg, queue);
});
dispatcher.on('error', (error) => {
// Skip to the next song.
console.log(error);
queue.shift();
executeQueue(msg, queue);
});
dispatcher.on('end',() => {
// Wait a second.
setTimeout(() => {
if (queue.length > 0) {
// Remove the song from the queue.
queue.shift();
// Play the next song in the queue.
executeQueue(msg, queue);
}
}, 1000);
});
}).catch((error) => {
console.log(error);
});
}).catch((error) => {
console.log(error);
});
}
function wrap(text) {
return '```\n' + text.replace(/`/g, '`' + String.fromCharCode(8203)) + '\n```';
}
module.exports = playCommand;
這是skip.js文件
const commando = require('discord.js-commando');
var YoutubeDL = require('youtube-dl');
const ytdl = require('ytdl-core');
var bot;
var play = require('./play');
class skipCommand extends commando.Command {
constructor(client) {
bot = client;
super(client, {
name: 'skip',
group: 'music',
memberName: 'skip',
description: 'skips song'
});
}
async run(msg, suffix) {
// Get the voice connection.
const voiceConnection = bot.voiceConnections.find(val => val.channel.guild.id == msg.guild.id);
if (voiceConnection === null) return msg.channel.sendMessage(wrap('No music being played.'));
// Get the queue.
const queue = play.getQueue(msg.guild.id);
if (!canSkip(msg.member, queue)) return msg.channel.sendMessage(wrap('You cannot skip this as you didn\'t queue it.')).then((response) => {
response.delete(5000);
});
// Get the number to skip.
let toSkip = 1; // Default 1.
if (!isNaN(suffix) && parseInt(suffix) > 0) {
toSkip = parseInt(suffix);
}
toSkip = Math.min(toSkip, queue.length);
// Skip.
queue.splice(0, toSkip - 1);
// Resume and stop playing.
const dispatcher = voiceConnection.player.dispatcher;
if (voiceConnection.paused) dispatcher.resume();
dispatcher.end();
msg.channel.sendMessage(wrap('Skipped ' + toSkip + '!'));
}
}
function canSkip(member, queue) {
return true;
}
function getQueue(server) {
// Return the queue.
if (!queues[server]) queues[server] = [];
return queues[server];
}
function queue(msg, args) {
// Get the queue.
const queue = play.getQueue(msg.guild.id);
// Get the queue text.
const text = queue.map((video, index) => (
(index + 1) + ': ' + video.title
)).join('\n');
// Get the status of the queue.
let queueStatus = 'Stopped';
const voiceConnection = bot.voiceConnections.find(val => val.channel.guild.id == msg.guild.id);
if (voiceConnection !== null) {
const dispatcher = voiceConnection.player.dispatcher;
queueStatus = dispatcher.paused ? 'Paused' : 'Playing';
}
// Send the queue and status.
msg.channel.sendMessage(wrap('Queue (' + queueStatus + '):\n' + text));
}
function wrap(text) {
return '```\n' + text.replace(/`/g, '`' + String.fromCharCode(8203)) + '\n```';
}
module.exports = skipCommand;
搜索有關出口和進口 – Jan