From 4da9d6f903054d89583fed9ae2628bd566afa6f4 Mon Sep 17 00:00:00 2001 From: BrokenFire Date: Tue, 26 Dec 2017 16:25:35 +0100 Subject: [PATCH] Adding basic music control --- .../Broken/RestApi/Data/CommandPostData.java | 7 + .../RestApi/Data/CommandResponseData.java | 14 ++ .../Broken/RestApi/MusicWebController.java | 53 ++++++++ src/main/java/net/Broken/audio/AudioM.java | 18 +-- src/main/resources/log4j2.xml | 2 +- src/main/resources/static/index.html | 12 +- src/main/resources/static/js/init.js | 122 ++++++++++++------ src/main/resources/templates/music.html | 109 ++++++++++------ 8 files changed, 239 insertions(+), 98 deletions(-) create mode 100644 src/main/java/net/Broken/RestApi/Data/CommandPostData.java create mode 100644 src/main/java/net/Broken/RestApi/Data/CommandResponseData.java diff --git a/src/main/java/net/Broken/RestApi/Data/CommandPostData.java b/src/main/java/net/Broken/RestApi/Data/CommandPostData.java new file mode 100644 index 0000000..741db3a --- /dev/null +++ b/src/main/java/net/Broken/RestApi/Data/CommandPostData.java @@ -0,0 +1,7 @@ +package net.Broken.RestApi.Data; + + +public class CommandPostData { + public String command; + public String data; +} diff --git a/src/main/java/net/Broken/RestApi/Data/CommandResponseData.java b/src/main/java/net/Broken/RestApi/Data/CommandResponseData.java new file mode 100644 index 0000000..e78e8c2 --- /dev/null +++ b/src/main/java/net/Broken/RestApi/Data/CommandResponseData.java @@ -0,0 +1,14 @@ +package net.Broken.RestApi.Data; + +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class CommandResponseData { + public String Commande; + public String Message; + + public CommandResponseData(String commande, String message) { + Commande = commande; + Message = message; + } +} diff --git a/src/main/java/net/Broken/RestApi/MusicWebController.java b/src/main/java/net/Broken/RestApi/MusicWebController.java index 2429932..7ef3410 100644 --- a/src/main/java/net/Broken/RestApi/MusicWebController.java +++ b/src/main/java/net/Broken/RestApi/MusicWebController.java @@ -5,12 +5,21 @@ import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo; import net.Broken.Commandes.Music; import net.Broken.MainBot; +import net.Broken.RestApi.Data.CommandPostData; +import net.Broken.RestApi.Data.CommandResponseData; import net.Broken.RestApi.Data.CurrentMusicData; import net.Broken.RestApi.Data.PlaylistData; import net.Broken.audio.NotConectedException; import net.Broken.audio.NullMusicManager; +import net.dv8tion.jda.core.events.message.MessageReceivedEvent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONObject; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -18,6 +27,8 @@ import java.util.List; @RestController @RequestMapping("/api/music/") public class MusicWebController { + Logger logger = LogManager.getLogger(); + @RequestMapping("/currentMusicInfo") public CurrentMusicData test(){ Music musicCommande = (Music) MainBot.commandes.get("music"); @@ -45,4 +56,46 @@ public class MusicWebController { return new PlaylistData(list); } } + + @RequestMapping(value = "/command", method = RequestMethod.POST) + public ResponseEntity command(@RequestBody CommandPostData data){ + + if(data.command != null){ + logger.info("receive command: " + data.command); + Music musicCommande = (Music) MainBot.commandes.get("music"); + switch (data.command){ + case "PLAY": + try { + musicCommande.getAudioManager().getMusicManager().scheduler.resume(); + return new ResponseEntity<>(new CommandResponseData(data.command,"Accepted"), HttpStatus.OK); + } catch (NullMusicManager | NotConectedException nullMusicManager) { + return new ResponseEntity<>(new CommandResponseData(data.command,"Not connected to vocal!"), HttpStatus.NOT_ACCEPTABLE); + } + + case "PAUSE": + try { + musicCommande.getAudioManager().getMusicManager().scheduler.pause(); + return new ResponseEntity<>(new CommandResponseData(data.command,"Accepted"), HttpStatus.OK); + } catch (NullMusicManager | NotConectedException nullMusicManager) { + return new ResponseEntity<>(new CommandResponseData(data.command,"Not connected to vocal!"), HttpStatus.NOT_ACCEPTABLE); + } + + case "NEXT": + try { + musicCommande.getAudioManager().getMusicManager().scheduler.nextTrack(); + return new ResponseEntity<>(new CommandResponseData(data.command,"Accepted"), HttpStatus.OK); + } catch (NullMusicManager | NotConectedException nullMusicManager) { + return new ResponseEntity<>(new CommandResponseData(data.command,"Not connected to vocal!"), HttpStatus.NOT_ACCEPTABLE); + } + + case "STOP": + musicCommande.getAudioManager().stop((MessageReceivedEvent) null); + return new ResponseEntity<>(new CommandResponseData(data.command,"Accepted"), HttpStatus.OK); + + } + } + else + logger.info("Null"); + return new ResponseEntity<>(new CommandResponseData(null, null), HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/net/Broken/audio/AudioM.java b/src/main/java/net/Broken/audio/AudioM.java index 4ca74f3..6ab75fe 100644 --- a/src/main/java/net/Broken/audio/AudioM.java +++ b/src/main/java/net/Broken/audio/AudioM.java @@ -223,16 +223,18 @@ public class AudioM { public void stop (MessageReceivedEvent event) { - GuildMusicManager musicManager = getGuildAudioPlayer(event.getGuild()); musicManager.scheduler.stop(); playedChanel = null; - event.getGuild().getAudioManager().closeAudioConnection(); - Message message = event.getTextChannel().sendMessage(EmbedMessageUtils.getMusicOk("Arret de la musique!")).complete(); - List messages = new ArrayList(){{ - add(message); - add(event.getMessage()); - }}; - new MessageTimeOut(messages, MainBot.messageTimeOut).start(); + + if (event != null) { + event.getGuild().getAudioManager().closeAudioConnection(); + Message message = event.getTextChannel().sendMessage(EmbedMessageUtils.getMusicOk("Arret de la musique!")).complete(); + List messages = new ArrayList(){{ + add(message); + add(event.getMessage()); + }}; + new MessageTimeOut(messages, MainBot.messageTimeOut).start(); + } } public void stop (GuildVoiceLeaveEvent event) { diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 8a55852..943dfee 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -17,7 +17,7 @@ - + diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index 4119e3c..8207e20 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -52,8 +52,8 @@
@@ -68,12 +68,8 @@
- -
+ +
info diff --git a/src/main/resources/static/js/init.js b/src/main/resources/static/js/init.js index 8bc156f..c397607 100644 --- a/src/main/resources/static/js/init.js +++ b/src/main/resources/static/js/init.js @@ -1,5 +1,6 @@ var savedPlaylist; var error = false; +var state; $(document).ready(function() { setInterval("getCurentMusic()",1000); @@ -13,20 +14,32 @@ $(document).ready(function() { }); var height = $( window ).height(); + $('#btn_play').click(function () { + switch (state){ + case "PLAYING": + sendCommand("PAUSE") + break; + + case "PAUSE": + sendCommand("PLAY") + break; + } + + }) + + $('#btn_next').click(function () { + sendCommand("NEXT"); + }) + $('#btn_stop').click(function () { + sendCommand("STOP"); + }) + }) -function updateModal(data){ - $('#modal_title').text("Title: "+ data.info.title); - $('#modal_author').text("Author: "+ data.info.author); - $('#modal_lenght').text("Duration: "+ msToTime(data.info.length)); - $('#modal_url').text("URL: "+ data.info.uri); -} - - function getCurentMusic() { $.get("api/music/currentMusicInfo", function (data) { @@ -34,6 +47,7 @@ function getCurentMusic() { // alert( "second success" ); // console.log(data); + state = data.state; switch (data.state) { case "STOP": $('#music_text').text("No Music"); @@ -85,12 +99,11 @@ function getCurentMusic() { }) } - function getPlayList() { $.get("api/music/getPlaylist", function (data) { }).done(function (data) { data = data.list; - if(data.length != 0){ + if(data != null && data.length != 0){ var noUpdate = comparePlaylist(data, savedPlaylist); if(!noUpdate){ @@ -114,6 +127,9 @@ function getPlayList() { }); } } + else + $('#playlist_list').empty(); + @@ -121,22 +137,52 @@ function getPlayList() { } +function updateModal(data){ + $('#modal_title').text("Title: "+ data.info.title); + $('#modal_author').text("Author: "+ data.info.author); + $('#modal_lenght').text("Duration: "+ msToTime(data.info.length)); + $('#modal_url').text("URL: "+ data.info.uri); + -function msToTime(duration) { - var milliseconds = parseInt((duration%1000)/100) - , seconds = parseInt((duration/1000)%60) - , minutes = parseInt((duration/(1000*60))%60) - , hours = parseInt((duration/(1000*60*60))%24); - hours = (hours < 10) ? "0" + hours : hours; - minutes = (minutes < 10) ? "0" + minutes : minutes; - seconds = (seconds < 10) ? "0" + seconds : seconds; - if(hours > 0 ) - return hours + ":" + minutes + ":" + seconds; - else - return minutes + ":" + seconds; } +function updateControl(data){ + $('#music_text').text(data.info.title); + var percent = (data.currentPos / data.info.length) * 100; + // console.log(percent) + if (!$('#btn_info').hasClass("indeterminate")) { + $('#btn_info').addClass("determinate").removeClass("indeterminate"); + } + $('#music_progress').width(percent + "%"); + + + if ($('#btn_stop').hasClass("disabled")) { + $('#btn_stop').removeClass("disabled"); + } + if ($('#btn_info').hasClass("disabled")) { + $('#btn_info').removeClass("disabled"); + } + + $('#music_img').attr("src","http://img.youtube.com/vi/"+data.info.identifier+"/hqdefault.jpg"); + updateModal(data); +} + +function sendCommand(commandStr){ + $.ajax({ + type: "POST", + dataType: 'json', + contentType: 'application/json', + url: "/api/music/command", + data: JSON.stringify({ command: commandStr}), + success: function (data) { + console.log(data); + } + + }).fail(function (data) { + console.log(data); + }); +} function comparePlaylist(list1, list2){ if(list1 == null || list2 == null){ @@ -160,23 +206,19 @@ function comparePlaylist(list1, list2){ return true; } -function updateControl(data){ - $('#music_text').text(data.info.title); - var percent = (data.currentPos / data.info.length) * 100; - // console.log(percent) - if (!$('#btn_info').hasClass("indeterminate")) { - $('#btn_info').addClass("determinate").removeClass("indeterminate"); - } - $('#music_progress').width(percent + "%"); +function msToTime(duration) { + var milliseconds = parseInt((duration%1000)/100) + , seconds = parseInt((duration/1000)%60) + , minutes = parseInt((duration/(1000*60))%60) + , hours = parseInt((duration/(1000*60*60))%24); - - if ($('#btn_stop').hasClass("disabled")) { - $('#btn_stop').removeClass("disabled"); - } - if ($('#btn_info').hasClass("disabled")) { - $('#btn_info').removeClass("disabled"); - } - - $('#music_img').attr("src","http://img.youtube.com/vi/"+data.info.identifier+"/hqdefault.jpg"); - updateModal(data); + hours = (hours < 10) ? "0" + hours : hours; + minutes = (minutes < 10) ? "0" + minutes : minutes; + seconds = (seconds < 10) ? "0" + seconds : seconds; + if(hours > 0 ) + return hours + ":" + minutes + ":" + seconds; + else + return minutes + ":" + seconds; } + + diff --git a/src/main/resources/templates/music.html b/src/main/resources/templates/music.html index 9758d51..e58c4d2 100644 --- a/src/main/resources/templates/music.html +++ b/src/main/resources/templates/music.html @@ -15,7 +15,7 @@
-
-
- -
-

Test- By test

-
-
-
+
+
+
+ +
+

+
+
+
+
+
+ +
+ +
-
- - - +
+
    + +
-
- - + + +
+ + + + + + -
    - -
+