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.'