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: |
+ /