diff --git a/src/commands/music/CommandMusicMain.java b/src/commands/music/CommandMusicMain.java index 7e71fc6..6581271 100644 --- a/src/commands/music/CommandMusicMain.java +++ b/src/commands/music/CommandMusicMain.java @@ -27,6 +27,7 @@ public class CommandMusicMain extends Command public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) { SubCommandFormattable scf = framework.run(guild, channel, user, input); + System.out.println("SCF: " + scf.resString); scf.Call(res); } } \ No newline at end of file diff --git a/src/commands/music/MusicThread.java b/src/commands/music/MusicThread.java new file mode 100644 index 0000000..dd99216 --- /dev/null +++ b/src/commands/music/MusicThread.java @@ -0,0 +1,18 @@ +package commands.music; + +public class MusicThread extends Thread +{ + public MusicThread() + { + + } + + //Called when spawned + @Override + public void run() + { + + } + + +} diff --git a/src/commands/music/SubCommandPlaylist.java b/src/commands/music/SubCommandPlaylist.java index b6c2a3f..f0ef41b 100644 --- a/src/commands/music/SubCommandPlaylist.java +++ b/src/commands/music/SubCommandPlaylist.java @@ -1,9 +1,5 @@ package commands.music; -import java.util.ArrayList; - -import com.sedmelluq.discord.lavaplayer.track.AudioTrack; - import core.SubCommand; import core.SubCommandFormattable; import dataStructures.KittyChannel; @@ -21,18 +17,9 @@ public class SubCommandPlaylist extends SubCommand @Override public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input) { - ArrayList playlist = guild.audio.getPlaylist(); - String stringPlaylist = ""; - - for(AudioTrack track : playlist) - { - stringPlaylist += (playlist.indexOf(track) + 1) + ": " + track.getInfo().title + "\n"; - } - if(stringPlaylist.equals("")) - { - return new SubCommandFormattable("Nothing Queued!"); - } +// ArrayList playlist = guild.audio.getPlaylist(); + String stringPlaylist = guild.audio.getPlaylist(guild.audio.player); return new SubCommandFormattable(stringPlaylist); } -} \ No newline at end of file +} diff --git a/src/commands/music/SubCommandStop.java b/src/commands/music/SubCommandStop.java index 1422792..2aacffd 100644 --- a/src/commands/music/SubCommandStop.java +++ b/src/commands/music/SubCommandStop.java @@ -17,7 +17,8 @@ public class SubCommandStop extends SubCommand @Override public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input) { + return new SubCommandFormattable(guild.audio.stopPlayer(guild.audio.player)); } -} \ No newline at end of file +} diff --git a/src/core/ObjectBuilderFactory.java b/src/core/ObjectBuilderFactory.java index a17d2ed..ecca033 100644 --- a/src/core/ObjectBuilderFactory.java +++ b/src/core/ObjectBuilderFactory.java @@ -20,7 +20,6 @@ import dataStructures.KittyCore; import dataStructures.KittyGuild; import dataStructures.KittyRating; import dataStructures.KittyRole; -import dataStructures.KittyStartupMode; import dataStructures.KittyUser; import main.Main; import net.dv8tion.jda.core.AccountType; @@ -142,8 +141,10 @@ public class ObjectBuilderFactory List emotes = event.getGuild().getEmotes(); ArrayList emotesString = new ArrayList(); + HashMap channels = new HashMap(); String emote; String emoteFix; + channels.put(Long.getLong(uid), extractChannel(event)); for(int i = 0; i < emotes.size(); i++) { emote = emotes.get(i).toString(); @@ -164,8 +165,8 @@ public class ObjectBuilderFactory } else { - // Construct a new guild with defaults - guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString, new AudioUtils(event.getGuild(), playerManager)); + // Construct a new guild with defaults + guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString, new AudioUtils(event.getGuild(), playerManager), channels); DatabaseManager.instance.globalRegister(guild); guildCache.put(uid, guild); } @@ -223,14 +224,13 @@ public class ObjectBuilderFactory public static KittyChannel extractChannel(GuildMessageReceivedEvent event) { lazyInit(); - String channelID = event.getChannel().getId(); - String guildID = event.getGuild().getId(); KittyChannel channel = null; synchronized(channelCache) { KittyChannel cachedChannel = channelCache.get(channelID); + boolean mature; if(cachedChannel != null) { @@ -238,8 +238,8 @@ public class ObjectBuilderFactory } else { - KittyGuild cachedGuild = guildCache.get(guildID); - channel = new KittyChannel(channelID, cachedGuild); + mature = event.getChannel().isNSFW(); + channel = new KittyChannel(channelID, mature); channelCache.put(channelID, channel); } } @@ -383,15 +383,9 @@ public class ObjectBuilderFactory { lazyInit(); - // Determine token based on config. Default to test token. - String tokenToUse = Ref.TestToken; - if(ConfigGlobals.getStartupMode() == KittyStartupMode.Release) - tokenToUse = Ref.Token; - - // Construct bot based on token kitty = new JDABuilder(AccountType.BOT) - .setToken(tokenToUse).buildBlocking(); - kitty.getPresence().setGame(Game.playing("with a laser pointer")); + .setToken(Ref.TestToken).buildBlocking(); + kitty.getPresence().setGame(Game.playing("with digital yarn")); kitty.addEventListener(new Main()); return new KittyCore(kitty); diff --git a/src/dataStructures/KittyChannel.java b/src/dataStructures/KittyChannel.java index 92c93de..770bc49 100644 --- a/src/dataStructures/KittyChannel.java +++ b/src/dataStructures/KittyChannel.java @@ -1,31 +1,15 @@ package dataStructures; -//import core.DatabaseTrackedObject; -public class KittyChannel //extends DatabaseTrackedObject +public class KittyChannel { public String uniqueID; - public KittyGuild guild; + public boolean mature; - //public KittyRating rating; - //public bool isVoice; - - public KittyChannel(String uniqueID, KittyGuild guild) + public KittyChannel(String uniqueID, boolean mature) { //super(uniqueID); this.uniqueID = uniqueID; - this.guild = guild; - } - -// @Override -// public String serialize() -// { -// return ""; -// } -// -// @Override -// public void deSerialzie(String string) -// { -// -// } -} + this.mature = false; + } +} \ No newline at end of file diff --git a/src/dataStructures/KittyGuild.java b/src/dataStructures/KittyGuild.java index ceb056d..71445b9 100644 --- a/src/dataStructures/KittyGuild.java +++ b/src/dataStructures/KittyGuild.java @@ -1,6 +1,7 @@ package dataStructures; import java.util.ArrayList; +import java.util.HashMap; import core.DatabaseManager; import core.DatabaseTrackedObject; @@ -21,6 +22,7 @@ public class KittyGuild extends DatabaseTrackedObject public ArrayList hasVoted = new ArrayList(); public ArrayList emoji = new ArrayList(); public ArrayList choices = new ArrayList(); + public HashMap channels; public AdminControl control; public AudioUtils audio; public ArrayList raffleUsersUnchosen = new ArrayList(); @@ -42,7 +44,7 @@ public class KittyGuild extends DatabaseTrackedObject } // Default content for a guild - public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList emoji, AudioUtils audio) + public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList emoji, AudioUtils audio, HashMap channels) { super(uniqueID); @@ -56,11 +58,12 @@ public class KittyGuild extends DatabaseTrackedObject this.polling = false; this.emoji = emoji; this.audio = audio; + this.channels = channels; setCommandIndicator("!"); } // Explicit constructor - public KittyGuild(String commandIndicator, KittyRating contentRating, KittyUser guildOwner, String uniqueID, AudioUtils audio) + public KittyGuild(String commandIndicator, KittyRating contentRating, KittyUser guildOwner, String uniqueID, AudioUtils audio, HashMap channels) { super(uniqueID); this.uniqueID = uniqueID; @@ -73,6 +76,7 @@ public class KittyGuild extends DatabaseTrackedObject this.polling = false; this.guildOwner = guildOwner; this.audio = audio; + this.channels = channels; } public String startPoll(String poll) diff --git a/src/network/NetworkDerpi.java b/src/network/NetworkDerpi.java index 4463b40..b0451b2 100644 --- a/src/network/NetworkDerpi.java +++ b/src/network/NetworkDerpi.java @@ -14,6 +14,7 @@ public class NetworkDerpi { public String image; public String tags; + public String score; } private class InitialRequest @@ -29,16 +30,26 @@ public class NetworkDerpi String res = HTTPUtils.sendGETRequest(mainURL + query + "&random_image=1&key=" + Ref.derpiKey); if(res != null) { + InitialRequest obj; // Use class evaluation on an array of the response object to be able to hold multiple. - InitialRequest obj = jsonParser_.fromJson(res, InitialRequest.class); + try + { + obj = jsonParser_.fromJson(res, InitialRequest.class); + } + catch(Exception e) + { + return null; + } + if(res != null) { String res2 = HTTPUtils.sendGETRequest("https://derpibooru.org/" + obj.id + ".json"); - image.editPostURL(""); + image.editPostURL("https://derpibooru.org/" + obj.id); DerpiResponseObject imageObj = jsonParser_.fromJson(res2, DerpiResponseObject.class); - image.editImageURL("https:" + imageObj.image.substring(0, imageObj.image.indexOf('_')) + imageObj.image.substring(imageObj.image.lastIndexOf('.'))); + image.editImageURL("https:" + imageObj.image.substring(0, imageObj.image.indexOf('_')) + + imageObj.image.substring(imageObj.image.lastIndexOf('.'))); if(imageObj.tags.contains("artist:")) { String [] sepTags = imageObj.tags.split(","); @@ -54,8 +65,20 @@ public class NetworkDerpi artists += sepTags[i].substring(sepTags[i].indexOf(":")+1); } } + image.editAuthorImage("https://derpicdn.net/favicon.ico"); image.editArtist(artists); + String tags = ""; + for(int i = 0; i < sepTags.length && i < 15; i++) + { + if(!sepTags[i].contains("artist:")) + { + tags += sepTags[i]; + } + } + + image.editFooterText("[Tags]" + tags); + image.editDescriptionText("Score: " + imageObj.score); } else { @@ -66,4 +89,46 @@ public class NetworkDerpi return image; } + + public GenericImage getDerpiByID(String id) + { + GenericImage image = new GenericImage(" ", " ", " "); + String artists = ""; + image.editAuthorImage("https://derpicdn.net/favicon.ico"); + String res; + try + { + res = HTTPUtils.sendGETRequest("https://derpibooru.org/" + id + ".json"); + } + catch(Exception e) + { + return null; + } + DerpiResponseObject imageObj = jsonParser_.fromJson(res, DerpiResponseObject.class); + if(imageObj.tags.contains("artist:")) + { + String [] sepTags = imageObj.tags.split(","); + for(int i = 0; i < sepTags.length; i++) + { + if(sepTags[i].contains("artist:")) + { + if(!artists.equals("")) + { + artists += " and "; + } + artists += sepTags[i].substring(sepTags[i].indexOf(":")+1); + } + } + } + if(artists != "") + image.editArtist(artists); + else + image.editArtist("Artist Unknown!"); + + image.editFooterText("[Tags]" + imageObj.tags); + image.editDescriptionText("Score: " + imageObj.score); + image.editImageURL("https:" + imageObj.image.substring(0, imageObj.image.indexOf('_')) + + imageObj.image.substring(imageObj.image.lastIndexOf('.'))); + return image; + } } \ No newline at end of file diff --git a/src/network/NetworkE6.java b/src/network/NetworkE6.java index 13980c9..da8ebfa 100644 --- a/src/network/NetworkE6.java +++ b/src/network/NetworkE6.java @@ -1,13 +1,14 @@ package network; import com.google.gson.Gson; + import dataStructures.GenericImage; import offline.Ref; -import utils.*; +import utils.HTTPUtils; /** - * This is the e6 request class, designed for form and parse requests that - * use the e6 API, and is entirely static. + * This is the e621 request class, designed for form and parse requests that + * use the e621 API, and is entirely static. * * If you ever find this class randomly not working, * it may be a good idea to make sure the user agent string is set in @@ -17,7 +18,7 @@ import utils.*; * @author Wisp * Edited by Rin */ -public class NetworkE6 +public class NetworkE6 { /////////////////////////////////////// // Internal JSON class and variables // @@ -26,6 +27,7 @@ public class NetworkE6 private static final String API_ROOT = "https://e621.net/post/index.json?"; private static int maxSearchResults_ = 10; private static String[] blacklist = Ref.e621Blacklist; + private class E6ResponseObject { // public varaibles matching the case and the type we want for JSON. @@ -35,6 +37,8 @@ public class NetworkE6 public String id; public String tags; public String [] artist; + public String [] sources; + public String score; } @@ -45,7 +49,6 @@ public class NetworkE6 // Requests a specific image, then returns a few. public GenericImage getE6(String input) { - GenericImage image = new GenericImage("","",""); boolean blacklisted; // Clean up request and replace problematic characters for the query string. @@ -60,6 +63,7 @@ public class NetworkE6 , "tags=order:random%20" + input + "&limit=" + maxSearchResults_); + if(res != null) { // Use class evaluation on an array of the response imageObject to be able to hold multiple. @@ -80,13 +84,14 @@ public class NetworkE6 { if(imageObj[i].tags.contains(blacklist[j])) { + System.out.println("BLACKLISTED " + blacklist[j]); blacklisted = true; } } if(blacklisted) { - continue; + return null; } // We will always have a file URL. That's a given. image.editImageURL(imageObj[i].file_url); @@ -95,6 +100,59 @@ public class NetworkE6 image.editArtist(imageObj[i].artist[0]); else image.editArtist("Artist Not Found!"); + + image.editAuthorImage("https://e621.net/favicon.ico"); + + String sources = ""; + + if(imageObj[i].sources != null) + { + for(int k = 0; k < imageObj[i].sources.length; k ++) + { + if(!imageObj[i].sources[k].endsWith(imageObj[i].file_url.substring(imageObj[i].file_url.lastIndexOf('.')))) + { + String source = imageObj[i].sources[k]; + if(source.contains("//www.")) + { + source = source.substring(source.indexOf(".") + 1); + source = source.substring(0, source.indexOf('.')); + } + else + { + source = source.substring(source.indexOf("/") + 2); + source = source.substring(0, source.indexOf('.')); + } + sources += " [" + source + "](" + imageObj[i].sources[k] + ") "; + } + } + image.editDescriptionText("Score: " + imageObj[i].score + "\n**Source:**" + sources); + } + else + { + image.editDescriptionText("Score: " + imageObj[i].score); + } + + + + if(imageObj[i].tags.split(" ").length > 15) + { + String [] splitTags = imageObj[i].tags.split(" "); + String descTags = ""; + for(int o = 0; o < 15; o++) + { + descTags += splitTags[o] + ", "; + } + image.editFooterText("[Tags] " + descTags + " etc."); + } + else + { + image.editFooterText("[Tags] " + imageObj[i].tags.replace(" ", ", ")); + } + + if(image.output().authorText != null) + { + return image; + } } } diff --git a/src/utils/audio/AudioUtils.java b/src/utils/audio/AudioUtils.java index 7430926..ab209b2 100644 --- a/src/utils/audio/AudioUtils.java +++ b/src/utils/audio/AudioUtils.java @@ -1,5 +1,6 @@ package utils.audio; -import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Queue; import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; @@ -20,7 +21,7 @@ public class AudioUtils public AudioManager am; public final AudioPlayer player; public final AudioPlayerManager playerManager; - private ArrayList playlist = new ArrayList(); + private Queue playlist = new LinkedList<>(); public AudioUtils(Guild guild, AudioPlayerManager playerManager) @@ -84,9 +85,12 @@ public class AudioUtils } public class SmallAudio implements AudioLoadResultHandler - { + { + private AudioPlayer player; + private SmallAudio(AudioPlayer player) { + this.player = player; } @Override public void loadFailed(FriendlyException arg0) { } @@ -100,6 +104,14 @@ public class AudioUtils { playlist.add(track); } + do + { + if(player.getPlayingTrack() == null) + { + player.startTrack(playlist.poll(), false); + } + } + while(!playlist.isEmpty()); } } @@ -108,21 +120,13 @@ public class AudioUtils { guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player)); playerManager.loadItemOrdered(player, videoURL, new SmallAudio(player)); - try { - Thread.sleep(1000); - } catch (InterruptedException e) {} - if(player.getPlayingTrack() == null) - { - MusicController control = new MusicController(player, playlist); - control.start(); - } + return null; } public String skipVideo(AudioPlayer player) { - player.stopTrack(); - return "Skipped"; + return null; } public String stopPlayer(AudioPlayer player) @@ -132,44 +136,13 @@ public class AudioUtils return "Stopped"; } - public ArrayList getPlaylist() + public String getPlaylist(AudioPlayer player) { - return playlist; - } -} - -class MusicController extends Thread -{ - AudioPlayer player; - private ArrayList playlist; - - public MusicController(AudioPlayer player, ArrayList playlist) - { - this.player = player; - this.playlist = playlist; - } - - @Override - public void run() - { - AudioTrack nowPlaying = null; - do + String response =""; + for(AudioTrack track:playlist) { - if(!playlist.isEmpty() || nowPlaying != null) - { - if(player.getPlayingTrack() == null) - { - if(playlist.isEmpty()) - nowPlaying = null; - else - { - nowPlaying = playlist.get(0); - playlist.remove(0); - } - player.startTrack(nowPlaying, false); - } - } + response += track.getInfo().title; } - while(!playlist.isEmpty() || player.getPlayingTrack() != null); + return response; } }