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)