diff --git a/README.md b/README.md index 29e7f22..feee5e1 100644 --- a/README.md +++ b/README.md @@ -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. -* `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. diff --git a/pom.xml b/pom.xml index dea48d3..321f66d 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,31 @@ 1.8 + + org.apache.maven.plugins + maven-assembly-plugin + 3.0.0 + + 1.8 + 1.8 + + jar-with-dependencies + + + + handiebot.HandieBot + + + + + + package + + single + + + + jar diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000..e9e1ba4 --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: handiebot.HandieBot + diff --git a/src/main/java/handiebot/HandieBot.java b/src/main/java/handiebot/HandieBot.java index 7e4ca6e..a92be94 100644 --- a/src/main/java/handiebot/HandieBot.java +++ b/src/main/java/handiebot/HandieBot.java @@ -2,6 +2,7 @@ package handiebot; import handiebot.command.CommandHandler; import handiebot.lavaplayer.MusicPlayer; +import handiebot.utils.DisappearingMessage; import handiebot.view.BotLog; import handiebot.view.BotWindow; 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.handle.impl.events.ReadyEvent; 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.RateLimitException; @@ -40,6 +42,9 @@ public class HandieBot { @EventSubscriber public void onReady(ReadyEvent event){ 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"))); } diff --git a/src/main/java/handiebot/command/CommandHandler.java b/src/main/java/handiebot/command/CommandHandler.java index a4a14b2..3b78cd5 100644 --- a/src/main/java/handiebot/command/CommandHandler.java +++ b/src/main/java/handiebot/command/CommandHandler.java @@ -1,21 +1,25 @@ package handiebot.command; -import com.sun.istack.internal.NotNull; -import handiebot.command.commands.music.PlayCommand; -import handiebot.command.commands.music.PlaylistCommand; -import handiebot.command.commands.music.RepeatCommand; -import handiebot.command.commands.music.ShuffleCommand; +import handiebot.command.commands.HelpCommand; +import handiebot.command.commands.InfoCommand; +import handiebot.command.commands.SetPrefixCommand; +import handiebot.command.commands.music.*; import handiebot.utils.DisappearingMessage; +import handiebot.utils.FileUtil; 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.obj.*; -import sx.blah.discord.util.EmbedBuilder; +import sx.blah.discord.handle.obj.IChannel; +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; /** @@ -24,7 +28,8 @@ import static handiebot.HandieBot.log; */ public class CommandHandler { - public static String PREFIX = "!"; + public static final String DEFAULT_PREFIX = "!"; + public static Map PREFIXES = loadGuildPrefixes(); /** * Main method to handle user messages. * @param event The event generated by the message. @@ -32,49 +37,53 @@ public class CommandHandler { public static void handleCommand(MessageReceivedEvent event){ IMessage message = event.getMessage(); IUser user = event.getAuthor(); + //Exit immediately if the user is a bot; avoids bot spam chat. + if (user.isBot()){ + return; + } IChannel channel = event.getChannel(); 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[] 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); if (guild != null && command != null){ DisappearingMessage.deleteMessageAfter(1000, message); - if (command.equals("play")){ - //Play or queue a song. - new PlayCommand().execute(context); - } else if (command.equals("skip") && args.length == 0){ - //Skip the current song. - new SkipAction(guild).actionPerformed(null); - } else if (command.equals("help")){ - //Send a PM to the user with help info. - sendHelpInfo(user);//TODO finish the help command and fill in with new descriptions each time. - } else if (command.equals("queue")){ - //Display the first few items of the queue. - new QueueListAction(guild, (args.length == 1) && args[0].equals("all")).actionPerformed(null); - } else if (command.equals("repeat")) { - //Toggle repeat. - new RepeatCommand().execute(context); - } else if (command.equals("shuffle")){ - new ShuffleCommand().execute(context); - } else if (command.equals("clear")){ - //TODO clear command. - } 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); - } else if (command.equals("prefix") && args.length == 1){ - //Set the prefix to the first argument. - if (args[0].length() != 1){ - new DisappearingMessage(channel, "You may only set the prefix to 1 character. To do otherwise is simply foolish.", 3000); - } else { - new DisappearingMessage(channel, "Command prefix set to "+PREFIX, 10000); - log.log(BotLog.TYPE.INFO, guild, "Prefix set to "+PREFIX); - setPrefix(args[0]); - } - } else { - log.log(BotLog.TYPE.ERROR, guild, "Invalid command: "+command+" issued by "+user.getName()); + switch (command){ + //Music commands. + case ("play"): + new PlayCommand().execute(context); + break; + case ("skip"): + new SkipCommand().execute(context); + break; + case ("queue"): + new QueueCommand().execute(context); + break; + case ("repeat"): + new RepeatCommand().execute(context); + break; + case ("shuffle"): + new ShuffleCommand().execute(context); + break; + case ("playlist"): + new PlaylistCommand().execute(context); + break; + //Other commands. + case ("help"): + new HelpCommand().execute(context); + break; + case ("info"): + new InfoCommand().execute(context); + break; + case ("setprefix"): + new SetPrefixCommand().execute(context); + default: + 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){ String[] words = message.getContent().split(" "); - if (words[0].startsWith(PREFIX)){ - return words[0].replaceFirst(PREFIX, "").toLowerCase(); + if (words[0].startsWith(PREFIXES.get(message.getGuild()))){ + return words[0].replaceFirst(PREFIXES.get(message.getGuild()), "").toLowerCase(); } return null; } @@ -97,10 +106,9 @@ public class CommandHandler { * @param message The message to parse. * @return A list of strings representing args. */ - @NotNull private static String[] extractArgs(IMessage message){ 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]; for (int i = 0; i < words.length-1; i++){ 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. - * @param user The user to send the message to. + * Loads a persistent list of prefixes for guilds from a file called guildPrefixes.txt + * @return The mapping of guild to prefix. */ - private static void sendHelpInfo(IUser user){ - IPrivateChannel pm = user.getOrCreatePMChannel(); - EmbedBuilder builder = new EmbedBuilder(); - - builder.withAuthorName("HandieBot"); - builder.withAuthorUrl("https://github.com/andrewlalis/HandieBot"); - builder.withAuthorIcon("https://github.com/andrewlalis/HandieBot/blob/master/src/main/resources/icon.png"); - - 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); - - pm.sendMessage(builder.build()); + private static Map loadGuildPrefixes(){ + File prefixFile = new File(FileUtil.getDataDirectory()+"guildPrefixes.txt"); + Map prefixes = new HashMap<>(); + if (prefixFile.exists()){ + List lines = FileUtil.getLinesFromFile(prefixFile); + for (String line : lines){ + String[] words = line.split(" / "); + prefixes.put(client.getGuildByID(Long.parseLong(words[0])), words[1]); + } + } + log.log(BotLog.TYPE.INFO, "Loaded prefixes."); + return prefixes; } /** - * Sets the prefix used to identify commands. - * @param prefix The prefix appended to the beginning of commands. + * Saves the list of prefixes to a file. */ - public static void setPrefix(String prefix){ - PREFIX = prefix; + public static void saveGuildPrefixes(){ + File prefixFile = new File(FileUtil.getDataDirectory()+"guildPrefixes.txt"); + List lines = new ArrayList<>(); + for (Map.Entry entry : PREFIXES.entrySet()){ + lines.add(Long.toString(entry.getKey().getLongID())+" / "+entry.getValue()); + } + FileUtil.writeLinesToFile(lines, prefixFile); + log.log(BotLog.TYPE.INFO, "Saved prefixes."); } } diff --git a/src/main/java/handiebot/command/commands/InfoCommand.java b/src/main/java/handiebot/command/commands/InfoCommand.java new file mode 100644 index 0000000..229814d --- /dev/null +++ b/src/main/java/handiebot/command/commands/InfoCommand.java @@ -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())); + } +} diff --git a/src/main/java/handiebot/command/commands/SetPrefixCommand.java b/src/main/java/handiebot/command/commands/SetPrefixCommand.java new file mode 100644 index 0000000..a68e1e0 --- /dev/null +++ b/src/main/java/handiebot/command/commands/SetPrefixCommand.java @@ -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); + } + } +} diff --git a/src/main/java/handiebot/command/commands/music/PlaylistCommand.java b/src/main/java/handiebot/command/commands/music/PlaylistCommand.java index 37e505b..cdc9fa9 100644 --- a/src/main/java/handiebot/command/commands/music/PlaylistCommand.java +++ b/src/main/java/handiebot/command/commands/music/PlaylistCommand.java @@ -86,7 +86,7 @@ public class PlaylistCommand extends ContextCommand { } playlist.save(); 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 { 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); } } 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 { 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()); DisappearingMessage.deleteMessageAfter(6000, message); } 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 { List playlists = Playlist.getAvailablePlaylists(); @@ -163,7 +163,7 @@ public class PlaylistCommand extends ContextCommand { DisappearingMessage.deleteMessageAfter(6000, message); } else { 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 { 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()+"]."); new DisappearingMessage(context.getChannel(), "Now playing from playlist: *"+playlist.getName()+"*.", 6000); } 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){ 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()){ track = playlist.getTracks().remove(oldIndex); if (newIndex > -1 && newIndex <= playlist.getTrackCount()){ diff --git a/src/main/java/handiebot/command/commands/music/QueueCommand.java b/src/main/java/handiebot/command/commands/music/QueueCommand.java index 85b8919..ebcae20 100644 --- a/src/main/java/handiebot/command/commands/music/QueueCommand.java +++ b/src/main/java/handiebot/command/commands/music/QueueCommand.java @@ -15,7 +15,7 @@ public class QueueCommand extends ContextCommand { @Override 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"))); } } diff --git a/src/main/java/handiebot/lavaplayer/MusicPlayer.java b/src/main/java/handiebot/lavaplayer/MusicPlayer.java index 977aab1..7e9438d 100644 --- a/src/main/java/handiebot/lavaplayer/MusicPlayer.java +++ b/src/main/java/handiebot/lavaplayer/MusicPlayer.java @@ -150,7 +150,7 @@ public class MusicPlayer { public void showQueueList(IGuild guild, boolean showAll) { List tracks = getMusicManager(guild).scheduler.queueList(); 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 { if (tracks.size() > 10 && showAll) { String result = Pastebin.paste("Current queue for discord server: "+guild.getName()+".", getMusicManager(guild).scheduler.getActivePlaylist().toString()); diff --git a/src/main/java/handiebot/lavaplayer/TrackScheduler.java b/src/main/java/handiebot/lavaplayer/TrackScheduler.java index f06d513..49be0cf 100644 --- a/src/main/java/handiebot/lavaplayer/TrackScheduler.java +++ b/src/main/java/handiebot/lavaplayer/TrackScheduler.java @@ -174,8 +174,6 @@ public class TrackScheduler extends AudioEventAdapter { } if (endReason.mayStartNext){ nextTrack(); - } else { - log.log(BotLog.TYPE.MUSIC, this.guild, "Unable to go to the next track. Reason: "+endReason.name()); } } diff --git a/src/main/java/handiebot/utils/FileUtil.java b/src/main/java/handiebot/utils/FileUtil.java new file mode 100644 index 0000000..5a01126 --- /dev/null +++ b/src/main/java/handiebot/utils/FileUtil.java @@ -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 getLinesFromFile(File file){ + try { + return Files.readAllLines(file.toPath()); + } catch (IOException e) { + e.printStackTrace(); + return new ArrayList<>(); + } + } + + public static void writeLinesToFile(List 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()); + } + } + +} diff --git a/src/main/java/handiebot/view/View.java b/src/main/java/handiebot/view/View.java index 67580fe..13fe909 100644 --- a/src/main/java/handiebot/view/View.java +++ b/src/main/java/handiebot/view/View.java @@ -1,6 +1,7 @@ package handiebot.view; import javax.swing.*; +import java.awt.*; /** * @author Andrew Lalis @@ -10,12 +11,55 @@ public class View { private JTextPane outputArea; private JTextField commandField; - public View(){ + public View() { this.commandField.addKeyListener(new CommandLineListener()); } - public JTextPane getOutputArea(){ - return this.outputArea; - } + public JTextPane getOutputArea() { + 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; + } }