diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml
index 0097452..d5ddd95 100644
--- a/dependency-reduced-pom.xml
+++ b/dependency-reduced-pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.fpghoti
Biscuit
- 1.7
+ 1.8
src/main/java
diff --git a/pom.xml b/pom.xml
index a7e3a45..85dab2c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
4.0.0
com.fpghoti
Biscuit
- 1.7
+ 1.8
src/main/java
@@ -194,5 +194,10 @@
lavaplayer
1.3.50
+
+ org.pf4j
+ pf4j
+ 3.4.1
+
\ No newline at end of file
diff --git a/src/main/java/com/fpghoti/biscuit/Main.java b/src/main/java/com/fpghoti/biscuit/Main.java
index eac7679..c55da99 100644
--- a/src/main/java/com/fpghoti/biscuit/Main.java
+++ b/src/main/java/com/fpghoti/biscuit/Main.java
@@ -1,5 +1,6 @@
package com.fpghoti.biscuit;
+import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
@@ -10,47 +11,47 @@ import org.fusesource.jansi.AnsiConsole;
import com.fpghoti.biscuit.biscuit.Biscuit;
import com.fpghoti.biscuit.captcha.BCage;
import com.fpghoti.biscuit.commands.CommandManager;
-import com.fpghoti.biscuit.commands.client.AddCommand;
-import com.fpghoti.biscuit.commands.client.ChanIDCommand;
-import com.fpghoti.biscuit.commands.client.DivideCommand;
-import com.fpghoti.biscuit.commands.client.GetConfigCommand;
-import com.fpghoti.biscuit.commands.client.GuildIDCommand;
-import com.fpghoti.biscuit.commands.client.ToggleRoleCommand;
-import com.fpghoti.biscuit.commands.client.HelpCommand;
-import com.fpghoti.biscuit.commands.client.MultiplyCommand;
-import com.fpghoti.biscuit.commands.client.NotSpammerCommand;
-import com.fpghoti.biscuit.commands.client.MakeInviteCommand;
-import com.fpghoti.biscuit.commands.client.PingCommand;
-import com.fpghoti.biscuit.commands.client.PowerCommand;
-import com.fpghoti.biscuit.commands.client.RecentSpammersCommand;
-import com.fpghoti.biscuit.commands.client.SaveConfigCommand;
-import com.fpghoti.biscuit.commands.client.SoftMuteCommand;
-import com.fpghoti.biscuit.commands.client.SquareRootCommand;
-import com.fpghoti.biscuit.commands.client.SubtractCommand;
-import com.fpghoti.biscuit.commands.client.UIDCommand;
-import com.fpghoti.biscuit.commands.client.UnSoftMuteCommand;
-import com.fpghoti.biscuit.commands.client.WikiCommand;
-import com.fpghoti.biscuit.commands.client.music.ClearCommand;
-import com.fpghoti.biscuit.commands.client.music.ForceSkipCommand;
-import com.fpghoti.biscuit.commands.client.music.ForceSkipToCommand;
-import com.fpghoti.biscuit.commands.client.music.ClearUserSongsCommand;
-import com.fpghoti.biscuit.commands.client.music.LoopMusicCommand;
-import com.fpghoti.biscuit.commands.client.music.MoveToCommand;
-import com.fpghoti.biscuit.commands.client.music.NowPlayingCommand;
-import com.fpghoti.biscuit.commands.client.music.PauseCommand;
-import com.fpghoti.biscuit.commands.client.music.PlayCommand;
-import com.fpghoti.biscuit.commands.client.music.PlayFirstCommand;
-import com.fpghoti.biscuit.commands.client.music.QueueCommand;
-import com.fpghoti.biscuit.commands.client.music.RemoveCommand;
-import com.fpghoti.biscuit.commands.client.music.ShuffleCommand;
-import com.fpghoti.biscuit.commands.client.music.SkipAllCommand;
-import com.fpghoti.biscuit.commands.client.music.SkipCommand;
-import com.fpghoti.biscuit.commands.client.music.TogglePauseCommand;
-import com.fpghoti.biscuit.commands.client.music.UnpauseCommand;
-import com.fpghoti.biscuit.commands.client.music.VolumeCommand;
import com.fpghoti.biscuit.commands.console.GuildSayCommand;
import com.fpghoti.biscuit.commands.console.SayCommand;
import com.fpghoti.biscuit.commands.console.ShutdownConsoleCommand;
+import com.fpghoti.biscuit.commands.discord.AddCommand;
+import com.fpghoti.biscuit.commands.discord.ChanIDCommand;
+import com.fpghoti.biscuit.commands.discord.DivideCommand;
+import com.fpghoti.biscuit.commands.discord.GetConfigCommand;
+import com.fpghoti.biscuit.commands.discord.GuildIDCommand;
+import com.fpghoti.biscuit.commands.discord.HelpCommand;
+import com.fpghoti.biscuit.commands.discord.MakeInviteCommand;
+import com.fpghoti.biscuit.commands.discord.MultiplyCommand;
+import com.fpghoti.biscuit.commands.discord.NotSpammerCommand;
+import com.fpghoti.biscuit.commands.discord.PingCommand;
+import com.fpghoti.biscuit.commands.discord.PowerCommand;
+import com.fpghoti.biscuit.commands.discord.RecentSpammersCommand;
+import com.fpghoti.biscuit.commands.discord.SaveConfigCommand;
+import com.fpghoti.biscuit.commands.discord.SoftMuteCommand;
+import com.fpghoti.biscuit.commands.discord.SquareRootCommand;
+import com.fpghoti.biscuit.commands.discord.SubtractCommand;
+import com.fpghoti.biscuit.commands.discord.ToggleRoleCommand;
+import com.fpghoti.biscuit.commands.discord.UIDCommand;
+import com.fpghoti.biscuit.commands.discord.UnSoftMuteCommand;
+import com.fpghoti.biscuit.commands.discord.WikiCommand;
+import com.fpghoti.biscuit.commands.discord.music.ClearCommand;
+import com.fpghoti.biscuit.commands.discord.music.ClearUserSongsCommand;
+import com.fpghoti.biscuit.commands.discord.music.ForceSkipCommand;
+import com.fpghoti.biscuit.commands.discord.music.ForceSkipToCommand;
+import com.fpghoti.biscuit.commands.discord.music.LoopMusicCommand;
+import com.fpghoti.biscuit.commands.discord.music.MoveToCommand;
+import com.fpghoti.biscuit.commands.discord.music.NowPlayingCommand;
+import com.fpghoti.biscuit.commands.discord.music.PauseCommand;
+import com.fpghoti.biscuit.commands.discord.music.PlayCommand;
+import com.fpghoti.biscuit.commands.discord.music.PlayFirstCommand;
+import com.fpghoti.biscuit.commands.discord.music.QueueCommand;
+import com.fpghoti.biscuit.commands.discord.music.RemoveCommand;
+import com.fpghoti.biscuit.commands.discord.music.ShuffleCommand;
+import com.fpghoti.biscuit.commands.discord.music.SkipAllCommand;
+import com.fpghoti.biscuit.commands.discord.music.SkipCommand;
+import com.fpghoti.biscuit.commands.discord.music.TogglePauseCommand;
+import com.fpghoti.biscuit.commands.discord.music.UnpauseCommand;
+import com.fpghoti.biscuit.commands.discord.music.VolumeCommand;
import com.fpghoti.biscuit.listener.CommandListener;
import com.fpghoti.biscuit.listener.DMListener;
import com.fpghoti.biscuit.listener.GuildListener;
@@ -63,6 +64,7 @@ import com.fpghoti.biscuit.listener.ReactionListener;
import com.fpghoti.biscuit.listener.RoleListener;
import com.fpghoti.biscuit.logging.BColor;
import com.fpghoti.biscuit.logging.BiscuitLog;
+import com.fpghoti.biscuit.plugin.PluginController;
import com.github.cage.Cage;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
@@ -95,10 +97,19 @@ public class Main {
public static boolean isPlugin = false;
public static boolean shutdownStarted = false;
private static Cage cage;
+ private static File pluginsDir;
+ private static PluginController pluginController;
private static AudioPlayerManager playerManager;
public static void main(String[] args){
+ if(!isPlugin) {
+ pluginsDir = new File("plugins");
+ }else {
+ pluginsDir = new File(PluginCore.plugin.getDataFolder(), "plugins");
+ }
+ pluginsDir.mkdir();
+
final Properties properties = new Properties();
try {
properties.load(Main.class.getClassLoader().getResourceAsStream("info.properties"));
@@ -186,6 +197,12 @@ public class Main {
CommandManager.addCommand(new GuildSayCommand());
CommandManager.addCommand(new ShutdownConsoleCommand());
+ //Plugins
+
+ pluginController = new PluginController();
+ pluginController.loadPlugins();
+ pluginController.startPlugins();
+
link = "https://discord.com/oauth2/authorize?&client_id=" + jda.getSelfUser().getId() + "&permissions=8&scope=bot";
log.info("Connection successful!");
log.info("Startup successful!");
@@ -243,11 +260,16 @@ public class Main {
public static AudioPlayerManager getPlayerManager() {
return playerManager;
}
+
+ public static File getPluginDirectory() {
+ return pluginsDir;
+ }
public static void shutdown() {
if(!shutdownStarted) {
shutdownStarted = true;
mainBiscuit.log("Shutting down...");
+ pluginController.shutdownPlugins();
ArrayList list = new ArrayList(biscuits);
for(Biscuit b : list) {
b.remove();
@@ -274,6 +296,10 @@ public class Main {
public static BiscuitLog getLogger() {
return log;
}
+
+ public static PluginController getPluginController() {
+ return pluginController;
+ }
public static void registerBiscuit(Biscuit b) {
biscuits.add(b);
diff --git a/src/main/java/com/fpghoti/biscuit/audio/AudioScheduler.java b/src/main/java/com/fpghoti/biscuit/audio/AudioScheduler.java
index 94173ca..52a3bcb 100644
--- a/src/main/java/com/fpghoti/biscuit/audio/AudioScheduler.java
+++ b/src/main/java/com/fpghoti/biscuit/audio/AudioScheduler.java
@@ -5,6 +5,7 @@ import java.util.ArrayList;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.audio.queue.AudioQueue;
import com.fpghoti.biscuit.audio.queue.QueuedTrack;
+import com.fpghoti.biscuit.audio.request.RequestType;
import com.fpghoti.biscuit.audio.request.youtube.YTImmediateRequest;
import com.fpghoti.biscuit.audio.request.youtube.YTRequest;
import com.fpghoti.biscuit.audio.result.YTResultHandler;
@@ -50,7 +51,6 @@ public class AudioScheduler extends AudioEventAdapter {
@Override
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
-
QueuedTrack qt = queue.getLastTrack();
String title = track.getInfo().title;
@@ -58,7 +58,7 @@ public class AudioScheduler extends AudioEventAdapter {
case LOAD_FAILED:
warn("Something went wrong while trying to load the current track. Trying alternate track.");
- if(!qt.triedAlternative()) {
+ if(!qt.triedAlternative() && !queue.isStuckLooping()) {
qt.useAttempt();
TextChannel channel = qt.getCommandChannel();
MessageText.send(channel, "The video selected cannot be played through the music player. An alternate track will be played if available.");
@@ -89,7 +89,7 @@ public class AudioScheduler extends AudioEventAdapter {
if (endReason.mayStartNext) {
if(loop) {
- queue(track.makeClone(), qt.getUserId(), qt.getCommandChannel(), 1);
+ queue(qt.getType(), track.makeClone(), qt.getUserId(), qt.getCommandChannel(), 1);
}
startPlaying();
}
@@ -113,21 +113,21 @@ public class AudioScheduler extends AudioEventAdapter {
}
}
- public void queue(AudioTrack track, String uid, TextChannel channel) {
- queue(track, uid, channel, null);
+ public void queue(RequestType type, AudioTrack track, String uid, TextChannel channel) {
+ queue(type, track, uid, channel, null);
}
- public void queue(AudioTrack track, String uid, TextChannel channel, Integer place) {
+ public void queue(RequestType type, AudioTrack track, String uid, TextChannel channel, Integer place) {
if(queue.isEmpty() && biscuit.getAudioPlayer().getPlayingTrack() == null) {
- QueuedTrack qt = new QueuedTrack(biscuit, track, uid, channel);
+ QueuedTrack qt = new QueuedTrack(biscuit, track, uid, channel, type);
queue.sendQueueMessage(qt);
queue.addPreviousTrack(qt);
biscuit.getAudioPlayer().playTrack(track);
}else {
if(place != null) {
- queue.addAtPlace(new QueuedTrack(biscuit, track, uid, channel), place);
+ queue.addAtPlace(new QueuedTrack(biscuit, track, uid, channel, type), place);
}else {
- queue.add(new QueuedTrack(biscuit, track, uid, channel));
+ queue.add(new QueuedTrack(biscuit, track, uid, channel, type));
}
}
}
diff --git a/src/main/java/com/fpghoti/biscuit/audio/PlayCommandUtil.java b/src/main/java/com/fpghoti/biscuit/audio/PlayCommandUtil.java
index f182dbc..da06503 100644
--- a/src/main/java/com/fpghoti/biscuit/audio/PlayCommandUtil.java
+++ b/src/main/java/com/fpghoti/biscuit/audio/PlayCommandUtil.java
@@ -52,9 +52,16 @@ public class PlayCommandUtil {
}
public static String getSearchPhrase(String[] args) {
- String searchPhrase = args[0];
- if(args.length > 1) {
- for(int i = 1; i < args.length; i++) {
+ return getSearchPhrase(args, 0);
+ }
+
+ public static String getSearchPhrase(String[] args, int startArg) {
+ if(startArg >= args.length) {
+ return "";
+ }
+ String searchPhrase = args[startArg];
+ if(args.length > startArg + 1) {
+ for(int i = startArg + 1; i < args.length; i++) {
searchPhrase = searchPhrase + " " + args[i];
}
}
diff --git a/src/main/java/com/fpghoti/biscuit/audio/queue/AudioQueue.java b/src/main/java/com/fpghoti/biscuit/audio/queue/AudioQueue.java
index b6ffdb6..4cc9b6e 100644
--- a/src/main/java/com/fpghoti/biscuit/audio/queue/AudioQueue.java
+++ b/src/main/java/com/fpghoti/biscuit/audio/queue/AudioQueue.java
@@ -3,6 +3,7 @@ package com.fpghoti.biscuit.audio.queue;
import java.util.ArrayList;
import java.util.Collections;
+import com.fpghoti.biscuit.audio.request.RequestType;
import com.fpghoti.biscuit.rest.MessageText;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
@@ -77,6 +78,17 @@ public class AudioQueue {
return null;
}
+ public QueuedTrack getPreviousTrack(int fromEnd) {
+ if(previousTracks.isEmpty()) {
+ return null;
+ }
+ int index = previousTracks.size() - fromEnd;
+ if(index < 0) {
+ return null;
+ }
+ return previousTracks.get(index);
+ }
+
public QueuedTrack getLastTrack() {
if(previousTracks.isEmpty()) {
return null;
@@ -182,5 +194,22 @@ public class AudioQueue {
public int size() {
return tracks.size();
}
+
+ public boolean isStuckLooping() {
+ QueuedTrack last = getLastTrack();
+ if(last == null) {
+ return false;
+ }
+ if(last.getType() == RequestType.YOUTUBE_IMMEDIATE) {
+ QueuedTrack beforeLast = getPreviousTrack(2);
+ if(beforeLast == null) {
+ return false;
+ }
+ if(beforeLast.getTrack().getIdentifier().equals(last.getTrack().getIdentifier())) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/src/main/java/com/fpghoti/biscuit/audio/queue/QueuedTrack.java b/src/main/java/com/fpghoti/biscuit/audio/queue/QueuedTrack.java
index 2d74b86..8a4ea76 100644
--- a/src/main/java/com/fpghoti/biscuit/audio/queue/QueuedTrack.java
+++ b/src/main/java/com/fpghoti/biscuit/audio/queue/QueuedTrack.java
@@ -2,6 +2,7 @@ package com.fpghoti.biscuit.audio.queue;
import java.awt.Color;
+import com.fpghoti.biscuit.audio.request.RequestType;
import com.fpghoti.biscuit.biscuit.Biscuit;
import com.fpghoti.biscuit.util.Util;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
@@ -17,13 +18,15 @@ public class QueuedTrack {
private AudioTrack track;
private String userId;
private TextChannel channel;
+ private RequestType type;
private boolean triedAlternative;
- public QueuedTrack(Biscuit biscuit, AudioTrack track, String userId, TextChannel channel) {
+ public QueuedTrack(Biscuit biscuit, AudioTrack track, String userId, TextChannel channel, RequestType type) {
this.biscuit = biscuit;
this.track = track;
this.userId = userId;
this.channel = channel;
+ this.type = type;
this.triedAlternative = false;
}
@@ -70,7 +73,7 @@ public class QueuedTrack {
duration+=1000;
}
- String desc = "Author: " + track.getInfo().author + "\nLength: " + Util.getTime(duration);
+ String desc = "Type: " + type.toString() + "\nAuthor: " + track.getInfo().author + "\nLength: " + Util.getTime(duration);
if(showRemaining) {
desc = desc + "\nTime Remaining: " + Util.getTime(track.getDuration() - track.getPosition());
@@ -89,7 +92,7 @@ public class QueuedTrack {
embed.setAuthor(name, null, avatar);
- if(isYouTube()) {
+ if(type.toString().toLowerCase().contains("youtube")) {
embed.setThumbnail("https://img.youtube.com/vi/" + track.getIdentifier() + "/mqdefault.jpg");
}
@@ -107,8 +110,8 @@ public class QueuedTrack {
triedAlternative = true;
}
- public boolean isYouTube() {
- return track.getInfo().uri.contains("https://www.youtube.com/watch?v=");
+ public RequestType getType() {
+ return type;
}
}
diff --git a/src/main/java/com/fpghoti/biscuit/audio/request/PlayRequest.java b/src/main/java/com/fpghoti/biscuit/audio/request/PlayRequest.java
index 16408e8..5068ba8 100644
--- a/src/main/java/com/fpghoti/biscuit/audio/request/PlayRequest.java
+++ b/src/main/java/com/fpghoti/biscuit/audio/request/PlayRequest.java
@@ -1,5 +1,10 @@
package com.fpghoti.biscuit.audio.request;
+import com.fpghoti.biscuit.audio.request.soundcloud.SCPriorityRequest;
+import com.fpghoti.biscuit.audio.request.soundcloud.SCRequest;
+import com.fpghoti.biscuit.audio.request.youtube.YTImmediateRequest;
+import com.fpghoti.biscuit.audio.request.youtube.YTPriorityRequest;
+import com.fpghoti.biscuit.audio.request.youtube.YTRequest;
import com.fpghoti.biscuit.biscuit.Biscuit;
import net.dv8tion.jda.api.entities.Message;
@@ -7,6 +12,46 @@ import net.dv8tion.jda.api.entities.TextChannel;
public abstract class PlayRequest {
+ public static PlayRequest createPlayRequest(Message message, String searchPhrase) {
+ return createPlayRequest(message, searchPhrase, 0);
+ }
+
+ public static PlayRequest createPlayRequest(Message message, String searchPhrase, int insertSlot) {
+ String contents = message.getContentDisplay().toLowerCase();
+ RequestType type = RequestType.YOUTUBE;
+ if(insertSlot > 0) {
+ type = RequestType.YOUTUBE_PRIORITY;
+ }
+ if(contents.contains("soundcloud.com") && searchPhrase.split(" ").length == 1) {
+ type = RequestType.SOUNDCLOUD;
+ if(insertSlot > 0) {
+ type = RequestType.SOUNDCLOUD_PRIORITY;
+ }
+ }
+ return createPlayRequest(type, message, searchPhrase, insertSlot);
+ }
+
+ public static PlayRequest createPlayRequest(RequestType type, Message message, String searchPhrase) {
+ return createPlayRequest(type, message, searchPhrase, 0);
+ }
+
+ public static PlayRequest createPlayRequest(RequestType type, Message message, String searchPhrase, int insertSlot) {
+ switch(type) {
+ case YOUTUBE:
+ return new YTRequest(message, searchPhrase);
+ case YOUTUBE_PRIORITY:
+ return new YTPriorityRequest(message, searchPhrase, insertSlot);
+ case YOUTUBE_IMMEDIATE:
+ return new YTImmediateRequest(message.getTextChannel(), message.getAuthor().getId(), searchPhrase);
+ case SOUNDCLOUD:
+ return new SCRequest(message, searchPhrase);
+ case SOUNDCLOUD_PRIORITY:
+ return new SCPriorityRequest(message, searchPhrase, insertSlot);
+ default:
+ return null;
+ }
+ }
+
private TextChannel channel;
private Biscuit biscuit;
private String authorId;
diff --git a/src/main/java/com/fpghoti/biscuit/audio/request/RequestType.java b/src/main/java/com/fpghoti/biscuit/audio/request/RequestType.java
index 7c68b01..846b439 100644
--- a/src/main/java/com/fpghoti/biscuit/audio/request/RequestType.java
+++ b/src/main/java/com/fpghoti/biscuit/audio/request/RequestType.java
@@ -2,8 +2,35 @@ package com.fpghoti.biscuit.audio.request;
public enum RequestType {
- YOUTUBE,
- YOUTUBE_IMMEDIATE,
- YOUTUBE_PRIORITY;
+ YOUTUBE{
+ @Override
+ public String toString() {
+ return "YouTube";
+ }
+ },
+ YOUTUBE_IMMEDIATE{
+ @Override
+ public String toString() {
+ return "YouTube - Immediate";
+ }
+ },
+ YOUTUBE_PRIORITY{
+ @Override
+ public String toString() {
+ return "YouTube - Priority";
+ }
+ },
+ SOUNDCLOUD{
+ @Override
+ public String toString() {
+ return "Soundcloud";
+ }
+ },
+ SOUNDCLOUD_PRIORITY{
+ @Override
+ public String toString() {
+ return "Soundcloud - Priority";
+ }
+ };
}
diff --git a/src/main/java/com/fpghoti/biscuit/audio/request/soundcloud/SCPriorityRequest.java b/src/main/java/com/fpghoti/biscuit/audio/request/soundcloud/SCPriorityRequest.java
new file mode 100644
index 0000000..70af567
--- /dev/null
+++ b/src/main/java/com/fpghoti/biscuit/audio/request/soundcloud/SCPriorityRequest.java
@@ -0,0 +1,34 @@
+package com.fpghoti.biscuit.audio.request.soundcloud;
+
+import com.fpghoti.biscuit.audio.request.RequestType;
+
+import net.dv8tion.jda.api.entities.Message;
+import net.dv8tion.jda.api.entities.TextChannel;
+
+public class SCPriorityRequest extends SCRequest{
+
+ int insertSlot;
+
+ public SCPriorityRequest(Message message, String identifier, int insertSlot) {
+ this(message.getTextChannel(), message.getAuthor().getId(), identifier, insertSlot);
+ }
+
+ public SCPriorityRequest(TextChannel channel, String authorId, String identifier, int insertSlot) {
+ super(channel, authorId, identifier);
+ this.insertSlot = insertSlot;
+ }
+
+ public int getSlot() {
+ return insertSlot;
+ }
+
+ public void setSlot(int slotNumber) {
+ insertSlot = slotNumber;
+ }
+
+ @Override
+ public RequestType getType() {
+ return RequestType.SOUNDCLOUD_PRIORITY;
+ }
+
+}
diff --git a/src/main/java/com/fpghoti/biscuit/audio/request/soundcloud/SCRequest.java b/src/main/java/com/fpghoti/biscuit/audio/request/soundcloud/SCRequest.java
new file mode 100644
index 0000000..a6d8cf0
--- /dev/null
+++ b/src/main/java/com/fpghoti/biscuit/audio/request/soundcloud/SCRequest.java
@@ -0,0 +1,39 @@
+package com.fpghoti.biscuit.audio.request.soundcloud;
+
+import com.fpghoti.biscuit.audio.request.PlayRequest;
+import com.fpghoti.biscuit.audio.request.RequestType;
+
+import net.dv8tion.jda.api.entities.Message;
+import net.dv8tion.jda.api.entities.TextChannel;
+
+public class SCRequest extends PlayRequest{
+
+ private boolean searchMode;
+
+ public SCRequest(Message message, String identifier) {
+ this(message.getTextChannel(), message.getAuthor().getId(), identifier);
+ }
+
+ public SCRequest(TextChannel channel, String authorId, String identifier) {
+ super(channel, authorId, identifier);
+ searchMode = false;
+ }
+
+ public boolean inSearchMode() {
+ return searchMode;
+ }
+
+ public void enableSearchMode() {
+ searchMode = true;
+ }
+
+ public void disableSearchMode() {
+ searchMode = false;
+ }
+
+ @Override
+ public RequestType getType() {
+ return RequestType.SOUNDCLOUD;
+ }
+
+}
diff --git a/src/main/java/com/fpghoti/biscuit/audio/result/ResultHandler.java b/src/main/java/com/fpghoti/biscuit/audio/result/ResultHandler.java
new file mode 100644
index 0000000..09da43e
--- /dev/null
+++ b/src/main/java/com/fpghoti/biscuit/audio/result/ResultHandler.java
@@ -0,0 +1,43 @@
+package com.fpghoti.biscuit.audio.result;
+
+import com.fpghoti.biscuit.audio.request.PlayRequest;
+import com.fpghoti.biscuit.biscuit.Biscuit;
+import com.fpghoti.biscuit.rest.MessageText;
+import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
+import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
+import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
+import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
+
+public abstract class ResultHandler implements AudioLoadResultHandler {
+
+ private Biscuit biscuit;
+ private PlayRequest request;
+
+ public PlayRequest getRequest() {
+ return request;
+ }
+
+ public abstract void handleTrack(AudioTrack track);
+
+ @Override
+ public void trackLoaded(AudioTrack track) {
+ handleTrack(track);
+ }
+
+ @Override
+ public void playlistLoaded(AudioPlaylist playlist) {
+ AudioTrack track = playlist.getTracks().get(0);
+ handleTrack(track);
+ }
+
+ @Override
+ public void loadFailed(FriendlyException exception) {
+ exception.printStackTrace();
+ MessageText.send(request.getRequestChannel(), "An error was encountered while attempting to load audio.");
+ }
+
+ public Biscuit getBiscuit() {
+ return biscuit;
+ }
+
+}
diff --git a/src/main/java/com/fpghoti/biscuit/audio/result/SCResultHandler.java b/src/main/java/com/fpghoti/biscuit/audio/result/SCResultHandler.java
new file mode 100644
index 0000000..5727541
--- /dev/null
+++ b/src/main/java/com/fpghoti/biscuit/audio/result/SCResultHandler.java
@@ -0,0 +1,77 @@
+package com.fpghoti.biscuit.audio.result;
+
+import com.fpghoti.biscuit.Main;
+import com.fpghoti.biscuit.audio.AudioScheduler;
+import com.fpghoti.biscuit.audio.request.PlayRequest;
+import com.fpghoti.biscuit.audio.request.soundcloud.SCPriorityRequest;
+import com.fpghoti.biscuit.audio.request.soundcloud.SCRequest;
+import com.fpghoti.biscuit.biscuit.Biscuit;
+import com.fpghoti.biscuit.rest.MessageText;
+import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
+import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
+import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
+
+public class SCResultHandler extends ResultHandler {
+
+ private Biscuit biscuit;
+ private SCRequest request;
+
+ public SCResultHandler(SCRequest request) {
+ this.request = request;
+ this.biscuit = request.getBiscuit();
+ }
+
+ public PlayRequest getRequest() {
+ return request;
+ }
+
+ public void handleTrack(AudioTrack track) {
+ AudioScheduler sched = biscuit.getAudioScheduler();
+
+ switch(request.getType()) {
+
+ case SOUNDCLOUD:
+ sched.queue(request.getType(), track, request.getAuthorId(), request.getRequestChannel());
+ break;
+
+ case SOUNDCLOUD_PRIORITY:
+ SCPriorityRequest prq = (SCPriorityRequest) request;
+ sched.queue(request.getType(), track, request.getAuthorId(), request.getRequestChannel(), prq.getSlot());
+ break;
+
+ default:
+ biscuit.error("Soundcloud result handler received an incompatible request.");
+ break;
+
+ }
+ }
+
+ @Override
+ public void trackLoaded(AudioTrack track) {
+ handleTrack(track);
+ }
+
+ @Override
+ public void playlistLoaded(AudioPlaylist playlist) {
+ AudioTrack track = playlist.getTracks().get(0);
+ handleTrack(track);
+ }
+
+ @Override
+ public void noMatches() {
+ if(!request.inSearchMode()) {
+ biscuit.log("Exact match not found. Searching instead...");
+ request.enableSearchMode();
+ Main.getPlayerManager().loadItemOrdered(biscuit.getGuild(),"scsearch:" + request.getIdentifier(), new SCResultHandler(request));
+ }else {
+ MessageText.send(request.getRequestChannel(), "Song match not found.");
+ }
+ }
+
+ @Override
+ public void loadFailed(FriendlyException exception) {
+ exception.printStackTrace();
+ MessageText.send(request.getRequestChannel(), "An error was encountered while attempting to load audio.");
+ }
+
+}
diff --git a/src/main/java/com/fpghoti/biscuit/audio/result/YTResultHandler.java b/src/main/java/com/fpghoti/biscuit/audio/result/YTResultHandler.java
index a45371e..f27dc62 100644
--- a/src/main/java/com/fpghoti/biscuit/audio/result/YTResultHandler.java
+++ b/src/main/java/com/fpghoti/biscuit/audio/result/YTResultHandler.java
@@ -7,12 +7,11 @@ import com.fpghoti.biscuit.audio.request.youtube.YTPriorityRequest;
import com.fpghoti.biscuit.audio.request.youtube.YTRequest;
import com.fpghoti.biscuit.biscuit.Biscuit;
import com.fpghoti.biscuit.rest.MessageText;
-import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
-public class YTResultHandler implements AudioLoadResultHandler {
+public class YTResultHandler extends ResultHandler {
private Biscuit biscuit;
private YTRequest request;
@@ -32,16 +31,16 @@ public class YTResultHandler implements AudioLoadResultHandler {
switch(request.getType()) {
case YOUTUBE:
- sched.queue(track, request.getAuthorId(), request.getRequestChannel());
+ sched.queue(request.getType(), track, request.getAuthorId(), request.getRequestChannel());
break;
case YOUTUBE_PRIORITY:
YTPriorityRequest prq = (YTPriorityRequest) request;
- sched.queue(track, request.getAuthorId(), request.getRequestChannel(), prq.getSlot());
+ sched.queue(request.getType(), track, request.getAuthorId(), request.getRequestChannel(), prq.getSlot());
break;
case YOUTUBE_IMMEDIATE:
- sched.queue(track, request.getAuthorId(), request.getRequestChannel(), 1);
+ sched.queue(request.getType(), track, request.getAuthorId(), request.getRequestChannel(), 1);
if(!sched.getQueue().isEmpty()) {
sched.startPlaying();
}
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/AddCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/AddCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/AddCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/AddCommand.java
index 6d1510f..604d962 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/AddCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/AddCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/ChanIDCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/ChanIDCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/ChanIDCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/ChanIDCommand.java
index 0c501c2..f5c9021 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/ChanIDCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/ChanIDCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/DivideCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/DivideCommand.java
similarity index 94%
rename from src/main/java/com/fpghoti/biscuit/commands/client/DivideCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/DivideCommand.java
index ee21a19..dde9043 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/DivideCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/DivideCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/GetConfigCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/GetConfigCommand.java
similarity index 94%
rename from src/main/java/com/fpghoti/biscuit/commands/client/GetConfigCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/GetConfigCommand.java
index 0ceb6e4..f8eb017 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/GetConfigCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/GetConfigCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/GuildIDCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/GuildIDCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/GuildIDCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/GuildIDCommand.java
index d038014..f28446e 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/GuildIDCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/GuildIDCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/HelpCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/HelpCommand.java
similarity index 95%
rename from src/main/java/com/fpghoti/biscuit/commands/client/HelpCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/HelpCommand.java
index 1a68576..b2a2502 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/HelpCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/HelpCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/MakeInviteCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/MakeInviteCommand.java
similarity index 94%
rename from src/main/java/com/fpghoti/biscuit/commands/client/MakeInviteCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/MakeInviteCommand.java
index 486f2f7..a8e59db 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/MakeInviteCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/MakeInviteCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/MultiplyCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/MultiplyCommand.java
similarity index 94%
rename from src/main/java/com/fpghoti/biscuit/commands/client/MultiplyCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/MultiplyCommand.java
index cbbebbc..5613f0d 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/MultiplyCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/MultiplyCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/NotSpammerCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/NotSpammerCommand.java
similarity index 94%
rename from src/main/java/com/fpghoti/biscuit/commands/client/NotSpammerCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/NotSpammerCommand.java
index 64892ad..06aa086 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/NotSpammerCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/NotSpammerCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/PingCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/PingCommand.java
similarity index 91%
rename from src/main/java/com/fpghoti/biscuit/commands/client/PingCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/PingCommand.java
index fa81f86..a582c27 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/PingCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/PingCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/PowerCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/PowerCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/PowerCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/PowerCommand.java
index 21a9c10..28cac4c 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/PowerCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/PowerCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/RecentSpammersCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/RecentSpammersCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/RecentSpammersCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/RecentSpammersCommand.java
index ca6cdd2..251be1b 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/RecentSpammersCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/RecentSpammersCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/SaveConfigCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/SaveConfigCommand.java
similarity index 95%
rename from src/main/java/com/fpghoti/biscuit/commands/client/SaveConfigCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/SaveConfigCommand.java
index 51b0955..4f967c5 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/SaveConfigCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/SaveConfigCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import java.util.List;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/SoftMuteCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/SoftMuteCommand.java
similarity index 94%
rename from src/main/java/com/fpghoti/biscuit/commands/client/SoftMuteCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/SoftMuteCommand.java
index 1711d63..f2fb477 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/SoftMuteCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/SoftMuteCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/SquareRootCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/SquareRootCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/SquareRootCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/SquareRootCommand.java
index d509942..d85eeb7 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/SquareRootCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/SquareRootCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/SubtractCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/SubtractCommand.java
similarity index 94%
rename from src/main/java/com/fpghoti/biscuit/commands/client/SubtractCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/SubtractCommand.java
index 6e04b6d..738527e 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/SubtractCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/SubtractCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/ToggleRoleCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/ToggleRoleCommand.java
similarity index 94%
rename from src/main/java/com/fpghoti/biscuit/commands/client/ToggleRoleCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/ToggleRoleCommand.java
index 5eb8b37..075ff66 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/ToggleRoleCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/ToggleRoleCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/UIDCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/UIDCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/UIDCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/UIDCommand.java
index 5b2c9ae..ba66714 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/UIDCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/UIDCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/UnSoftMuteCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/UnSoftMuteCommand.java
similarity index 94%
rename from src/main/java/com/fpghoti/biscuit/commands/client/UnSoftMuteCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/UnSoftMuteCommand.java
index 2af0121..52d21ee 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/UnSoftMuteCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/UnSoftMuteCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/WikiCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/WikiCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/WikiCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/WikiCommand.java
index c673a8e..2a9e9e8 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/WikiCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/WikiCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client;
+package com.fpghoti.biscuit.commands.discord;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/ClearCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ClearCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/ClearCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/ClearCommand.java
index 5fae2dc..7c95b26 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/ClearCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ClearCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/ClearUserSongsCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ClearUserSongsCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/ClearUserSongsCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/ClearUserSongsCommand.java
index af1f6a6..0bce7d3 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/ClearUserSongsCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ClearUserSongsCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/ForceSkipCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ForceSkipCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/ForceSkipCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/ForceSkipCommand.java
index ec9d172..f0678db 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/ForceSkipCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ForceSkipCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/ForceSkipToCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ForceSkipToCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/ForceSkipToCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/ForceSkipToCommand.java
index e88039b..d89e95c 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/ForceSkipToCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ForceSkipToCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/LoopMusicCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/LoopMusicCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/LoopMusicCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/LoopMusicCommand.java
index 73577a1..d16d9da 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/LoopMusicCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/LoopMusicCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/MoveToCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/MoveToCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/MoveToCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/MoveToCommand.java
index 8f8d415..727e067 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/MoveToCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/MoveToCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/NowPlayingCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/NowPlayingCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/NowPlayingCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/NowPlayingCommand.java
index d3af141..da46a8e 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/NowPlayingCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/NowPlayingCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/PauseCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/PauseCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/PauseCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/PauseCommand.java
index c0199cb..3c89dfb 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/PauseCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/PauseCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/PlayCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/PlayCommand.java
similarity index 52%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/PlayCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/PlayCommand.java
index 764a236..f3f16fa 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/PlayCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/PlayCommand.java
@@ -1,8 +1,13 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.audio.PlayCommandUtil;
+import com.fpghoti.biscuit.audio.request.PlayRequest;
+import com.fpghoti.biscuit.audio.request.RequestType;
+import com.fpghoti.biscuit.audio.request.soundcloud.SCRequest;
import com.fpghoti.biscuit.audio.request.youtube.YTRequest;
+import com.fpghoti.biscuit.audio.result.ResultHandler;
+import com.fpghoti.biscuit.audio.result.SCResultHandler;
import com.fpghoti.biscuit.audio.result.YTResultHandler;
import com.fpghoti.biscuit.biscuit.Biscuit;
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
@@ -15,7 +20,7 @@ public class PlayCommand extends MusicClientCommand{
public PlayCommand() {
name = "Play";
description = "Plays the specified song or plays a song found using search parameters.";
- usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "play ";
+ usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "play [-sc] ";
minArgs = 1;
maxArgs = 2000;
identifiers.add("play");
@@ -25,8 +30,16 @@ public class PlayCommand extends MusicClientCommand{
public void execute(String[] args, GuildMessageReceivedEvent event) {
Guild guild = event.getGuild();
Biscuit b = Biscuit.getBiscuit(guild);
+
+ int searchArg = 0;
+ boolean scSearch = false;
+
+ if(args[0].equalsIgnoreCase("-sc")) {
+ scSearch = true;
+ searchArg = 1;
+ }
- String searchPhrase = PlayCommandUtil.getSearchPhrase(args);
+ String searchPhrase = PlayCommandUtil.getSearchPhrase(args, searchArg);
b.log(event.getAuthor().getName() + " issued a command: -play " + searchPhrase);
@@ -34,9 +47,19 @@ public class PlayCommand extends MusicClientCommand{
if(!connected) {
return;
}
-
- YTRequest request = new YTRequest(event.getMessage(), searchPhrase);
- Main.getPlayerManager().loadItemOrdered(guild, PlayCommandUtil.getID(event), new YTResultHandler(request));
+
+ PlayRequest request;
+ ResultHandler handler;
+
+ if(scSearch) {
+ request = PlayRequest.createPlayRequest(RequestType.SOUNDCLOUD, event.getMessage(), searchPhrase);
+ handler = new SCResultHandler((SCRequest)request);
+ }else {
+ request = PlayRequest.createPlayRequest(event.getMessage(), searchPhrase);
+ handler = new YTResultHandler((YTRequest)request);
+ }
+
+ Main.getPlayerManager().loadItemOrdered(guild, PlayCommandUtil.getID(event), handler);
}
}
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/PlayFirstCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/PlayFirstCommand.java
similarity index 57%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/PlayFirstCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/PlayFirstCommand.java
index b8931ae..18c6658 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/PlayFirstCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/PlayFirstCommand.java
@@ -1,9 +1,13 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.audio.PlayCommandUtil;
-import com.fpghoti.biscuit.audio.request.youtube.YTPriorityRequest;
+import com.fpghoti.biscuit.audio.request.PlayRequest;
+import com.fpghoti.biscuit.audio.request.RequestType;
+import com.fpghoti.biscuit.audio.request.soundcloud.SCRequest;
import com.fpghoti.biscuit.audio.request.youtube.YTRequest;
+import com.fpghoti.biscuit.audio.result.ResultHandler;
+import com.fpghoti.biscuit.audio.result.SCResultHandler;
import com.fpghoti.biscuit.audio.result.YTResultHandler;
import com.fpghoti.biscuit.biscuit.Biscuit;
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
@@ -19,7 +23,7 @@ public class PlayFirstCommand extends MusicClientCommand{
public PlayFirstCommand() {
name = "Play First";
description = "Places specified song at the front of the queue.";
- usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "playfirst ";
+ usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "playfirst ";
minArgs = 1;
maxArgs = 2000;
identifiers.add("playfirst");
@@ -31,7 +35,15 @@ public class PlayFirstCommand extends MusicClientCommand{
Biscuit b = Biscuit.getBiscuit(guild);
TextChannel tchannel = event.getChannel();
- String searchPhrase = PlayCommandUtil.getSearchPhrase(args);
+ int searchArg = 0;
+ boolean scSearch = false;
+
+ if(args[0].equalsIgnoreCase("-sc")) {
+ scSearch = true;
+ searchArg = 1;
+ }
+
+ String searchPhrase = PlayCommandUtil.getSearchPhrase(args, searchArg);
b.log(event.getAuthor().getName() + " issued a command: -playfirst " + searchPhrase);
@@ -44,9 +56,19 @@ public class PlayFirstCommand extends MusicClientCommand{
if(!connected) {
return;
}
-
- YTRequest request = new YTPriorityRequest(event.getMessage(), searchPhrase, 1);
- Main.getPlayerManager().loadItemOrdered(guild, PlayCommandUtil.getID(event), new YTResultHandler(request));
+
+ PlayRequest request;
+ ResultHandler handler;
+
+ if(scSearch) {
+ request = PlayRequest.createPlayRequest(RequestType.SOUNDCLOUD_PRIORITY, event.getMessage(), searchPhrase, 1);
+ handler = new SCResultHandler((SCRequest)request);
+ }else {
+ request = PlayRequest.createPlayRequest(event.getMessage(), searchPhrase, 1);
+ handler = new YTResultHandler((YTRequest)request);
+ }
+
+ Main.getPlayerManager().loadItemOrdered(guild, PlayCommandUtil.getID(event), handler);
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/QueueCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/QueueCommand.java
similarity index 95%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/QueueCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/QueueCommand.java
index 622e575..3033f15 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/QueueCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/QueueCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.audio.queue.AudioQueue;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/RemoveCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/RemoveCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/RemoveCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/RemoveCommand.java
index 67c2cff..4c44a45 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/RemoveCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/RemoveCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/ShuffleCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ShuffleCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/ShuffleCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/ShuffleCommand.java
index 11aa1e2..c0527a0 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/ShuffleCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/ShuffleCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/SkipAllCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/SkipAllCommand.java
similarity index 92%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/SkipAllCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/SkipAllCommand.java
index 52602fe..e3312b7 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/SkipAllCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/SkipAllCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/SkipCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/SkipCommand.java
similarity index 95%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/SkipCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/SkipCommand.java
index 96a0524..8fa2d8c 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/SkipCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/SkipCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import java.util.ArrayList;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/TogglePauseCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/TogglePauseCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/TogglePauseCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/TogglePauseCommand.java
index bfbdd1c..123f17f 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/TogglePauseCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/TogglePauseCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/UnpauseCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/UnpauseCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/UnpauseCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/UnpauseCommand.java
index 9c0b350..27f268e 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/UnpauseCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/UnpauseCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/commands/client/music/VolumeCommand.java b/src/main/java/com/fpghoti/biscuit/commands/discord/music/VolumeCommand.java
similarity index 93%
rename from src/main/java/com/fpghoti/biscuit/commands/client/music/VolumeCommand.java
rename to src/main/java/com/fpghoti/biscuit/commands/discord/music/VolumeCommand.java
index 113fb3a..0b61105 100644
--- a/src/main/java/com/fpghoti/biscuit/commands/client/music/VolumeCommand.java
+++ b/src/main/java/com/fpghoti/biscuit/commands/discord/music/VolumeCommand.java
@@ -1,4 +1,4 @@
-package com.fpghoti.biscuit.commands.client.music;
+package com.fpghoti.biscuit.commands.discord.music;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.biscuit.Biscuit;
diff --git a/src/main/java/com/fpghoti/biscuit/plugin/BiscuitPlugin.java b/src/main/java/com/fpghoti/biscuit/plugin/BiscuitPlugin.java
new file mode 100644
index 0000000..c0c8bc7
--- /dev/null
+++ b/src/main/java/com/fpghoti/biscuit/plugin/BiscuitPlugin.java
@@ -0,0 +1,66 @@
+package com.fpghoti.biscuit.plugin;
+
+import java.util.ArrayList;
+
+import org.pf4j.Plugin;
+import org.pf4j.PluginWrapper;
+
+import com.fpghoti.biscuit.Main;
+import com.fpghoti.biscuit.biscuit.Biscuit;
+import com.fpghoti.biscuit.logging.BiscuitLog;
+import com.github.cage.Cage;
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
+
+public abstract class BiscuitPlugin extends Plugin {
+
+ private String id;
+ private String version;
+ private String author;
+ private String description;
+
+ public BiscuitPlugin(PluginWrapper wrapper) {
+ super(wrapper);
+ this.id = wrapper.getPluginId();
+ this.version = wrapper.getDescriptor().getVersion();
+ this.author = wrapper.getDescriptor().getProvider();
+ this.description = wrapper.getDescriptor().getPluginDescription();
+ Main.getPluginController().registerPlugin(this);
+ }
+
+ public String getID() {
+ return id;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public BiscuitPlugin getPlugin() {
+ return this;
+ }
+
+ public ArrayList getBiscuits() {
+ return Main.getBiscuits();
+ }
+
+ public Cage getCage() {
+ return Main.getCage();
+ }
+
+ public AudioPlayerManager getPlayerManager() {
+ return Main.getPlayerManager();
+ }
+
+ public BiscuitLog getLogger() {
+ return Main.getLogger();
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/fpghoti/biscuit/plugin/PluginController.java b/src/main/java/com/fpghoti/biscuit/plugin/PluginController.java
new file mode 100644
index 0000000..ceb237e
--- /dev/null
+++ b/src/main/java/com/fpghoti/biscuit/plugin/PluginController.java
@@ -0,0 +1,61 @@
+package com.fpghoti.biscuit.plugin;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.pf4j.DefaultPluginManager;
+import org.pf4j.PluginManager;
+
+public class PluginController implements Iterable{
+
+ private PluginManager pluginManager;
+ private ArrayList plugins;
+
+ public PluginController() {
+ pluginManager = new DefaultPluginManager();
+ plugins = new ArrayList();
+ }
+
+ @Override
+ public Iterator iterator() {
+ return new ArrayList(plugins).iterator();
+ }
+
+ public void registerPlugin(BiscuitPlugin plugin) {
+ if(!contains(plugin)) {
+ plugins.add(plugin);
+ }
+ }
+
+ public void loadPlugins() {
+ pluginManager.loadPlugins();
+ }
+
+ public void startPlugins() {
+ pluginManager.startPlugins();
+ }
+
+ public void stopPlugins() {
+ pluginManager.stopPlugins();
+ }
+
+ public void unloadPlugins() {
+ pluginManager.unloadPlugins();
+ }
+
+ public void shutdownPlugins() {
+ stopPlugins();
+ unloadPlugins();
+ plugins.clear();
+ }
+
+ public boolean contains(BiscuitPlugin plugin) {
+ for(BiscuitPlugin pl : plugins) {
+ if(plugin.getID().equals(pl.getID())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}