From 860251c46ff7fd862250bc8f710d57ed379d3f67 Mon Sep 17 00:00:00 2001 From: Savvy Date: Tue, 11 Jul 2017 21:56:47 -0400 Subject: [PATCH] Implement search for youtube / music --- .../2.13/taskArtifacts/cache.properties.lock | Bin 17 -> 17 bytes .gradle/2.13/taskArtifacts/fileHashes.bin | Bin 39343 -> 39675 bytes .gradle/2.13/taskArtifacts/fileSnapshots.bin | Bin 942113 -> 961562 bytes .gradle/2.13/taskArtifacts/taskArtifacts.bin | Bin 34449 -> 34449 bytes .idea/workspace.xml | 314 ++++++++++++++---- src/main/java/me/savvy/rixa/Rixa.java | 3 +- .../rixa/commands/admin/ConfigCommand.java | 10 +- .../rixa/commands/general/MusicCommand.java | 28 +- .../general/UrbanDictionaryCommand.java | 1 - .../rixa/commands/general/YoutubeCommand.java | 41 +++ .../me/savvy/rixa/events/MessageEvent.java | 1 - .../rixa/modules/twitter/TwitterModule.java | 11 +- .../java/me/savvy/rixa/utils/WebUtil.java | 42 +++ .../me/savvy/rixa/utils/YoutubeSearch.java | 96 +++++- 14 files changed, 465 insertions(+), 82 deletions(-) create mode 100644 src/main/java/me/savvy/rixa/commands/general/YoutubeCommand.java create mode 100644 src/main/java/me/savvy/rixa/utils/WebUtil.java diff --git a/.gradle/2.13/taskArtifacts/cache.properties.lock b/.gradle/2.13/taskArtifacts/cache.properties.lock index fd54d85b228b262ea29b1b911fa2c7988469c30e..1b6b67dbae86ba95950d1b0e9ad73ef9132efa41 100644 GIT binary patch literal 17 UcmZRM`)gkj_?x4T0SvVA0W&8AkpKVy literal 17 UcmZRM`)gkj_?x4T0SvTQ0W!S=CjbBd diff --git a/.gradle/2.13/taskArtifacts/fileHashes.bin b/.gradle/2.13/taskArtifacts/fileHashes.bin index 276a4567076ec5a05b124468d63d12d13fdaa06f..9ce369e6c8cfaf18e985e1ebfe949dbf1ac8e125 100644 GIT binary patch delta 1583 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 lo$=$>;k50A_1tTir+*OU5pS=%nSuZS diff --git a/.gradle/2.13/taskArtifacts/taskArtifacts.bin b/.gradle/2.13/taskArtifacts/taskArtifacts.bin index da67c1a49ab13613f6dc5f796f6a15bbb97b74ef..5a97c6ea5c0eb33771e9fed1eb97c78a734b7200 100644 GIT binary patch delta 96 zcmbQ(%QUf5x)@7MV{EKA#Ws1N_w3D`-f4`R7x`A{ zN|a2^5aN7Y6upY^d*$+8_Loc+^)^4!b_#E9EM{cfl(~&*vrP3ob`AzG;I07xr%oj! delta 92 zcmbQ(%QUfkq=VYV}F@27{qH;-LHZr - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -1151,24 +1271,7 @@ - - - - - - - - - - - - - - - - - @@ -1331,13 +1434,6 @@ - - - - - - - @@ -1352,13 +1448,6 @@ - - - - - - - @@ -1401,13 +1490,6 @@ - - - - - - - @@ -1422,28 +1504,20 @@ - - - - - - - + + + + + + - - - - - - - @@ -1452,26 +1526,120 @@ - + - - - + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/me/savvy/rixa/Rixa.java b/src/main/java/me/savvy/rixa/Rixa.java index 45cc03e..3a8ab1f 100644 --- a/src/main/java/me/savvy/rixa/Rixa.java +++ b/src/main/java/me/savvy/rixa/Rixa.java @@ -2,6 +2,7 @@ package me.savvy.rixa; import me.savvy.rixa.commands.admin.BatchMoveCommand; import me.savvy.rixa.commands.admin.ConfigCommand; +import me.savvy.rixa.commands.admin.InviteCommand; import me.savvy.rixa.commands.general.*; import me.savvy.rixa.commands.handlers.CommandExec; import me.savvy.rixa.commands.handlers.CommandHandler; @@ -88,7 +89,7 @@ public class Rixa { new InfoCommand(), new ServerInfoCommand(), new HelpCommand(), new DeleteMessagesCommand(), new PingCommand(), new PurgeMessagesCommand(), new BatchMoveCommand(), new MuteCommand(), new MusicCommand(), - new ConfigCommand(), new UrbanDictionaryCommand(), /*new InviteCommand()*/}); + new ConfigCommand(), new UrbanDictionaryCommand(), new YoutubeCommand()}); register(new React[] {new HelpReaction(), new ConfigReaction()}); data = new Data(DataType.SQL); } diff --git a/src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java b/src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java index 009b86d..fce031c 100644 --- a/src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java +++ b/src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java @@ -33,6 +33,13 @@ public class ConfigCommand implements CommandExec { "%pconfig set defaultRole ; Set role to be assigned when a user joins the server!", "%pconfig set muteRole ; Set role to be assigned when a user is muted!", "%pconfig set musicRole ; Set role required to use the music functions! (Not required)", + + "%pconfig set twitterCKey ; Set Twitter Consumer Key!", + "%pconfig set twitterCSecret ; Set Twitter Consumer Secret!", + "%pconfig set twitterAToken ; Set Twitter Access Key!", + "%pconfig set twitterASecret ; Set Twitter Access Secret!", + "%config set twitterChannel ; Set the channel for Twitter feed updates!", + "%pconfig joinMessage ; Set the greetings message for when a user joins the server!", "%pconfig quitMessage ; Set the quit message for when a user leaves the server!", "%pconfig joinPm ; Set the message to be private messaged when a user joins!", @@ -40,7 +47,8 @@ public class ConfigCommand implements CommandExec { "%pconfig addPerm ; Give a role permission to access a command!", "%pconfig removePerm ; Remove a role's permission to access a command!", "%pconfig enable ; Enabled a Rixa Module!", - "%pconfig disable ; Disable a Rixa Module!"); + "%pconfig disable ; Disable a Rixa Module!" + ); } @Override @Command(mainCommand = "config", diff --git a/src/main/java/me/savvy/rixa/commands/general/MusicCommand.java b/src/main/java/me/savvy/rixa/commands/general/MusicCommand.java index a7f367a..526a2a7 100644 --- a/src/main/java/me/savvy/rixa/commands/general/MusicCommand.java +++ b/src/main/java/me/savvy/rixa/commands/general/MusicCommand.java @@ -24,12 +24,14 @@ import me.savvy.rixa.guild.RixaManager; import me.savvy.rixa.modules.music.MusicManager; import me.savvy.rixa.modules.music.TrackScheduler; import me.savvy.rixa.utils.MessageBuilder; +import me.savvy.rixa.utils.YoutubeSearch; import net.dv8tion.jda.core.Permission; import net.dv8tion.jda.core.entities.*; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.core.exceptions.PermissionException; import java.awt.*; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -125,7 +127,7 @@ public class MusicCommand implements CommandExec { return; } new MessageBuilder("Track Name: " + player.getPlayingTrack().getInfo().title + "\n Track Link: " + - player.getPlayingTrack().getInfo().uri).setColor(event.getMember().getColor()).queue(event.getChannel()); + player.getPlayingTrack().getInfo().uri).setColor(event.getMember().getColor()).queue(event.getChannel()); } else if(message[1].equalsIgnoreCase("pause")) { if (player.getPlayingTrack() == null) { new MessageBuilder("There is no track currently playing.").setColor(event.getMember().getColor()).queue(event.getChannel()); @@ -134,9 +136,9 @@ public class MusicCommand implements CommandExec { player.setPaused(!player.isPaused()); if (player.isPaused()) { new MessageBuilder("The music player has been paused.").setColor(event.getMember().getColor()).queue(event.getChannel()); - } else { + } else { new MessageBuilder("There music player has resumed playing.").setColor(event.getMember().getColor()).queue(event.getChannel()); - } + } } else if(message[1].equalsIgnoreCase("stop")) { scheduler.queue.clear(); player.stopTrack(); @@ -249,6 +251,18 @@ public class MusicCommand implements CommandExec { new MessageBuilder(message[2] + " is not a valid integer. Try a number between 10 and 100.").setColor(event.getMember().getColor()).queue(event.getChannel()); } } + } // music youtube = 3) { + if(message[1].equalsIgnoreCase("youtube") || message[1].equalsIgnoreCase("yt") || message[1].equalsIgnoreCase("search") + || message[1].equalsIgnoreCase("ytsearch")) { + String search = getMessage(message, 2); + try { + YoutubeSearch ytSearch = new YoutubeSearch(search); + loadAndPlay(mng, event.getChannel(), ytSearch.getUrl(0), false); + } catch (IOException e) { + e.printStackTrace(); + } + } } } @@ -323,4 +337,12 @@ public class MusicCommand implements CommandExec { private void sendHelp() { } + + private String getMessage(String[] messages, int argToBegin) { + StringBuilder builder = new StringBuilder(); + for(int i = argToBegin; i < messages.length; i++) { + builder.append(messages[i]).append(" "); + } + return builder.toString().trim(); + } } diff --git a/src/main/java/me/savvy/rixa/commands/general/UrbanDictionaryCommand.java b/src/main/java/me/savvy/rixa/commands/general/UrbanDictionaryCommand.java index cd9d69e..9e974fe 100644 --- a/src/main/java/me/savvy/rixa/commands/general/UrbanDictionaryCommand.java +++ b/src/main/java/me/savvy/rixa/commands/general/UrbanDictionaryCommand.java @@ -16,7 +16,6 @@ import java.net.URLEncoder; */ public class UrbanDictionaryCommand implements CommandExec { - @Override @Command(mainCommand = "urbandictionary", aliases = {"ud"}, diff --git a/src/main/java/me/savvy/rixa/commands/general/YoutubeCommand.java b/src/main/java/me/savvy/rixa/commands/general/YoutubeCommand.java new file mode 100644 index 0000000..95c215b --- /dev/null +++ b/src/main/java/me/savvy/rixa/commands/general/YoutubeCommand.java @@ -0,0 +1,41 @@ +package me.savvy.rixa.commands.general; + +import me.savvy.rixa.commands.handlers.Command; +import me.savvy.rixa.commands.handlers.CommandExec; +import me.savvy.rixa.utils.MessageBuilder; +import me.savvy.rixa.utils.YoutubeSearch; +import net.dv8tion.jda.core.entities.ChannelType; +import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; + +import java.io.IOException; + +/** + * Created by savit on 7/11/2017. + */ +public class YoutubeCommand implements CommandExec { + + @Override + @Command(mainCommand = "youtube", + aliases = {"yt"}, + description = "Search youtube for music videos!", + channelType = ChannelType.TEXT) + public void execute(GuildMessageReceivedEvent event) { + String[] message = event.getMessage().getContent().split(" "); + String search = getMessage(message, 1); + try { + YoutubeSearch ytSearch = new YoutubeSearch(search); + new MessageBuilder(ytSearch.getUrl(0)) + .setColor(event.getMember().getColor()).queue(event.getChannel()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private String getMessage(String[] messages, int argToBegin) { + StringBuilder builder = new StringBuilder() ; + for(int i = argToBegin; i < messages.length; i++) { + builder.append(messages[i]).append(" "); + } + return builder.toString().trim(); + } +} diff --git a/src/main/java/me/savvy/rixa/events/MessageEvent.java b/src/main/java/me/savvy/rixa/events/MessageEvent.java index dfbfeb1..349e762 100644 --- a/src/main/java/me/savvy/rixa/events/MessageEvent.java +++ b/src/main/java/me/savvy/rixa/events/MessageEvent.java @@ -44,7 +44,6 @@ public class MessageEvent { CommandRegistrar cmd = CommandHandler.get(splitContent[0]); Method m = cmd.getMethod(); try { - Rixa.getInstance().getLogger().info("Invoking: " + cmd.getCommandAnnotation().mainCommand()); m.invoke(cmd.getExecutor(), event); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/me/savvy/rixa/modules/twitter/TwitterModule.java b/src/main/java/me/savvy/rixa/modules/twitter/TwitterModule.java index c391760..11847a0 100644 --- a/src/main/java/me/savvy/rixa/modules/twitter/TwitterModule.java +++ b/src/main/java/me/savvy/rixa/modules/twitter/TwitterModule.java @@ -13,9 +13,14 @@ public class TwitterModule { private ConfigurationBuilder configurationBuilder; private Twitter twitter; private TwitterFactory twitterFactory; - private String consumerKey, consumerSecret, accessToken, accessTokenSecret; + private final RixaGuild rixaGuild; + private String consumerKey; + private String consumerSecret; + private String accessToken; + private String accessTokenSecret; public TwitterModule(RixaGuild rixaGuild, String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) { + this.rixaGuild = rixaGuild; this.consumerKey = consumerKey; this.consumerSecret = consumerSecret; this.accessToken = accessToken; @@ -77,4 +82,8 @@ public class TwitterModule { public TwitterStream getTwitterStream() { return twitterStream; } + + public RixaGuild getRixaGuild() { + return rixaGuild; + } } diff --git a/src/main/java/me/savvy/rixa/utils/WebUtil.java b/src/main/java/me/savvy/rixa/utils/WebUtil.java new file mode 100644 index 0000000..421e862 --- /dev/null +++ b/src/main/java/me/savvy/rixa/utils/WebUtil.java @@ -0,0 +1,42 @@ +package me.savvy.rixa.utils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * Created by savit on 7/11/2017. + */ +public class WebUtil { + + public static String getWebPage(String url) throws IOException { + URL searchURL = new URL(url); + HttpURLConnection conn = (HttpURLConnection) searchURL.openConnection(); + return getWebPage(conn); + } + + public static String getWebPage(HttpURLConnection conn) throws IOException { + StringBuilder sb = new StringBuilder(); + conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); + conn.setRequestProperty("Referer", "http://www.google.com"); + + int response = conn.getResponseCode(); + if (response == 403) { + System.out.println("Quota Exceeded"); + } + else if (response != 200) { + System.out.println("DEBUG: Response code: " + response); + } + + BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + sb.append(line).append("\n"); + } + in.close(); + + return sb.toString(); + } +} diff --git a/src/main/java/me/savvy/rixa/utils/YoutubeSearch.java b/src/main/java/me/savvy/rixa/utils/YoutubeSearch.java index 8af2cf0..0d0b057 100644 --- a/src/main/java/me/savvy/rixa/utils/YoutubeSearch.java +++ b/src/main/java/me/savvy/rixa/utils/YoutubeSearch.java @@ -1,7 +1,101 @@ package me.savvy.rixa.utils; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + /** * Created by savit on 7/11/2017. */ public class YoutubeSearch { -} + + private static final String API_KEY; + private JSONArray items; + private final String YOUTUBE_WATCH_BASE_URL = "https://www.youtube.com/watch?v="; + + static { + API_KEY = "AIzaSyD1wjRGbzKgvjqAU25pREy1dVio9WpcuS0"; + } + + public YoutubeSearch(String query) throws IOException { + try { + String url = "https://www.googleapis.com/youtube/v3/search?" + + "q=" + URLEncoder.encode(query, "UTF-8") + + "&part=id%2Csnippet" + + "&safeSearch=none" + + "&key=" + API_KEY; + search(url); + } + catch (UnsupportedEncodingException ignored) {} + } + + + public String getKind(int index) { + return items.getJSONObject(index).getString("kind"); + } + + public String getIdKind(int index) { + return items.getJSONObject(index).getJSONObject("id").getString("kind"); + } + + public String getVideoId(int index) { + return items.getJSONObject(index).getJSONObject("id").getString("videoId"); + } + + public String getPublishedTime(int index) { + return items.getJSONObject(index).getJSONObject("snippet").getString("publishedAt"); + } + + public String getChannelId(int index) { + return items.getJSONObject(index).getJSONObject("snippet").getString("channelId"); + } + + public String getTitle(int index) { + return items.getJSONObject(index).getJSONObject("snippet").getString("title"); + } + + public String getDescription(int index) { + return items.getJSONObject(index).getJSONObject("snippet").getString("description"); + } + + public String getChannelTitle(int index) { + return items.getJSONObject(index).getJSONObject("snippet").getString("channelTitle"); + } + + public String getLiveBroadcastContent(int index) { + return items.getJSONObject(index).getJSONObject("snippet").getString("liveBroadcastContent"); + } + + public String getThumbnailDefaultUrl(int index) { + return items.getJSONObject(index).getJSONObject("snippet").getJSONObject("default").getString("url"); + } + + public String getThumbnailMediumUrl(int index) { + return items.getJSONObject(index).getJSONObject("snippet").getJSONObject("medium").getString("url"); + } + + public String getThumbnailHighUrl(int index) { + return items.getJSONObject(index).getJSONObject("snippet").getJSONObject("high").getString("url"); + } + + public String getUrl(int index) { + return YOUTUBE_WATCH_BASE_URL + getVideoId(index); + } + + private void search(String url) throws IOException { + String json = WebUtil.getWebPage(url); + + JSONObject obj = new JSONObject(json); + try { + items = obj.getJSONArray("items"); + } + catch (JSONException e) { + System.out.println("No search results found.");// throw new NotFoundException("No results found."); + } + } + +} \ No newline at end of file