diff --git a/README.md b/README.md index f52bdac..c6a1f51 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,12 @@ summon | Join the channel the author of the message(now you can cast to the Bot disconnect | Disconnect from all current Voice Channels play | Play the following item(can be the name of the song or the Stream URL) pause/resume | Pause/Resume audio +seek | Where to Seek to in seconds or MM:SS help | Display the help message ### Limitations - Playlist (soon) -- Seek to functionality (soon) - [Playing Video Content](https://support.discord.com/hc/en-us/community/posts/360059238512-Add-Go-Live-support-for-API) (if Discord ever adds this, I'll implement it into this Bot) ## Getting Started diff --git a/src/messagehandler.js b/src/messagehandler.js index 7d0bb0d..a4dee72 100644 --- a/src/messagehandler.js +++ b/src/messagehandler.js @@ -6,6 +6,9 @@ const { const { getAudioDispatcher } = require("./dispachermanager"); +const { + hmsToSeconds +} = require("./util"); const discordclientmanager = require("./discordclientmanager"); const jellyfinClientManager = require("./jellyfinclientmanager"); @@ -41,6 +44,15 @@ function getRandomDiscordColor () { 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)); } +function getDiscordEmbedError(e){ + return new Discord.MessageEmbed() + .setColor(0xff0000) + .setTitle("Error!") + .setTimestamp() + .setDescription("<:x:757935515445231651> " + e); +} + + // Song Search, return the song itemID async function searchForItemID (searchString) { const response = await jellyfinClientManager.getJellyfinClient().getSearchHints({ @@ -100,11 +112,7 @@ async function playThis (message) { try { itemID = await searchForItemID(argument); } catch (e) { - const noSong = new Discord.MessageEmbed() - .setColor(0xff0000) - .setTitle("Error!") - .setTimestamp() - .setDescription("<:x:757935515445231651> " + e); + const noSong = getDiscordEmbedError(e); message.channel.send(noSong); playbackmanager.stop(isSummendByPlay?discordClient.user.client.voice.connections.first():undefined); return; @@ -170,6 +178,15 @@ function handleChannelMessage (message) { } else { playbackmanager.stop(); } + } else if (message.content.startsWith(CONFIG["discord-prefix"] + "seek")) { + const indexOfArgument = message.content.indexOf(CONFIG["discord-prefix"] + "seek") + (CONFIG["discord-prefix"] + "seek").length + 1; + const argument = message.content.slice(indexOfArgument); + try { + playbackmanager.seek(hmsToSeconds(argument)*10000000); + } catch (error) { + const errorMessage = getDiscordEmbedError(error); + message.channel.send(errorMessage); + } } else if (message.content.startsWith(CONFIG["discord-prefix"] + "help")) { /* eslint-disable quotes */ const reply = new Discord.MessageEmbed() @@ -187,6 +204,9 @@ function handleChannelMessage (message) { }, { name: `${CONFIG["discord-prefix"]}pause/resume`, value: "Pause/Resume audio" + }, { + name: `${CONFIG["discord-prefix"]}seek`, + value: "Where to Seek to in seconds or MM:SS" }, { name: `${CONFIG["discord-prefix"]}help`, value: "Display this help message" diff --git a/src/playbackmanager.js b/src/playbackmanager.js index 3636dd2..06694d5 100644 --- a/src/playbackmanager.js +++ b/src/playbackmanager.js @@ -52,6 +52,8 @@ function seek (toSeek = 0) { if (getAudioDispatcher()) { startPlaying(undefined, undefined, ticksToSeconds(toSeek), _disconnectOnFinish); jellyfinClientManager.getJellyfinClient().reportPlaybackProgress(getProgressPayload()); + }else{ + throw Error("No Song Playing"); } } diff --git a/src/util.js b/src/util.js index 455cb13..1bf5259 100644 --- a/src/util.js +++ b/src/util.js @@ -7,7 +7,20 @@ function ticksToSeconds (ticks) { return ticks / 10000000; } +function hmsToSeconds(str) { + var p = str.split(':'), + s = 0, m = 1; + + while (p.length > 0) { + s += m * parseInt(p.pop(), 10); + m *= 60; + } + + return s; +} + module.exports = { checkJellyfinItemIDRegex, - ticksToSeconds + ticksToSeconds, + hmsToSeconds };