diff --git a/external/Permissions-3.1.6.jar b/external/Permissions-3.1.6.jar new file mode 100644 index 0000000..31c3e5d Binary files /dev/null and b/external/Permissions-3.1.6.jar differ diff --git a/pom.xml b/pom.xml index f7a3aa8..ba5dc59 100644 --- a/pom.xml +++ b/pom.xml @@ -251,8 +251,7 @@ org.pircbotx pircbotx - 1.7-SNAPSHOT - compile + 1.6 net.sf.trove4j @@ -260,5 +259,12 @@ 3.0.1 compile + + com.nijiko.permissions + permissions + system + 3.1.6 + ${project.basedir}\external\Permissions-3.1.6.jar + diff --git a/src/main/java/hef/IRCTransport/IRCTransport.java b/src/main/java/hef/IRCTransport/IRCTransport.java index ead3f5b..71f0d2e 100644 --- a/src/main/java/hef/IRCTransport/IRCTransport.java +++ b/src/main/java/hef/IRCTransport/IRCTransport.java @@ -1,10 +1,17 @@ package hef.IRCTransport; +import com.nijiko.permissions.PermissionHandler; +import com.nijikokun.bukkit.Permissions.Permissions; + +import org.bukkit.Server; +import org.bukkit.plugin.Plugin; import gnu.trove.map.hash.TIntObjectHashMap; import gnu.trove.procedure.TIntObjectProcedure; import java.io.File; import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -14,15 +21,36 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import org.pircbotx.PircBotX; + +import com.nijiko.permissions.PermissionHandler; /** * IRCTransport for Bukkit. */ public class IRCTransport extends JavaPlugin { + public static PermissionHandler permissionHandler; + private void setupPermissions() { + if (permissionHandler != null) { + return; + } + + Plugin permissionsPlugin = this.getServer().getPluginManager().getPlugin("Permissions"); + + if (permissionsPlugin == null) { + LOG.log(Level.INFO, "Permission system not detected, defaulting to OP"); + return; + } + + permissionHandler = ((Permissions) permissionsPlugin).getHandler(); + LOG.log(Level.INFO, "Found and will use plugin "+((Permissions)permissionsPlugin).getDescription().getFullName()); + } + /** The logging obect. Used internal to write to the console. */ private static final Logger LOG = Logger.getLogger("Minecraft"); /** MC Player to IRCAgent map. */ @@ -85,6 +113,7 @@ public void onDisable() { TIntObjectProcedure shutdown = new ShutdownProcedure(); bots.forEachEntry(shutdown); bots.clear(); + LOG.log(Level.INFO, this.getDescription().getFullName() + " is disabled"); } @@ -95,6 +124,8 @@ public void onDisable() { */ @Override public void onEnable() { + setupPermissions(); + this.playerListener = new IRCTransportPlayerListener(this); listener = new IrcListener(this); this.entityListener = new IRCTransportEntityListener(this); @@ -144,6 +175,7 @@ public void onEnable() { getCommand("me").setExecutor(commandExecutor); getCommand("topic").setExecutor(commandExecutor); getCommand("whois").setExecutor(commandExecutor); + getCommand("irc_listbots").setExecutor(commandExecutor); LOG.log(Level.INFO, pdfFile.getFullName() + " is enabled!"); } diff --git a/src/main/java/hef/IRCTransport/IRCTransportCommandExecutor.java b/src/main/java/hef/IRCTransport/IRCTransportCommandExecutor.java index 317ab29..5e6d65d 100644 --- a/src/main/java/hef/IRCTransport/IRCTransportCommandExecutor.java +++ b/src/main/java/hef/IRCTransport/IRCTransportCommandExecutor.java @@ -70,6 +70,9 @@ public boolean onCommand(final CommandSender sender, final Command command, fina return topic(bot, args); } else if (commandName.equals("whois")) { return whois(bot, args); + } else if (commandName.equals("irc_listbots")) { + log.info(plugin.getBots().toString()); + return true; } return false; } diff --git a/src/main/java/hef/IRCTransport/IRCTransportPlayerListener.java b/src/main/java/hef/IRCTransport/IRCTransportPlayerListener.java index 3ecd8f2..ccd6a2c 100644 --- a/src/main/java/hef/IRCTransport/IRCTransportPlayerListener.java +++ b/src/main/java/hef/IRCTransport/IRCTransportPlayerListener.java @@ -43,6 +43,15 @@ public void onPlayerChat(final PlayerChatEvent event) { @Override public void onPlayerJoin(final PlayerJoinEvent event) { Player player = event.getPlayer(); + + for (final int x : bots.keys()) + { + IrcAgent current = bots.get(x); + if (current.getPlayer().getName().equals(player.getName())) + current.shutdown(); + current.getPlayer().getName(); + } + int playerID = player.getEntityId(); IrcAgent agent = new IrcAgent(plugin, player); agent.getListenerManager().addListener(plugin.getListener()); diff --git a/src/main/java/hef/IRCTransport/IrcAgent.java b/src/main/java/hef/IRCTransport/IrcAgent.java index 6e71b80..b18bc51 100644 --- a/src/main/java/hef/IRCTransport/IrcAgent.java +++ b/src/main/java/hef/IRCTransport/IrcAgent.java @@ -1,4 +1,7 @@ package hef.IRCTransport; +import com.nijiko.permissions.PermissionHandler; +import com.nijikokun.bukkit.Permissions.Permissions; +import org.bukkit.plugin.Plugin; import java.io.IOException; import java.util.HashSet; @@ -60,7 +63,12 @@ public IrcAgent(final IRCTransport instance, final Player bukkitPlayer) { setSettings(new AgentSettings(player)); String prefix = plugin.getConfig().getString("default.prefix", ""); String suffix = plugin.getConfig().getString("default.suffix", ""); - getSettings().setIrcNick(String.format("%s%s%s", prefix, player.getName(), suffix)); + int ircnicksize = plugin.getConfig().getInt("server.nicksize", 15); + String nick = String.format("%s%s%s", prefix, player.getName(), suffix); + if (nick.length() > ircnicksize) + nick = nick.substring(0, ircnicksize); + getSettings().setIrcNick(nick); + } else { String format = "Player '%s' using persistent IRC nick '%s'"; String name = player.getName(); @@ -88,12 +96,12 @@ public void connect() throws IOException, IrcException { } //setup WEBIRC - setWebIrcAddress(this.getPlayer().getAddress().getAddress()); - setWebIrcHostname(player.getAddress().getHostName()); - String webIrcPassword = getPlugin().getConfig().getString("server.webirc_password"); - if (webIrcPassword != null) { - this.setWebIrcPassword(webIrcPassword); - } + //setWebIrcAddress(this.getPlayer().getAddress().getAddress()); + //setWebIrcHostname(player.getAddress().getHostName()); + //String webIrcPassword = getPlugin().getConfig().getString("server.webirc_password"); + //if (webIrcPassword != null) { + // this.setWebIrcPassword(webIrcPassword); + //} if (!isConnected()) { if (getServer() == null) { @@ -102,6 +110,7 @@ public void connect() throws IOException, IrcException { reconnect(); } } + this.joinChannel(plugin.getConfig().getString("autojoin")); } /** @@ -180,8 +189,13 @@ protected void saveSettings() { * @param action The content of the action. */ public void sendAction(final String action) { - sendAction(activeChannel, action); - getPlayer().sendMessage(String.format("[%s] * %s %s", activeChannel.getName(), getPlayer().getDisplayName(), action)); + String actiontr = action; + String trans = plugin.getConfig().getString("translations." + action, ""); + if (! trans.equals("")) { + actiontr = trans; + } + sendAction(activeChannel, actiontr); + getPlayer().sendMessage(String.format("* %s %s", /*activeChannel.getName(),*/ getPlayer().getDisplayName(), actiontr)); } /** @@ -191,8 +205,16 @@ public void sendAction(final String action) { public void sendMessage(final String message) { sendMessage(activeChannel, message); if (isConnected()) { - String msg = String.format("[%s] %s: %s", activeChannel.getName(), getPlayer().getDisplayName(), message); - getPlayer().sendMessage(msg); + String formattedMessage = plugin.getConfig().getString("messages.chat-ingame"); + String group = IRCTransport.permissionHandler.getGroup(player.getWorld().getName(), player.getName()); + String prefix = IRCTransport.permissionHandler.getGroupRawPrefix(player.getWorld().getName(), group); + String suffix = IRCTransport.permissionHandler.getGroupRawSuffix(player.getWorld().getName(), group); + formattedMessage = formattedMessage.replace("${GROUP}", group); + formattedMessage = formattedMessage.replace("${PREFIX}", prefix); + formattedMessage = formattedMessage.replace("${SUFFIX}", suffix); + formattedMessage = formattedMessage.replace("${NICK}", getPlayer().getDisplayName()); + formattedMessage = formattedMessage.replace("${MESSAGE}", message); + getPlayer().sendMessage(formattedMessage.replace("&", "\u00A7")); } } @@ -234,8 +256,11 @@ protected void setTopic(final String topic) { * Initiate agent shutdown Disconnects the agent, sets shutting down flag. */ public void shutdown() { - shuttingDown = true; - disconnect(); + if (isConnected() && shuttingDown == false) + { + shuttingDown = true; + disconnect(); + } } /** Request active topic. */ diff --git a/src/main/java/hef/IRCTransport/IrcListener.java b/src/main/java/hef/IRCTransport/IrcListener.java index 2a6d279..af549d9 100644 --- a/src/main/java/hef/IRCTransport/IrcListener.java +++ b/src/main/java/hef/IRCTransport/IrcListener.java @@ -58,11 +58,11 @@ public IrcListener(final IRCTransport parentPlugin) { */ @Override public void onAction(final ActionEvent event) { - String format = "[%s] * %s %s"; + String format = plugin.getConfig().getString("messages.action"); String channel = event.getChannel().getName(); String user = event.getUser().getNick(); String action = event.getAction(); - String message = String.format(format, channel, user, action); + String message = format.replace("${CHANNEL}", channel).replace("${NICK}", user).replace("${ACTION}", action); event.getBot().getPlayer().sendMessage(message); } @@ -86,7 +86,6 @@ public void onConnect(final ConnectEvent event) { boolean bSuppressNames = plugin.getConfig().getBoolean("suppress.initial_userlist", false); boolean bSuppressTopic = plugin.getConfig().getBoolean("suppress.initial_topic", false); List channelData = plugin.getConfig().getList("default.channels"); - for (Object i : channelData) { if (i instanceof LinkedHashMap) { LinkedHashMap linkedHashMapI = (LinkedHashMap) i; @@ -134,11 +133,11 @@ public void onJoin(final JoinEvent event) { if (event.getUser().equals(event.getBot().getUserBot())) { event.getBot().setActiveChannel(event.getChannel()); } - String format = "[%s] %s has joined."; + String format = plugin.getConfig().getString("messages.join"); String channel = event.getChannel().getName(); String user = event.getUser().getNick(); - String message = String.format(format, channel, user); - event.getBot().getPlayer().sendMessage(ChatColor.YELLOW + message); + String message = format.replace("${CHANNEL}", channel).replace("${NICK}", user); + event.getBot().getPlayer().sendMessage(message.replace("&", "\u00A7")); } /** @@ -147,13 +146,13 @@ public void onJoin(final JoinEvent event) { */ @Override public void onKick(final KickEvent event) { - String format = "[%s] %s kicked by %s: %s"; + String format = plugin.getConfig().getString("messages.kick"); String channel = event.getChannel().getName(); String recipient = event.getRecipient().getNick(); String source = event.getSource().getNick(); String reason = event.getReason(); - String message = String.format(format, channel, recipient, source, reason); - event.getBot().getPlayer().sendMessage(ChatColor.YELLOW + message); + String message = format.replace("${NICK}", recipient).replace("${SOURCE}", source).replace("${REASON}", reason).replace("${CHANNEL}", channel); + event.getBot().getPlayer().sendMessage(message.replace("&", "\u00A7")); } /** @@ -162,12 +161,40 @@ public void onKick(final KickEvent event) { */ @Override public void onMessage(final MessageEvent event) { - String format = "[%s] %s: %s"; + String formattedMessage = plugin.getConfig().getString("messages.chat-irc"); + + int len = plugin.getServer().getOnlinePlayers().length; String channel = event.getChannel().getName(); String sender = event.getUser().getNick(); + + for (int p = 0; p < len; p++) + { + Player player = plugin.getServer().getOnlinePlayers()[p]; + if (event.getUser().getLogin().equals(String.format("~%s", player.getEntityId()))) + sender = player.getDisplayName(); + } + + //Player player = null; + for (int p = 0; p < len; p++) + { + Player player = plugin.getServer().getOnlinePlayers()[p]; + if (player.getName().equals(sender)) + { + formattedMessage = plugin.getConfig().getString("messages.chat-ingame"); + String group = plugin.permissionHandler.getGroup(player.getWorld().getName(), player.getDisplayName()); + formattedMessage = formattedMessage.replace("${GROUP}", group); + String prefix = IRCTransport.permissionHandler.getGroupRawPrefix(player.getWorld().getName(), group); + formattedMessage = formattedMessage.replace("${PREFIX}", prefix); + String suffix = IRCTransport.permissionHandler.getGroupRawSuffix(player.getWorld().getName(), group); + formattedMessage = formattedMessage.replace("${SUFFIX}", suffix); + } + } + String message = ColorMap.fromIrc(event.getMessage()); - String formattedMessage = String.format(format, channel, sender, message); - event.getBot().getPlayer().sendMessage(formattedMessage); + formattedMessage = formattedMessage.replace("${CHANNEL}", channel); + formattedMessage = formattedMessage.replace("${NICK}", sender); + formattedMessage = formattedMessage.replace("${MESSAGE}", message); + event.getBot().getPlayer().sendMessage(formattedMessage.replace("&", "\u00A7")); log.info(formattedMessage); } @@ -184,11 +211,11 @@ public void onNickChange(final NickChangeEvent event) { event.getBot().getSettings().setIrcNick(event.getNewNick()); event.getBot().saveSettings(); } - String format = "%s is now known as %s"; + String format = plugin.getConfig().getString("messages.rename"); String oldNick = event.getOldNick(); String newNick = event.getNewNick(); - String message = String.format(format, oldNick, newNick); - event.getBot().getPlayer().sendMessage(ChatColor.YELLOW + message); + String message = format.replace("${NICK}", oldNick).replace("${NEWNICK}", newNick); + event.getBot().getPlayer().sendMessage(message.replace("&", "\u00A7")); } /** @@ -197,11 +224,11 @@ public void onNickChange(final NickChangeEvent event) { */ @Override public void onPart(final PartEvent event) { - String format = "[%s] %s has parted."; + String format = plugin.getConfig().getString("messages.part"); String channel = event.getChannel().getName(); String user = event.getUser().getNick(); - String message = String.format(format, channel, user); - event.getBot().getPlayer().sendMessage(ChatColor.YELLOW + message); + String message = format.replace("${USER}", user).replace("${CHAN}", channel); + event.getBot().getPlayer().sendMessage(message.replace("&", "\u00A7")); } /** @@ -210,11 +237,11 @@ public void onPart(final PartEvent event) { */ @Override public void onPrivateMessage(final PrivateMessageEvent event) { - String format = "%s: %s"; + String format = plugin.getConfig().getString("messages.private"); String user = event.getUser().getNick(); String text = event.getMessage(); - String message = String.format(format, user, text); - event.getBot().getPlayer().sendMessage(ChatColor.LIGHT_PURPLE + message); + String message = format.replace("${NICK}", user).replace("${MESSAGE}", text); + event.getBot().getPlayer().sendMessage(message.replace("&", "\u00A7")); } /** @@ -224,11 +251,11 @@ public void onPrivateMessage(final PrivateMessageEvent event) { */ @Override public void onQuit(final QuitEvent event) { - String format = "%s has quit: %s"; + String format = plugin.getConfig().getString("messages.quit"); String user = event.getUser().getNick(); String reason = event.getReason(); - String message = String.format(format, user, reason); - event.getBot().getPlayer().sendMessage(ChatColor.YELLOW + message); + String message = format.replace("${NICK}", user).replace("${REASON}", reason); + event.getBot().getPlayer().sendMessage(message.replace("&", "\u00A7")); } /** @@ -266,7 +293,7 @@ public void onUnknown(final UnknownEvent event) { protected void onErrorMessage(final Event event, final String channel, final String errorMessage) { String format = "[%s] %s"; String message = String.format(format, channel, errorMessage); - event.getBot().getPlayer().sendMessage(ChatColor.YELLOW + message); + event.getBot().getPlayer().sendMessage(message.replace("&", "\u00A7")); } /** @@ -284,13 +311,9 @@ public void onTopic(final TopicEvent event) { if (event.getBot().getSuppressTopic().contains(event.getChannel())) { event.getBot().getSuppressTopic().remove(event.getChannel()); - } else if (event.isChanged()) { - format = ChatColor.YELLOW + "[%s] Topic changed: %s"; - String formattedMessage = String.format(format, channel, topic); - player.sendMessage(formattedMessage); } else { - format = ChatColor.YELLOW + String.format("[%s] Topic: %s"); - String formattedMessage = String.format(format, channel, topic); + format = plugin.getConfig().getString("messages.topic"); + String formattedMessage = format.replace("${CHANNEL}", channel).replace("${TOPIC}", topic); player.sendMessage(formattedMessage); } } @@ -307,13 +330,13 @@ public void onUserList(final UserListEvent event) { } else { StringBuilder usersString = new StringBuilder(); for (User user : event.getUsers()) { - usersString.append(user.toString()); + usersString.append(user.getNick()); usersString.append(" "); } - String format = "%s members: %s"; + String format = plugin.getConfig().getString("messages.list"); String channel = event.getChannel().getName(); - String message = String.format(format, channel, usersString.toString()); - event.getBot().getPlayer().sendMessage(ChatColor.YELLOW + message); + String message = format.replace("${LIST}", usersString.toString()).replace("${CHANNEL}", channel); + event.getBot().getPlayer().sendMessage(message.replace("&", "\u00A7")); } } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 317015a..a746fb3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -8,8 +8,24 @@ server: password: ssl: false webirc_password: + nicksize: 16 default: prefix: suffix: channels: - channel: '#minecraft' +autojoin: '#minecraft' +messages: + chat-ingame: '[${PREFIX}${GROUP}${SUFFIX}&f] ${NICK}: ${MESSAGE}' + chat-irc: '[${CHANNEL}] ${NICK}: ${MESSAGE}' + quit: '${NICK} left' + private: '${NICK}: ${MESSAGE}' + part: '${NICK} left' + rename: ${OLDNICK} is now ${NEWNICK} + kick: '${NICK} kicked by ${OP}: ${REASON}' + join: '${NICK} joined' + list: 'On IRC: ${LIST}' + topic: '[${CHANNEL}] Topic: ${TOPIC}' + action: '* ${NICK} ${ACTION}' +translations: + hit the ground too hard: hit the ground \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 9e098a3..709ad84 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -58,3 +58,7 @@ commands: usage: | / [nick] / Sam + irc_listbots: + description: List bots + usage: | + /