From 5e8f705c2f363d7f8e5ee96c51c60f2a771697a0 Mon Sep 17 00:00:00 2001 From: cnaude Date: Sun, 22 Nov 2015 16:00:17 -0700 Subject: [PATCH] Updating javadocs. #116 Code merge with Spigot version. Added game-first-join message template. --- .../java/com/cnaude/purpleirc/BotWatcher.java | 9 +- .../com/cnaude/purpleirc/ChannelWatcher.java | 10 +- .../com/cnaude/purpleirc/CommandHandlers.java | 19 +- .../cnaude/purpleirc/CommandQueueWatcher.java | 24 +- .../com/cnaude/purpleirc/Commands/AddBan.java | 109 +++++++++ .../com/cnaude/purpleirc/Commands/AddOp.java | 67 +++--- .../cnaude/purpleirc/Commands/AddVoice.java | 66 +++--- .../com/cnaude/purpleirc/Commands/Ban.java | 113 +++++++++ .../com/cnaude/purpleirc/Commands/CTCP.java | 4 +- .../cnaude/purpleirc/Commands/Connect.java | 4 +- .../com/cnaude/purpleirc/Commands/DeOp.java | 4 +- .../cnaude/purpleirc/Commands/DeVoice.java | 4 +- .../com/cnaude/purpleirc/Commands/Debug.java | 4 +- .../cnaude/purpleirc/Commands/Disconnect.java | 4 +- .../com/cnaude/purpleirc/Commands/Help.java | 4 +- .../cnaude/purpleirc/Commands/ListBans.java | 94 ++++++++ .../cnaude/purpleirc/Commands/RemoveBan.java | 79 ++++++ .../com/cnaude/purpleirc/Commands/UnBan.java | 93 ++++++++ .../com/cnaude/purpleirc/FloodChecker.java | 2 +- .../java/com/cnaude/purpleirc/IRCCommand.java | 26 +- .../cnaude/purpleirc/IRCCommandSender.java | 2 +- .../purpleirc/IRCConsoleCommandSender.java | 224 ++++++++++++++++++ .../java/com/cnaude/purpleirc/IRCMessage.java | 2 +- .../cnaude/purpleirc/IRCMessageHandler.java | 9 +- .../purpleirc/IRCMessageQueueWatcher.java | 2 +- .../java/com/cnaude/purpleirc/LogTailer.java | 113 +++++++++ .../java/com/cnaude/purpleirc/PlayerList.java | 2 +- .../java/com/cnaude/purpleirc/PurpleBot.java | 154 +++++++++++- .../java/com/cnaude/purpleirc/PurpleIRC.java | 22 +- .../cnaude/purpleirc/PurpleTabCompleter.java | 8 +- .../com/cnaude/purpleirc/TemplateName.java | 3 +- .../purpleirc/Utilities/BotsAndChannels.java | 25 +- .../purpleirc/Utilities/ChatTokenizer.java | 4 +- .../purpleirc/Utilities/ColorConverter.java | 4 +- .../purpleirc/Utilities/CompatChecker.java | 2 +- .../purpleirc/Utilities/NetPacket_183.java | 2 +- .../NetPacket_184_185_186_187_188.java | 2 +- .../purpleirc/Utilities/NetPackets.java | 4 +- .../purpleirc/Utilities/RegexGlobber.java | 2 +- .../purpleirc/Utilities/UpdateChecker.java | 43 +++- src/main/resources/SampleBot.yml | 6 + src/main/resources/config.yml | 1 + 42 files changed, 1234 insertions(+), 141 deletions(-) create mode 100644 src/main/java/com/cnaude/purpleirc/Commands/AddBan.java create mode 100644 src/main/java/com/cnaude/purpleirc/Commands/Ban.java create mode 100644 src/main/java/com/cnaude/purpleirc/Commands/ListBans.java create mode 100644 src/main/java/com/cnaude/purpleirc/Commands/RemoveBan.java create mode 100644 src/main/java/com/cnaude/purpleirc/Commands/UnBan.java create mode 100644 src/main/java/com/cnaude/purpleirc/IRCConsoleCommandSender.java create mode 100644 src/main/java/com/cnaude/purpleirc/LogTailer.java diff --git a/src/main/java/com/cnaude/purpleirc/BotWatcher.java b/src/main/java/com/cnaude/purpleirc/BotWatcher.java index 844e6e6..b9d14e6 100644 --- a/src/main/java/com/cnaude/purpleirc/BotWatcher.java +++ b/src/main/java/com/cnaude/purpleirc/BotWatcher.java @@ -22,16 +22,16 @@ * This thread checks each bot for connectivity and reconnects when appropriate. * * @author Chris Naude - * - */ + * */ public class BotWatcher { private final PurpleIRC plugin; private final BukkitTask bt; /** + * Run the BotWatcher thread asynchronously at configured interval. * - * @param plugin + * @param plugin the PurpleIRC plugin */ public BotWatcher(final PurpleIRC plugin) { this.plugin = plugin; @@ -55,7 +55,8 @@ public void run() { } /** - * + * Cancel the scheduled BukkitTask. Call this when + * shutting down. */ public void cancel() { bt.cancel(); diff --git a/src/main/java/com/cnaude/purpleirc/ChannelWatcher.java b/src/main/java/com/cnaude/purpleirc/ChannelWatcher.java index 255c610..5323c9e 100644 --- a/src/main/java/com/cnaude/purpleirc/ChannelWatcher.java +++ b/src/main/java/com/cnaude/purpleirc/ChannelWatcher.java @@ -19,9 +19,10 @@ import org.bukkit.scheduler.BukkitTask; /** - * - * @author Chris Naude This thread checks each for users and updates the + * This thread checks each for users and updates the * internal lists. + * + * @author Chris Naude */ public class ChannelWatcher { @@ -30,7 +31,7 @@ public class ChannelWatcher { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public ChannelWatcher(final PurpleIRC plugin) { this.plugin = plugin; @@ -46,7 +47,8 @@ public void run() { } /** - * + * Cancel the scheduled BukkitTask. Call this when + * shutting down. */ public void cancel() { bt.cancel(); diff --git a/src/main/java/com/cnaude/purpleirc/CommandHandlers.java b/src/main/java/com/cnaude/purpleirc/CommandHandlers.java index 26dd3e4..a130c9a 100644 --- a/src/main/java/com/cnaude/purpleirc/CommandHandlers.java +++ b/src/main/java/com/cnaude/purpleirc/CommandHandlers.java @@ -28,7 +28,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class CommandHandlers implements CommandExecutor { @@ -38,14 +38,16 @@ public class CommandHandlers implements CommandExecutor { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public CommandHandlers(PurpleIRC plugin) { this.plugin = plugin; + commands.put("addban", new AddBan(plugin)); commands.put("addop", new AddOp(plugin)); commands.put("addvoice", new AddVoice(plugin)); + commands.put("ban", new Ban(plugin)); commands.put("connect", new Connect(plugin)); commands.put("ctcp", new CTCP(plugin)); commands.put("deop", new DeOp(plugin)); @@ -61,6 +63,7 @@ public CommandHandlers(PurpleIRC plugin) { commands.put("list", new List(plugin)); commands.put("listbots", new ListBots(plugin)); commands.put("listops", new ListOps(plugin)); + commands.put("listbans", new ListBans(plugin)); commands.put("listvoices", new ListVoices(plugin)); commands.put("login", new Login(plugin)); commands.put("load", new Load(plugin)); @@ -78,6 +81,7 @@ public CommandHandlers(PurpleIRC plugin) { commands.put("reloadbotconfigs", new ReloadBotConfigs(plugin)); commands.put("reloadbots", new ReloadBots(plugin)); commands.put("reloadconfig", new ReloadConfig(plugin)); + commands.put("removeban", new RemoveBan(plugin)); commands.put("removeop", new RemoveOp(plugin)); commands.put("removevoice", new RemoveVoice(plugin)); commands.put("save", new Save(plugin)); @@ -88,6 +92,7 @@ public CommandHandlers(PurpleIRC plugin) { commands.put("slist", new SList(plugin)); commands.put("smsg", new SMsg(plugin)); commands.put("topic", new Topic(plugin)); + commands.put("unban", new UnBan(plugin)); commands.put("unmute", new UnMute(plugin)); commands.put("updatecheck", new UpdateCheck(plugin)); commands.put("unload", new Unload(plugin)); @@ -106,11 +111,11 @@ public CommandHandlers(PurpleIRC plugin) { /** * - * @param sender - * @param cmd - * @param commandLabel - * @param args - * @return + * @param sender sender of the command + * @param cmd the actual command + * @param commandLabel the command label + * @param args the command arguments + * @return always return true */ @Override public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { diff --git a/src/main/java/com/cnaude/purpleirc/CommandQueueWatcher.java b/src/main/java/com/cnaude/purpleirc/CommandQueueWatcher.java index 6966015..169d4b6 100644 --- a/src/main/java/com/cnaude/purpleirc/CommandQueueWatcher.java +++ b/src/main/java/com/cnaude/purpleirc/CommandQueueWatcher.java @@ -19,6 +19,7 @@ import com.cnaude.purpleirc.Events.IRCCommandEvent; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +import org.bukkit.Bukkit; import org.bukkit.command.CommandException; /** @@ -33,7 +34,7 @@ public class CommandQueueWatcher { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public CommandQueueWatcher(final PurpleIRC plugin) { this.plugin = plugin; @@ -54,8 +55,25 @@ private void queueAndSend() { IRCCommand ircCommand = queue.poll(); if (ircCommand != null) { try { - plugin.logDebug("Dispatching command as IRCCommandSender: " + ircCommand.getGameCommand()); - plugin.getServer().dispatchCommand(ircCommand.getIRCCommandSender(), ircCommand.getGameCommand()); + String cmd = ircCommand.getGameCommand().split(" ")[0]; + boolean isCommandBookCommand = false; + plugin.logDebug("CMD: " + cmd); + if (plugin.commandBookHook != null) { + isCommandBookCommand = plugin.commandBookHook.isCommandBookCommand(cmd); + plugin.logDebug("Is this is a CommandBook command? " + Boolean.toString(isCommandBookCommand)); + } + if (plugin.getServer().getVersion().contains("MC: 1.8") + && plugin.getServer().getVersion().contains("Spigot") + && plugin.getServer().getPluginCommand(cmd) == null + && !isCommandBookCommand) { + plugin.logDebug("Dispatching command as ConsoleSender: " + ircCommand.getGameCommand()); + + plugin.getServer().dispatchCommand(ircCommand.getIRCConsoleCommandSender(), ircCommand.getGameCommand()); + ircCommand.getIRCConsoleCommandSender().sendMessage("Command sent: " + ircCommand.getGameCommand()); + } else { + plugin.logDebug("Dispatching command as IRCCommandSender: " + ircCommand.getGameCommand()); + plugin.getServer().dispatchCommand(ircCommand.getIRCCommandSender(), ircCommand.getGameCommand()); + } } catch (CommandException ce) { plugin.logError("Error running command: " + ce.getMessage()); } diff --git a/src/main/java/com/cnaude/purpleirc/Commands/AddBan.java b/src/main/java/com/cnaude/purpleirc/Commands/AddBan.java new file mode 100644 index 0000000..b4a1db2 --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/Commands/AddBan.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2014 cnaude + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.cnaude.purpleirc.Commands; + +import com.cnaude.purpleirc.PurpleIRC; +import com.cnaude.purpleirc.Utilities.BotsAndChannels; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.pircbotx.Channel; +import org.pircbotx.User; + +/** + * + * @author Chris Naude + */ +public class AddBan implements IRCCommandInterface { + + private final PurpleIRC plugin; + private final String usage = "([bot]) ([channel]) [user|mask]"; + private final String desc = "Add IRC users to the ban list."; + private final String name = "addban"; + private final String fullUsage = ChatColor.WHITE + "Usage: " + ChatColor.GOLD + "/irc " + name + " " + usage; + + /** + * + * @param plugin the PurpleIRC plugin + */ + public AddBan(PurpleIRC plugin) { + this.plugin = plugin; + } + + /** + * + * @param sender + * @param args + */ + @Override + public void dispatch(CommandSender sender, String[] args) { + BotsAndChannels bac; + int idx; + + if (args.length >= 4) { + bac = new BotsAndChannels(plugin, sender, args[1], args[2]); + idx = 3; + } else if (args.length == 2) { + bac = new BotsAndChannels(plugin, sender); + idx = 1; + } else { + sender.sendMessage(fullUsage); + return; + } + if (bac.bot.size() > 0 && bac.channel.size() > 0) { + for (String botName : bac.bot) { + for (String channelName : bac.channel) { + for (int i = idx; i < args.length; i++) { + + String nick = args[i]; + String mask = nick; + Channel channel = plugin.ircBots.get(botName).getChannel(channelName); + if (channel != null) { + for (User user : channel.getUsers()) { + if (user.getNick().equalsIgnoreCase(nick)) { + mask = "*!*" + user.getLogin() + "@" + user.getHostmask(); + } + } + } + if (mask.split("[\\!\\@]", 3).length == 3) { + plugin.ircBots.get(botName).addBan(channelName, mask, sender); + plugin.ircBots.get(botName).ban(channelName, mask); + } else { + sender.sendMessage(ChatColor.RED + "Invalid user or mask: " + + ChatColor.WHITE + mask); + } + } + } + } + } + + } + + @Override + public String name() { + return name; + } + + @Override + public String desc() { + return desc; + } + + @Override + public String usage() { + return usage; + } +} diff --git a/src/main/java/com/cnaude/purpleirc/Commands/AddOp.java b/src/main/java/com/cnaude/purpleirc/Commands/AddOp.java index f3a1bc1..7ef5e4f 100644 --- a/src/main/java/com/cnaude/purpleirc/Commands/AddOp.java +++ b/src/main/java/com/cnaude/purpleirc/Commands/AddOp.java @@ -17,6 +17,7 @@ package com.cnaude.purpleirc.Commands; import com.cnaude.purpleirc.PurpleIRC; +import com.cnaude.purpleirc.Utilities.BotsAndChannels; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.pircbotx.Channel; @@ -24,19 +25,19 @@ /** * - * @author cnaude + * @author Chris Naude */ public class AddOp implements IRCCommandInterface { private final PurpleIRC plugin; - private final String usage = "[bot] [channel] [user|mask]"; + private final String usage = "([bot]) ([channel]) [user|mask]"; private final String desc = "Add IRC users to IRC auto op list."; private final String name = "addop"; private final String fullUsage = ChatColor.WHITE + "Usage: " + ChatColor.GOLD + "/irc " + name + " " + usage; /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public AddOp(PurpleIRC plugin) { this.plugin = plugin; @@ -49,34 +50,46 @@ public AddOp(PurpleIRC plugin) { */ @Override public void dispatch(CommandSender sender, String[] args) { - if (args.length == 4) { - String bot = args[1]; - String channelName = args[2]; - if (plugin.ircBots.containsKey(bot)) { - // #channel, user - String nick = args[3]; - String mask = nick; - Channel channel = plugin.ircBots.get(bot).getChannel(channelName); - if (channel != null) { - for (User user : channel.getUsers()) { - if (user.getNick().equalsIgnoreCase(nick)) { - mask = "*!*" + user.getLogin() + "@" + user.getHostmask(); + BotsAndChannels bac; + int idx; + + if (args.length >= 4) { + bac = new BotsAndChannels(plugin, sender, args[1], args[2]); + idx = 3; + } else if (args.length == 2) { + bac = new BotsAndChannels(plugin, sender); + idx = 1; + } else { + sender.sendMessage(fullUsage); + return; + } + if (bac.bot.size() > 0 && bac.channel.size() > 0) { + for (String botName : bac.bot) { + for (String channelName : bac.channel) { + for (int i = idx; i < args.length; i++) { + + String nick = args[i]; + String mask = nick; + Channel channel = plugin.ircBots.get(botName).getChannel(channelName); + if (channel != null) { + for (User user : channel.getUsers()) { + if (user.getNick().equalsIgnoreCase(nick)) { + mask = "*!*" + user.getLogin() + "@" + user.getHostmask(); + } + } + } + if (mask.split("[\\!\\@]", 3).length == 3) { + plugin.ircBots.get(botName).addOp(channelName, mask, sender); + plugin.ircBots.get(botName).opIrcUsers(channelName); + } else { + sender.sendMessage(ChatColor.RED + "Invalid user or mask: " + + ChatColor.WHITE + mask); } } } - if (mask.split("[\\!\\@]", 3).length == 3) { - plugin.ircBots.get(bot).addOp(channelName, mask, sender); - plugin.ircBots.get(bot).opIrcUsers(channelName); - } else { - sender.sendMessage(ChatColor.RED + "Invalid user or mask: " - + ChatColor.WHITE + mask); - } - } else { - sender.sendMessage(plugin.invalidBotName.replace("%BOT%", bot)); } - } else { - sender.sendMessage(fullUsage); } + } @Override @@ -93,4 +106,4 @@ public String desc() { public String usage() { return usage; } -} \ No newline at end of file +} diff --git a/src/main/java/com/cnaude/purpleirc/Commands/AddVoice.java b/src/main/java/com/cnaude/purpleirc/Commands/AddVoice.java index 6a9e09b..2733bf9 100644 --- a/src/main/java/com/cnaude/purpleirc/Commands/AddVoice.java +++ b/src/main/java/com/cnaude/purpleirc/Commands/AddVoice.java @@ -17,6 +17,7 @@ package com.cnaude.purpleirc.Commands; import com.cnaude.purpleirc.PurpleIRC; +import com.cnaude.purpleirc.Utilities.BotsAndChannels; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.pircbotx.Channel; @@ -24,19 +25,19 @@ /** * - * @author cnaude + * @author Chris Naude */ public class AddVoice implements IRCCommandInterface { private final PurpleIRC plugin; - private final String usage = "[bot] [channel] [user|mask]"; + private final String usage = "([bot]) ([channel]) [user|mask]"; private final String desc = "Add IRC users to IRC auto voice list."; private final String name = "addvoice"; private final String fullUsage = ChatColor.WHITE + "Usage: " + ChatColor.GOLD + "/irc " + name + " " + usage; /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public AddVoice(PurpleIRC plugin) { this.plugin = plugin; @@ -49,33 +50,44 @@ public AddVoice(PurpleIRC plugin) { */ @Override public void dispatch(CommandSender sender, String[] args) { - if (args.length == 4) { - String bot = args[1]; - String channelName = args[2]; - if (plugin.ircBots.containsKey(bot)) { - // #channel, user - String nick = args[3]; - String mask = nick; - Channel channel = plugin.ircBots.get(bot).getChannel(channelName); - if (channel != null) { - for (User user : channel.getUsers()) { - if (user.getNick().equalsIgnoreCase(nick)) { - mask = "*!*" + user.getLogin() + "@" + user.getHostmask(); + BotsAndChannels bac; + int idx; + + if (args.length >= 4) { + bac = new BotsAndChannels(plugin, sender, args[1], args[2]); + idx = 3; + } else if (args.length == 2) { + bac = new BotsAndChannels(plugin, sender); + idx = 1; + } else { + sender.sendMessage(fullUsage); + return; + } + if (bac.bot.size() > 0 && bac.channel.size() > 0) { + for (String botName : bac.bot) { + for (String channelName : bac.channel) { + for (int i = idx; i < args.length; i++) { + + String nick = args[i]; + String mask = nick; + Channel channel = plugin.ircBots.get(botName).getChannel(channelName); + if (channel != null) { + for (User user : channel.getUsers()) { + if (user.getNick().equalsIgnoreCase(nick)) { + mask = "*!*" + user.getLogin() + "@" + user.getHostmask(); + } + } + } + if (mask.split("[\\!\\@]", 3).length == 3) { + plugin.ircBots.get(botName).addVoice(channelName, mask, sender); + plugin.ircBots.get(botName).voiceIrcUsers(channelName); + } else { + sender.sendMessage(ChatColor.RED + "Invalid user or mask: " + + ChatColor.WHITE + mask); } } } - if (mask.split("[\\!\\@]", 3).length == 3) { - plugin.ircBots.get(bot).addVoice(channelName, mask, sender); - plugin.ircBots.get(bot).voiceIrcUsers(channelName); - } else { - sender.sendMessage(ChatColor.RED + "Invalid user or mask: " - + ChatColor.WHITE + mask); - } - } else { - sender.sendMessage(plugin.invalidBotName.replace("%BOT%", bot)); } - } else { - sender.sendMessage(fullUsage); } } @@ -93,4 +105,4 @@ public String desc() { public String usage() { return usage; } -} \ No newline at end of file +} diff --git a/src/main/java/com/cnaude/purpleirc/Commands/Ban.java b/src/main/java/com/cnaude/purpleirc/Commands/Ban.java new file mode 100644 index 0000000..d4f0515 --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/Commands/Ban.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2014 cnaude + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.cnaude.purpleirc.Commands; + +import com.cnaude.purpleirc.PurpleIRC; +import com.cnaude.purpleirc.Utilities.BotsAndChannels; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.pircbotx.Channel; +import org.pircbotx.User; + +/** + * + * @author Chris Naude + */ +public class Ban implements IRCCommandInterface { + + private final PurpleIRC plugin; + private final String usage = "([bot]) ([channel]) [user(s)]"; + private final String desc = "Ban an IRC user from a channel."; + private final String name = "ban"; + private final String fullUsage = ChatColor.WHITE + "Usage: " + ChatColor.GOLD + "/irc " + name + " " + usage; + + /** + * + * @param plugin the PurpleIRC plugin + */ + public Ban(PurpleIRC plugin) { + this.plugin = plugin; + } + + /** + * + * @param sender + * @param args + */ + @Override + public void dispatch(CommandSender sender, String[] args) { + BotsAndChannels bac; + int idx; + + if (args.length >= 4) { + bac = new BotsAndChannels(plugin, sender, args[1], args[2]); + idx = 3; + } else if (args.length == 2) { + bac = new BotsAndChannels(plugin, sender); + idx = 1; + } else { + sender.sendMessage(fullUsage); + return; + } + if (bac.bot.size() > 0 && bac.channel.size() > 0) { + for (String botName : bac.bot) { + for (String channelName : bac.channel) { + for (int i = idx; i < args.length; i++) { + + String nick = args[i]; + String mask = nick; + Channel channel = plugin.ircBots.get(botName).getChannel(channelName); + if (channel != null) { + for (User user : channel.getUsers()) { + if (user.getNick().equalsIgnoreCase(nick)) { + mask = "*!*" + user.getLogin() + "@" + user.getHostmask(); + } + } + } + if (mask.split("[\\!\\@]", 3).length == 3) { + plugin.ircBots.get(botName).ban(channelName, mask); + plugin.ircBots.get(botName).kick(channelName, nick, "Banned"); + sender.sendMessage("Setting +b for " + + ChatColor.WHITE + mask + + ChatColor.RESET + " on " + + ChatColor.WHITE + channelName); + } else { + sender.sendMessage(ChatColor.RED + "Invalid user or mask: " + + ChatColor.WHITE + mask); + } + + } + } + } + } + } + + @Override + public String name() { + return name; + } + + @Override + public String desc() { + return desc; + } + + @Override + public String usage() { + return usage; + } +} diff --git a/src/main/java/com/cnaude/purpleirc/Commands/CTCP.java b/src/main/java/com/cnaude/purpleirc/Commands/CTCP.java index a3bcda6..ba58725 100644 --- a/src/main/java/com/cnaude/purpleirc/Commands/CTCP.java +++ b/src/main/java/com/cnaude/purpleirc/Commands/CTCP.java @@ -23,7 +23,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class CTCP implements IRCCommandInterface { @@ -35,7 +35,7 @@ public class CTCP implements IRCCommandInterface { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public CTCP(PurpleIRC plugin) { this.plugin = plugin; diff --git a/src/main/java/com/cnaude/purpleirc/Commands/Connect.java b/src/main/java/com/cnaude/purpleirc/Commands/Connect.java index 38cda31..00e30ab 100644 --- a/src/main/java/com/cnaude/purpleirc/Commands/Connect.java +++ b/src/main/java/com/cnaude/purpleirc/Commands/Connect.java @@ -23,7 +23,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class Connect implements IRCCommandInterface { @@ -35,7 +35,7 @@ public class Connect implements IRCCommandInterface { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public Connect(PurpleIRC plugin) { this.plugin = plugin; diff --git a/src/main/java/com/cnaude/purpleirc/Commands/DeOp.java b/src/main/java/com/cnaude/purpleirc/Commands/DeOp.java index e2c0570..2e65240 100644 --- a/src/main/java/com/cnaude/purpleirc/Commands/DeOp.java +++ b/src/main/java/com/cnaude/purpleirc/Commands/DeOp.java @@ -23,7 +23,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class DeOp implements IRCCommandInterface { @@ -35,7 +35,7 @@ public class DeOp implements IRCCommandInterface { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public DeOp(PurpleIRC plugin) { this.plugin = plugin; diff --git a/src/main/java/com/cnaude/purpleirc/Commands/DeVoice.java b/src/main/java/com/cnaude/purpleirc/Commands/DeVoice.java index 7075b0f..04160e2 100644 --- a/src/main/java/com/cnaude/purpleirc/Commands/DeVoice.java +++ b/src/main/java/com/cnaude/purpleirc/Commands/DeVoice.java @@ -23,7 +23,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class DeVoice implements IRCCommandInterface { @@ -35,7 +35,7 @@ public class DeVoice implements IRCCommandInterface { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public DeVoice(PurpleIRC plugin) { this.plugin = plugin; diff --git a/src/main/java/com/cnaude/purpleirc/Commands/Debug.java b/src/main/java/com/cnaude/purpleirc/Commands/Debug.java index 6693b64..f71ee75 100644 --- a/src/main/java/com/cnaude/purpleirc/Commands/Debug.java +++ b/src/main/java/com/cnaude/purpleirc/Commands/Debug.java @@ -22,7 +22,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class Debug implements IRCCommandInterface { @@ -34,7 +34,7 @@ public class Debug implements IRCCommandInterface { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public Debug(PurpleIRC plugin) { this.plugin = plugin; diff --git a/src/main/java/com/cnaude/purpleirc/Commands/Disconnect.java b/src/main/java/com/cnaude/purpleirc/Commands/Disconnect.java index 78a77b4..437e77b 100644 --- a/src/main/java/com/cnaude/purpleirc/Commands/Disconnect.java +++ b/src/main/java/com/cnaude/purpleirc/Commands/Disconnect.java @@ -23,7 +23,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class Disconnect implements IRCCommandInterface { @@ -35,7 +35,7 @@ public class Disconnect implements IRCCommandInterface { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public Disconnect(PurpleIRC plugin) { this.plugin = plugin; diff --git a/src/main/java/com/cnaude/purpleirc/Commands/Help.java b/src/main/java/com/cnaude/purpleirc/Commands/Help.java index 65f6e8a..2e297db 100644 --- a/src/main/java/com/cnaude/purpleirc/Commands/Help.java +++ b/src/main/java/com/cnaude/purpleirc/Commands/Help.java @@ -22,7 +22,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class Help implements IRCCommandInterface { @@ -33,7 +33,7 @@ public class Help implements IRCCommandInterface { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public Help(PurpleIRC plugin) { this.plugin = plugin; diff --git a/src/main/java/com/cnaude/purpleirc/Commands/ListBans.java b/src/main/java/com/cnaude/purpleirc/Commands/ListBans.java new file mode 100644 index 0000000..60c8416 --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/Commands/ListBans.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2014 cnaude + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.cnaude.purpleirc.Commands; + +import com.cnaude.purpleirc.PurpleIRC; +import com.cnaude.purpleirc.Utilities.BotsAndChannels; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +/** + * + * @author Chris Naude + */ +public class ListBans implements IRCCommandInterface { + + private final PurpleIRC plugin; + private final String usage = "([bot]) ([channel])"; + private final String desc = "List IRC user mask in ban list."; + private final String name = "listbans"; + private final String fullUsage = ChatColor.WHITE + "Usage: " + ChatColor.GOLD + "/irc " + name + " " + usage; + + /** + * + * @param plugin the PurpleIRC plugin + */ + public ListBans(PurpleIRC plugin) { + this.plugin = plugin; + } + + /** + * + * @param sender + * @param args + */ + @Override + public void dispatch(CommandSender sender, String[] args) { + BotsAndChannels bac; + + if (args.length >= 3) { + bac = new BotsAndChannels(plugin, sender, args[1], args[2]); + } else if (args.length >= 2) { + bac = new BotsAndChannels(plugin, sender, args[1]); + } else if (args.length == 1) { + bac = new BotsAndChannels(plugin, sender); + } else { + sender.sendMessage(fullUsage); + return; + } + if (bac.bot.size() > 0 && bac.channel.size() > 0) { + for (String botName : bac.bot) { + for (String channelName : bac.channel) { + if (plugin.ircBots.get(botName).banList.containsKey(channelName)) { + sender.sendMessage(ChatColor.LIGHT_PURPLE + "-----[ " + ChatColor.WHITE + channelName + + ChatColor.LIGHT_PURPLE + " - " + ChatColor.WHITE + "Ban Masks" + ChatColor.LIGHT_PURPLE + " ]-----"); + for (String userMask : plugin.ircBots.get(botName).banList.get(channelName)) { + sender.sendMessage(" - " + userMask); + } + } else { + sender.sendMessage(plugin.invalidChannel.replace("%CHANNEL%", channelName)); + } + } + } + } + } + + @Override + public String name() { + return name; + } + + @Override + public String desc() { + return desc; + } + + @Override + public String usage() { + return usage; + } +} diff --git a/src/main/java/com/cnaude/purpleirc/Commands/RemoveBan.java b/src/main/java/com/cnaude/purpleirc/Commands/RemoveBan.java new file mode 100644 index 0000000..b69f1a2 --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/Commands/RemoveBan.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2014 cnaude + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.cnaude.purpleirc.Commands; + +import com.cnaude.purpleirc.PurpleIRC; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +/** + * + * @author Chris Naude + */ +public class RemoveBan implements IRCCommandInterface { + + private final PurpleIRC plugin; + private final String usage = "[bot] [channel] [user mask]"; + private final String desc = "Remove a user mask from the ban list."; + private final String name = "removeban"; + private final String fullUsage = ChatColor.WHITE + "Usage: " + ChatColor.GOLD + "/irc " + name + " " + usage; + + /** + * + * @param plugin the PurpleIRC plugin + */ + public RemoveBan(PurpleIRC plugin) { + this.plugin = plugin; + } + + /** + * + * @param sender + * @param args + */ + @Override + public void dispatch(CommandSender sender, String[] args) { + if (args.length == 4) { + String bot = args[1]; + String channel = args[2]; + if (plugin.ircBots.containsKey(bot)) { + // #channel, user + plugin.ircBots.get(bot).removeBan(channel, args[3], sender); + plugin.ircBots.get(bot).unBan(channel, args[3]); + } else { + sender.sendMessage(plugin.invalidBotName.replace("%BOT%", bot)); + } + } else { + sender.sendMessage(fullUsage); + } + } + + @Override + public String name() { + return name; + } + + @Override + public String desc() { + return desc; + } + + @Override + public String usage() { + return usage; + } +} diff --git a/src/main/java/com/cnaude/purpleirc/Commands/UnBan.java b/src/main/java/com/cnaude/purpleirc/Commands/UnBan.java new file mode 100644 index 0000000..e59c21c --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/Commands/UnBan.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2014 cnaude + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.cnaude.purpleirc.Commands; + +import com.cnaude.purpleirc.PurpleIRC; +import com.cnaude.purpleirc.Utilities.BotsAndChannels; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +/** + * + * @author Chris Naude + */ +public class UnBan implements IRCCommandInterface { + + private final PurpleIRC plugin; + private final String usage = "([bot]) ([channel]) [user(s)]"; + private final String desc = "Unban IRC user(s)."; + private final String name = "unban"; + private final String fullUsage = ChatColor.WHITE + "Usage: " + ChatColor.GOLD + "/irc " + name + " " + usage; + + /** + * + * @param plugin the PurpleIRC plugin + */ + public UnBan(PurpleIRC plugin) { + this.plugin = plugin; + } + + /** + * + * @param sender + * @param args + */ + @Override + public void dispatch(CommandSender sender, String[] args) { + BotsAndChannels bac; + int idx; + + if (args.length >= 4) { + bac = new BotsAndChannels(plugin, sender, args[1], args[2]); + idx = 3; + } else if (args.length == 2) { + bac = new BotsAndChannels(plugin, sender); + idx = 1; + } else { + sender.sendMessage(fullUsage); + return; + } + if (bac.bot.size() > 0 && bac.channel.size() > 0) { + for (String botName : bac.bot) { + for (String channelName : bac.channel) { + for (int i = idx; i < args.length; i++) { + plugin.ircBots.get(botName).unBan(channelName, args[i]); + sender.sendMessage("Setting -b for " + + ChatColor.WHITE + args[i] + + ChatColor.RESET + " on " + + ChatColor.WHITE + channelName); + } + } + } + } + } + + @Override + public String name() { + return name; + } + + @Override + public String desc() { + return desc; + } + + @Override + public String usage() { + return usage; + } +} diff --git a/src/main/java/com/cnaude/purpleirc/FloodChecker.java b/src/main/java/com/cnaude/purpleirc/FloodChecker.java index 03e41a0..8306dc5 100644 --- a/src/main/java/com/cnaude/purpleirc/FloodChecker.java +++ b/src/main/java/com/cnaude/purpleirc/FloodChecker.java @@ -23,7 +23,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class FloodChecker { diff --git a/src/main/java/com/cnaude/purpleirc/IRCCommand.java b/src/main/java/com/cnaude/purpleirc/IRCCommand.java index f063093..fb9c6c6 100644 --- a/src/main/java/com/cnaude/purpleirc/IRCCommand.java +++ b/src/main/java/com/cnaude/purpleirc/IRCCommand.java @@ -18,22 +18,26 @@ /** * - * @author cnaude + * @author Chris Naude */ public class IRCCommand { - final private IRCCommandSender sender; - final private String command; - + + private final IRCCommandSender sender; + private final IRCConsoleCommandSender consoleSender; + private final String command; + /** * * @param sender + * @param consoleSender * @param command */ - public IRCCommand(IRCCommandSender sender, String command) { + public IRCCommand(IRCCommandSender sender, IRCConsoleCommandSender consoleSender, String command) { this.sender = sender; + this.consoleSender = consoleSender; this.command = command; } - + /** * * @return @@ -41,7 +45,15 @@ public IRCCommand(IRCCommandSender sender, String command) { public IRCCommandSender getIRCCommandSender() { return sender; } - + + /** + * + * @return + */ + public IRCConsoleCommandSender getIRCConsoleCommandSender() { + return consoleSender; + } + /** * * @return diff --git a/src/main/java/com/cnaude/purpleirc/IRCCommandSender.java b/src/main/java/com/cnaude/purpleirc/IRCCommandSender.java index 1f1cd81..73fb8d9 100644 --- a/src/main/java/com/cnaude/purpleirc/IRCCommandSender.java +++ b/src/main/java/com/cnaude/purpleirc/IRCCommandSender.java @@ -70,7 +70,7 @@ private void addMessageToQueue(String message) { * * @param ircBot * @param target - * @param plugin + * @param plugin the PurpleIRC plugin * @param ctcpResponse * @param name * @param template diff --git a/src/main/java/com/cnaude/purpleirc/IRCConsoleCommandSender.java b/src/main/java/com/cnaude/purpleirc/IRCConsoleCommandSender.java new file mode 100644 index 0000000..23c9a2a --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/IRCConsoleCommandSender.java @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2014 cnaude + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.cnaude.purpleirc; + +import java.util.Set; +import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.conversations.Conversation; +import org.bukkit.conversations.ConversationAbandonedEvent; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.Plugin; + +/** + * + * @author Chris Naude We have to implement our own CommandSender so that we can + * receive output from the command dispatcher. + */ +public class IRCConsoleCommandSender implements ConsoleCommandSender { + + private final PurpleBot ircBot; + private final String target; + private final PurpleIRC plugin; + private final boolean ctcpResponse; + private final String name; + + /** + * + * @param message + */ + @Override + public void sendMessage(String message) { + plugin.logDebug("sendMessage: " + message); + addMessageToQueue(message); + } + + /** + * + * @param messages + */ + @Override + public void sendMessage(String[] messages) { + for (String message : messages) { + plugin.logDebug("sendMessage[]: " + message); + addMessageToQueue(message); + } + } + + private void addMessageToQueue(String message) { + ircBot.messageQueue.add(new IRCMessage(target, + plugin.colorConverter.gameColorsToIrc(message), ctcpResponse)); + } + + /** + * + * @param ircBot + * @param target + * @param plugin the PurpleIRC plugin + * @param ctcpResponse + * @param name + */ + public IRCConsoleCommandSender(PurpleBot ircBot, String target, PurpleIRC plugin, boolean ctcpResponse, String name) { + super(); + this.target = target; + this.ircBot = ircBot; + this.plugin = plugin; + this.ctcpResponse = ctcpResponse; + this.name = name; + } + + /** + * + * @return + */ + @Override + public Server getServer() { + return Bukkit.getServer(); + } + + /** + * + * @return + */ + @Override + public String getName() { + return name; + } + + /** + * + * @return + */ + @Override + public Set getEffectivePermissions() { + return null; + } + + /** + * + * @param perm + * @return + */ + @Override + public boolean hasPermission(final String perm) { + return true; + } + + /** + * + * @param arg0 + * @return + */ + @Override + public boolean hasPermission(final Permission arg0) { + return true; + } + + /** + * + * @param arg0 + * @return + */ + @Override + public boolean isPermissionSet(final String arg0) { + return true; + } + + /** + * + * @param arg0 + * @return + */ + @Override + public boolean isPermissionSet(final Permission arg0) { + return true; + } + + @Override + public void sendRawMessage(String string) { + plugin.logDebug("sendRawMessage: " + string); + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, String string, boolean bln) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, String string, boolean bln, int i) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, int i) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void removeAttachment(PermissionAttachment pa) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void recalculatePermissions() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public boolean isOp() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void setOp(boolean bln) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public boolean isConversing() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void acceptConversationInput(String string) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public boolean beginConversation(Conversation c) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void abandonConversation(Conversation c) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void abandonConversation(Conversation c, ConversationAbandonedEvent cae) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + +} diff --git a/src/main/java/com/cnaude/purpleirc/IRCMessage.java b/src/main/java/com/cnaude/purpleirc/IRCMessage.java index de4b78d..b6fb9f4 100644 --- a/src/main/java/com/cnaude/purpleirc/IRCMessage.java +++ b/src/main/java/com/cnaude/purpleirc/IRCMessage.java @@ -18,7 +18,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class IRCMessage { diff --git a/src/main/java/com/cnaude/purpleirc/IRCMessageHandler.java b/src/main/java/com/cnaude/purpleirc/IRCMessageHandler.java index f795797..faf6a4f 100644 --- a/src/main/java/com/cnaude/purpleirc/IRCMessageHandler.java +++ b/src/main/java/com/cnaude/purpleirc/IRCMessageHandler.java @@ -32,7 +32,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class IRCMessageHandler { @@ -40,7 +40,7 @@ public class IRCMessageHandler { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public IRCMessageHandler(PurpleIRC plugin) { this.plugin = plugin; @@ -232,8 +232,9 @@ && checkHostMask(ircBot, user, userMasks)) { try { plugin.commandQueue.add(new IRCCommand( new IRCCommandSender(ircBot, target, plugin, ctcpResponse, senderName, outputTemplate), - //new IRCConsoleCommandSender(ircBot, target, plugin, ctcpResponse, senderName), - gameCommand.trim())); + new IRCConsoleCommandSender(ircBot, target, plugin, ctcpResponse, senderName), + gameCommand.trim() + )); } catch (Exception ex) { plugin.logError(ex.getMessage()); } diff --git a/src/main/java/com/cnaude/purpleirc/IRCMessageQueueWatcher.java b/src/main/java/com/cnaude/purpleirc/IRCMessageQueueWatcher.java index 9196795..eddaac3 100644 --- a/src/main/java/com/cnaude/purpleirc/IRCMessageQueueWatcher.java +++ b/src/main/java/com/cnaude/purpleirc/IRCMessageQueueWatcher.java @@ -39,7 +39,7 @@ public class IRCMessageQueueWatcher { /** * - * @param plugin + * @param plugin the PurpleIRC plugin * @param ircBot */ public IRCMessageQueueWatcher(final PurpleBot ircBot, final PurpleIRC plugin) { diff --git a/src/main/java/com/cnaude/purpleirc/LogTailer.java b/src/main/java/com/cnaude/purpleirc/LogTailer.java new file mode 100644 index 0000000..d2049a8 --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/LogTailer.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2014 cnaude + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.cnaude.purpleirc; + +import java.io.File; +import org.apache.commons.io.input.Tailer; +import org.apache.commons.io.input.TailerListener; +import org.apache.commons.io.input.TailerListenerAdapter; + +/** + * + * @author Chris Naude Poll the command queue and dispatch to Bukkit + */ +public class LogTailer { + + private final PurpleIRC plugin; + private final PurpleBot ircBot; + private final String target; + private final boolean ctcp; + private static final int SLEEP = 500; + private final File file; + private Tailer tailer; + private Thread thread; + private TailerListener listener; + + /** + * + * @param plugin the PurpleIRC plugin + * @param ircBot + * @param target + * @param ctcp + * @param fileName + */ + public LogTailer(final PurpleBot ircBot, final PurpleIRC plugin, final String target, final boolean ctcp, final String fileName) { + this.plugin = plugin; + this.ircBot = ircBot; + this.target = target; + this.ctcp = ctcp; + this.file = new File(fileName); + if (file.exists()) { + startWatcher(); + } else { + plugin.logError("No such file: " + fileName); + } + } + + private void startWatcher() { + plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() { + @Override + public void run() { + plugin.logInfo("Tailing file: " + file.getName()); + listener = new MyTailerListener(); + tailer = new Tailer(file, listener, SLEEP); + thread = new Thread(tailer); + thread.setDaemon(true); // optional + thread.start(); + } + }, 0); + } + + public class MyTailerListener extends TailerListenerAdapter { + + @Override + public void handle(String line) { + if (ctcp) { + blockingCTCPMessage(target, line); + } else { + blockingIRCMessage(target, line); + } + } + + } + + private void blockingIRCMessage(final String target, final String message) { + if (!ircBot.isConnected()) { + return; + } + plugin.logDebug("[blockingIRCMessage] About to send IRC message to " + target + ": " + message); + ircBot.bot.sendIRC().message(target, message); + plugin.logDebug("[blockingIRCMessage] Message sent to " + target + ": " + message); + } + + private void blockingCTCPMessage(final String target, final String message) { + if (!ircBot.isConnected()) { + return; + } + plugin.logDebug("[blockingCTCPMessage] About to send IRC message to " + target + ": " + message); + ircBot.bot.sendIRC().ctcpResponse(target, message); + plugin.logDebug("[blockingCTCPMessage] Message sent to " + target + ": " + message); + } + + protected void stopTailer() { + if (tailer != null) { + plugin.logInfo("Stoping tailer."); + tailer.stop(); + } + } + +} diff --git a/src/main/java/com/cnaude/purpleirc/PlayerList.java b/src/main/java/com/cnaude/purpleirc/PlayerList.java index da3047d..d648f85 100644 --- a/src/main/java/com/cnaude/purpleirc/PlayerList.java +++ b/src/main/java/com/cnaude/purpleirc/PlayerList.java @@ -2,7 +2,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class PlayerList { public int count; diff --git a/src/main/java/com/cnaude/purpleirc/PurpleBot.java b/src/main/java/com/cnaude/purpleirc/PurpleBot.java index 9503696..4b659a8 100644 --- a/src/main/java/com/cnaude/purpleirc/PurpleBot.java +++ b/src/main/java/com/cnaude/purpleirc/PurpleBot.java @@ -59,6 +59,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import me.botsko.prism.actionlibs.QueryParameters; import me.botsko.prism.events.BlockStateChange; +import org.apache.commons.io.input.Tailer; import org.bukkit.Achievement; import org.bukkit.ChatColor; import org.bukkit.GameMode; @@ -147,6 +148,7 @@ public final class PurpleBot { public CaseInsensitiveMap heroChannel; public CaseInsensitiveMap townyChannel; public CaseInsensitiveMap> opsList; + public CaseInsensitiveMap> banList; public CaseInsensitiveMap> voicesList; public CaseInsensitiveMap> worldList; public CaseInsensitiveMap> muteList; @@ -187,11 +189,16 @@ public final class PurpleBot { public CaseInsensitiveMap linkRequests; public CaseInsensitiveMap> remotePlayers; public CaseInsensitiveMap> remoteServerInfo; + private LogTailer tailer; + private boolean tailerEnabled; + private String tailerFile; + private String tailerRecipient; + private boolean tailerCtcp; /** * * @param file - * @param plugin + * @param plugin the PurpleIRC plugin */ public PurpleBot(File file, PurpleIRC plugin) { this.rwl = new ReentrantReadWriteLock(); @@ -213,6 +220,7 @@ public PurpleBot(File file, PurpleIRC plugin) { this.muteList = new CaseInsensitiveMap<>(); this.worldList = new CaseInsensitiveMap<>(); this.opsList = new CaseInsensitiveMap<>(); + this.banList = new CaseInsensitiveMap<>(); this.voicesList = new CaseInsensitiveMap<>(); this.heroChannel = new CaseInsensitiveMap<>(); this.townyChannel = new CaseInsensitiveMap<>(); @@ -273,6 +281,9 @@ public void run() { } public void buildBot(boolean reload) { + if (tailer != null) { + tailer.stopTailer(); + } Configuration.Builder configBuilder = new Configuration.Builder() .setName(botNick) .setLogin(botLogin) @@ -352,6 +363,15 @@ public void buildBot(boolean reload) { plugin.logInfo("Auto-connect is disabled. To connect: /irc connect " + bot.getNick()); } plugin.logDebug("Max line length: " + configBuilder.getMaxLineLength()); + if (tailerEnabled && !tailerFile.isEmpty() && !tailerRecipient.isEmpty()) { + tailer = new LogTailer(this, plugin, tailerRecipient, tailerCtcp, tailerFile); + } + } + + protected void stopTailer() { + if (tailer != null) { + tailer.stopTailer(); + } } private void addListeners() { @@ -711,6 +731,7 @@ private boolean loadConfig() { plugin.logDebug("Quit Message => " + quitMessage); botChannels.clear(); opsList.clear(); + banList.clear(); voicesList.clear(); muteList.clear(); enabledMessages.clear(); @@ -774,6 +795,12 @@ private boolean loadConfig() { plugin.logInfo(" No command recipients defined."); } + // load tailer settings + tailerEnabled = config.getBoolean("file-tailer.enabled", false); + tailerFile = config.getString("file-tailer.file", "server.log"); + tailerRecipient = config.getString("file-tailer.recipient", ""); + tailerCtcp = config.getBoolean("file-tailer.ctcp", false); + // build command notify ignore list for (String command : config.getStringList("command-notify.ignore")) { if (!channelCmdNotifyIgnore.contains(command)) { @@ -873,6 +900,19 @@ private boolean loadConfig() { plugin.logInfo("No channel ops defined."); } + // build channel ban list + Collection cBans = new ArrayList<>(); + for (String channelBan : config.getStringList("channels." + enChannelName + ".banlist")) { + if (!cBans.contains(channelBan)) { + cBans.add(channelBan); + } + plugin.logDebug(" Channel Ban => " + channelBan); + } + banList.put(channelName, cBans); + if (banList.isEmpty()) { + plugin.logInfo("No channel bans defined."); + } + // build channel voice list Collection cVoices = new ArrayList<>(); for (String channelVoice : config.getStringList("channels." + enChannelName + ".voices")) { @@ -1564,7 +1604,12 @@ public void gameJoin(Player player, String message) { continue; } } - if (isMessageEnabled(channelName, TemplateName.GAME_JOIN) + if (isMessageEnabled(channelName, TemplateName.GAME_FIRST_JOIN) + && !player.hasPlayedBefore()) { + asyncIRCMessage(channelName, plugin.tokenizer + .gameChatToIRCTokenizer(this, channelName, player, plugin + .getMsgTemplate(botNick, channelName, TemplateName.GAME_FIRST_JOIN), message)); + } else if (isMessageEnabled(channelName, TemplateName.GAME_JOIN) && isPlayerInValidWorld(player, channelName)) { asyncIRCMessage(channelName, plugin.tokenizer .gameChatToIRCTokenizer(this, channelName, player, plugin @@ -1850,6 +1895,24 @@ public void addOp(String channelName, String userMask, CommandSender sender) { saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".ops", opsList.get(channelName)); } + /** + * + * @param channelName + * @param userMask + * @param sender + */ + public void addBan(String channelName, String userMask, CommandSender sender) { + if (banList.get(channelName).contains(userMask)) { + sender.sendMessage("User mask " + ChatColor.WHITE + userMask + + ChatColor.RESET + " is already in the ban list."); + } else { + sender.sendMessage("User mask " + ChatColor.WHITE + userMask + + ChatColor.RESET + " has been added to the ban list."); + banList.get(channelName).add(userMask); + } + saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".ops", opsList.get(channelName)); + } + /** * * @param channelName @@ -1877,7 +1940,7 @@ public void addVoice(String channelName, String userMask, CommandSender sender) public void removeOp(String channelName, String userMask, CommandSender sender) { if (opsList.get(channelName).contains(userMask)) { sender.sendMessage("User mask " + ChatColor.WHITE + userMask - + ChatColor.RESET + " has been removed to the ops list."); + + ChatColor.RESET + " has been removed from the ops list."); opsList.get(channelName).remove(userMask); } else { sender.sendMessage("User mask " + ChatColor.WHITE + userMask @@ -1886,6 +1949,24 @@ public void removeOp(String channelName, String userMask, CommandSender sender) saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".ops", opsList.get(channelName)); } + /** + * + * @param channelName + * @param userMask + * @param sender + */ + public void removeBan(String channelName, String userMask, CommandSender sender) { + if (banList.get(channelName).contains(userMask)) { + sender.sendMessage("User mask " + ChatColor.WHITE + userMask + + ChatColor.RESET + " has been removed from the ban list."); + banList.get(channelName).remove(userMask); + } else { + sender.sendMessage("User mask " + ChatColor.WHITE + userMask + + ChatColor.RESET + " is not in the ban list."); + } + saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".banlist", banList.get(channelName)); + } + /** * * @param channelName @@ -1922,6 +2003,32 @@ public void op(String channelName, String nick) { } } + /** + * + * @param channelName + * @param mask + */ + public void ban(String channelName, String mask) { + Channel channel; + channel = getChannel(channelName); + if (channel != null) { + channel.send().ban(mask); + } + } + + /** + * + * @param channelName + * @param mask + */ + public void unBan(String channelName, String mask) { + Channel channel; + channel = getChannel(channelName); + if (channel != null) { + channel.send().unBan(mask); + } + } + /** * * @param channelName @@ -1994,6 +2101,25 @@ public void kick(String channelName, String nick) { } } + /** + * + * @param channelName + * @param nick + * @param reason + */ + public void kick(String channelName, String nick, String reason) { + Channel channel; + channel = getChannel(channelName); + if (channel != null) { + for (User user : channel.getUsers()) { + if (user.getNick().equals(nick)) { + channel.send().kick(user, reason); + return; + } + } + } + } + private String encodeChannel(String s) { return s.replace(".", "%2E"); } @@ -2367,6 +2493,26 @@ public void opIrcUser(Channel channel, User user) { } } + /** + * + * @param channel + * @param user + */ + public void banIrcUser(Channel channel, User user) { + String channelName = channel.getName(); + if (user.getNick().equals(botNick)) { + return; + } + for (String userMask : banList.get(channelName)) { + if (checkUserMask(user, userMask)) { + plugin.logInfo("Setting +b for " + userMask + " on " + channelName); + ban(channelName, userMask); + kick(channelName, user.getNick(), "Banned"); + break; + } + } + } + /** * * @param channel @@ -3364,7 +3510,7 @@ public void joinNotice(Channel channel, User user) { if (joinNoticeMessage.startsWith("/")) { plugin.commandQueue.add(new IRCCommand( new IRCCommandSender(this, target, plugin, joinNoticeCtcp, "CONSOLE", "%RESULT%"), - // new IRCConsoleCommandSender(this, target, plugin, joinNoticeCtcp, "CONSOLE"), + new IRCConsoleCommandSender(this, target, plugin, joinNoticeCtcp, "CONSOLE"), myMessage.trim().substring(1))); } else if (joinNoticeCtcp) { asyncCTCPMessage(target, myMessage); diff --git a/src/main/java/com/cnaude/purpleirc/PurpleIRC.java b/src/main/java/com/cnaude/purpleirc/PurpleIRC.java index 0027ff0..f8c2f5b 100644 --- a/src/main/java/com/cnaude/purpleirc/PurpleIRC.java +++ b/src/main/java/com/cnaude/purpleirc/PurpleIRC.java @@ -250,7 +250,7 @@ public PurpleIRC() { } /** - * + * Very first method that gets called when starting the plugin. */ @Override public void onEnable() { @@ -320,7 +320,7 @@ public void onEnable() { } /** - * + * Called when plugin is told to stop. */ @Override public void onDisable() { @@ -346,6 +346,7 @@ public void onDisable() { logInfo("Disconnecting IRC bots."); for (PurpleBot ircBot : ircBots.values()) { commandQueue.cancel(); + ircBot.stopTailer(); ircBot.saveConfig(getServer().getConsoleSender()); ircBot.quit(); } @@ -378,7 +379,8 @@ public void debugMode(boolean debug) { } /** - * + * Return the current debug mode status + * * @return */ public boolean debugMode() { @@ -832,10 +834,10 @@ public String getMCPlayers(PurpleBot ircBot, String channelName) { .replace("%COUNT%", Integer.toString(pl.count)) .replace("%MAX%", Integer.toString(pl.max)) .replace("%PLAYERS%", pl.list); - + return colorConverter.gameColorsToIrc(msg); } - + /** * * @param ircBot @@ -844,7 +846,7 @@ public String getMCPlayers(PurpleBot ircBot, String channelName) { */ public PlayerList getMCPlayerList(PurpleBot ircBot, String channelName) { PlayerList pl = new PlayerList(); - + Map playerList = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (Player player : getServer().getOnlinePlayers()) { if (ircBot.hideListWhenVanished.get(channelName)) { @@ -868,15 +870,15 @@ public PlayerList getMCPlayerList(PurpleBot ircBot, String channelName) { // sort without nick prefixes pList = Joiner.on(listSeparator).join(playerList.values()); } - + pl.count = playerList.size(); pl.max = getServer().getMaxPlayers(); pl.list = pList; - + return pl; - + } - + public String getRemotePlayers(String commandArgs) { if (commandArgs != null) { String host; diff --git a/src/main/java/com/cnaude/purpleirc/PurpleTabCompleter.java b/src/main/java/com/cnaude/purpleirc/PurpleTabCompleter.java index 461c201..6b35981 100644 --- a/src/main/java/com/cnaude/purpleirc/PurpleTabCompleter.java +++ b/src/main/java/com/cnaude/purpleirc/PurpleTabCompleter.java @@ -27,7 +27,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class PurpleTabCompleter implements TabCompleter { @@ -35,7 +35,7 @@ public class PurpleTabCompleter implements TabCompleter { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public PurpleTabCompleter(final PurpleIRC plugin) { this.plugin = plugin; @@ -71,11 +71,11 @@ public List onTabComplete(CommandSender cs, Command cmnd, String string, continue; } } - list.add(user.getNick()); + list.add(user.getNick()); + } } } } - } for (Player player : plugin.getServer().getOnlinePlayers()) { if (plugin.vanishHook != null) { if (plugin.vanishHook.isVanished(player)) { diff --git a/src/main/java/com/cnaude/purpleirc/TemplateName.java b/src/main/java/com/cnaude/purpleirc/TemplateName.java index b96fd33..4b0bf07 100644 --- a/src/main/java/com/cnaude/purpleirc/TemplateName.java +++ b/src/main/java/com/cnaude/purpleirc/TemplateName.java @@ -18,7 +18,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class TemplateName { @@ -31,6 +31,7 @@ public class TemplateName { public final static String GAME_SEND = "game-send"; public final static String GAME_DEATH = "game-death"; public final static String GAME_JOIN = "game-join"; + public final static String GAME_FIRST_JOIN = "game-first-join"; public final static String GAME_QUIT = "game-quit"; public final static String GAME_KICK = "game-kick"; public final static String GAME_COMMAND = "game-command"; diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/BotsAndChannels.java b/src/main/java/com/cnaude/purpleirc/Utilities/BotsAndChannels.java index 6a868f5..6cfe986 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/BotsAndChannels.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/BotsAndChannels.java @@ -22,7 +22,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class BotsAndChannels { @@ -31,7 +31,7 @@ public class BotsAndChannels { /** * - * @param plugin + * @param plugin the PurpleIRC plugin * @param sender * @param botName * @param channelName @@ -39,7 +39,7 @@ public class BotsAndChannels { public BotsAndChannels(PurpleIRC plugin, CommandSender sender, String botName, String channelName) { if (plugin.ircBots.containsKey(botName)) { bot.add(botName); - if (plugin.ircBots.get(botName).isValidChannel(channelName)) { + if (plugin.ircBots.get(botName).isValidChannel(channelName)) { channel.add(channelName); } else { sender.sendMessage(plugin.invalidChannelName.replace("%CHANNEL%", channelName)); @@ -51,7 +51,24 @@ public BotsAndChannels(PurpleIRC plugin, CommandSender sender, String botName, S /** * - * @param plugin + * @param plugin the PurpleIRC plugin + * @param sender + * @param botName + */ + public BotsAndChannels(PurpleIRC plugin, CommandSender sender, String botName) { + if (plugin.ircBots.containsKey(botName)) { + bot.add(botName); + for (String channelName : plugin.ircBots.get(botName).botChannels) { + channel.add(channelName); + } + } else { + sender.sendMessage(plugin.invalidBotName.replace("%BOT%", botName)); + } + } + + /** + * + * @param plugin the PurpleIRC plugin * @param sender */ public BotsAndChannels(PurpleIRC plugin, CommandSender sender) { diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/ChatTokenizer.java b/src/main/java/com/cnaude/purpleirc/Utilities/ChatTokenizer.java index 8900f4c..b29ff1e 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/ChatTokenizer.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/ChatTokenizer.java @@ -32,7 +32,7 @@ /** * Main class containing all message template token expanding methods * - * @author cnaude + * @author Chris Naude */ public class ChatTokenizer { @@ -41,7 +41,7 @@ public class ChatTokenizer { /** * Class initializer * - * @param plugin + * @param plugin the PurpleIRC plugin */ public ChatTokenizer(PurpleIRC plugin) { this.plugin = plugin; diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/ColorConverter.java b/src/main/java/com/cnaude/purpleirc/Utilities/ColorConverter.java index a5001d9..982976d 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/ColorConverter.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/ColorConverter.java @@ -26,7 +26,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class ColorConverter { @@ -42,7 +42,7 @@ public class ColorConverter { /** * - * @param plugin + * @param plugin the PurpleIRC plugin * @param stripGameColors * @param stripIRCColors * @param stripIRCBackgroundColors diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/CompatChecker.java b/src/main/java/com/cnaude/purpleirc/Utilities/CompatChecker.java index 9828bda..fc5bd09 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/CompatChecker.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/CompatChecker.java @@ -20,7 +20,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class CompatChecker { public static boolean isCompatible(PurpleIRC plugin) { diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_183.java b/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_183.java index 1bca744..31c28a4 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_183.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_183.java @@ -28,7 +28,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class NetPacket_183 { diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_184_185_186_187_188.java b/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_184_185_186_187_188.java index afe8eec..8f08647 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_184_185_186_187_188.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_184_185_186_187_188.java @@ -28,7 +28,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class NetPacket_184_185_186_187_188 { diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/NetPackets.java b/src/main/java/com/cnaude/purpleirc/Utilities/NetPackets.java index ddbc375..5975301 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/NetPackets.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/NetPackets.java @@ -34,7 +34,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class NetPackets { @@ -44,7 +44,7 @@ public class NetPackets { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public NetPackets(PurpleIRC plugin) { this.plugin = plugin; diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/RegexGlobber.java b/src/main/java/com/cnaude/purpleirc/Utilities/RegexGlobber.java index 7247bd1..c4d80a3 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/RegexGlobber.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/RegexGlobber.java @@ -3,7 +3,7 @@ /** * http://stackoverflow.com/questions/1247772/is-there-an-equivalent-of-java-util-regex-for-glob-type-patterns * - * @author cnaude + * @author Chris Naude */ public class RegexGlobber { diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/UpdateChecker.java b/src/main/java/com/cnaude/purpleirc/Utilities/UpdateChecker.java index b74418c..924c26b 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/UpdateChecker.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/UpdateChecker.java @@ -30,7 +30,7 @@ /** * - * @author cnaude + * @author Chris Naude */ public class UpdateChecker { @@ -44,7 +44,7 @@ public class UpdateChecker { /** * - * @param plugin + * @param plugin the PurpleIRC plugin */ public UpdateChecker(PurpleIRC plugin) { this.plugin = plugin; @@ -68,12 +68,12 @@ public void run() { } }, 0, 432000); } - + public void asyncUpdateCheck(final CommandSender sender, final String mode) { plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() { @Override public void run() { - if (plugin.isUpdateCheckerEnabled()) { + if (plugin.isUpdateCheckerEnabled()) { updateCheck(sender, mode); } } @@ -81,7 +81,37 @@ public void run() { } private void updateCheck(CommandSender sender, String mode) { - if (mode.equalsIgnoreCase("stable")) { + if (plugin.getServer().getVersion().contains("Spigot")) { + try { + URL url = new URL("http://h.cnaude.org:8081/job/PurpleIRC-spigot/lastStableBuild/api/json"); + URLConnection conn = url.openConnection(); + conn.setReadTimeout(5000); + conn.addRequestProperty("User-Agent", "PurpleIRC-spigot Update Checker"); + conn.setDoOutput(true); + final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + final String response = reader.readLine(); + final JSONObject obj = (JSONObject) JSONValue.parse(response); + if (obj.isEmpty()) { + sender.sendMessage(plugin.LOG_HEADER_F + " No files found, or Feed URL is bad."); + return; + } + + newVersion = obj.get("number").toString(); + String downloadUrl = obj.get("url").toString(); + plugin.logDebug("newVersionTitle: " + newVersion); + newBuild = Integer.valueOf(newVersion); + if (newBuild > currentBuild) { + sender.sendMessage(plugin.LOG_HEADER_F + " Latest dev build: " + newVersion + " is out!" + " You are still running build: " + currentVersion); + sender.sendMessage(plugin.LOG_HEADER_F + " Update at: " + downloadUrl); + } else if (currentBuild > newBuild) { + sender.sendMessage(plugin.LOG_HEADER_F + " Dev build: " + newVersion + " | Current build: " + currentVersion); + } else { + sender.sendMessage(plugin.LOG_HEADER_F + " No new version available"); + } + } catch (IOException | NumberFormatException e) { + sender.sendMessage(plugin.LOG_HEADER_F + " Error checking for latest dev build: " + e.getMessage()); + } + } else if (mode.equalsIgnoreCase("stable")) { try { URL url = new URL("https://api.curseforge.com/servermods/files?projectids=56773"); URLConnection conn = url.openConnection(); @@ -91,7 +121,7 @@ private void updateCheck(CommandSender sender, String mode) { final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); final String response = reader.readLine(); final JSONArray array = (JSONArray) JSONValue.parse(response); - if (array.size() == 0) { + if (array.isEmpty()) { plugin.logInfo("No files found, or Feed URL is bad."); return; } @@ -140,6 +170,7 @@ private void updateCheck(CommandSender sender, String mode) { sender.sendMessage(plugin.LOG_HEADER_F + " Error checking for latest dev build: " + e.getMessage()); } } + } public void cancel() { diff --git a/src/main/resources/SampleBot.yml b/src/main/resources/SampleBot.yml index 3959a74..c60c5a9 100644 --- a/src/main/resources/SampleBot.yml +++ b/src/main/resources/SampleBot.yml @@ -66,6 +66,12 @@ command-notify: - example ignore: - /example +# File tailer +file-tailer: + enabled: false + file: 'server.log' + recipient: '#minecraft-test' + ctcp: false # Messaging flood control (game and IRC) flood-control: # Enable or disable flood control diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 67b1d86..7841823 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -100,6 +100,7 @@ message-format: game-death: '[&2%WORLD%&r] %MESSAGE%' game-kick: '[&2%WORLD%&r] %MESSAGE%: %REASON%' game-join: '[&2%WORLD%&r] %NAME% joined the game.' + game-first-join: '[&2%WORLD%&r] %NAME% joined the game for the very first time.' game-quit: '[&2%WORLD%&r] %NAME% left the game.' fake-join: '[&2%WORLD%&r] %NAME% joined the game.' fake-quit: '[&2%WORLD%&r] %NAME% left the game.'