2020-09-05 08:22:39 +02:00
|
|
|
const CONFIG = require('../config.json');
|
|
|
|
const Discord = require('discord.js');
|
2020-09-08 13:17:55 +02:00
|
|
|
const {
|
|
|
|
checkJellyfinItemIDRegex
|
|
|
|
} = require('./util');
|
2020-09-05 08:59:09 +02:00
|
|
|
const {
|
|
|
|
getAudioDispatcher,
|
|
|
|
setAudioDispatcher
|
|
|
|
} = require('./dispachermanager');
|
2020-09-05 08:22:39 +02:00
|
|
|
|
|
|
|
const discordclientmanager = require('./discordclientmanager');
|
2020-09-08 13:17:55 +02:00
|
|
|
const jellyfinClientManager = require('./jellyfinclientmanager');
|
2020-09-05 08:59:09 +02:00
|
|
|
const discordClient = discordclientmanager.getDiscordClient();
|
2020-09-05 08:22:39 +02:00
|
|
|
|
|
|
|
|
2020-09-08 13:17:55 +02:00
|
|
|
var isSummendByPlay = false;
|
|
|
|
|
|
|
|
|
2020-09-05 08:59:09 +02:00
|
|
|
//random Color of the Jellyfin Logo Gradient
|
|
|
|
function getRandomDiscordColor() {
|
2020-09-08 13:17:55 +02:00
|
|
|
function randomNumber(b, a) {
|
|
|
|
return Math.floor((Math.random() * Math.pow(Math.pow((b - a), 2), 1 / 2)) + (b > a ? a : b))
|
2020-09-05 08:59:09 +02:00
|
|
|
}
|
|
|
|
|
2020-09-08 13:17:55 +02:00
|
|
|
const GRANDIENT_START = '#AA5CC3';
|
|
|
|
const GRANDIENT_END = '#00A4DC';
|
|
|
|
|
|
|
|
let rS = GRANDIENT_START.slice(1, 3);
|
|
|
|
let gS = GRANDIENT_START.slice(3, 5);
|
|
|
|
let bS = GRANDIENT_START.slice(5, 7);
|
|
|
|
rS = parseInt(rS, 16);
|
|
|
|
gS = parseInt(gS, 16);
|
|
|
|
bS = parseInt(bS, 16);
|
|
|
|
|
|
|
|
let rE = GRANDIENT_END.slice(1, 3);
|
|
|
|
let gE = GRANDIENT_END.slice(3, 5);
|
|
|
|
let bE = GRANDIENT_END.slice(5, 7);
|
|
|
|
rE = parseInt(rE, 16);
|
|
|
|
gE = parseInt(gE, 16);
|
|
|
|
bE = parseInt(bE, 16);
|
|
|
|
|
|
|
|
return ('#' + ('00' + (randomNumber(rS, rE)).toString(16)).substr(-2) + ('00' + (randomNumber(gS, gE)).toString(16)).substr(-2) + ('00' + (randomNumber(bS, bE)).toString(16)).substr(-2));
|
|
|
|
}
|
|
|
|
|
|
|
|
async function searchForItemID(searchString) {
|
|
|
|
|
|
|
|
let response = await jellyfinClientManager.getJellyfinClient().getSearchHints({
|
|
|
|
searchTerm: searchString,
|
|
|
|
includeItemTypes: "Audio"
|
|
|
|
})
|
|
|
|
|
|
|
|
if (response.TotalRecordCount < 1) {
|
|
|
|
throw "Found no Song"
|
|
|
|
} else {
|
|
|
|
return response.SearchHints[0].ItemId
|
|
|
|
}
|
|
|
|
}
|
2020-09-05 08:59:09 +02:00
|
|
|
|
2020-09-08 13:17:55 +02:00
|
|
|
function summon(voiceChannel){
|
2020-09-05 08:59:09 +02:00
|
|
|
|
2020-09-08 13:17:55 +02:00
|
|
|
if (!voiceChannel) {
|
|
|
|
return message.reply('please join a voice channel to summon me!');
|
|
|
|
}
|
2020-09-05 08:59:09 +02:00
|
|
|
|
2020-09-08 13:17:55 +02:00
|
|
|
voiceChannel.join()
|
2020-09-05 08:59:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function handleChannelMessage(message) {
|
2020-09-08 13:17:55 +02:00
|
|
|
getRandomDiscordColor()
|
2020-09-05 08:22:39 +02:00
|
|
|
|
|
|
|
if (message.content.startsWith(CONFIG["discord-prefix"] + 'summon')) {
|
|
|
|
if (message.channel.type === 'dm') {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-09-08 13:17:55 +02:00
|
|
|
summon(message.member.voice.channel);
|
|
|
|
|
2020-09-05 08:22:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
} else if (message.content.startsWith(CONFIG["discord-prefix"] + 'disconnect')) {
|
|
|
|
discordClient.user.client.voice.connections.forEach((element) => {
|
|
|
|
element.disconnect();
|
|
|
|
});
|
2020-09-08 13:17:55 +02:00
|
|
|
|
|
|
|
|
|
|
|
} else if ((message.content.startsWith(CONFIG["discord-prefix"] + 'pause')) || (message.content.startsWith(CONFIG["discord-prefix"] + 'resume'))) {
|
2020-09-05 08:59:09 +02:00
|
|
|
if (getAudioDispatcher() !== undefined) {
|
|
|
|
if (getAudioDispatcher().paused)
|
2020-09-05 08:22:39 +02:00
|
|
|
getAudioDispatcher().resume();
|
|
|
|
else
|
|
|
|
getAudioDispatcher().pause(true);
|
2020-09-05 08:59:09 +02:00
|
|
|
} else {
|
2020-09-08 13:17:55 +02:00
|
|
|
message.reply("there is nothing playing!")
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} else if (message.content.startsWith(CONFIG["discord-prefix"] + 'play')) {
|
|
|
|
|
|
|
|
|
|
|
|
if (discordClient.user.client.voice.connections.size < 1) {
|
|
|
|
discordClient.user.client.voice.connections.size
|
|
|
|
summon(message.member.voice.channel)
|
|
|
|
isSummendByPlay=true
|
2020-09-05 08:22:39 +02:00
|
|
|
}
|
2020-09-08 13:17:55 +02:00
|
|
|
|
|
|
|
async function playThis(){
|
|
|
|
|
|
|
|
let indexOfItemID = message.content.indexOf(CONFIG["discord-prefix"] + 'play') + (CONFIG["discord-prefix"] + 'play').length + 1;
|
|
|
|
let argument = message.content.slice(indexOfItemID);
|
|
|
|
let itemID;
|
|
|
|
//check if play command was used with itemID
|
|
|
|
let regexresults = checkJellyfinItemIDRegex(argument);
|
|
|
|
if (regexresults) {
|
|
|
|
itemID = regexresults[0];
|
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
itemID = await searchForItemID(argument);
|
|
|
|
} catch (e) {
|
|
|
|
message.reply(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
discordClient.user.client.voice.connections.forEach((element) => {
|
|
|
|
let stream = `${jellyfinClientManager.getJellyfinClient().serverAddress()}/Audio/${itemID}/universal?UserId=${jellyfinClientManager.getJellyfinClient().getCurrentUserId()}&DeviceId=${jellyfinClientManager.getJellyfinClient().deviceId()}&MaxStreamingBitrate=${element.channel.bitrate.toString()}&Container=opus&AudioCodec=opus&api_key=${jellyfinClientManager.getJellyfinClient().accessToken()}&TranscodingContainer=ts&TranscodingProtocol=hls`;
|
|
|
|
setAudioDispatcher(element.play(stream));
|
|
|
|
element.on("error", (error) => {
|
|
|
|
console.error(error);
|
|
|
|
})
|
|
|
|
getAudioDispatcher().on("finish",()=>{
|
|
|
|
if(isSummendByPlay){
|
|
|
|
element.disconnect();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
playThis();
|
|
|
|
|
|
|
|
} else if (message.content.startsWith(CONFIG["discord-prefix"] + 'stop')) {
|
|
|
|
getAudioDispatcher().pause()
|
|
|
|
setAudioDispatcher(undefined)
|
2020-09-18 02:44:47 +02:00
|
|
|
discordClient.user.client.voice.connections.forEach((element) => {
|
|
|
|
element.disconnect();
|
|
|
|
});
|
2020-09-08 13:17:55 +02:00
|
|
|
|
2020-09-05 08:59:09 +02:00
|
|
|
} else if (message.content.startsWith(CONFIG["discord-prefix"] + 'help')) {
|
2020-09-05 08:22:39 +02:00
|
|
|
const reply = new Discord.MessageEmbed()
|
2020-09-05 08:59:09 +02:00
|
|
|
.setColor(getRandomDiscordColor())
|
|
|
|
.addFields({
|
|
|
|
name: `${CONFIG['discord-prefix']}summon`,
|
|
|
|
value: 'Join the channel the author of the message'
|
|
|
|
}, {
|
|
|
|
name: `${CONFIG['discord-prefix']}disconnect`,
|
|
|
|
value: 'Disconnect from all current Voice Channels'
|
|
|
|
}, {
|
|
|
|
name: `${CONFIG['discord-prefix']}play`,
|
|
|
|
value: 'Play the following item'
|
|
|
|
}, {
|
|
|
|
name: `${CONFIG['discord-prefix']}pause/resume`,
|
|
|
|
value: 'Pause/Resume audio'
|
|
|
|
}, {
|
|
|
|
name: `${CONFIG['discord-prefix']}help`,
|
|
|
|
value: 'Display this help message'
|
|
|
|
})
|
2020-09-05 08:22:39 +02:00
|
|
|
message.channel.send(reply);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
handleChannelMessage
|
|
|
|
}
|