Add Plugin system and Soundcloud searching

This commit is contained in:
Ghoti 2020-10-02 16:38:33 -05:00
parent 3b65e91d10
commit 791f2b3d60
54 changed files with 621 additions and 115 deletions

View File

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.fpghoti</groupId>
<artifactId>Biscuit</artifactId>
<version>1.7</version>
<version>1.8</version>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<resources>

View File

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.fpghoti</groupId>
<artifactId>Biscuit</artifactId>
<version>1.7</version>
<version>1.8</version>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
@ -194,5 +194,10 @@
<artifactId>lavaplayer</artifactId>
<version>1.3.50</version>
</dependency>
<dependency>
<groupId>org.pf4j</groupId>
<artifactId>pf4j</artifactId>
<version>3.4.1</version>
</dependency>
</dependencies>
</project>

View File

@ -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!");
@ -244,10 +261,15 @@ public class Main {
return playerManager;
}
public static File getPluginDirectory() {
return pluginsDir;
}
public static void shutdown() {
if(!shutdownStarted) {
shutdownStarted = true;
mainBiscuit.log("Shutting down...");
pluginController.shutdownPlugins();
ArrayList<Biscuit> list = new ArrayList<Biscuit>(biscuits);
for(Biscuit b : list) {
b.remove();
@ -275,6 +297,10 @@ public class Main {
return log;
}
public static PluginController getPluginController() {
return pluginController;
}
public static void registerBiscuit(Biscuit b) {
biscuits.add(b);
}

View File

@ -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));
}
}
}

View File

@ -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];
}
}

View File

@ -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;
@ -183,4 +195,21 @@ public class AudioQueue {
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;
}
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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";
}
};
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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.");
}
}

View File

@ -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();
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -1,4 +1,4 @@
package com.fpghoti.biscuit.commands.client;
package com.fpghoti.biscuit.commands.discord;
import java.util.ArrayList;
import java.util.List;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -1,4 +1,4 @@
package com.fpghoti.biscuit.commands.client;
package com.fpghoti.biscuit.commands.discord;
import java.util.List;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 <YouTube link OR Search Phrase>";
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "play [-sc] <Link OR Search Phrase>";
minArgs = 1;
maxArgs = 2000;
identifiers.add("play");
@ -26,7 +31,15 @@ public class PlayCommand extends MusicClientCommand{
Guild guild = event.getGuild();
Biscuit b = Biscuit.getBiscuit(guild);
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: -play " + searchPhrase);
@ -35,8 +48,18 @@ public class PlayCommand extends MusicClientCommand{
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);
}
}

View File

@ -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 <YouTube link OR Search Phrase>";
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "playfirst <Link OR Search Phrase>";
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);
@ -45,8 +57,18 @@ public class PlayFirstCommand extends MusicClientCommand{
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);
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -1,4 +1,4 @@
package com.fpghoti.biscuit.commands.client.music;
package com.fpghoti.biscuit.commands.discord.music;
import java.util.ArrayList;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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<Biscuit> getBiscuits() {
return Main.getBiscuits();
}
public Cage getCage() {
return Main.getCage();
}
public AudioPlayerManager getPlayerManager() {
return Main.getPlayerManager();
}
public BiscuitLog getLogger() {
return Main.getLogger();
}
}

View File

@ -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<BiscuitPlugin>{
private PluginManager pluginManager;
private ArrayList<BiscuitPlugin> plugins;
public PluginController() {
pluginManager = new DefaultPluginManager();
plugins = new ArrayList<BiscuitPlugin>();
}
@Override
public Iterator<BiscuitPlugin> iterator() {
return new ArrayList<BiscuitPlugin>(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;
}
}