diff --git a/.classpath b/.classpath index e5e8a9b..571ccd1 100644 --- a/.classpath +++ b/.classpath @@ -24,7 +24,8 @@ - - + + + diff --git a/assets/config.csv b/assets/config.csv index 2564dd9..686c012 100644 --- a/assets/config.csv +++ b/assets/config.csv @@ -19,6 +19,7 @@ "Localized Commands","e621","" "Localized Commands","eightball, 8ball","" "Localized Commands","fetch","" +"Localized Commands","getsauce","" "Localized Commands","givebeans","" "Localized Commands","help","" "Localized Commands","indicator","" @@ -139,6 +140,7 @@ "Localized Strings","FetchInfo","Throw a custom emote and I'll try to bring it back.... maybe" "Localized Strings","FetchRunAway","*Runs away and doesn't return for a long time*" "Localized Strings","FetchStare","*Stares at %s*" +"Localized Strings","GetSauceInfo","" "Localized Strings","GiveBeansInfo","Gives beans to the mentioned users!" "Localized Strings","GiveBeansInvalid","That's not a valid number!" "Localized Strings","GiveBeansNoneMentioned","You didn't mention anyone!" @@ -270,6 +272,7 @@ "Command Enabler","e621","1" "Command Enabler","eightball, 8ball","1" "Command Enabler","fetch","1" +"Command Enabler","getsauce","1" "Command Enabler","givebeans","1" "Command Enabler","guildroleadd","1" "Command Enabler","guildroleallowed","1" diff --git a/lib/LavaPlayerJar-0.0.1-jar-with-dependencies.jar b/lib/LavaPlayerJar-0.0.1-jar-with-dependencies.jar new file mode 100644 index 0000000..b0e1843 Binary files /dev/null and b/lib/LavaPlayerJar-0.0.1-jar-with-dependencies.jar differ diff --git a/lib/google-http-client-1.32.0.jar b/lib/google-http-client-1.32.0.jar new file mode 100644 index 0000000..b97d4d4 Binary files /dev/null and b/lib/google-http-client-1.32.0.jar differ diff --git a/lib/lavaplayer-1.3.19.jar b/lib/lavaplayer-1.3.19.jar deleted file mode 100644 index 472c468..0000000 Binary files a/lib/lavaplayer-1.3.19.jar and /dev/null differ diff --git a/src/commands/general/CommandGetSauce.java b/src/commands/general/CommandGetSauce.java new file mode 100644 index 0000000..be59ec8 --- /dev/null +++ b/src/commands/general/CommandGetSauce.java @@ -0,0 +1,29 @@ +package commands.general; + +import core.Command; +import core.LocStrings; +import dataStructures.KittyChannel; +import dataStructures.KittyGuild; +import dataStructures.KittyRating; +import dataStructures.KittyRole; +import dataStructures.KittyUser; +import dataStructures.Response; +import dataStructures.UserInput; +import network.NetworkSauceNAO; + +public class CommandGetSauce extends Command +{ + NetworkSauceNAO sauce = new NetworkSauceNAO(); + + public CommandGetSauce(KittyRole level, KittyRating rating) { super(level, rating); } + + @Override + public String getHelpText() { return LocStrings.stub("GetSauceInfo"); }; + + @Override + public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) + { + res.send(sauce.getSauce(input.args)); + + } +} \ No newline at end of file diff --git a/src/commands/music/CommandMusicMain.java b/src/commands/music/CommandMusicMain.java index 181fb21..7176498 100644 --- a/src/commands/music/CommandMusicMain.java +++ b/src/commands/music/CommandMusicMain.java @@ -13,10 +13,11 @@ public class CommandMusicMain extends Command super(level, rating); framework.addCommand("join", new SubCommandJoin(KittyRole.General, KittyRating.Safe)); framework.addCommand("leave", new SubCommandLeave(KittyRole.General, KittyRating.Safe)); + framework.addCommand("add", new SubCommandAddTrack(KittyRole.General, KittyRating.Safe)); } @Override - public String getHelpText() { return LocStrings.stub("MusicInfo"); } + public String getHelpText() {return LocStrings.stub("MusicInfo"); } @Override public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) diff --git a/src/commands/music/SubCommandAddTrack.java b/src/commands/music/SubCommandAddTrack.java index 1c19498..eae45ce 100644 --- a/src/commands/music/SubCommandAddTrack.java +++ b/src/commands/music/SubCommandAddTrack.java @@ -1,7 +1,5 @@ package commands.music; -import com.google.api.services.youtube.YouTube; - import core.SubCommand; import core.SubCommandFormattable; import dataStructures.KittyChannel; @@ -10,16 +8,20 @@ import dataStructures.KittyRating; import dataStructures.KittyRole; import dataStructures.KittyUser; import dataStructures.UserInput; +import network.NetworkYoutube; public class SubCommandAddTrack extends SubCommand { public SubCommandAddTrack(KittyRole level, KittyRating rating) { super(level, rating); } + NetworkYoutube YT = new NetworkYoutube(); + @Override public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input) { - return null; + String response = YT.getYT(input.args); + return new SubCommandFormattable(response); } } \ No newline at end of file diff --git a/src/core/CommandManager.java b/src/core/CommandManager.java index c1441c4..2607956 100644 --- a/src/core/CommandManager.java +++ b/src/core/CommandManager.java @@ -22,6 +22,7 @@ import commands.general.CommandDBStats; import commands.general.CommandDoWork; import commands.general.CommandEightBall; import commands.general.CommandFetch; +import commands.general.CommandGetSauce; import commands.general.CommandGiveBeans; import commands.general.CommandHelp; import commands.general.CommandHelpBuilder; @@ -154,6 +155,7 @@ public class CommandManager this.register(LocCommands.stub("raffle"), new CommandRaffleMain(KittyRole.General, KittyRating.Safe)); this.register(LocCommands.stub("poll"), new CommandPollMain(KittyRole.General, KittyRating.Safe)); this.register(LocCommands.stub("music"), new CommandMusicMain(KittyRole.General, KittyRating.Safe)); + this.register(LocCommands.stub("getsauce"), new CommandGetSauce(KittyRole.General, KittyRating.Safe)); } // Allows the command manager to keep track of a command. Takes a pair (the un-localized and localzied commands) diff --git a/src/core/ObjectBuilderFactory.java b/src/core/ObjectBuilderFactory.java index fb93eff..8ee3e06 100644 --- a/src/core/ObjectBuilderFactory.java +++ b/src/core/ObjectBuilderFactory.java @@ -20,6 +20,7 @@ import net.dv8tion.jda.core.entities.*; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import offline.Ref; import utils.AdminControl; +import utils.AudioUtils; //import utils.AudioUtils; import utils.GlobalLog; import utils.LogFilter; @@ -147,7 +148,7 @@ public class ObjectBuilderFactory else { // Construct a new guild with defaults - guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString); + guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString, new AudioUtils(event.getGuild())); DatabaseManager.instance.globalRegister(guild); guildCache.put(uid, guild); } diff --git a/src/dataStructures/KittyGuild.java b/src/dataStructures/KittyGuild.java index 7801f79..8f4c443 100644 --- a/src/dataStructures/KittyGuild.java +++ b/src/dataStructures/KittyGuild.java @@ -22,7 +22,7 @@ public class KittyGuild extends DatabaseTrackedObject public ArrayList emoji = new ArrayList(); public ArrayList choices = new ArrayList(); public AdminControl control; - public AudioUtils audio; + public AudioUtils audio; public ArrayList raffleUsersUnchosen = new ArrayList(); public ArrayList raffleUsersChosen = new ArrayList(); @@ -42,7 +42,7 @@ public class KittyGuild extends DatabaseTrackedObject } // Default content for a guild - public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList emoji) + public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList emoji, AudioUtils audio) { super(uniqueID); this.uniqueID = uniqueID; @@ -54,11 +54,12 @@ public class KittyGuild extends DatabaseTrackedObject this.contentRating = KittyRating.Safe; this.polling = false; this.emoji = emoji; + this.audio = audio; setCommandIndicator("!"); } // Explicit constructor - public KittyGuild(String commandIndicator, KittyRating contentRating, KittyUser guildOwner, String uniqueID) + public KittyGuild(String commandIndicator, KittyRating contentRating, KittyUser guildOwner, String uniqueID, AudioUtils audio) { super(uniqueID); this.uniqueID = uniqueID; @@ -70,6 +71,7 @@ public class KittyGuild extends DatabaseTrackedObject this.contentRating = contentRating; this.polling = false; this.guildOwner = guildOwner; + this.audio = audio; } public String startPoll(String poll) diff --git a/src/main/Main.java b/src/main/Main.java index 06b562b..369a666 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -18,13 +18,9 @@ import dataStructures.KittyGuild; import dataStructures.KittyUser; import dataStructures.Response; import dataStructures.UserInput; -import net.dv8tion.jda.core.AccountType; -import net.dv8tion.jda.core.JDA; -import net.dv8tion.jda.core.JDABuilder; -import net.dv8tion.jda.core.entities.Game; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.core.hooks.ListenerAdapter; -import offline.Ref; +import utils.AudioController; import utils.GlobalLog; // http://www.slf4j.org/ - this JDA logging tool has been disabled by specifying NOP implementation. @@ -41,6 +37,8 @@ public class Main extends ListenerAdapter private static RPManager rpManager; private static PluginManager pluginManager; private static CharacterManager charManager; + private static AudioController audioControl; + // Initialization and setup public static void main(String[] args) throws InterruptedException, LoginException, Exception @@ -51,6 +49,7 @@ public class Main extends ListenerAdapter commandManager = ObjectBuilderFactory.constructCommandManager(CommandEnabler.instance); // TODO: Untangle this singleton stats = ObjectBuilderFactory.constructStats(commandManager); charManager = new CharacterManager(); + audioControl = new AudioController(); rpManager = ObjectBuilderFactory.constructRPManager(); pluginManager = ObjectBuilderFactory.constructPluginManager(); diff --git a/src/network/NetworkSauceNAO.java b/src/network/NetworkSauceNAO.java new file mode 100644 index 0000000..93c030f --- /dev/null +++ b/src/network/NetworkSauceNAO.java @@ -0,0 +1,48 @@ +package network; + +import java.util.List; + +import com.google.gson.Gson; + +import offline.Ref; +import utils.HTTPUtils; + +public class NetworkSauceNAO +{ + private static final Gson jsonParser_ = new Gson(); + private static final String API_ROOT = "https://saucenao.com/search.php?db=999&output_type=2&numres=10&api_key=" + Ref.SauceNAOKey +"&url="; + NetworkE621 e621Sauce = new NetworkE621(); + private class SauceNAOResponseObject + { + List results; + } + + private class SauceNAOResult + { + SauceNAOData data; + } + + private class SauceNAOData + { + String [] ext_urls; + } + + public String getSauce(String input) + { + input = input.trim(); + input = input.replace("+", "%2B"); + input = input.replace(" ", "%20"); + + String res = HTTPUtils.sendGETRequest(API_ROOT + input); + + SauceNAOResponseObject sauce = jsonParser_.fromJson(res, SauceNAOResponseObject.class); + String sauceUrl = sauce.results.get(0).data.ext_urls[0]; + if(sauceUrl.startsWith("https://e621.net/post/show/")) + { + System.out.println("id:" + sauceUrl.substring(26)); + return e621Sauce.getE621("id:" + sauceUrl.substring(27)).toString(); + } + return sauce.results.get(0).data.ext_urls[0]; + } + +} diff --git a/src/network/NetworkYoutube.java b/src/network/NetworkYoutube.java index d2ee0b6..8bb0f76 100644 --- a/src/network/NetworkYoutube.java +++ b/src/network/NetworkYoutube.java @@ -1,14 +1,55 @@ package network; -import com.google.api.services.youtube.YouTube; +import java.util.List; + +import com.google.gson.Gson; import offline.Ref; +import utils.HTTPUtils; public class NetworkYoutube { - private static YouTube youtube; + /////////////////////////////////////// + // Internal JSON class and variables // + //////////////////////////////////.//// - public NetworkYoutube() + //https://www.youtube.com/watch?v= + + private static final Gson jsonParser_ = new Gson(); + private static final String API_ROOT = "https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=10&q="; + + + // Use this as the base + public class YTOuter { + List items; } -} \ No newline at end of file + + public class YTInner + { + TYID id; + YTSnippet snippet; + } + + public class TYID + { + String videoId; + } + + public class YTSnippet + { + String title; + String description; + } + + public String getYT(String input) + { + input = input.trim(); + input = input.replace("+", "%2B"); + input = input.replace(" ", "%20"); + + String res = HTTPUtils.sendGETRequest(API_ROOT + input + "&order=viewCount&type=video&topicId=%2Fm%2F04rlf&videoDefinition=high&key=" + Ref.youtube); + YTOuter videoObj = jsonParser_.fromJson(res, YTOuter.class); + return "https://www.youtube.com/watch?v=" + videoObj.items.get(0).id.videoId; + } +} diff --git a/src/utils/AudioController.java b/src/utils/AudioController.java new file mode 100644 index 0000000..26080c6 --- /dev/null +++ b/src/utils/AudioController.java @@ -0,0 +1,30 @@ +package utils; + +import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; +import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; +import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers; + +public class AudioController +{ + public static AudioController instance; + AudioPlayerManager playerManager = new DefaultAudioPlayerManager(); + + public AudioController () + { + if(instance == null) + { + instance = this; + } + else + { + AudioSourceManagers.registerRemoteSources(playerManager); + return; + } + } + + public AudioPlayer createPlayer() + { + return playerManager.createPlayer(); + } +} \ No newline at end of file diff --git a/src/utils/AudioUtils.java b/src/utils/AudioUtils.java index 79c1529..34d6a8a 100644 --- a/src/utils/AudioUtils.java +++ b/src/utils/AudioUtils.java @@ -1,10 +1,4 @@ package utils; -/*** - * https://developers.google.com/youtube/v3/code_samples/code_snippets?apix_params=%7B%22part%22%3A%22snippet%22%2C%22maxResults%22%3A25%2C%22q%22%3A%22surfing%22%7D - * https://github.com/sedmelluq/LavaPlayer#jda-integration - * https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/core/entities/VoiceChannel.html - * https://developers.google.com/youtube/registering_an_application#Create_API_Keys - */ import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; import net.dv8tion.jda.core.entities.Guild; @@ -14,14 +8,15 @@ import net.dv8tion.jda.core.managers.AudioManager; public class AudioUtils { private Guild guild; - AudioManager audio; - AudioPlayer player; + public AudioManager audio; + public final AudioPlayer player; public AudioUtils(Guild guild) { this.guild = guild; audio = guild.getAudioManager(); + player = AudioController.instance.createPlayer(); } public boolean joinChannel(String channelName)