diff --git a/src/main/java/net/Broken/Commands/Code.java b/src/main/java/net/Broken/Commands/Code.java new file mode 100644 index 0000000..55da096 --- /dev/null +++ b/src/main/java/net/Broken/Commands/Code.java @@ -0,0 +1,68 @@ +package net.Broken.Commands; + +import groovy.lang.Binding; +import groovy.lang.GroovyShell; +import net.Broken.Commande; +import net.dv8tion.jda.core.EmbedBuilder; +import net.dv8tion.jda.core.events.message.MessageReceivedEvent; + +import java.awt.*; + +public class Code implements Commande { + @Override + public void action(String[] args, MessageReceivedEvent event) { + StringBuilder stringBuilder = new StringBuilder(); + for(String arg : args){ + stringBuilder.append(arg); + stringBuilder.append(" "); + } + + Binding binding = new Binding(); + binding.setVariable("event", event); + GroovyShell shell = new GroovyShell(binding); + EmbedBuilder builder; + try{ + Object value = shell.evaluate(stringBuilder.toString()); + StringBuilder stringResult = new StringBuilder(); + + if(value.getClass().isArray()){ + Object[] array = (Object[]) value; + for(Object obj : array){ + if(stringResult.length() < 1800){ + stringResult.append(obj.toString()).append("\n\n"); + } + else{ + stringResult.append("\n..."); + break; + } + + } + }else{ + stringResult.append(value.toString()); + } + builder = new EmbedBuilder().setColor(Color.orange).setTitle(":hammer_pick: Compilation Successful :hammer_pick:").setDescription("```java\n" + stringResult.toString() + "```"); + }catch (Exception ex){ + builder = new EmbedBuilder().setColor(Color.red).setTitle(":x: Compilation Failed :x:").setDescription("```java\n" + ex.toString() + "```"); + } + + + event.getChannel().sendMessage(builder.build()).queue(); + + + } + + @Override + public boolean isPrivateUsable() { + return true; + } + + @Override + public boolean isAdminCmd() { + return true; + } + + @Override + public boolean isNSFW() { + return false; + } +} diff --git a/src/main/java/net/Broken/Commands/YtSearch.java b/src/main/java/net/Broken/Commands/YtSearch.java new file mode 100644 index 0000000..9c6232c --- /dev/null +++ b/src/main/java/net/Broken/Commands/YtSearch.java @@ -0,0 +1,65 @@ +package net.Broken.Commands; + +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import net.Broken.Commande; +import net.Broken.MainBot; +import net.Broken.Tools.EmbedMessageUtils; +import net.Broken.Tools.MessageTimeOut; +import net.Broken.audio.Youtube.SearchResult; +import net.Broken.audio.Youtube.YoutubeTools; +import net.dv8tion.jda.core.EmbedBuilder; +import net.dv8tion.jda.core.entities.Message; +import net.dv8tion.jda.core.entities.MessageEmbed; +import net.dv8tion.jda.core.events.message.MessageReceivedEvent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.util.ArrayList; + +public class YtSearch implements Commande { + + private Logger logger = LogManager.getLogger(); + + @Override + public void action(String[] args, MessageReceivedEvent event) { + YoutubeTools youtubeT = YoutubeTools.getInstance(); + + if(args.length < 1){ + logger.info("YtSearch: Missing args, user: " + event.getAuthor().getName()); + Message message = event.getChannel().sendMessage(EmbedMessageUtils.buildStandar(EmbedMessageUtils.getError("Missing search query!"))).complete(); + new MessageTimeOut(MainBot.messageTimeOut, message, event.getMessage()).start(); + }else { + try { + ArrayList result = youtubeT.search(args[0], 5); + for(SearchResult item : result){ + event.getChannel().sendMessage(EmbedMessageUtils.searchResult(item)).queue(); + } + + } catch (GoogleJsonResponseException e) { + logger.error("There was a service error: " + e.getDetails().getCode() + " : " + e.getDetails().getMessage()); + event.getChannel().sendMessage(EmbedMessageUtils.getInternalError()).queue(); + } catch (IOException t) { + logger.catching(t); + event.getChannel().sendMessage(EmbedMessageUtils.getInternalError()).queue(); + } + } + + + } + + @Override + public boolean isPrivateUsable() { + return false; + } + + @Override + public boolean isAdminCmd() { + return false; + } + + @Override + public boolean isNSFW() { + return false; + } +} diff --git a/src/main/java/net/Broken/MainBot.java b/src/main/java/net/Broken/MainBot.java index a51a750..44529e3 100644 --- a/src/main/java/net/Broken/MainBot.java +++ b/src/main/java/net/Broken/MainBot.java @@ -1,20 +1,15 @@ package net.Broken; -import net.Broken.RestApi.ApiCommandLoader; import net.Broken.Tools.Command.CommandParser; import net.Broken.Tools.EmbedMessageUtils; import net.Broken.Tools.MessageTimeOut; import net.Broken.Tools.PrivateMessage; import net.Broken.Tools.UserSpamUtils; -import net.Broken.audio.Youtube.YoutubeTools; -import net.dv8tion.jda.core.AccountType; import net.dv8tion.jda.core.JDA; -import net.dv8tion.jda.core.JDABuilder; import net.dv8tion.jda.core.Permission; import net.dv8tion.jda.core.entities.ChannelType; import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.Message; -import net.dv8tion.jda.core.entities.User; import net.dv8tion.jda.core.events.message.MessageReceivedEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -24,7 +19,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Controller; -import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/net/Broken/RestApi/MusicWebAPIController.java b/src/main/java/net/Broken/RestApi/MusicWebAPIController.java index 687fa97..88fbe5e 100644 --- a/src/main/java/net/Broken/RestApi/MusicWebAPIController.java +++ b/src/main/java/net/Broken/RestApi/MusicWebAPIController.java @@ -1,5 +1,6 @@ package net.Broken.RestApi; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import net.Broken.Commands.Music; @@ -7,10 +8,13 @@ import net.Broken.DB.Entity.UserEntity; import net.Broken.DB.Repository.UserRepository; import net.Broken.MainBot; import net.Broken.RestApi.Data.*; +import net.Broken.Tools.EmbedMessageUtils; import net.Broken.Tools.UserManager.Exceptions.UnknownTokenException; import net.Broken.Tools.UserManager.UserUtils; import net.Broken.audio.AudioM; import net.Broken.audio.FindGeneral; +import net.Broken.audio.Youtube.SearchResult; +import net.Broken.audio.Youtube.YoutubeTools; import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.VoiceChannel; import org.apache.logging.log4j.LogManager; @@ -21,6 +25,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -44,7 +49,7 @@ public class MusicWebAPIController { @RequestMapping("/currentMusicInfo") - public ResponseEntity getCurrentM(@RequestParam(value = "guild") String guildId){ + public ResponseEntity getCurrentM(@RequestParam(value = "guild") String guildId){ //TODO security issue ???!!! Guild guild = MainBot.jda.getGuildById(guildId); if(guild == null ){ logger.warn("Request whit no guild!"); @@ -72,7 +77,7 @@ public class MusicWebAPIController { } @RequestMapping("/getPlaylist") - public ResponseEntity getPlaylist(@RequestParam(value = "guild") String guildId){ + public ResponseEntity getPlaylist(@RequestParam(value = "guild") String guildId){ //TODO security issue ???!!! Guild guild = MainBot.jda.getGuildById(guildId); if(guild == null ){ logger.warn("Request whit no guild!"); @@ -127,7 +132,7 @@ public class MusicWebAPIController { } @RequestMapping(value = "/getChanel", method = RequestMethod.GET) - public ResponseEntity> getChanel(@RequestParam(value = "guild") String guildId){ + public ResponseEntity> getChanel(@RequestParam(value = "guild") String guildId){ //TODO security issue ???!!! Guild guild = MainBot.jda.getGuildById(guildId); if(guild == null ){ logger.warn("Request whit no guild!"); @@ -143,6 +148,33 @@ public class MusicWebAPIController { return new ResponseEntity<>(temp, HttpStatus.OK); } + @RequestMapping(value = "/search", method = RequestMethod.GET) + public ResponseEntity> search(@CookieValue("token") String token, @RequestParam(value = "query") String query ){ + if(token != null) { + try { + UserEntity user = userUtils.getUserWithApiToken(userRepository, token); + YoutubeTools youtubeTools = YoutubeTools.getInstance(); + ArrayList result = youtubeTools.search(query, 25); + return new ResponseEntity<>(result, HttpStatus.OK); + + }catch (UnknownTokenException e){ + logger.warn("Search without token!"); + return new ResponseEntity<>( HttpStatus.UNAUTHORIZED); + } catch (GoogleJsonResponseException e) { + logger.error("There was a service error: " + e.getDetails().getCode() + " : " + e.getDetails().getMessage()); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } catch (IOException e) { + logger.catching(e); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + + } + }else{ + logger.warn("Search without token!"); + return new ResponseEntity<>( HttpStatus.UNAUTHORIZED); + + } + } + } diff --git a/src/main/java/net/Broken/Tools/EmbedMessageUtils.java b/src/main/java/net/Broken/Tools/EmbedMessageUtils.java index 1d8a385..5890837 100644 --- a/src/main/java/net/Broken/Tools/EmbedMessageUtils.java +++ b/src/main/java/net/Broken/Tools/EmbedMessageUtils.java @@ -2,6 +2,7 @@ package net.Broken.Tools; import net.Broken.DB.Entity.GuildPreferenceEntity; import net.Broken.MainBot; +import net.Broken.audio.Youtube.SearchResult; import net.dv8tion.jda.core.EmbedBuilder; import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.MessageEmbed; @@ -123,6 +124,16 @@ public class EmbedMessageUtils { return buildStandar(messageB); } + public static MessageEmbed searchResult(SearchResult result){ + EmbedBuilder builder = new EmbedBuilder() + .setColor(Color.CYAN) + .setTitle(result.title) + .setImage(result.imageUrl) + .addField("URL:","https://www.youtube.com/watch?v="+result.id,false) + .addField("Chanel:", result.channelTittle, false); + return buildStandar(builder); + } + diff --git a/src/main/java/net/Broken/audio/TrackScheduler.java b/src/main/java/net/Broken/audio/TrackScheduler.java index a2bbe88..4de5cfe 100644 --- a/src/main/java/net/Broken/audio/TrackScheduler.java +++ b/src/main/java/net/Broken/audio/TrackScheduler.java @@ -13,6 +13,7 @@ import net.dv8tion.jda.core.entities.Guild; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingDeque; @@ -190,7 +191,7 @@ public class TrackScheduler extends AudioEventAdapter { } catch (GoogleJsonResponseException e) { logger.error("There was a service error: " + e.getDetails().getCode() + " : " + e.getDetails().getMessage()); - } catch (Throwable t) { + } catch (IOException t) { logger.catching(t); } diff --git a/src/main/java/net/Broken/audio/Youtube/SearchResult.java b/src/main/java/net/Broken/audio/Youtube/SearchResult.java new file mode 100644 index 0000000..c62b241 --- /dev/null +++ b/src/main/java/net/Broken/audio/Youtube/SearchResult.java @@ -0,0 +1,21 @@ +package net.Broken.audio.Youtube; + +public class SearchResult { + public String id; + public String title; + public String description; + public String publishedAt; + public String channelId; + public String channelTittle; + public String imageUrl; + + public SearchResult(com.google.api.services.youtube.model.SearchResult result){ + id = result.getId().getVideoId(); + title = result.getSnippet().getTitle(); + description = result.getSnippet().getDescription(); + publishedAt = result.getSnippet().getPublishedAt().toString(); + channelId = result.getSnippet().getChannelId(); + channelTittle = result.getSnippet().getChannelTitle(); + imageUrl = result.getSnippet().getThumbnails().getDefault().getUrl(); + } +} diff --git a/src/main/java/net/Broken/audio/Youtube/YoutubeTools.java b/src/main/java/net/Broken/audio/Youtube/YoutubeTools.java index 4d52a61..64d8254 100644 --- a/src/main/java/net/Broken/audio/Youtube/YoutubeTools.java +++ b/src/main/java/net/Broken/audio/Youtube/YoutubeTools.java @@ -1,14 +1,10 @@ package net.Broken.audio.Youtube; -import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequest; -import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.youtube.YouTube; import com.google.api.services.youtube.model.SearchListResponse; import com.google.api.services.youtube.model.SearchResult; -import net.dv8tion.jda.core.entities.Guild; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -19,31 +15,35 @@ import java.util.HashMap; public class YoutubeTools { private Logger logger = LogManager.getLogger(); + private String apiKey = System.getenv("GOOGLE_API_KEY"); + private static YoutubeTools INSTANCE; - private static YoutubeTools INSTANCE ; - - private YoutubeTools(){ + private YoutubeTools() { } - public static YoutubeTools getInstance(){ - if(INSTANCE == null) + public static YoutubeTools getInstance() { + if (INSTANCE == null) INSTANCE = new YoutubeTools(); return INSTANCE; } - public String getRelatedVideo(String videoId, ArrayList history) throws IOException, GoogleJsonResponseException, Throwable { + private YouTube getYoutubeService() { -// YouTube youtube = getYouTubeService(); - - YouTube.Builder builder = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), new HttpRequestInitializer() { - public void initialize(HttpRequest request) throws IOException { - } + YouTube.Builder builder = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), request -> { }); - builder.setApplicationName("youtube-cmdline-search-sample"); - YouTube youtube = builder.build(); + builder.setApplicationName("BotDiscord"); + return builder.build(); + + } + + + public String getRelatedVideo(String videoId, ArrayList history) throws IOException { + + + YouTube youtube = getYoutubeService(); HashMap parameters = new HashMap<>(); @@ -60,15 +60,14 @@ public class YoutubeTools { searchListRelatedVideosRequest.setType(parameters.get("type")); } - searchListRelatedVideosRequest.setKey(System.getenv("GOOGLE_API_KEY")); + searchListRelatedVideosRequest.setKey(apiKey); SearchListResponse response = searchListRelatedVideosRequest.execute(); - for(SearchResult item : response.getItems()){ - if(!history.contains(item.getId().getVideoId())){ + for (SearchResult item : response.getItems()) { + if (!history.contains(item.getId().getVideoId())) { return item.getId().getVideoId(); - } - else + } else logger.debug("ID already on history"); } @@ -76,4 +75,26 @@ public class YoutubeTools { return response.getItems().get(0).getId().getVideoId(); } + + + public ArrayList search(String query, long max) throws IOException { + YouTube youTube = getYoutubeService(); + YouTube.Search.List searchList = youTube.search().list("snippet"); + searchList.setType("video"); + searchList.setSafeSearch("none"); + searchList.setMaxResults(max); + searchList.setQ(query); + searchList.setKey(apiKey); + searchList.setOrder("relevance"); + + SearchListResponse response = searchList.execute(); + ArrayList finalResult = new ArrayList<>(); + for(SearchResult item : response.getItems()){ + logger.debug(item.getSnippet().getTitle()); + finalResult.add(new net.Broken.audio.Youtube.SearchResult(item)); + } + + return finalResult; + + } } diff --git a/src/main/resources/templates/music.html b/src/main/resources/templates/music.html index cc8c5d7..360e1b0 100644 --- a/src/main/resources/templates/music.html +++ b/src/main/resources/templates/music.html @@ -19,6 +19,9 @@ + + +
...