Improved music.js

- Added DJ class
pull/8/head
Trivernis 6 years ago
parent c14f95030b
commit ec888aa5b7

@ -12,7 +12,6 @@ function main() {
cmd.setLogger(logger);
cmd.init();
registerCommands();
music.setClient(client);
client.login(authToken).then(()=> {
logger.debug("Logged in");
});
@ -20,11 +19,11 @@ function main() {
function registerCommands() {
cmd.createCommand('~', 'play', (msg, argv) => {
let vc = msg.member.voiceChannel;
let gid = msg.guild.id;
let url = argv['url'];
if (!url) return 'No url given.';
try {
return music.play(vc, url);
return music.play(gid, url);
} catch(err) {
logger.error(err);
msg.reply(`${JSON.stringify(err)}`);
@ -45,47 +44,45 @@ function registerCommands() {
});
cmd.createCommand('~', 'stop', (msg) => {
let vc = msg.member.voiceChannel;
music.stop(vc);
let gid = msg.guild.id;
music.stop(gid);
});
cmd.createCommand('~', 'pause', (msg) => {
let vc = msg.member.voiceChannel;
music.pause(vc);
let gid = msg.guild.id;
music.pause(gid);
});
cmd.createCommand('~', 'resume', (msg) => {
let vc = msg.member.voiceChannel;
music.resume(vc);
let gid = msg.guild.id;
music.resume(gid);
});
cmd.createCommand('~', 'skip', (msg) => {
let vc = msg.member.voiceChannel;
music.skip(vc);
let gid = msg.guild.id;
music.skip(gid);
});
cmd.createCommand('~', 'plist', (msg) => {
let vc = msg.member.voiceChannel;
music.getQueue(vc, (songs) => {
let songlist = "**Songs**\n";
for (let i = 0; i < songs.length; i++) {
if (i > 10) break;
songlist += songs[i] + '\n';
}
msg.reply(songlist);
});
let gid = msg.guild.id;
let songs = music.getQueue(gid);
let songlist = "**Songs**\n";
for (let i = 0; i < songs.length; i++) {
if (i > 10) break;
songlist += songs[i] + '\n';
}
return songlist;
});
cmd.createCommand('~', 'shuffle', (msg) => {
let vc = msg.member.voiceChannel;
music.shuffle(vc);
let gid = msg.guild.id;
music.shuffle(gid);
});
cmd.createCommand('~', 'current', (msg) => {
let vc = msg.member.voiceChannel;
music.nowPlaying(vc, (title, url) => {
msg.reply(`Playing: ${title}\n ${url}`);
});
let gid = msg.guild.id;
let song = music.nowPlaying(gid);
return `Playing: ${song.title}\n ${song.url}`;
});
cmd.createCommand('_', 'repeat', (msg, argv) => {

@ -5,218 +5,251 @@ const Discord = require("discord.js"),
ytapiKey = "AIzaSyBLF20r-c4mXoAT2qBFB5YlCgT0D-izOaU";
/* Variable Definition */
let logger = require('winston');
let client = null;
let djs = {};
let connections = {};
/* Function Definition */
// TODO: initCommands function that takes the cmd.js module as variable and uses it to create commands
/**
* Getting the logger;
* @param {Object} newLogger
*/
exports.setLogger = function (newLogger) {
logger = newLogger;
};
/**
* Sets the discord Client for the module
* @param newClient
*/
exports.setClient = function(newClient) {
client = newClient;
};
class DJ {
constructor(voiceChannel) {
this.conn = null;
this.disp = null;
this.queue = [];
this.playing = false;
this.current = null;
this.volume = 0.5;
this.voiceChannel = voiceChannel;
}
/**
* Connects to a voicechannel
* @param voiceChannel
*/
exports.connect = function(voiceChannel) {
logger.debug(JSON.stringify());
logger.verbose(`Connecting to voiceChannel ${voiceChannel.name}`);
if (client !== null) {
voiceChannel.join().then(connection => {
logger.info(`Connected to Voicechannel ${voiceChannel.name}`);
connections[voiceChannel.guild.id] = {
'conn': connection,
'disp': null,
'queue': [],
'playing': false,
current: null
};
connect() {
logger.verbose(`Connecting to voiceChannel ${this.voiceChannel.name}`);
return this.voiceChannel.join().then(connection => {
logger.info(`Connected to Voicechannel ${this.voiceChannel.name}`);
this.conn = connection;
});
} else {
logger.error("Client is null");
}
};
/**
* Plays a file
* @param filename
*/
exports.playFile = function(voiceChannel, filename) {
let gid = voiceChannel.guild.id;
let conn = connections[gid].conn;
if (conn !== null) {
connections[gid].disp = conn.playFile(filename);
connections[gid].playing = true;
} else {
this.connect(voiceChannel);
logger.warn("Not connected to a voicechannel");
playFile(filename) {
if (this.conn !== null) {
this.disp = this.conn.playFile(filename);
this.playing = true;
} else {
logger.warn("Not connected to a voicechannel. Connection now.");
this.connect(this.voiceChannel).then(() => {
this.playFile(filename);
});
}
}
};
exports.play = function(voiceChannel, url) {
let gid = voiceChannel.guild.id;
if (!connections[gid]) this.connect(voiceChannel);
let conn = connections[gid].conn;
if (conn !== null) {
playYouTube(url) {
if (!this.conn) this.connect(this.voiceChannel).then(this.playYouTube(url));
let plist = url.match(/(?<=\?list=)[\w\-]+/g);
if (plist) {
logger.debug(`Adding playlist ${plist} to queue`);
ypi(ytapiKey, plist).then(items => {
for (let i = 0; i < items.length; i++) {
let vurl = `https://www.youtube.com/watch?v=${items[i].resourceId.videoId}`;
connections[gid].queue.push(vurl);
this.queue.push({'url': vurl, 'title': null});
yttl(vurl.replace(/http(s)?:\/\/(www.)?youtube.com\/watch\?v=/g, ''), (err, title) => {
if (err) {
logger.error(err);
} else {
this.queue.find((el) => {
return (el.url === vurl);
}).title = title;
}
});
}
this.play(voiceChannel, connections[gid].queue.shift());
this.playYouTube(this.queue.shift().url);
});
return;
}
if (!connections[gid].playing) {
if (!this.playing) {
logger.debug(`Playing ${url}`);
connections[gid].disp = conn.playStream(ytdl(url, {
this.disp = this.conn.playStream(ytdl(url, {
filter: "audioonly"
}), {seek: 0, volume: 0.5});
connections[gid].disp.on('end', () => {
connections[gid].playing = false;
connections[gid].current = null;
if (connections[gid].queue.length > 0) {
this.play(voiceChannel, connections[gid].queue.shift());
}), {seek: 0, volume: this.volume});
this.disp.on('end', () => {
this.playing = false;
this.current = null;
if (this.queue.length > 0) {
this.current = this.queue.shift()
this.playYouTube(this.current.url);
} else {
this.stop();
}
});
connections[gid].playing = true;
connections[gid].current = url;
this.playing = true;
} else {
logger.debug(`Added ${url} to the queue`);
connections[gid].queue.push(url);
this.queue.push(url);
}
}
setVolume(percentage) {
logger.verbose(`Setting volume to ${percentage}`);
if (this.disp !== null) {
this.disp.setVolume(percentage);
} else {
logger.warn("No dispatcher found.")
}
}
pause() {
logger.verbose("Pausing music...");
if (this.disp !== null) {
this.disp.pause();
} else {
logger.warn("No dispatcher found");
}
}
resume() {
logger.verbose("Resuming music...");
if (this.disp !== null) {
this.disp.resume();
} else {
logger.warn("No dispatcher found");
}
}
stop() {
logger.verbose("Stopping music...");
if (this.disp !== null) {
this.disp.end();
logger.debug("Ended dispatcher");
}
if (this.conn !== null) {
this.conn.disconnect();
logger.debug("Ended connection");
}
}
skip () {
logger.debug("Skipping song");
if (this.disp !== null) {
this.disp.end();
}
} else {
logger.warn("Not connected to a voicechannel");
}
get playlist() {
let songs = [];
this.queue.forEach((entry) => {
songs.push(entry.title);
});
return songs;
}
get song() {
return this.current.title;
}
shuffle() {
this.queue = shuffleArray(this.queue);
}
}
/**
* Getting the logger;
* @param {Object} newLogger
*/
exports.setLogger = function (newLogger) {
logger = newLogger;
};
/**
* Connects to a voicechannel
* @param voiceChannel
*/
exports.connect = function(voiceChannel) {
let gid = voiceChannel.guild.id;
let voiceDJ = new DJ(voiceChannel);
voiceDJ.connect();
djs[gid] = voiceDJ;
};
/**
* Plays a file
* @param filename
* @param guildId
*/
exports.playFile = function(guildId, filename) {
djs[guildId].playFile(filename);
};
/**
* Plays a YT Url
* @param guildId
* @param url
*/
exports.play = function(guildId, url) {
djs[guildId].playYouTube(url);
};
/**
* Sets the volume of the music
* @param percentage
* @param voiceChannel
* @param guildId
*/
exports.setVolume = function(voiceChannel, percentage) {
let disp = connections[voiceChannel.guild.id].disp;
logger.verbose(`Setting volume to ${percentage}`);
if (disp !== null) {
disp.setVolume(percentage);
} else {
logger.warn("No dispatcher found.")
}
exports.setVolume = function(guildId, percentage) {
djs[guildId].setVolume(percentage);
};
/**
* pauses the music
*/
exports.pause = function(voiceChannel) {
let disp = connections[voiceChannel.guild.id].disp;
logger.verbose("Pausing music...");
if (disp !== null) {
disp.pause();
} else {
logger.warn("No dispatcher found");
}
exports.pause = function(guildId) {
djs[guildId].pause();
};
/**
* Resumes the music
* @param guildId
*/
exports.resume = function(voiceChannel) {
let disp = connections[voiceChannel.guild.id].disp;
logger.verbose("Resuming music...");
if (disp !== null) {
disp.resume();
} else {
logger.warn("No dispatcher found");
}
exports.resume = function(guildId) {
djs[guildId].resume();
};
/**
* Stops the music
* @param guildId
*/
exports.stop = function(voiceChannel) {
let gid = voiceChannel.guild.id;
let disp = connections[gid].disp;
let conn = connections[gid].conn;
logger.verbose("Stopping music...");
if (disp !== null) {
disp.end();
logger.debug("Ended dispatcher");
}
if (conn !== null) {
conn.disconnect();
logger.debug("Ended connection");
}
connections[gid].playing = false;
exports.stop = function(guildId) {
djs[guildId].stop();
delete djs[guildId];
};
/**
* Skips the song
* @param guildId
*/
exports.skip = function(voiceChannel) {
let disp = connections[voiceChannel.guild.id].disp;
logger.debug("Skipping song");
if (disp !== null) {
disp.end();
}
exports.skip = function(guildId) {
djs[guildId].skip();
};
/**
* executes the callback when the titlelist is finished
* Returns the queue
* @param guildId
*/
exports.getQueue = function(voiceChannel, callback) {
let titles = [];
connections[voiceChannel.guild.id].queue.forEach((url) => {
yttl(url.replace(/http(s)?:\/\/(www.)?youtube.com\/watch\?v=/g, ''), (err, title) => {
if (err) {
logger.error(err);
} else {
titles.push(title);
}
});
});
setTimeout(() => callback(titles), 2000 );
exports.getQueue = function(guildId) {
return djs[guildId].playlist;
};
/**
* evokes the callback function with the title of the current song
* @param callback
* @param voiceChannel
* @param guildId
*/
exports.nowPlaying = function(voiceChannel, callback) {
let gid = voiceChannel.guild.id;
if (connections[gid].queue.length > 0) {
yttl(connections[gid].current.replace(/http(s)?:\/\/(www.)?youtube.com\/watch\?v=/g, ''), (err, title) => {
if (err) {
logger.error(err);
} else {
callback(title, connections[gid].current);
}
});
}
exports.nowPlaying = function(guildId) {
return djs[guildId].song;
};
/**
* shuffles the queue
* @param guildId
*/
exports.shuffle = function(voiceChannel) {
connections[voiceChannel.guild.id].queue = shuffle(connections[voiceChannel.guild.id].queue);
exports.shuffle = function(guildId) {
djs[guildId].shuffle();
};
/**
@ -224,7 +257,7 @@ exports.shuffle = function(voiceChannel) {
* @param array
* @returns {Array}
*/
function shuffle(array) {
function shuffleArray(array) {
let currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...

Loading…
Cancel
Save