");
defaultMessages.put("command_reply_desc", "&bReply to the person who you private messaged most recently");
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/MultiChat.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/MultiChat.java
index 26ec1890..16465b2d 100644
--- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/MultiChat.java
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/MultiChat.java
@@ -38,11 +38,12 @@
*/
public class MultiChat extends Plugin implements Listener {
- public static final String LATEST_VERSION = "1.6";
+ public static final String LATEST_VERSION = "1.6.1";
public static final String[] ALLOWED_VERSIONS = new String[] {
LATEST_VERSION,
+ "1.6",
"1.5.2",
"1.5.1",
"1.5",
@@ -244,15 +245,22 @@ public void onEnable() {
configversion = configYML.getString("version");
if (Arrays.asList(ALLOWED_VERSIONS).contains(configversion)) {
-
+
// TODO - Remove for future 1.6.X versions!
- if (!configversion.equals(LATEST_VERSION)) {
-
+ if ( !( configversion.equals(LATEST_VERSION) || configversion.equals("1.6") ) ) {
+
getLogger().info("[!!!] [WARNING] YOUR CONFIG FILE IS NOT THE LATEST VERSION");
getLogger().info("[!!!] [WARNING] MULTICHAT 1.6 INTRODUCES SEVERAL NEW FEATURES WHICH ARE NOT IN YOUR OLD FILE");
getLogger().info("[!!!] [WARNING] THE PLUGIN SHOULD WORK WITH THE OLDER FILE, BUT IS NOT SUPPORTED!");
getLogger().info("[!!!] [WARNING] PLEASE BACKUP YOUR OLD CONFIG FILES (config.yml & joinmessages.yml) AND DELETE THEM FROM THE MULTICHAT FOLDER SO NEW ONES CAN BE GENERATED!");
getLogger().info("[!!!] [WARNING] THANK YOU");
+
+ } else if (!configversion.equals(LATEST_VERSION)) {
+
+ getLogger().info("[!!!] [WARNING] YOUR CONFIG FILE IS NOT THE LATEST VERSION");
+ getLogger().info("[!!!] [WARNING] MULTICHAT 1.6.1 HAS SOME NEW FEATURES NOT IN YOUR 1.6 FILE");
+ getLogger().info("[!!!] [WARNING] PLEASE BACKUP YOUR OLD CONFIG FILE (config.yml) AND DELETE FROM THE MULTICHAT FOLDER TO ACCESS THE NEW FEATURES");
+ getLogger().info("[!!!] [WARNING] THANK YOU");
}
@@ -266,6 +274,7 @@ public void onEnable() {
getProxy().registerChannel("multichat:suffix");
getProxy().registerChannel("multichat:nick");
getProxy().registerChannel("multichat:action");
+ getProxy().registerChannel("multichat:paction");
getProxy().getPluginManager().registerListener(this, new BungeeComm());
// Register commands
@@ -326,6 +335,7 @@ public void registerCommands(Configuration configYML, Configuration chatcontrolY
getProxy().getPluginManager().registerCommand(this, CommandManager.getGrouplist());
getProxy().getPluginManager().registerCommand(this, CommandManager.getMultichat());
getProxy().getPluginManager().registerCommand(this, CommandManager.getMultichatBypass());
+ getProxy().getPluginManager().registerCommand(this, CommandManager.getMultiChatExecute());
getProxy().getPluginManager().registerCommand(this, CommandManager.getDisplay());
getProxy().getPluginManager().registerCommand(this, CommandManager.getFreezechat());
getProxy().getPluginManager().registerCommand(this, CommandManager.getHelpme());
@@ -377,6 +387,7 @@ public void unregisterCommands(Configuration configYML, Configuration chatcontro
getProxy().getPluginManager().unregisterCommand(CommandManager.getGrouplist());
getProxy().getPluginManager().unregisterCommand(CommandManager.getMultichat());
getProxy().getPluginManager().unregisterCommand(CommandManager.getMultichatBypass());
+ getProxy().getPluginManager().unregisterCommand(CommandManager.getMultiChatExecute());
getProxy().getPluginManager().unregisterCommand(CommandManager.getDisplay());
getProxy().getPluginManager().unregisterCommand(CommandManager.getFreezechat());
getProxy().getPluginManager().unregisterCommand(CommandManager.getHelpme());
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/StaffChatManager.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/StaffChatManager.java
index 04ebf4ca..8c2fa0ba 100644
--- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/StaffChatManager.java
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/StaffChatManager.java
@@ -8,6 +8,7 @@
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
+import xyz.olivermartin.multichat.bungee.events.PostStaffChatEvent;
/**
* Staff Chat Manager
@@ -53,6 +54,15 @@ public void sendModMessage(String username, String displayname, String server, S
}
}
+ // Trigger PostStaffChatEvent
+ if (username.equalsIgnoreCase("console")) {
+ ProxyServer.getInstance().getPluginManager().callEvent(new PostStaffChatEvent("mod", ProxyServer.getInstance().getConsole() , original));
+ } else {
+ if (ProxyServer.getInstance().getPlayer(username) != null) {
+ ProxyServer.getInstance().getPluginManager().callEvent(new PostStaffChatEvent("mod", ProxyServer.getInstance().getPlayer(username) , original));
+ }
+ }
+
System.out.println("\033[36m[StaffChat] /mc {" + username + "} " + original);
}
@@ -93,6 +103,15 @@ public void sendAdminMessage(String username, String displayname, String server,
}
}
+ // Trigger PostStaffChatEvent
+ if (username.equalsIgnoreCase("console")) {
+ ProxyServer.getInstance().getPluginManager().callEvent(new PostStaffChatEvent("admin", ProxyServer.getInstance().getConsole() , original));
+ } else {
+ if (ProxyServer.getInstance().getPlayer(username) != null) {
+ ProxyServer.getInstance().getPluginManager().callEvent(new PostStaffChatEvent("admin", ProxyServer.getInstance().getPlayer(username) , original));
+ }
+ }
+
System.out.println("\033[35m[StaffChat] /ac {" + username + "} " + original);
}
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/DisplayCommand.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/DisplayCommand.java
index c5ddaea0..d728bad2 100644
--- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/DisplayCommand.java
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/DisplayCommand.java
@@ -8,6 +8,7 @@
import net.md_5.bungee.api.plugin.Command;
import xyz.olivermartin.multichat.bungee.ChatControl;
import xyz.olivermartin.multichat.bungee.MessageManager;
+import xyz.olivermartin.multichat.bungee.events.PostBroadcastEvent;
/**
* Display Command
@@ -50,6 +51,9 @@ public static void displayMessage(String message) {
for (ProxiedPlayer onlineplayer : ProxyServer.getInstance().getPlayers()) {
onlineplayer.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', message)));
}
+
+ // Trigger PostBroadcastEvent
+ ProxyServer.getInstance().getPluginManager().callEvent(new PostBroadcastEvent("display", message));
System.out.println("\033[33m[MultiChat][Display] " + message);
}
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/MsgCommand.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/MsgCommand.java
index d16eef6c..04d84c32 100644
--- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/MsgCommand.java
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/MsgCommand.java
@@ -3,6 +3,7 @@
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
+import java.util.UUID;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
@@ -177,6 +178,59 @@ public void execute(CommandSender sender, String[] args) {
MessageManager.sendMessage(sender, "command_msg_disabled_sender");
}
+ } else if (args[0].equalsIgnoreCase("console")) {
+
+ // New console target stuff here!
+
+ if (ConfigManager.getInstance().getHandler("config.yml").getConfig().getBoolean("fetch_spigot_display_names") == true) {
+
+ BungeeComm.sendMessage(sender.getName(), ((ProxiedPlayer)sender).getServer().getInfo());
+
+ }
+
+ if (!ConfigManager.getInstance().getHandler("config.yml").getConfig().getStringList("no_pm").contains(((ProxiedPlayer)sender).getServer().getInfo().getName())) {
+
+ String messageoutformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmout");
+ String messageinformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmin");
+ String messagespyformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmspy");
+
+ String finalmessage = chatfix.replaceMsgConsoleTargetVars(messageoutformat, message, (ProxiedPlayer)sender);
+ sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ finalmessage = chatfix.replaceMsgConsoleTargetVars(messageinformat, message, (ProxiedPlayer)sender);
+ ProxyServer.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ finalmessage = chatfix.replaceMsgConsoleTargetVars(messagespyformat, message, (ProxiedPlayer)sender);
+ for (ProxiedPlayer onlineplayer : ProxyServer.getInstance().getPlayers()) {
+
+ if ((onlineplayer.hasPermission("multichat.staff.spy"))
+ && (MultiChat.socialspy.contains(onlineplayer.getUniqueId()))
+ && (onlineplayer.getUniqueId() != ((ProxiedPlayer)sender).getUniqueId())
+ && (!(sender.hasPermission("multichat.staff.spy.bypass")))) {
+
+ onlineplayer.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+ }
+
+ }
+
+ if (MultiChat.lastmsg.containsKey(((ProxiedPlayer)sender).getUniqueId())) {
+ MultiChat.lastmsg.remove(((ProxiedPlayer)sender).getUniqueId());
+ }
+
+ MultiChat.lastmsg.put(((ProxiedPlayer)sender).getUniqueId(), new UUID(0L, 0L));
+
+ if (MultiChat.lastmsg.containsKey(new UUID(0L, 0L))) {
+ MultiChat.lastmsg.remove(new UUID(0L, 0L));
+ }
+
+ MultiChat.lastmsg.put(new UUID(0L, 0L), ((ProxiedPlayer)sender).getUniqueId());
+
+ } else {
+ MessageManager.sendMessage(sender, "command_msg_disabled_sender");
+ }
+
+ // End of console target stuff
+
} else {
MessageManager.sendMessage(sender, "command_msg_not_online");
}
@@ -184,7 +238,78 @@ public void execute(CommandSender sender, String[] args) {
chatfix = null;
} else {
- MessageManager.sendMessage(sender, "command_msg_only_players");
+
+ // new console messaging here!
+
+ boolean starter = false;
+ String message = "";
+ for (String arg : args) {
+ if (!starter) {
+ starter = true;
+ } else {
+ message = message + arg + " ";
+ }
+ }
+
+ ChatManipulation chatfix = new ChatManipulation();
+
+ if (ProxyServer.getInstance().getPlayer(args[0]) != null) {
+
+ ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
+
+ if (ConfigManager.getInstance().getHandler("config.yml").getConfig().getBoolean("fetch_spigot_display_names") == true) {
+
+ BungeeComm.sendMessage(target.getName(), target.getServer().getInfo());
+
+ }
+
+ if (!ConfigManager.getInstance().getHandler("config.yml").getConfig().getStringList("no_pm").contains(target.getServer().getInfo().getName())) {
+
+ String messageoutformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmout");
+ String messageinformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmin");
+ String messagespyformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmspy");
+
+ String finalmessage = chatfix.replaceMsgConsoleSenderVars(messageoutformat, message, target);
+ sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ finalmessage = chatfix.replaceMsgConsoleSenderVars(messageinformat, message, target);
+ target.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ finalmessage = chatfix.replaceMsgConsoleSenderVars(messagespyformat, message, target);
+ for (ProxiedPlayer onlineplayer : ProxyServer.getInstance().getPlayers()) {
+
+ if ((onlineplayer.hasPermission("multichat.staff.spy"))
+ && (MultiChat.socialspy.contains(onlineplayer.getUniqueId()))
+ && (onlineplayer.getUniqueId() != target.getUniqueId())
+ && (!(target.hasPermission("multichat.staff.spy.bypass")))) {
+
+ onlineplayer.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+ }
+
+ }
+
+ if (MultiChat.lastmsg.containsKey(new UUID(0L, 0L))) {
+ MultiChat.lastmsg.remove(new UUID(0L, 0L));
+ }
+
+ MultiChat.lastmsg.put(new UUID(0L, 0L), target.getUniqueId());
+
+ if (MultiChat.lastmsg.containsKey(target.getUniqueId())) {
+ MultiChat.lastmsg.remove(target.getUniqueId());
+ }
+
+ MultiChat.lastmsg.put(target.getUniqueId(), new UUID(0L, 0L));
+
+ } else {
+ MessageManager.sendMessage(sender, "command_msg_disabled_target");
+ }
+
+ } else {
+ MessageManager.sendMessage(sender, "command_msg_not_online");
+ }
+
+ chatfix = null;
+
}
}
}
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/MultiChatExecuteCommand.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/MultiChatExecuteCommand.java
new file mode 100644
index 00000000..40db80c1
--- /dev/null
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/MultiChatExecuteCommand.java
@@ -0,0 +1,91 @@
+package xyz.olivermartin.multichat.bungee.commands;
+
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.ProxyServer;
+import net.md_5.bungee.api.config.ServerInfo;
+import net.md_5.bungee.api.connection.ProxiedPlayer;
+import net.md_5.bungee.api.plugin.Command;
+import xyz.olivermartin.multichat.bungee.BungeeComm;
+import xyz.olivermartin.multichat.bungee.ConfigManager;
+import xyz.olivermartin.multichat.bungee.MessageManager;
+
+/**
+ * Execute Command
+ * Used to execute commands remotely on Spigot servers
+ *
+ * @author Oliver Martin (Revilo410)
+ *
+ */
+public class MultiChatExecuteCommand extends Command {
+
+ public MultiChatExecuteCommand() {
+ super("multichatexecute", "multichat.execute", ConfigManager.getInstance().getHandler("config.yml").getConfig().contains("multichatexecutecommand") ? (String[]) ConfigManager.getInstance().getHandler("config.yml").getConfig().getStringList("multichatexecutecommand").toArray(new String[0]) : new String[] {"mcexecute", "mce" ,"gexecute","gexe","gcommand"});
+ }
+
+ public void execute(CommandSender sender, String[] args) {
+
+ if (args.length < 1) {
+
+ MessageManager.sendMessage(sender, "command_execute_usage");
+
+ } else {
+
+ String server = ".*";
+ boolean playerFlag = false;
+ String player = ".*";
+
+ // Handle flags
+ int index = 0;
+
+ while (index < args.length) {
+
+ if (args[index].equalsIgnoreCase("-s")) {
+ if (index+1 < args.length) {
+ server = args[index+1];
+ }
+ } else if (args[index].equalsIgnoreCase("-p")) {
+ if (index+1 < args.length) {
+ playerFlag = true;
+ player = args[index+1];
+ }
+ } else {
+ break;
+ }
+
+ index = index+2;
+
+ }
+
+
+ String message = "";
+ for (String arg : args) {
+ if (index > 0) {
+ index--;
+ } else {
+ message = message + arg + " ";
+ }
+ }
+
+ for (ServerInfo s : ProxyServer.getInstance().getServers().values()) {
+
+ if (s.getName().matches(server)) {
+
+ if (playerFlag) {
+ for (ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) {
+ if (p.getName().matches(player)) {
+ BungeeComm.sendPlayerCommandMessage(message, player, s);
+ }
+ }
+ } else {
+ BungeeComm.sendCommandMessage(message, s);
+ }
+ }
+
+ }
+
+ MessageManager.sendMessage(sender, "command_execute_sent");
+
+ }
+ }
+
+}
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/ReplyCommand.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/ReplyCommand.java
index 56ca1fbd..a7f29e75 100644
--- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/ReplyCommand.java
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/commands/ReplyCommand.java
@@ -48,7 +48,7 @@ public void execute(CommandSender sender, String[] args) {
MessageManager.sendMessage(sender, "mute_cannot_send_message");
return;
}
-
+
if (ChatControl.handleSpam(((ProxiedPlayer)sender), message, "private_messages")) {
return;
}
@@ -125,6 +125,54 @@ public void execute(CommandSender sender, String[] args) {
MessageManager.sendMessage(sender, "command_msg_disabled_sender");
}
+ } else if ( MultiChat.lastmsg.get( ((ProxiedPlayer)sender ).getUniqueId()).equals(new UUID(0L, 0L)) ) {
+
+ // Console target stuff
+
+ if (!ConfigManager.getInstance().getHandler("config.yml").getConfig().getStringList("no_pm").contains(((ProxiedPlayer)sender).getServer().getInfo().getName())) {
+
+ String messageoutformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmout");
+ String messageinformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmin");
+ String messagespyformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmspy");
+
+ String finalmessage = chatfix.replaceMsgConsoleTargetVars(messageoutformat, message, (ProxiedPlayer)sender);
+ sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ finalmessage = chatfix.replaceMsgConsoleTargetVars(messageinformat, message, (ProxiedPlayer)sender);
+ ProxyServer.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ finalmessage = chatfix.replaceMsgConsoleTargetVars(messagespyformat, message, (ProxiedPlayer)sender);
+
+ for (ProxiedPlayer onlineplayer : ProxyServer.getInstance().getPlayers()) {
+
+ if ((onlineplayer.hasPermission("multichat.staff.spy"))
+ && (MultiChat.socialspy.contains(onlineplayer.getUniqueId()))
+ && (onlineplayer.getUniqueId() != ((ProxiedPlayer)sender).getUniqueId())) {
+
+ onlineplayer.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ }
+
+ }
+
+ if (MultiChat.lastmsg.containsKey(((ProxiedPlayer)sender).getUniqueId())) {
+ MultiChat.lastmsg.remove(((ProxiedPlayer)sender).getUniqueId());
+ }
+
+ MultiChat.lastmsg.put(((ProxiedPlayer)sender).getUniqueId(), new UUID(0L, 0L));
+
+ if (MultiChat.lastmsg.containsKey(new UUID(0L, 0L))) {
+ MultiChat.lastmsg.remove(new UUID(0L, 0L));
+ }
+
+ MultiChat.lastmsg.put(new UUID(0L, 0L), ((ProxiedPlayer)sender).getUniqueId());
+
+ } else {
+ MessageManager.sendMessage(sender, "command_msg_disabled_sender");
+ }
+
+ // End console target stuff
+
} else {
MessageManager.sendMessage(sender, "command_reply_no_one_to_reply_to");
}
@@ -136,7 +184,76 @@ public void execute(CommandSender sender, String[] args) {
chatfix = null;
} else {
- MessageManager.sendMessage(sender, "command_reply_only_players");
+
+ // New console reply
+
+ String message = "";
+ for (String arg : args) {
+ message = message + arg + " ";
+ }
+
+ ChatManipulation chatfix = new ChatManipulation();
+
+ if (MultiChat.lastmsg.containsKey(new UUID(0L,0L))) {
+
+ if (ProxyServer.getInstance().getPlayer((UUID)MultiChat.lastmsg.get((new UUID(0L,0L)))) != null) {
+
+ ProxiedPlayer target = ProxyServer.getInstance().getPlayer((UUID)MultiChat.lastmsg.get((new UUID(0L,0L))));
+
+ if (!ConfigManager.getInstance().getHandler("config.yml").getConfig().getStringList("no_pm").contains(target.getServer().getInfo().getName())) {
+
+ String messageoutformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmout");
+ String messageinformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmin");
+ String messagespyformat = ConfigManager.getInstance().getHandler("config.yml").getConfig().getString("pmspy");
+
+ String finalmessage = chatfix.replaceMsgConsoleSenderVars(messageoutformat, message, target);
+ sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ finalmessage = chatfix.replaceMsgConsoleSenderVars(messageinformat, message, target);
+ target.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ finalmessage = chatfix.replaceMsgConsoleSenderVars(messagespyformat, message, target);
+
+ for (ProxiedPlayer onlineplayer : ProxyServer.getInstance().getPlayers()) {
+
+ if ((onlineplayer.hasPermission("multichat.staff.spy"))
+ && (MultiChat.socialspy.contains(onlineplayer.getUniqueId()))
+ && (onlineplayer.getUniqueId() != target.getUniqueId())) {
+
+ onlineplayer.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', finalmessage)));
+
+ }
+
+ }
+
+ if (MultiChat.lastmsg.containsKey(new UUID(0L,0L))) {
+ MultiChat.lastmsg.remove(new UUID(0L,0L));
+ }
+
+ MultiChat.lastmsg.put(new UUID(0L,0L), target.getUniqueId());
+
+ if (MultiChat.lastmsg.containsKey(target.getUniqueId())) {
+ MultiChat.lastmsg.remove(target.getUniqueId());
+ }
+
+ MultiChat.lastmsg.put(target.getUniqueId(), new UUID(0L,0L));
+
+ } else {
+ MessageManager.sendMessage(sender, "command_msg_disabled_target");
+ }
+
+ } else {
+ MessageManager.sendMessage(sender, "command_reply_no_one_to_reply_to");
+ }
+
+ } else {
+ MessageManager.sendMessage(sender, "command_reply_no_one_to_reply_to");
+ }
+
+ chatfix = null;
+
+ // End new console stuff
+
}
}
}
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/events/PostBroadcastEvent.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/events/PostBroadcastEvent.java
new file mode 100644
index 00000000..1df6f339
--- /dev/null
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/events/PostBroadcastEvent.java
@@ -0,0 +1,98 @@
+package xyz.olivermartin.multichat.bungee.events;
+
+import java.util.regex.Pattern;
+
+import net.md_5.bungee.api.plugin.Cancellable;
+import net.md_5.bungee.api.plugin.Event;
+
+/**
+ * An event that triggers AFTER a broadcast message has been sent via MultiChat
+ *
+ * @author Oliver Martin (Revilo410)
+ *
+ */
+public class PostBroadcastEvent extends Event implements Cancellable {
+
+ private boolean cancelled;
+ private String message; // The actual message that was broadcast
+ private String type; // The type of broadcast
+
+ /**
+ * Trigger a new PostBroadcastEvent
+ *
+ * @param type "cast", "display", "bulletin" or "announcement" depending on the type of broadcast
+ * @param message The message that was broadcast
+ */
+ public PostBroadcastEvent(String type, String message) {
+
+ cancelled = false;
+ this.message = message;
+ this.type = type;
+
+ }
+
+ /**
+ * @return "cast", "display", "bulletin" or "announcement" depending on the type of broadcast
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @return The message that was broadcast including format codes in the '&' notation
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * Allows you to change the message in this PostBroadcastEvent ONLY
+ * THIS WILL HAVE NO AFFECT ON WHAT MESSAGE MULTICHAT BROADCASTS!
+ * This is a POST broadcast event, meaning the broadcast has already happened by the time this event triggers.
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ /**
+ * @return The message that was broadcast EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawMessage() {
+ return stripAllFormattingCodes(message);
+ }
+
+ /**
+ * Returns true if this post broadcast event has been cancelled
+ * THIS WILL HAVE NO AFFECT ON WHAT MESSAGE MULTICHAT BROADCASTS!
+ * This is a POST broadcast event, meaning the broadcast has already happened by the time this event triggers.
+ */
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ /**
+ * Allows you to cancel this PostBroadcastEvent
+ * THIS WILL HAVE NO AFFECT ON WHAT MESSAGE MULTICHAT BROADCASTS!
+ * This is a POST broadcast event, meaning the broadcast has already happened by the time this event triggers.
+ */
+ @Override
+ public void setCancelled(boolean cancel) {
+ cancelled = cancel;
+ }
+
+ // Remove all formatting codes from the text (&a, &l etc.)
+ private static String stripAllFormattingCodes(String input) {
+
+ char COLOR_CHAR = '&';
+ Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)" + String.valueOf(COLOR_CHAR) + "[0-9A-FK-OR]");
+
+ if (input == null) {
+ return null;
+ }
+
+ return STRIP_COLOR_PATTERN.matcher(input).replaceAll("");
+
+ }
+
+}
\ No newline at end of file
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/events/PostGlobalChatEvent.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/events/PostGlobalChatEvent.java
new file mode 100644
index 00000000..a5a3fed7
--- /dev/null
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/events/PostGlobalChatEvent.java
@@ -0,0 +1,241 @@
+package xyz.olivermartin.multichat.bungee.events;
+
+import java.util.Optional;
+import java.util.regex.Pattern;
+
+import net.md_5.bungee.api.connection.ProxiedPlayer;
+import net.md_5.bungee.api.plugin.Cancellable;
+import net.md_5.bungee.api.plugin.Event;
+import xyz.olivermartin.multichat.bungee.MultiChat;
+import xyz.olivermartin.multichat.bungee.PlayerMeta;
+import xyz.olivermartin.multichat.bungee.PlayerMetaManager;
+
+/**
+ * An event that triggers AFTER a global chat message has been sent via MultiChat
+ *
+ * @author Oliver Martin (Revilo410)
+ *
+ */
+public class PostGlobalChatEvent extends Event implements Cancellable {
+
+ private boolean cancelled;
+ private String message; // The message that was sent in global chat
+ private String format; // The global chat format that was used
+ private ProxiedPlayer sender; // The sender of the message
+
+ /**
+ * Trigger a new PostGlobalChatEvent
+ *
+ * @param sender The sender of the message
+ * @param format The format used to send the message
+ * @param message The message that was sent
+ */
+ public PostGlobalChatEvent(ProxiedPlayer sender, String format, String message) {
+
+ cancelled = false;
+ this.message = message;
+ this.sender = sender;
+ this.format = format;
+
+ }
+
+ /**
+ * @return The player who sent the message
+ */
+ public ProxiedPlayer getSender() {
+ return sender;
+ }
+
+ /**
+ * @return The message that was sent including any format codes in the '&' notation
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * @return The message that was sent EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawMessage() {
+ return stripAllFormattingCodes(getMessage());
+ }
+
+ /**
+ * Allows you to change the message in this PostGlobalChatEvent ONLY
+ * THIS WILL HAVE NO AFFECT ON WHAT MESSAGE MULTICHAT SENDS!
+ * This is a POST global chat event, meaning the chat message has already happened by the time this event triggers.
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ /**
+ * Returns the format that was used to send this message on the network
+ * (i.e. The bit that appears before the actual message)
+ *
+ * %NICK% -> Nickname
+ * %NAME% -> Name
+ * %DISPLAYNAME% -> DisplayName
+ * %PREFIX% -> Prefix
+ * %SUFFIX% -> Suffix
+ * %SERVER% -> Server
+ * %MODE% -> Chat Mode
+ * %M% -> Short Chat Mode
+ *
+ * @return The format MultiChat used to send this message
+ */
+ public String getFormat() {
+ return format;
+ }
+
+ /**
+ * @return The display name of the sender including any format codes in the '&' notation
+ */
+ public String getSenderDisplayName() {
+ return sender.getDisplayName();
+ }
+
+ /**
+ * @return The display name of the sender EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawSenderDisplayName() {
+ return stripAllFormattingCodes(getSenderDisplayName());
+ }
+
+ /**
+ * @return The prefix of the sender including any format codes in the '&' notation
+ */
+ public String getSenderPrefix() {
+ Optional opm = PlayerMetaManager.getInstance().getPlayer(sender.getUniqueId());
+ if (opm.isPresent()) {
+ return opm.get().prefix;
+ } else {
+ return "";
+ }
+ }
+
+ /**
+ * @return The prefix of the sender EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawSenderPrefix() {
+ return stripAllFormattingCodes(getSenderPrefix());
+ }
+
+ /**
+ * @return The suffix of the sender including any format codes in the '&' notation
+ */
+ public String getSenderSuffix() {
+ Optional opm = PlayerMetaManager.getInstance().getPlayer(sender.getUniqueId());
+ if (opm.isPresent()) {
+ return opm.get().suffix;
+ } else {
+ return "";
+ }
+ }
+
+ /**
+ * @return The suffix of the sender EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawSenderSuffix() {
+ return stripAllFormattingCodes(getSenderSuffix());
+ }
+
+ /**
+ * @return The username of the sender
+ */
+ public String getSenderName() {
+ return sender.getName();
+ }
+
+ /**
+ * @return The nickname of the sender including any format codes in the '&' notation
+ */
+ public String getSenderNickname() {
+ Optional opm = PlayerMetaManager.getInstance().getPlayer(sender.getUniqueId());
+ if (opm.isPresent()) {
+ return opm.get().nick;
+ } else {
+ return "";
+ }
+ }
+
+ /**
+ * @return The nickname of the sender EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawSenderNickname() {
+ return stripAllFormattingCodes(getSenderNickname());
+ }
+
+ /**
+ * @return The server name of the sender
+ */
+ public String getSenderServer() {
+ return sender.getServer().getInfo().getName();
+ }
+
+ /**
+ * Returns "Local" if the player is in local mode and only seeing chat from players on the same server
+ * Returns "Global" if the player is in global mode and seeing chat from everyone
+ */
+ public String getSenderChatMode() {
+ if (MultiChat.globalplayers.get(sender.getUniqueId()).equals(false)) {
+ return "Local";
+ } else {
+ return "Global";
+ }
+ }
+
+ /**
+ * Returns "L" if the player is in local mode and only seeing chat from players on the same server
+ * Returns "G" if the player is in global mode and seeing chat from everyone
+ */
+ public String getSenderShortChatMode() {
+ if (MultiChat.globalplayers.get(sender.getUniqueId()).equals(false)) {
+ return "L";
+ } else {
+ return "G";
+ }
+ }
+
+ /**
+ * Returns true if the player has the MultiChat permission to use format codes in global chat
+ */
+ public boolean hasColorChatPermission() {
+ return ( sender.hasPermission("multichat.chat.color") || sender.hasPermission("multichat.chat.colour") );
+ }
+
+ /**
+ * Returns true if this PostGlobalChatEvent has been cancelled
+ * THIS WILL HAVE NO AFFECT ON WHAT MESSAGE MULTICHAT SENDS!
+ * This is a POST global chat event, meaning the message has already happened by the time this event triggers.
+ */
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ /**
+ * Allows you to cancel this PostGlobalChatEvent
+ * THIS WILL HAVE NO AFFECT ON WHAT MESSAGE MULTICHAT SENDS!
+ * This is a POST global chat event, meaning the message has already happened by the time this event triggers.
+ */
+ @Override
+ public void setCancelled(boolean cancel) {
+ cancelled = cancel;
+ }
+
+ // Remove all formatting codes from the text (&a, &l etc.)
+ private static String stripAllFormattingCodes(String input) {
+
+ char COLOR_CHAR = '&';
+ Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)" + String.valueOf(COLOR_CHAR) + "[0-9A-FK-OR]");
+
+ if (input == null) {
+ return null;
+ }
+
+ return STRIP_COLOR_PATTERN.matcher(input).replaceAll("");
+
+ }
+
+}
\ No newline at end of file
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/events/PostStaffChatEvent.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/events/PostStaffChatEvent.java
new file mode 100644
index 00000000..9339798d
--- /dev/null
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/events/PostStaffChatEvent.java
@@ -0,0 +1,238 @@
+package xyz.olivermartin.multichat.bungee.events;
+
+import java.util.Optional;
+import java.util.regex.Pattern;
+
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.connection.ProxiedPlayer;
+import net.md_5.bungee.api.plugin.Cancellable;
+import net.md_5.bungee.api.plugin.Event;
+import xyz.olivermartin.multichat.bungee.PlayerMeta;
+import xyz.olivermartin.multichat.bungee.PlayerMetaManager;
+
+/**
+ * An event that triggers AFTER a staff chat message has been sent via MultiChat
+ *
+ * @author Oliver Martin (Revilo410)
+ *
+ */
+public class PostStaffChatEvent extends Event implements Cancellable {
+
+ private boolean cancelled;
+ private String message; // The message that was sent
+ private CommandSender sender; // The sender of the message
+ private String type; // The type of staff chat, currently "mod" or "admin"
+
+ /**
+ * Trigger a new PostStaffChatEvent
+ *
+ * @param type The type of staff chat, currently "mod" or "admin"
+ * @param sender The sender of the command, could be a player or the console
+ * @param message The message that was sent
+ */
+ public PostStaffChatEvent(String type, CommandSender sender, String message) {
+
+ cancelled = false;
+ this.message = message;
+ this.sender = sender;
+ this.type = type;
+
+ }
+
+ /**
+ * @return "mod" or "admin" depending on the type of staff chat
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @return The sender of the message, could be a player or the console
+ */
+ public CommandSender getSender() {
+ return sender;
+ }
+
+ /**
+ * @return The message that was sent including any format codes in the '&' notation
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * @return The message that was sent EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawMessage() {
+ return stripAllFormattingCodes(getMessage());
+ }
+
+ /**
+ * Allows you to change the message in this PostStaffChatEvent ONLY
+ * THIS WILL HAVE NO AFFECT ON WHAT MESSAGE MULTICHAT SENDS!
+ * This is a POST staff chat event, meaning the chat message has already happened by the time this event triggers.
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ /**
+ * @return The display name of the sender including any format codes in the '&' notation
+ */
+ public String getSenderDisplayName() {
+ if (sender instanceof ProxiedPlayer) return ((ProxiedPlayer) sender).getDisplayName();
+ return "CONSOLE";
+ }
+
+ /**
+ * @return The display name of the sender EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawSenderDisplayName() {
+ return stripAllFormattingCodes(getSenderDisplayName());
+ }
+
+ /**
+ * @return The prefix of the sender including any format codes in the '&' notation
+ */
+ public String getSenderPrefix() {
+
+ if (sender instanceof ProxiedPlayer) {
+
+ ProxiedPlayer player = (ProxiedPlayer) sender;
+
+ Optional opm = PlayerMetaManager.getInstance().getPlayer(player.getUniqueId());
+ if (opm.isPresent()) {
+ return opm.get().prefix;
+ } else {
+ return "";
+ }
+
+ } else {
+ return "";
+ }
+ }
+
+ /**
+ * @return The prefix of the sender EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawSenderPrefix() {
+ return stripAllFormattingCodes(getSenderPrefix());
+ }
+
+ /**
+ * @return The suffix of the sender including any format codes in the '&' notation
+ */
+ public String getSenderSuffix() {
+ if (sender instanceof ProxiedPlayer) {
+
+ ProxiedPlayer player = (ProxiedPlayer) sender;
+
+ Optional opm = PlayerMetaManager.getInstance().getPlayer(player.getUniqueId());
+ if (opm.isPresent()) {
+ return opm.get().suffix;
+ } else {
+ return "";
+ }
+
+ } else {
+ return "";
+ }
+ }
+
+ /**
+ * @return The suffix of the sender EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawSenderSuffix() {
+ return stripAllFormattingCodes(getSenderSuffix());
+ }
+
+ /**
+ * @return The username of the sender
+ */
+ public String getSenderName() {
+ if (sender instanceof ProxiedPlayer) {
+
+ return sender.getName();
+
+ } else {
+ return "CONSOLE";
+ }
+ }
+
+ /**
+ * @return The nickname of the sender including any format codes in the '&' notation
+ */
+ public String getSenderNickname() {
+ if (sender instanceof ProxiedPlayer) {
+
+ ProxiedPlayer player = (ProxiedPlayer) sender;
+
+ Optional opm = PlayerMetaManager.getInstance().getPlayer(player.getUniqueId());
+ if (opm.isPresent()) {
+ return opm.get().nick;
+ } else {
+ return "";
+ }
+
+ } else {
+ return "CONSOLE";
+ }
+ }
+
+ /**
+ * @return The nickname of the sender EXCLUDING any format codes in the '&' notation
+ */
+ public String getRawSenderNickname() {
+ return stripAllFormattingCodes(getSenderNickname());
+ }
+
+ /**
+ * @return The server name of the sender
+ */
+ public String getSenderServer() {
+ if (sender instanceof ProxiedPlayer) {
+
+ ProxiedPlayer player = (ProxiedPlayer) sender;
+
+ return player.getServer().getInfo().getName();
+
+ } else {
+ return "CONSOLE";
+ }
+ }
+
+ /**
+ * Returns true if this PostStaffChatEvent has been cancelled
+ * THIS WILL HAVE NO AFFECT ON WHAT MESSAGE MULTICHAT SENDS!
+ * This is a POST staff chat event, meaning the message has already happened by the time this event triggers.
+ */
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ /**
+ * Allows you to cancel this PostStaffChatEvent
+ * THIS WILL HAVE NO AFFECT ON WHAT MESSAGE MULTICHAT SENDS!
+ * This is a POST staff chat event, meaning the message has already happened by the time this event triggers.
+ */
+ @Override
+ public void setCancelled(boolean cancel) {
+ cancelled = cancel;
+ }
+
+ // Remove all formatting codes from the text (&a, &l etc.)
+ private static String stripAllFormattingCodes(String input) {
+
+ char COLOR_CHAR = '&';
+ Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)" + String.valueOf(COLOR_CHAR) + "[0-9A-FK-OR]");
+
+ if (input == null) {
+ return null;
+ }
+
+ return STRIP_COLOR_PATTERN.matcher(input).replaceAll("");
+
+ }
+
+}
\ No newline at end of file
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/spigotbridge/NameManager.java b/multichat/src/main/java/xyz/olivermartin/multichat/spigotbridge/NameManager.java
index 816338d0..0d7a2a98 100644
--- a/multichat/src/main/java/xyz/olivermartin/multichat/spigotbridge/NameManager.java
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/spigotbridge/NameManager.java
@@ -7,9 +7,11 @@
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.Set;
import java.util.UUID;
import java.util.regex.Pattern;
@@ -161,7 +163,7 @@ public Optional getUUIDFromName(String username) {
public Optional getUUIDFromNickname(String nickname) {
nickname = nickname.toLowerCase();
- nickname = stripFormat(nickname);
+ nickname = stripAllFormattingCodes(nickname);
return getUUIDFromUnformattedNickname(nickname);
@@ -318,7 +320,7 @@ public void setNickname(UUID uuid, String nickname) {
removeNickname(uuid);
}
- String unformattedNickname = stripFormat(nickname.toLowerCase());
+ String unformattedNickname = stripAllFormattingCodes(nickname.toLowerCase());
synchronized (mapNickUUID) {
@@ -350,7 +352,52 @@ public boolean existsPlayer(String username) {
* @return If this nickname is currently in use
*/
public boolean existsNickname(String nickname) {
- return mapNickUUID.containsKey(stripFormat(nickname.toLowerCase()));
+ return mapNickUUID.containsKey(stripAllFormattingCodes(nickname.toLowerCase()));
+ }
+
+ /**
+ * Return the UUIDs of players who have nicknames containing characters provided in the nickname argument
+ * @param nickname The characters of the nickname to check
+ * @return An optional which might contain a players UUID if a partial match was found
+ */
+ public Optional> getPartialNicknameMatches(String nickname) {
+
+ Set nickSet = mapNickUUID.keySet();
+ nickname = stripAllFormattingCodes(nickname.toLowerCase());
+ Set uuidSet = new HashSet();
+
+ for (String nick : nickSet) {
+
+ if (nick.startsWith(nickname)) {
+ uuidSet.add(mapNickUUID.get(nick));
+ }
+
+ }
+
+ if (!uuidSet.isEmpty()) return Optional.of(uuidSet);
+
+ for (String nick : nickSet) {
+
+ if (nick.contains(nickname)) {
+ uuidSet.add(mapNickUUID.get(nick));
+ }
+
+ }
+
+ if (!uuidSet.isEmpty()) return Optional.of(uuidSet);
+
+ for (String nick : nickSet) {
+
+ if (nick.matches(nickname)) {
+ uuidSet.add(mapNickUUID.get(nick));
+ }
+
+ }
+
+ if (!uuidSet.isEmpty()) return Optional.of(uuidSet);
+
+ return Optional.empty();
+
}
/**
@@ -548,7 +595,7 @@ public void loadNicknameData(FileInputStream saveFile) {
/*
* Remove all colour / format codes from a string (using the '&' char)
*/
- public String stripFormat(String input) {
+ public String stripAllFormattingCodes(String input) {
char COLOR_CHAR = '&';
Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)" + String.valueOf(COLOR_CHAR) + "[0-9A-FK-OR]");
@@ -561,6 +608,40 @@ public String stripFormat(String input) {
}
+ /**
+ * @param input
+ * @return True if the input contains colour codes (e.g. '&a')
+ */
+ public boolean containsColorCodes(String input) {
+
+ char COLOR_CHAR = '&';
+ Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)" + String.valueOf(COLOR_CHAR) + "[0-9A-F]");
+
+ if (input == null) {
+ return false;
+ }
+
+ return !STRIP_COLOR_PATTERN.matcher(input).replaceAll("").equals(input);
+
+ }
+
+ /**
+ * @param input
+ * @return True if the input contains format codes (e.g. '&l')
+ */
+ public boolean containsFormatCodes(String input) {
+
+ char COLOR_CHAR = '&';
+ Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)" + String.valueOf(COLOR_CHAR) + "[K-OR]");
+
+ if (input == null) {
+ return false;
+ }
+
+ return !STRIP_COLOR_PATTERN.matcher(input).replaceAll("").equals(input);
+
+ }
+
/*
* EVENT LISTENERS
*/
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/spigotbridge/SpigotComm.java b/multichat/src/main/java/xyz/olivermartin/multichat/spigotbridge/SpigotComm.java
index 17a4f71f..c154f4f5 100644
--- a/multichat/src/main/java/xyz/olivermartin/multichat/spigotbridge/SpigotComm.java
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/spigotbridge/SpigotComm.java
@@ -12,6 +12,7 @@
import java.io.ObjectInputStream;
import java.util.HashMap;
import java.util.Optional;
+import java.util.Set;
import java.util.UUID;
import java.util.regex.Pattern;
@@ -48,7 +49,7 @@ public class SpigotComm extends JavaPlugin implements PluginMessageListener, Lis
private static final String nameDataFile = "namedata.dat";
private static File legacyNicknameFile;
- private static final Pattern simpleNickname = Pattern.compile("^[a-zA-Z0-9_]+$");
+ private static final Pattern simpleNickname = Pattern.compile("^[a-zA-Z0-9&_]+$");
private static boolean setDisplayNameLastVal = false;
private static String displayNameFormatLastVal = "%PREFIX%%NICK%%SUFFIX%";
@@ -160,6 +161,7 @@ public void onEnable() {
getServer().getMessenger().registerOutgoingPluginChannel(this, "multichat:nick");
getServer().getMessenger().registerIncomingPluginChannel(this, "multichat:comm", this);
getServer().getMessenger().registerIncomingPluginChannel(this, "multichat:action", this);
+ getServer().getMessenger().registerIncomingPluginChannel(this, "multichat:paction", this);
getServer().getPluginManager().registerEvents(this, this);
getServer().getPluginManager().registerEvents(NameManager.getInstance(), this);
@@ -268,9 +270,9 @@ public void onPluginMessageReceived(String channel, Player player, byte[] bytes)
String displayNameFormat = "";
String playername = in.readUTF();
Player bukkitPlayer;
-
+
bukkitPlayer = Bukkit.getPlayer(playername);
-
+
if (bukkitPlayer == null) {
return;
}
@@ -311,6 +313,30 @@ public void onPluginMessageReceived(String channel, Player player, byte[] bytes)
System.out.println("[MultiChat] [BRIDGE] Failed to contact bungeecord");
e.printStackTrace();
+ }
+ } else if (channel.equals("multichat:paction")) {
+
+ ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
+ DataInputStream in = new DataInputStream(stream);
+
+ try {
+
+ String playerRegex = in.readUTF();
+ String command = in.readUTF();
+
+ for (Player p : getServer().getOnlinePlayers()) {
+
+ if (p.getName().matches(playerRegex)) {
+ getServer().dispatchCommand(p, command);
+ }
+
+ }
+
+ } catch (IOException e) {
+
+ System.out.println("[MultiChat] [BRIDGE] Failed to contact bungeecord");
+ e.printStackTrace();
+
}
}
}
@@ -370,18 +396,22 @@ public boolean onCommand(CommandSender commandSender, Command cmd, String label,
return true;
}
- if (!simpleNickname.matcher(args[0]).matches()) {
-
- if (!sender.hasPermission("multichatbridge.nick.format")) {
-
- sender.sendMessage(ChatColor.DARK_RED + "You do not have permission to use nicknames with special characters!");
- return true;
+ if (NameManager.getInstance().containsColorCodes(args[0]) && !(sender.hasPermission("multichatbridge.nick.color") || sender.hasPermission("multichatbridge.nick.colour"))) {
+ sender.sendMessage(ChatColor.DARK_RED + "You do not have permission to use nicknames with color codes!");
+ return true;
+ }
- }
+ if (NameManager.getInstance().containsFormatCodes(args[0]) && !(sender.hasPermission("multichatbridge.nick.format"))) {
+ sender.sendMessage(ChatColor.DARK_RED + "You do not have permission to use nicknames with format codes!");
+ return true;
+ }
+ if (!simpleNickname.matcher(args[0]).matches() && !(sender.hasPermission("multichatbridge.nick.special"))) {
+ sender.sendMessage(ChatColor.DARK_RED + "You do not have permission to use nicknames with special characters!");
+ return true;
}
-
- if (NameManager.getInstance().stripFormat(args[0]).length() > 20 && !sender.hasPermission("multichatbridge.nick.anylength")) {
+
+ if (NameManager.getInstance().stripAllFormattingCodes(args[0]).length() > 20 && !sender.hasPermission("multichatbridge.nick.anylength")) {
sender.sendMessage(ChatColor.DARK_RED + "Sorry your nickname is too long, max 20 characters! (Excluding format codes)");
return true;
@@ -421,14 +451,25 @@ public boolean onCommand(CommandSender commandSender, Command cmd, String label,
return true;
}
- if (!simpleNickname.matcher(args[1]).matches()) {
+ if (NameManager.getInstance().containsColorCodes(args[1]) && !(sender.hasPermission("multichatbridge.nick.color") || sender.hasPermission("multichatbridge.nick.colour"))) {
+ sender.sendMessage(ChatColor.DARK_RED + "You do not have permission to use nicknames with color codes!");
+ return true;
+ }
- if (!sender.hasPermission("multichatbridge.nick.format")) {
+ if (NameManager.getInstance().containsFormatCodes(args[1]) && !(sender.hasPermission("multichatbridge.nick.format"))) {
+ sender.sendMessage(ChatColor.DARK_RED + "You do not have permission to use nicknames with format codes!");
+ return true;
+ }
- sender.sendMessage(ChatColor.DARK_RED + "You do not have permission to give nicknames with special characters!");
- return true;
+ if (!simpleNickname.matcher(args[1]).matches() && !(sender.hasPermission("multichatbridge.nick.special"))) {
+ sender.sendMessage(ChatColor.DARK_RED + "You do not have permission to use nicknames with special characters!");
+ return true;
+ }
- }
+ if (NameManager.getInstance().stripAllFormattingCodes(args[1]).length() > 20 && !sender.hasPermission("multichatbridge.nick.anylength")) {
+
+ sender.sendMessage(ChatColor.DARK_RED + "Sorry your nickname is too long, max 20 characters! (Excluding format codes)");
+ return true;
}
@@ -472,6 +513,37 @@ public boolean onCommand(CommandSender commandSender, Command cmd, String label,
return true;
+ } else if (sender.hasPermission("multichatbridge.realname.partial")) {
+
+ Optional> matches = NameManager.getInstance().getPartialNicknameMatches(args[0]);
+
+ if (matches.isPresent()) {
+
+ int limit = 10;
+
+ sender.sendMessage(ChatColor.DARK_AQUA + "No one could be found with the exact nickname: " + args[0]);
+ sender.sendMessage(ChatColor.AQUA + "The following were found as partial matches:");
+
+ for (UUID uuid : matches.get()) {
+
+ if (limit > 0 || sender.hasPermission("multichatbridge.realname.nolimit")) {
+ sender.sendMessage(ChatColor.GREEN + "Nickname: '" + NameManager.getInstance().getCurrentName(uuid) + "' Belongs to player: '" + NameManager.getInstance().getName(uuid) + "'");
+ limit--;
+ } else {
+ sender.sendMessage(ChatColor.DARK_GREEN + "Only the first 10 results have been shown, please try a more specific query!");
+ break;
+ }
+
+ }
+
+ } else {
+
+ sender.sendMessage(ChatColor.DARK_RED + "No one could be found with nickname: " + args[0]);
+
+ }
+
+ return true;
+
} else {
sender.sendMessage(ChatColor.DARK_RED + "No one could be found with nickname: " + args[0]);
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/spongebridge/BungeePlayerCommandListener.java b/multichat/src/main/java/xyz/olivermartin/multichat/spongebridge/BungeePlayerCommandListener.java
new file mode 100644
index 00000000..38b3f5e1
--- /dev/null
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/spongebridge/BungeePlayerCommandListener.java
@@ -0,0 +1,39 @@
+package xyz.olivermartin.multichat.spongebridge;
+
+import org.spongepowered.api.Platform;
+import org.spongepowered.api.Sponge;
+import org.spongepowered.api.entity.living.player.Player;
+import org.spongepowered.api.network.ChannelBuf;
+import org.spongepowered.api.network.RawDataListener;
+import org.spongepowered.api.network.RemoteConnection;
+
+/**
+ * Used to execute player specific commands sent from MultiChat on bungeecord
+ *
+ * @author Oliver Martin (Revilo410)
+ *
+ */
+public class BungeePlayerCommandListener implements RawDataListener {
+
+ public BungeePlayerCommandListener() {
+ super();
+ }
+
+ @Override
+ public void handlePayload(ChannelBuf data, RemoteConnection connection, Platform.Type side) {
+
+ String playerRegex = data.getUTF(0);
+ String command = data.getUTF(0);
+
+ for (Player p : Sponge.getServer().getOnlinePlayers()) {
+
+ if (p.getName().matches(playerRegex)) {
+
+ Sponge.getCommandManager().process(p, command);
+
+ }
+
+ }
+
+ }
+}
diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/spongebridge/SpongeComm.java b/multichat/src/main/java/xyz/olivermartin/multichat/spongebridge/SpongeComm.java
index 6524bf65..dcb72b05 100644
--- a/multichat/src/main/java/xyz/olivermartin/multichat/spongebridge/SpongeComm.java
+++ b/multichat/src/main/java/xyz/olivermartin/multichat/spongebridge/SpongeComm.java
@@ -43,12 +43,13 @@
* @author Oliver Martin (Revilo410)
*
*/
-@Plugin(id = "multichat", name = "MultiChat Sponge", version = "1.6")
+@Plugin(id = "multichat", name = "MultiChat Sponge", version = "1.6.1")
public final class SpongeComm implements CommandExecutor {
ChannelRegistrar channelRegistrar;
RawDataChannel channel;
RawDataChannel actionChannel;
+ RawDataChannel playerActionChannel;
static RawDataChannel prefixChannel;
static RawDataChannel suffixChannel;
static RawDataChannel nickChannel;
@@ -113,13 +114,16 @@ public void onServerStart(GameStartedServerEvent event) {
channelRegistrar = Sponge.getGame().getChannelRegistrar();
ChannelBinding.RawDataChannel channel = Sponge.getGame().getChannelRegistrar().createRawChannel(this, "multichat:comm");
ChannelBinding.RawDataChannel actionChannel = Sponge.getGame().getChannelRegistrar().createRawChannel(this, "multichat:action");
+ ChannelBinding.RawDataChannel playerActionChannel = Sponge.getGame().getChannelRegistrar().createRawChannel(this, "multichat:paction");
ChannelBinding.RawDataChannel prefixChannel = Sponge.getGame().getChannelRegistrar().createRawChannel(this, "multichat:prefix");
ChannelBinding.RawDataChannel suffixChannel = Sponge.getGame().getChannelRegistrar().createRawChannel(this, "multichat:suffix");
ChannelBinding.RawDataChannel nickChannel = Sponge.getGame().getChannelRegistrar().createRawChannel(this, "multichat:nick");
channel.addListener(Platform.Type.SERVER, new MetaListener(channel));
actionChannel.addListener(Platform.Type.SERVER, new BungeeCommandListener());
+ playerActionChannel.addListener(Platform.Type.SERVER, new BungeePlayerCommandListener());
this.channel = channel;
this.actionChannel = actionChannel;
+ this.playerActionChannel = playerActionChannel;
SpongeComm.prefixChannel = prefixChannel;
SpongeComm.suffixChannel = suffixChannel;
SpongeComm.nickChannel = nickChannel;
@@ -189,14 +193,14 @@ public static void updatePlayerMeta(String playername, boolean setDisplayName, S
if (player.getOption("prefix").isPresent()) {
prefix = player.getOption("prefix").get();
}
-
+
final String fPrefix = prefix;
prefixChannel.sendTo(player,buffer -> buffer.writeUTF(player.getUniqueId().toString()).writeUTF(fPrefix));
if (player.getOption("suffix").isPresent()) {
suffix = player.getOption("suffix").get();
}
-
+
final String fSuffix = suffix;
suffixChannel.sendTo(player,buffer -> buffer.writeUTF(player.getUniqueId().toString()).writeUTF(fSuffix));
diff --git a/multichat/src/main/resources/bungee.yml b/multichat/src/main/resources/bungee.yml
index 9e7ea8a3..b0d0c2e2 100644
--- a/multichat/src/main/resources/bungee.yml
+++ b/multichat/src/main/resources/bungee.yml
@@ -1,5 +1,5 @@
name: MultiChat
main: xyz.olivermartin.multichat.bungee.MultiChat
-version: 1.6
+version: 1.6.1
author: Revilo410
api-version: 1.13
\ No newline at end of file
diff --git a/multichat/src/main/resources/chatcontrol.yml b/multichat/src/main/resources/chatcontrol.yml
index a62906ef..5ad69754 100644
--- a/multichat/src/main/resources/chatcontrol.yml
+++ b/multichat/src/main/resources/chatcontrol.yml
@@ -6,10 +6,10 @@
# By Revilo410
-################
-# DON'T EDIT #
-version: "1.6" #
-################
+##################
+# DON'T EDIT #
+version: "1.6.1" #
+##################
# 1. Chat Control Rules
# 2. Mute and Ignore Settings
diff --git a/multichat/src/main/resources/config.yml b/multichat/src/main/resources/config.yml
index 4c93e398..11dfe6dd 100644
--- a/multichat/src/main/resources/config.yml
+++ b/multichat/src/main/resources/config.yml
@@ -6,10 +6,10 @@
# By Revilo410
-################
-# DON'T EDIT #
-version: "1.6" #
-################
+##################
+# DON'T EDIT #
+version: "1.6.1" #
+##################
# 1. General
# 2. Private Messaging
@@ -219,3 +219,11 @@ staff_list: true
multichatbypasscommand:
- mcb
- bypass
+
+# MultiChat execute command aliases (other than /multichatexecute)
+multichatexecutecommand:
+- mcexecute
+- mce
+- gexecute
+- gexe
+- gcommand
diff --git a/multichat/src/main/resources/joinmessages.yml b/multichat/src/main/resources/joinmessages.yml
index 69a95358..a5764e3f 100644
--- a/multichat/src/main/resources/joinmessages.yml
+++ b/multichat/src/main/resources/joinmessages.yml
@@ -6,10 +6,10 @@
# By Revilo410
-################
-# DON'T EDIT #
-version: "1.6" #
-################
+##################
+# DON'T EDIT #
+version: "1.6.1" #
+##################
############################################################
# +------------------------------------------------------+ #
diff --git a/multichat/src/main/resources/messages.yml b/multichat/src/main/resources/messages.yml
index 077ca7d2..1973607b 100644
--- a/multichat/src/main/resources/messages.yml
+++ b/multichat/src/main/resources/messages.yml
@@ -6,10 +6,10 @@
# By Revilo410
-################
-# DON'T EDIT #
-version: "1.6" #
-################
+##################
+# DON'T EDIT #
+version: "1.6.1" #
+##################
############################################################
# +------------------------------------------------------+ #
@@ -227,6 +227,13 @@ command_multichatbypass_usage: |
command_multichatbypass_enabled: "&aMultiChat BYPASS Enabled"
command_multichatbypass_disabled: "&bMultiChat BYPASS Disabled"
+command_execute_usage: |
+ &2Usage: /mce [-s ] [-p ]
+ &a&oThis command allows you to execute a command over all your spigot servers (&lwhich have at least one player online!&a&o)
+ By default the command will be executed by console, you can instead make players execute the command using the -p flag.
+ By default the command will be executed on all servers, you can limit which servers using the -s flag.
+command_execute_sent: "&2The command has been sent"
+
command_reply_usage: "&bUsage: /r "
command_reply_desc: "&bReply to the person who you private messaged most recently"
command_reply_no_one_to_reply_to: "&cYou have no one to reply to!"
diff --git a/multichat/src/main/resources/plugin.yml b/multichat/src/main/resources/plugin.yml
index 733a8ec2..632b7eeb 100644
--- a/multichat/src/main/resources/plugin.yml
+++ b/multichat/src/main/resources/plugin.yml
@@ -1,5 +1,5 @@
name: MultiChatBridge
-version: 1.6
+version: 1.6.1
author: Revilo410
main: xyz.olivermartin.multichat.spigotbridge.SpigotComm
softdepend: [Vault]