Many bug fixes, small features added. #3
|
@ -36,7 +36,7 @@ Because the play command is defined as `play [URL]`, and the queue command is de
|
||||||
|
|
||||||
* `skip` - If a song is playing, the bot will skip it and play the next song in the queue.
|
* `skip` - If a song is playing, the bot will skip it and play the next song in the queue.
|
||||||
|
|
||||||
* `queue [all]` - Lists up to the first 10 items on the queue, if no argument is given. If you add `all`, the bot will upload a list to [PasteBin](http://pastebin.com) of the entire queue, and give you
|
* `queue [all]` - Lists up to the first 10 items on the queue, if no argument is given. If you add `all`, the bot will upload a list to [PasteBin](http://pastebin.com) of the entire queue, provided it is greater than 10 elements, and give you a link which expires in 10 minutes.
|
||||||
|
|
||||||
* `repeat [true|false]` - Sets the bot to repeat the playlist, as in once a song is removed from the queue to be played, it is added back to the end of the playlist.
|
* `repeat [true|false]` - Sets the bot to repeat the playlist, as in once a song is removed from the queue to be played, it is added back to the end of the playlist.
|
||||||
|
|
||||||
|
|
25
pom.xml
25
pom.xml
|
@ -17,6 +17,31 @@
|
||||||
<target>1.8</target>
|
<target>1.8</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
<descriptorRefs>
|
||||||
|
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||||
|
</descriptorRefs>
|
||||||
|
<archive>
|
||||||
|
<manifest>
|
||||||
|
<mainClass>handiebot.HandieBot</mainClass>
|
||||||
|
</manifest>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>single</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: handiebot.HandieBot
|
||||||
|
|
|
@ -2,6 +2,7 @@ package handiebot;
|
||||||
|
|
||||||
import handiebot.command.CommandHandler;
|
import handiebot.command.CommandHandler;
|
||||||
import handiebot.lavaplayer.MusicPlayer;
|
import handiebot.lavaplayer.MusicPlayer;
|
||||||
|
import handiebot.utils.DisappearingMessage;
|
||||||
import handiebot.view.BotLog;
|
import handiebot.view.BotLog;
|
||||||
import handiebot.view.BotWindow;
|
import handiebot.view.BotWindow;
|
||||||
import handiebot.view.View;
|
import handiebot.view.View;
|
||||||
|
@ -10,6 +11,7 @@ import sx.blah.discord.api.IDiscordClient;
|
||||||
import sx.blah.discord.api.events.EventSubscriber;
|
import sx.blah.discord.api.events.EventSubscriber;
|
||||||
import sx.blah.discord.handle.impl.events.ReadyEvent;
|
import sx.blah.discord.handle.impl.events.ReadyEvent;
|
||||||
import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent;
|
import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent;
|
||||||
|
import sx.blah.discord.handle.obj.IGuild;
|
||||||
import sx.blah.discord.util.DiscordException;
|
import sx.blah.discord.util.DiscordException;
|
||||||
import sx.blah.discord.util.RateLimitException;
|
import sx.blah.discord.util.RateLimitException;
|
||||||
|
|
||||||
|
@ -40,6 +42,9 @@ public class HandieBot {
|
||||||
@EventSubscriber
|
@EventSubscriber
|
||||||
public void onReady(ReadyEvent event){
|
public void onReady(ReadyEvent event){
|
||||||
log.log(BotLog.TYPE.INFO, "HandieBot initialized.");
|
log.log(BotLog.TYPE.INFO, "HandieBot initialized.");
|
||||||
|
for (IGuild guild : client.getGuilds()){
|
||||||
|
DisappearingMessage.deleteMessageAfter(5000, musicPlayer.getChatChannel(guild).sendMessage("HandieBot initialized."));
|
||||||
|
}
|
||||||
//client.changeAvatar(Image.forStream("png", getClass().getClassLoader().getResourceAsStream("avatarIcon.png")));
|
//client.changeAvatar(Image.forStream("png", getClass().getClassLoader().getResourceAsStream("avatarIcon.png")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,25 @@
|
||||||
package handiebot.command;
|
package handiebot.command;
|
||||||
|
|
||||||
import com.sun.istack.internal.NotNull;
|
import handiebot.command.commands.HelpCommand;
|
||||||
import handiebot.command.commands.music.PlayCommand;
|
import handiebot.command.commands.InfoCommand;
|
||||||
import handiebot.command.commands.music.PlaylistCommand;
|
import handiebot.command.commands.SetPrefixCommand;
|
||||||
import handiebot.command.commands.music.RepeatCommand;
|
import handiebot.command.commands.music.*;
|
||||||
import handiebot.command.commands.music.ShuffleCommand;
|
|
||||||
import handiebot.utils.DisappearingMessage;
|
import handiebot.utils.DisappearingMessage;
|
||||||
|
import handiebot.utils.FileUtil;
|
||||||
import handiebot.view.BotLog;
|
import handiebot.view.BotLog;
|
||||||
import handiebot.view.actions.QuitAction;
|
|
||||||
import handiebot.view.actions.music.QueueListAction;
|
|
||||||
import handiebot.view.actions.music.SkipAction;
|
|
||||||
import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent;
|
import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent;
|
||||||
import sx.blah.discord.handle.obj.*;
|
import sx.blah.discord.handle.obj.IChannel;
|
||||||
import sx.blah.discord.util.EmbedBuilder;
|
import sx.blah.discord.handle.obj.IGuild;
|
||||||
|
import sx.blah.discord.handle.obj.IMessage;
|
||||||
|
import sx.blah.discord.handle.obj.IUser;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static handiebot.HandieBot.client;
|
||||||
import static handiebot.HandieBot.log;
|
import static handiebot.HandieBot.log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,7 +28,8 @@ import static handiebot.HandieBot.log;
|
||||||
*/
|
*/
|
||||||
public class CommandHandler {
|
public class CommandHandler {
|
||||||
|
|
||||||
public static String PREFIX = "!";
|
public static final String DEFAULT_PREFIX = "!";
|
||||||
|
public static Map<IGuild, String> PREFIXES = loadGuildPrefixes();
|
||||||
/**
|
/**
|
||||||
* Main method to handle user messages.
|
* Main method to handle user messages.
|
||||||
* @param event The event generated by the message.
|
* @param event The event generated by the message.
|
||||||
|
@ -32,48 +37,52 @@ public class CommandHandler {
|
||||||
public static void handleCommand(MessageReceivedEvent event){
|
public static void handleCommand(MessageReceivedEvent event){
|
||||||
IMessage message = event.getMessage();
|
IMessage message = event.getMessage();
|
||||||
IUser user = event.getAuthor();
|
IUser user = event.getAuthor();
|
||||||
|
//Exit immediately if the user is a bot; avoids bot spam chat.
|
||||||
|
if (user.isBot()){
|
||||||
|
return;
|
||||||
|
}
|
||||||
IChannel channel = event.getChannel();
|
IChannel channel = event.getChannel();
|
||||||
IGuild guild = event.getGuild();
|
IGuild guild = event.getGuild();
|
||||||
|
//Check if the guild already has a prefix assigned, and if not, give it the default.
|
||||||
|
if (!PREFIXES.containsKey(guild)){
|
||||||
|
PREFIXES.put(guild, DEFAULT_PREFIX);
|
||||||
|
}
|
||||||
String command = extractCommand(message);
|
String command = extractCommand(message);
|
||||||
String[] args = extractArgs(message);
|
String[] args = extractArgs(message);
|
||||||
|
//Create a context to give to each command's execution, so it knows what channel to reply on, etc.
|
||||||
CommandContext context = new CommandContext(user, channel, guild, args);
|
CommandContext context = new CommandContext(user, channel, guild, args);
|
||||||
if (guild != null && command != null){
|
if (guild != null && command != null){
|
||||||
DisappearingMessage.deleteMessageAfter(1000, message);
|
DisappearingMessage.deleteMessageAfter(1000, message);
|
||||||
if (command.equals("play")){
|
switch (command){
|
||||||
//Play or queue a song.
|
//Music commands.
|
||||||
|
case ("play"):
|
||||||
new PlayCommand().execute(context);
|
new PlayCommand().execute(context);
|
||||||
} else if (command.equals("skip") && args.length == 0){
|
break;
|
||||||
//Skip the current song.
|
case ("skip"):
|
||||||
new SkipAction(guild).actionPerformed(null);
|
new SkipCommand().execute(context);
|
||||||
} else if (command.equals("help")){
|
break;
|
||||||
//Send a PM to the user with help info.
|
case ("queue"):
|
||||||
sendHelpInfo(user);//TODO finish the help command and fill in with new descriptions each time.
|
new QueueCommand().execute(context);
|
||||||
} else if (command.equals("queue")){
|
break;
|
||||||
//Display the first few items of the queue.
|
case ("repeat"):
|
||||||
new QueueListAction(guild, (args.length == 1) && args[0].equals("all")).actionPerformed(null);
|
|
||||||
} else if (command.equals("repeat")) {
|
|
||||||
//Toggle repeat.
|
|
||||||
new RepeatCommand().execute(context);
|
new RepeatCommand().execute(context);
|
||||||
} else if (command.equals("shuffle")){
|
break;
|
||||||
|
case ("shuffle"):
|
||||||
new ShuffleCommand().execute(context);
|
new ShuffleCommand().execute(context);
|
||||||
} else if (command.equals("clear")){
|
break;
|
||||||
//TODO clear command.
|
case ("playlist"):
|
||||||
} else if (command.equals("quit")){
|
|
||||||
//Quit the application.
|
|
||||||
new QuitAction(guild).actionPerformed(null);
|
|
||||||
} else if (command.equals("playlist")){
|
|
||||||
//Do playlist actions.
|
|
||||||
new PlaylistCommand().execute(context);
|
new PlaylistCommand().execute(context);
|
||||||
} else if (command.equals("prefix") && args.length == 1){
|
break;
|
||||||
//Set the prefix to the first argument.
|
//Other commands.
|
||||||
if (args[0].length() != 1){
|
case ("help"):
|
||||||
new DisappearingMessage(channel, "You may only set the prefix to 1 character. To do otherwise is simply foolish.", 3000);
|
new HelpCommand().execute(context);
|
||||||
} else {
|
break;
|
||||||
new DisappearingMessage(channel, "Command prefix set to "+PREFIX, 10000);
|
case ("info"):
|
||||||
log.log(BotLog.TYPE.INFO, guild, "Prefix set to "+PREFIX);
|
new InfoCommand().execute(context);
|
||||||
setPrefix(args[0]);
|
break;
|
||||||
}
|
case ("setprefix"):
|
||||||
} else {
|
new SetPrefixCommand().execute(context);
|
||||||
|
default:
|
||||||
log.log(BotLog.TYPE.ERROR, guild, "Invalid command: "+command+" issued by "+user.getName());
|
log.log(BotLog.TYPE.ERROR, guild, "Invalid command: "+command+" issued by "+user.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,8 +95,8 @@ public class CommandHandler {
|
||||||
*/
|
*/
|
||||||
private static String extractCommand(IMessage message){
|
private static String extractCommand(IMessage message){
|
||||||
String[] words = message.getContent().split(" ");
|
String[] words = message.getContent().split(" ");
|
||||||
if (words[0].startsWith(PREFIX)){
|
if (words[0].startsWith(PREFIXES.get(message.getGuild()))){
|
||||||
return words[0].replaceFirst(PREFIX, "").toLowerCase();
|
return words[0].replaceFirst(PREFIXES.get(message.getGuild()), "").toLowerCase();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -97,10 +106,9 @@ public class CommandHandler {
|
||||||
* @param message The message to parse.
|
* @param message The message to parse.
|
||||||
* @return A list of strings representing args.
|
* @return A list of strings representing args.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
|
||||||
private static String[] extractArgs(IMessage message){
|
private static String[] extractArgs(IMessage message){
|
||||||
String[] words = message.getContent().split(" ");
|
String[] words = message.getContent().split(" ");
|
||||||
if (words[0].startsWith(PREFIX)){
|
if (words[0].startsWith(PREFIXES.get(message.getGuild()))){
|
||||||
String[] args = new String[words.length-1];
|
String[] args = new String[words.length-1];
|
||||||
for (int i = 0; i < words.length-1; i++){
|
for (int i = 0; i < words.length-1; i++){
|
||||||
args[i] = words[i+1];
|
args[i] = words[i+1];
|
||||||
|
@ -111,30 +119,34 @@ public class CommandHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to send a useful list of commands to any user if they desire.
|
* Loads a persistent list of prefixes for guilds from a file called guildPrefixes.txt
|
||||||
* @param user The user to send the message to.
|
* @return The mapping of guild to prefix.
|
||||||
*/
|
*/
|
||||||
private static void sendHelpInfo(IUser user){
|
private static Map<IGuild, String> loadGuildPrefixes(){
|
||||||
IPrivateChannel pm = user.getOrCreatePMChannel();
|
File prefixFile = new File(FileUtil.getDataDirectory()+"guildPrefixes.txt");
|
||||||
EmbedBuilder builder = new EmbedBuilder();
|
Map<IGuild, String> prefixes = new HashMap<>();
|
||||||
|
if (prefixFile.exists()){
|
||||||
builder.withAuthorName("HandieBot");
|
List<String> lines = FileUtil.getLinesFromFile(prefixFile);
|
||||||
builder.withAuthorUrl("https://github.com/andrewlalis/HandieBot");
|
for (String line : lines){
|
||||||
builder.withAuthorIcon("https://github.com/andrewlalis/HandieBot/blob/master/src/main/resources/icon.png");
|
String[] words = line.split(" / ");
|
||||||
|
prefixes.put(client.getGuildByID(Long.parseLong(words[0])), words[1]);
|
||||||
builder.withColor(new Color(255, 0, 0));
|
}
|
||||||
builder.withDescription("I'm a discord bot that can manage music, as well as some other important functions which will be implemented later on. Some commands are shown below.");
|
}
|
||||||
builder.appendField("Commands:", "play, skip, help", false);
|
log.log(BotLog.TYPE.INFO, "Loaded prefixes.");
|
||||||
|
return prefixes;
|
||||||
pm.sendMessage(builder.build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the prefix used to identify commands.
|
* Saves the list of prefixes to a file.
|
||||||
* @param prefix The prefix appended to the beginning of commands.
|
|
||||||
*/
|
*/
|
||||||
public static void setPrefix(String prefix){
|
public static void saveGuildPrefixes(){
|
||||||
PREFIX = prefix;
|
File prefixFile = new File(FileUtil.getDataDirectory()+"guildPrefixes.txt");
|
||||||
|
List<String> lines = new ArrayList<>();
|
||||||
|
for (Map.Entry<IGuild, String> entry : PREFIXES.entrySet()){
|
||||||
|
lines.add(Long.toString(entry.getKey().getLongID())+" / "+entry.getValue());
|
||||||
|
}
|
||||||
|
FileUtil.writeLinesToFile(lines, prefixFile);
|
||||||
|
log.log(BotLog.TYPE.INFO, "Saved prefixes.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
package handiebot.command.commands;
|
||||||
|
|
||||||
|
import handiebot.command.CommandContext;
|
||||||
|
import handiebot.command.CommandHandler;
|
||||||
|
import handiebot.command.types.ContextCommand;
|
||||||
|
import handiebot.utils.DisappearingMessage;
|
||||||
|
import sx.blah.discord.util.EmbedBuilder;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Andrew Lalis
|
||||||
|
* Command to display information about the bot, and some common commands.
|
||||||
|
*/
|
||||||
|
public class InfoCommand extends ContextCommand {
|
||||||
|
|
||||||
|
public InfoCommand() {
|
||||||
|
super("info");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CommandContext context) {
|
||||||
|
EmbedBuilder builder = new EmbedBuilder();
|
||||||
|
builder.withColor(new Color(255, 0, 0));
|
||||||
|
builder.withDescription("HandieBot is a Discord bot created by Andrew Lalis. It can play music, manage playlists, and provide other assistance to users. Some useful commands are shown below.");
|
||||||
|
builder.appendField("`"+ CommandHandler.PREFIXES.get(context.getGuild())+"help`", "Receive a message with a detailed list of all commands and how to use them.", false);
|
||||||
|
builder.appendField("`"+CommandHandler.PREFIXES.get(context.getGuild())+"setprefix`", "Changed the prefix used at the beginning of each command.", false);
|
||||||
|
DisappearingMessage.deleteMessageAfter(10000, context.getChannel().sendMessage(builder.build()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package handiebot.command.commands;
|
||||||
|
|
||||||
|
import handiebot.command.CommandContext;
|
||||||
|
import handiebot.command.CommandHandler;
|
||||||
|
import handiebot.command.types.ContextCommand;
|
||||||
|
import handiebot.utils.DisappearingMessage;
|
||||||
|
import handiebot.view.BotLog;
|
||||||
|
|
||||||
|
import static handiebot.HandieBot.log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Andrew Lalis
|
||||||
|
* Command to set the prefix used for a particular server.
|
||||||
|
*/
|
||||||
|
public class SetPrefixCommand extends ContextCommand {
|
||||||
|
|
||||||
|
public SetPrefixCommand() {
|
||||||
|
super("setprefix");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CommandContext context) {
|
||||||
|
if (context.getArgs().length == 1) {
|
||||||
|
CommandHandler.PREFIXES.put(context.getGuild(), context.getArgs()[0]);
|
||||||
|
CommandHandler.saveGuildPrefixes();
|
||||||
|
new DisappearingMessage(context.getChannel(), "Changed command prefix to \""+context.getArgs()[0]+"\"", 6000);
|
||||||
|
log.log(BotLog.TYPE.INFO, "Changed command prefix to \""+context.getArgs()[0]+"\"");
|
||||||
|
} else {
|
||||||
|
new DisappearingMessage(context.getChannel(), "You must provide a new prefix.", 3000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -86,7 +86,7 @@ public class PlaylistCommand extends ContextCommand {
|
||||||
}
|
}
|
||||||
playlist.save();
|
playlist.save();
|
||||||
log.log(BotLog.TYPE.INFO, "Created playlist: "+playlist.getName()+" with "+playlist.getTrackCount()+" new tracks.");
|
log.log(BotLog.TYPE.INFO, "Created playlist: "+playlist.getName()+" with "+playlist.getTrackCount()+" new tracks.");
|
||||||
new DisappearingMessage(context.getChannel(), "Your playlist *"+playlist.getName()+"* has been created.\nType `"+ CommandHandler.PREFIX+"playlist play "+playlist.getName()+"` to play it.", 5000);
|
new DisappearingMessage(context.getChannel(), "Your playlist *"+playlist.getName()+"* has been created.\nType `"+ CommandHandler.PREFIXES.get(context.getGuild())+"playlist play "+playlist.getName()+"` to play it.", 5000);
|
||||||
} else {
|
} else {
|
||||||
new DisappearingMessage(context.getChannel(), "You must specify a name for the new playlist.", 3000);
|
new DisappearingMessage(context.getChannel(), "You must specify a name for the new playlist.", 3000);
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,7 @@ public class PlaylistCommand extends ContextCommand {
|
||||||
new DisappearingMessage(context.getChannel(), "The playlist was not able to be deleted.", 3000);
|
new DisappearingMessage(context.getChannel(), "The playlist was not able to be deleted.", 3000);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
new DisappearingMessage(context.getChannel(), "The name you entered is not a playlist.\nType `"+CommandHandler.PREFIX+"playlist show` to list the playlists available.", 5000);
|
new DisappearingMessage(context.getChannel(), "The name you entered is not a playlist.\nType `"+CommandHandler.PREFIXES.get(context.getGuild())+"playlist show` to list the playlists available.", 5000);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
new DisappearingMessage(context.getChannel(), "You must specify the name of a playlist to delete.", 3000);
|
new DisappearingMessage(context.getChannel(), "You must specify the name of a playlist to delete.", 3000);
|
||||||
|
@ -128,7 +128,7 @@ public class PlaylistCommand extends ContextCommand {
|
||||||
IMessage message = context.getChannel().sendMessage(playlist.toString());
|
IMessage message = context.getChannel().sendMessage(playlist.toString());
|
||||||
DisappearingMessage.deleteMessageAfter(6000, message);
|
DisappearingMessage.deleteMessageAfter(6000, message);
|
||||||
} else {
|
} else {
|
||||||
new DisappearingMessage(context.getChannel(), "The playlist you specified does not exist.\nUse `"+CommandHandler.PREFIX+"playlist show` to view available playlists.", 5000);
|
new DisappearingMessage(context.getChannel(), "The playlist you specified does not exist.\nUse `"+CommandHandler.PREFIXES.get(context.getGuild())+"playlist show` to view available playlists.", 5000);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
List<String> playlists = Playlist.getAvailablePlaylists();
|
List<String> playlists = Playlist.getAvailablePlaylists();
|
||||||
|
@ -163,7 +163,7 @@ public class PlaylistCommand extends ContextCommand {
|
||||||
DisappearingMessage.deleteMessageAfter(6000, message);
|
DisappearingMessage.deleteMessageAfter(6000, message);
|
||||||
} else {
|
} else {
|
||||||
if (context.getArgs().length == 1){
|
if (context.getArgs().length == 1){
|
||||||
new DisappearingMessage(context.getChannel(), "You must provide the name of a playlist to add a URL to.\nUse '"+CommandHandler.PREFIX+"playlist show` to view available playlists.", 5000);
|
new DisappearingMessage(context.getChannel(), "You must provide the name of a playlist to add a URL to.\nUse '"+CommandHandler.PREFIXES.get(context.getGuild())+"playlist show` to view available playlists.", 5000);
|
||||||
} else {
|
} else {
|
||||||
new DisappearingMessage(context.getChannel(), "You must provide at least one URL to add.", 3000);
|
new DisappearingMessage(context.getChannel(), "You must provide at least one URL to add.", 3000);
|
||||||
}
|
}
|
||||||
|
@ -187,7 +187,7 @@ public class PlaylistCommand extends ContextCommand {
|
||||||
log.log(BotLog.TYPE.INFO, "Loaded playlist ["+playlist.getName()+"].");
|
log.log(BotLog.TYPE.INFO, "Loaded playlist ["+playlist.getName()+"].");
|
||||||
new DisappearingMessage(context.getChannel(), "Now playing from playlist: *"+playlist.getName()+"*.", 6000);
|
new DisappearingMessage(context.getChannel(), "Now playing from playlist: *"+playlist.getName()+"*.", 6000);
|
||||||
} else {
|
} else {
|
||||||
new DisappearingMessage(context.getChannel(), "You must provide a playlist to play.\nUse '"+CommandHandler.PREFIX+"playlist show` to view available playlists.", 3000);
|
new DisappearingMessage(context.getChannel(), "You must provide a playlist to play.\nUse '"+CommandHandler.PREFIXES.get(context.getGuild())+"playlist show` to view available playlists.", 3000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ public class PlaylistCommand extends ContextCommand {
|
||||||
} catch (NumberFormatException e){
|
} catch (NumberFormatException e){
|
||||||
new DisappearingMessage(context.getChannel(), "You must enter two integer values for the song indices.", 5000);
|
new DisappearingMessage(context.getChannel(), "You must enter two integer values for the song indices.", 5000);
|
||||||
}
|
}
|
||||||
UnloadedTrack track = null;
|
UnloadedTrack track;
|
||||||
if (oldIndex > -1 && oldIndex < playlist.getTrackCount()){
|
if (oldIndex > -1 && oldIndex < playlist.getTrackCount()){
|
||||||
track = playlist.getTracks().remove(oldIndex);
|
track = playlist.getTracks().remove(oldIndex);
|
||||||
if (newIndex > -1 && newIndex <= playlist.getTrackCount()){
|
if (newIndex > -1 && newIndex <= playlist.getTrackCount()){
|
||||||
|
|
|
@ -15,7 +15,7 @@ public class QueueCommand extends ContextCommand {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(CommandContext context) {
|
public void execute(CommandContext context) {
|
||||||
HandieBot.musicPlayer.showQueueList(context.getGuild(), (context.getArgs() != null && context.getArgs()[0].equals("all")));
|
HandieBot.musicPlayer.showQueueList(context.getGuild(), (context.getArgs().length == 1 && context.getArgs()[0].equals("all")));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,7 @@ public class MusicPlayer {
|
||||||
public void showQueueList(IGuild guild, boolean showAll) {
|
public void showQueueList(IGuild guild, boolean showAll) {
|
||||||
List<UnloadedTrack> tracks = getMusicManager(guild).scheduler.queueList();
|
List<UnloadedTrack> tracks = getMusicManager(guild).scheduler.queueList();
|
||||||
if (tracks.size() == 0) {
|
if (tracks.size() == 0) {
|
||||||
new DisappearingMessage(getChatChannel(guild), "The queue is empty. Use **"+ CommandHandler.PREFIX+"play** *URL* to add songs.", 3000);
|
new DisappearingMessage(getChatChannel(guild), "The queue is empty. Use **"+ CommandHandler.PREFIXES.get(guild)+"play** *URL* to add songs.", 3000);
|
||||||
} else {
|
} else {
|
||||||
if (tracks.size() > 10 && showAll) {
|
if (tracks.size() > 10 && showAll) {
|
||||||
String result = Pastebin.paste("Current queue for discord server: "+guild.getName()+".", getMusicManager(guild).scheduler.getActivePlaylist().toString());
|
String result = Pastebin.paste("Current queue for discord server: "+guild.getName()+".", getMusicManager(guild).scheduler.getActivePlaylist().toString());
|
||||||
|
|
|
@ -174,8 +174,6 @@ public class TrackScheduler extends AudioEventAdapter {
|
||||||
}
|
}
|
||||||
if (endReason.mayStartNext){
|
if (endReason.mayStartNext){
|
||||||
nextTrack();
|
nextTrack();
|
||||||
} else {
|
|
||||||
log.log(BotLog.TYPE.MUSIC, this.guild, "Unable to go to the next track. Reason: "+endReason.name());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
package handiebot.utils;
|
||||||
|
|
||||||
|
import handiebot.view.BotLog;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static handiebot.HandieBot.log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Andrew Lalis
|
||||||
|
* Class to simplify file operations.
|
||||||
|
*/
|
||||||
|
public class FileUtil {
|
||||||
|
|
||||||
|
public static String getDataDirectory(){
|
||||||
|
return System.getProperty("user.home")+"/.handiebot/";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<String> getLinesFromFile(File file){
|
||||||
|
try {
|
||||||
|
return Files.readAllLines(file.toPath());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writeLinesToFile(List<String> lines, File file){
|
||||||
|
if (lines.size() == 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!file.exists()){
|
||||||
|
try {
|
||||||
|
boolean success = file.createNewFile();
|
||||||
|
if (!success) {
|
||||||
|
log.log(BotLog.TYPE.ERROR, "Unable to create file. "+file.getAbsolutePath());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
log.log(BotLog.TYPE.ERROR, "Unable to create file. "+file.getAbsolutePath());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try (PrintWriter writer = new PrintWriter(file)){
|
||||||
|
while (lines.size() > 0) {
|
||||||
|
writer.println(lines.remove(0));
|
||||||
|
}
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
log.log(BotLog.TYPE.ERROR, "Unable to write to file. "+file.getAbsolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package handiebot.view;
|
package handiebot.view;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrew Lalis
|
* @author Andrew Lalis
|
||||||
|
@ -10,12 +11,55 @@ public class View {
|
||||||
private JTextPane outputArea;
|
private JTextPane outputArea;
|
||||||
private JTextField commandField;
|
private JTextField commandField;
|
||||||
|
|
||||||
public View(){
|
public View() {
|
||||||
this.commandField.addKeyListener(new CommandLineListener());
|
this.commandField.addKeyListener(new CommandLineListener());
|
||||||
}
|
}
|
||||||
|
|
||||||
public JTextPane getOutputArea(){
|
public JTextPane getOutputArea() {
|
||||||
return this.outputArea;
|
return this.outputArea;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// GUI initializer generated by IntelliJ IDEA GUI Designer
|
||||||
|
// >>> IMPORTANT!! <<<
|
||||||
|
// DO NOT EDIT OR ADD ANY CODE HERE!
|
||||||
|
$$$setupUI$$$();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method generated by IntelliJ IDEA GUI Designer
|
||||||
|
* >>> IMPORTANT!! <<<
|
||||||
|
* DO NOT edit this method OR call it in your code!
|
||||||
|
*
|
||||||
|
* @noinspection ALL
|
||||||
|
*/
|
||||||
|
private void $$$setupUI$$$() {
|
||||||
|
mainPanel = new JPanel();
|
||||||
|
mainPanel.setLayout(new com.intellij.uiDesigner.core.GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1));
|
||||||
|
final JScrollPane scrollPane1 = new JScrollPane();
|
||||||
|
scrollPane1.setFont(new Font("Consolas", scrollPane1.getFont().getStyle(), 12));
|
||||||
|
mainPanel.add(scrollPane1, new com.intellij.uiDesigner.core.GridConstraints(0, 0, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_BOTH, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_WANT_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
|
||||||
|
outputArea = new JTextPane();
|
||||||
|
outputArea.setEditable(false);
|
||||||
|
outputArea.setFont(new Font("Consolas", outputArea.getFont().getStyle(), 12));
|
||||||
|
outputArea.setSelectedTextColor(new Color(-1));
|
||||||
|
outputArea.setSelectionColor(new Color(-9843846));
|
||||||
|
outputArea.setText("");
|
||||||
|
scrollPane1.setViewportView(outputArea);
|
||||||
|
final JPanel panel1 = new JPanel();
|
||||||
|
panel1.setLayout(new com.intellij.uiDesigner.core.GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
|
||||||
|
mainPanel.add(panel1, new com.intellij.uiDesigner.core.GridConstraints(1, 0, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_BOTH, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
|
||||||
|
commandField = new JTextField();
|
||||||
|
commandField.setFont(new Font("DialogInput", commandField.getFont().getStyle(), 16));
|
||||||
|
commandField.setForeground(new Color(-16118999));
|
||||||
|
commandField.setMargin(new Insets(0, 0, 0, 0));
|
||||||
|
panel1.add(commandField, new com.intellij.uiDesigner.core.GridConstraints(0, 0, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_WEST, com.intellij.uiDesigner.core.GridConstraints.FILL_HORIZONTAL, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_WANT_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @noinspection ALL
|
||||||
|
*/
|
||||||
|
public JComponent $$$getRootComponent$$$() {
|
||||||
|
return mainPanel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue