mirror of
https://github.com/informaticker/discord-jellyfin-bot.git
synced 2024-11-23 18:21:55 +01:00
156 lines
4.7 KiB
JavaScript
156 lines
4.7 KiB
JavaScript
const CONFIG = require("../config.json");
|
|
const Discord = require("discord.js");
|
|
const {
|
|
checkJellyfinItemIDRegex
|
|
} = require("./util");
|
|
const {
|
|
getAudioDispatcher
|
|
} = require("./dispachermanager");
|
|
|
|
const discordclientmanager = require("./discordclientmanager");
|
|
const jellyfinClientManager = require("./jellyfinclientmanager");
|
|
const playbackmanager = require("./playbackmanager");
|
|
const websocketHanler = require("./websockethandler");
|
|
const discordClient = discordclientmanager.getDiscordClient();
|
|
|
|
var isSummendByPlay = false;
|
|
|
|
// random Color of the Jellyfin Logo Gradient
|
|
function getRandomDiscordColor () {
|
|
function randomNumber (b, a) {
|
|
return Math.floor((Math.random() * Math.pow(Math.pow((b - a), 2), 1 / 2)) + (b > a ? a : b));
|
|
}
|
|
|
|
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) {
|
|
const response = await jellyfinClientManager.getJellyfinClient().getSearchHints({
|
|
searchTerm: searchString,
|
|
includeItemTypes: "Audio"
|
|
});
|
|
|
|
if (response.TotalRecordCount < 1) {
|
|
throw Error("Found no Song");
|
|
} else {
|
|
return response.SearchHints[0].ItemId;
|
|
}
|
|
}
|
|
|
|
function summon (voiceChannel) {
|
|
voiceChannel.join();
|
|
}
|
|
|
|
function summonMessage (message) {
|
|
if (!message.member.voice.channel) {
|
|
message.reply("please join a voice channel to summon me!");
|
|
} else if (message.channel.type === "dm") {
|
|
message.reply("no dms");
|
|
} else {
|
|
summon(message.member.voice.channel);
|
|
}
|
|
}
|
|
|
|
async function playThis (message) {
|
|
const indexOfItemID = message.content.indexOf(CONFIG["discord-prefix"] + "play") + (CONFIG["discord-prefix"] + "play").length + 1;
|
|
const argument = message.content.slice(indexOfItemID);
|
|
let itemID;
|
|
// check if play command was used with itemID
|
|
const regexresults = checkJellyfinItemIDRegex(argument);
|
|
if (regexresults) {
|
|
itemID = regexresults[0];
|
|
} else {
|
|
try {
|
|
itemID = await searchForItemID(argument);
|
|
} catch (e) {
|
|
message.reply(e.message);
|
|
playbackmanager.stop(discordClient.user.client.voice.connections.first());
|
|
return;
|
|
}
|
|
}
|
|
|
|
discordClient.user.client.voice.connections.forEach((element) => {
|
|
playbackmanager.startPlaying(element, itemID, isSummendByPlay);
|
|
});
|
|
}
|
|
|
|
function handleChannelMessage (message) {
|
|
getRandomDiscordColor();
|
|
|
|
if (message.content.startsWith(CONFIG["discord-prefix"] + "summon")) {
|
|
isSummendByPlay = false;
|
|
|
|
websocketHanler.openSocket();
|
|
|
|
summonMessage(message);
|
|
} else if (message.content.startsWith(CONFIG["discord-prefix"] + "disconnect")) {
|
|
playbackmanager.stop();
|
|
jellyfinClientManager.getJellyfinClient().closeWebSocket();
|
|
discordClient.user.client.voice.connections.forEach((element) => {
|
|
element.disconnect();
|
|
});
|
|
} else if ((message.content.startsWith(CONFIG["discord-prefix"] + "pause")) || (message.content.startsWith(CONFIG["discord-prefix"] + "resume"))) {
|
|
if (getAudioDispatcher() !== undefined) {
|
|
playbackmanager.playPause();
|
|
} else {
|
|
message.reply("there is nothing playing!");
|
|
}
|
|
} else if (message.content.startsWith(CONFIG["discord-prefix"] + "play")) {
|
|
if (discordClient.user.client.voice.connections.size < 1) {
|
|
summonMessage(message);
|
|
isSummendByPlay = true;
|
|
}
|
|
|
|
playThis(message);
|
|
} else if (message.content.startsWith(CONFIG["discord-prefix"] + "stop")) {
|
|
if (isSummendByPlay) {
|
|
if (discordClient.user.client.voice.connections.size > 0) {
|
|
playbackmanager.stop(discordClient.user.client.voice.connections.first());
|
|
}
|
|
} else {
|
|
playbackmanager.stop();
|
|
}
|
|
} else if (message.content.startsWith(CONFIG["discord-prefix"] + "help")) {
|
|
const reply = new Discord.MessageEmbed()
|
|
.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"
|
|
});
|
|
message.channel.send(reply);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
handleChannelMessage
|
|
};
|