|
|
|
const cmd = require('./cmd'),
|
|
|
|
music = require('./music'),
|
|
|
|
data = require('./data'),
|
|
|
|
config = require('../config.json'),
|
|
|
|
servercmd = require('../commands/servercommands'),
|
|
|
|
handlers = {};
|
|
|
|
let logger = require('winston');
|
|
|
|
|
|
|
|
exports.setLogger = function (newLogger) {
|
|
|
|
logger = newLogger;
|
|
|
|
music.setLogger(logger);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
exports.GuildHandler = class {
|
|
|
|
constructor(guild, prefix) {
|
|
|
|
this.guild = guild;
|
|
|
|
this.dataHandler = new data.DataHandler(guild.name);
|
|
|
|
this.dj = null;
|
|
|
|
this.mention = false;
|
|
|
|
this.prefix = prefix || config.prefix;
|
|
|
|
this.servant = new cmd.Servant(this.prefix);
|
|
|
|
this.registerMusicCommands();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* function shortcut returns the data from the dataHandler
|
|
|
|
* @param name
|
|
|
|
* @returns {{}}
|
|
|
|
*/
|
|
|
|
getData(name) {
|
|
|
|
return this.dataHandler.getData(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* appends data to the data handler
|
|
|
|
* @param name
|
|
|
|
* @param key
|
|
|
|
* @param value
|
|
|
|
*/
|
|
|
|
appendData(name, key, value) {
|
|
|
|
let data = this.getData(name);
|
|
|
|
data[key] = value;
|
|
|
|
this.dataHandler.setData(name, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* deletes an entry from the data handler
|
|
|
|
* @param name
|
|
|
|
* @param key
|
|
|
|
*/
|
|
|
|
deleteDataEntry(name, key) {
|
|
|
|
let data = this.getData(name);
|
|
|
|
delete data[key];
|
|
|
|
this.dataHandler.setData(name, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* registers all music commands and initializes a dj
|
|
|
|
* @param cmdPrefix
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* handles the message by letting the servant parse the command. Depending on the message setting it
|
|
|
|
* replies or just sends the answer.
|
|
|
|
* @param msg
|
|
|
|
*/
|
|
|
|
handleMessage(msg) {
|
|
|
|
let answer = this.servant.parseCommand(msg);
|
|
|
|
if (!answer) return;
|
|
|
|
if (this.mention) {
|
|
|
|
msg.reply(answer);
|
|
|
|
} else {
|
|
|
|
msg.channel.send(answer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
registerMusicCommands(cmdPrefix) {
|
|
|
|
let prefix = cmdPrefix || this.prefix;
|
|
|
|
this.dj = new music.DJ();
|
|
|
|
|
|
|
|
// play command
|
|
|
|
this.servant.createCommand(servercmd.music.play, (msg, argv) => {
|
|
|
|
let vc = msg.member.voiceChannel;
|
|
|
|
let url = argv['url'];
|
|
|
|
if (!vc)
|
|
|
|
return 'You are not connected to a VoiceChannel';
|
|
|
|
if (!url)
|
|
|
|
return servercmd.music.play.response.no_url;
|
|
|
|
if (!url.match(/http/g)) {
|
|
|
|
if (this.getData('savedplaylists') && this.getData('savedplaylists')[url]) {
|
|
|
|
url = this.getData('savedplaylists')[url];
|
|
|
|
} else {
|
|
|
|
return servercmd.music.play.response.url_invalid;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
if (!this.dj.connected) {
|
|
|
|
this.dj.connect(vc).then(() => {
|
|
|
|
this.dj.playYouTube(url);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
this.dj.playYouTube(url);
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
logger.error(err);
|
|
|
|
return servercmd.music.play.response.failure;
|
|
|
|
}
|
|
|
|
return servercmd.music.play.response.success;
|
|
|
|
});
|
|
|
|
|
|
|
|
// playnext command
|
|
|
|
this.servant.createCommand(servercmd.music.playnext,(msg, argv) => {
|
|
|
|
let vc = msg.member.voiceChannel;
|
|
|
|
if (!this.dj.connected) this.dj.voiceChannel = vc;
|
|
|
|
let url = argv['url'];
|
|
|
|
if (!url) return servercmd.music.playnext.response.no_url;
|
|
|
|
if (!url.match(/http/g)) {
|
|
|
|
if (this.getData('savedplaylists') && this.getData('savedplaylists')[url]) {
|
|
|
|
url = this.getData('savedplaylists')[url];
|
|
|
|
} else {
|
|
|
|
return servercmd.music.playnext.response.url_invalid;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
this.dj.playYouTube(url, true);
|
|
|
|
} catch (err) {
|
|
|
|
logger.error(err);
|
|
|
|
return servercmd.music.playnext.response.failure;
|
|
|
|
}
|
|
|
|
return servercmd.music.playnext.response.success;
|
|
|
|
});
|
|
|
|
|
|
|
|
// join command
|
|
|
|
this.servant.createCommand(servercmd.music.join, (msg) => {
|
|
|
|
if (msg.member.voiceChannel) {
|
|
|
|
this.dj.connect(msg.member.voiceChannel);
|
|
|
|
} else {
|
|
|
|
return servercmd.music.join.response.not_connected;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// stop command
|
|
|
|
this.servant.createCommand(servercmd.music.stop, () => {
|
|
|
|
this.dj.stop();
|
|
|
|
return servercmd.music.stop.response.success;
|
|
|
|
});
|
|
|
|
|
|
|
|
// pause command
|
|
|
|
this.servant.createCommand(servercmd.music.pause, () => {
|
|
|
|
this.dj.pause();
|
|
|
|
return servercmd.music.pause.response.success;
|
|
|
|
});
|
|
|
|
|
|
|
|
// resume command
|
|
|
|
this.servant.createCommand(servercmd.music.resume, () => {
|
|
|
|
this.dj.resume();
|
|
|
|
return servercmd.music.resume.response.success;
|
|
|
|
});
|
|
|
|
|
|
|
|
// skip command
|
|
|
|
this.servant.createCommand(servercmd.music.skip, () => {
|
|
|
|
this.dj.skip();
|
|
|
|
return servercmd.music.skip.response.success;
|
|
|
|
});
|
|
|
|
|
|
|
|
// clear command
|
|
|
|
this.servant.createCommand(servercmd.music.clear, () => {
|
|
|
|
this.dj.clear();
|
|
|
|
return servercmd.music.clear.response.success;
|
|
|
|
});
|
|
|
|
|
|
|
|
// playlist command
|
|
|
|
this.servant.createCommand(servercmd.music.playlist, () => {
|
|
|
|
let songs = this.dj.playlist;
|
|
|
|
logger.debug(`found ${songs.length} songs`);
|
|
|
|
let songlist = `**${songs.length} Songs in playlist**\n`;
|
|
|
|
for (let i = 0; i < songs.length; i++) {
|
|
|
|
if (i > 10) break;
|
|
|
|
songlist += songs[i] + '\n';
|
|
|
|
}
|
|
|
|
return songlist;
|
|
|
|
});
|
|
|
|
|
|
|
|
// np command
|
|
|
|
this.servant.createCommand(servercmd.music.current, () => {
|
|
|
|
let song = this.dj.song;
|
|
|
|
return `Playing: ${song.title}\n ${song.url}`;
|
|
|
|
});
|
|
|
|
|
|
|
|
// shuffle command
|
|
|
|
this.servant.createCommand(servercmd.music.shuffle, () => {
|
|
|
|
this.dj.shuffle();
|
|
|
|
return servercmd.music.shuffle.response.success;
|
|
|
|
});
|
|
|
|
|
|
|
|
// repeat command
|
|
|
|
this.servant.createCommand(servercmd.music.repeat, () => {
|
|
|
|
if (this.dj) {
|
|
|
|
this.dj.repeat = !this.dj.repeat;
|
|
|
|
if (this.dj.repeat)
|
|
|
|
return servercmd.music.repeat.response.repeat_true;
|
|
|
|
else
|
|
|
|
return servercmd.music.repeat.response.repeat_false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// saves playlists
|
|
|
|
this.servant.createCommand(servercmd.music.save, (msg, argv) => {
|
|
|
|
this.appendData('savedplaylists', argv.name, argv.url);
|
|
|
|
return `Saved song/playlist as ${argv['name']}`
|
|
|
|
});
|
|
|
|
|
|
|
|
// saved command - prints out saved playlists
|
|
|
|
this.servant.createCommand(servercmd.music.saved, () => {
|
|
|
|
let response = '```markdown\nSaved Playlists:\n==\n';
|
|
|
|
Object.entries(this.getData('savedplaylists')).forEach(([key, value]) => {
|
|
|
|
response += `${key.padEnd(10, ' ')} ${value} \n\n`;
|
|
|
|
});
|
|
|
|
response += '```';
|
|
|
|
return response;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param guild
|
|
|
|
* @param prefix
|
|
|
|
* @returns {GuildHandler}
|
|
|
|
*/
|
|
|
|
exports.getHandler = function (guild, prefix) {
|
|
|
|
if (!handlers[guild.id]) handlers[guild.id] = new this.GuildHandler(guild, prefix);
|
|
|
|
return handlers[guild.id];
|
|
|
|
};
|