diff --git a/multichat/pom.xml b/multichat/pom.xml index b1c4ede8..eae0a21d 100644 --- a/multichat/pom.xml +++ b/multichat/pom.xml @@ -4,7 +4,7 @@ xyz.olivermartin.multichat multichat - 1.6 + 1.6.1 diff --git a/multichat/releases/1.6.1/multichat-1.6.1-dev1.jar b/multichat/releases/1.6.1/multichat-1.6.1-dev1.jar new file mode 100644 index 00000000..eff6a00e Binary files /dev/null and b/multichat/releases/1.6.1/multichat-1.6.1-dev1.jar differ diff --git a/multichat/releases/1.6.1/multichat-1.6.1-dev2.jar b/multichat/releases/1.6.1/multichat-1.6.1-dev2.jar new file mode 100644 index 00000000..8b492db1 Binary files /dev/null and b/multichat/releases/1.6.1/multichat-1.6.1-dev2.jar differ diff --git a/multichat/releases/1.6.1/multichat-1.6.1-dev3.jar b/multichat/releases/1.6.1/multichat-1.6.1-dev3.jar new file mode 100644 index 00000000..c0ecfdd1 Binary files /dev/null and b/multichat/releases/1.6.1/multichat-1.6.1-dev3.jar differ diff --git a/multichat/releases/1.6.1/multichat-1.6.1-pre1.jar b/multichat/releases/1.6.1/multichat-1.6.1-pre1.jar new file mode 100644 index 00000000..6d3d06fa Binary files /dev/null and b/multichat/releases/1.6.1/multichat-1.6.1-pre1.jar differ diff --git a/multichat/releases/1.6.1/multichat-1.6.1-pre2.jar b/multichat/releases/1.6.1/multichat-1.6.1-pre2.jar new file mode 100644 index 00000000..a9d8badc Binary files /dev/null and b/multichat/releases/1.6.1/multichat-1.6.1-pre2.jar differ diff --git a/multichat/releases/1.6.1/multichat-1.6.1-pre3.jar b/multichat/releases/1.6.1/multichat-1.6.1-pre3.jar new file mode 100644 index 00000000..8b4f2da4 Binary files /dev/null and b/multichat/releases/1.6.1/multichat-1.6.1-pre3.jar differ diff --git a/multichat/releases/1.6.1/multichat-1.6.1-pre4.jar b/multichat/releases/1.6.1/multichat-1.6.1-pre4.jar new file mode 100644 index 00000000..e1115fa6 Binary files /dev/null and b/multichat/releases/1.6.1/multichat-1.6.1-pre4.jar differ diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/Announcements.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/Announcements.java index 6ceb1fd5..89486d18 100644 --- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/Announcements.java +++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/Announcements.java @@ -9,6 +9,7 @@ import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.scheduler.ScheduledTask; +import xyz.olivermartin.multichat.bungee.events.PostBroadcastEvent; /** * Announcements Management @@ -33,12 +34,15 @@ public static boolean startAnnouncement(final String name, Integer minutes) { @Override public void run() { String message = announcements.get(name.toLowerCase()); - + message = ChatControl.applyChatRules(message, "announcements", "").get(); for (ProxiedPlayer onlineplayer : ProxyServer.getInstance().getPlayers()) { onlineplayer.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&',message))); } + + // Trigger PostBroadcastEvent + ProxyServer.getInstance().getPluginManager().callEvent(new PostBroadcastEvent("announcement", message)); } }, 0, minutes, TimeUnit.MINUTES); @@ -124,12 +128,15 @@ public static void playAnnouncement(String name) { if (announcements.containsKey(name.toLowerCase())) { String message = announcements.get(name.toLowerCase()); - + message = ChatControl.applyChatRules(message, "announcements", "").get(); for (ProxiedPlayer onlineplayer : ProxyServer.getInstance().getPlayers()) { onlineplayer.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&',message))); } + + // Trigger PostBroadcastEvent + ProxyServer.getInstance().getPluginManager().callEvent(new PostBroadcastEvent("announcement", message)); } } diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/Bulletins.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/Bulletins.java index be6e5950..7dc37405 100644 --- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/Bulletins.java +++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/Bulletins.java @@ -9,6 +9,7 @@ import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.scheduler.ScheduledTask; +import xyz.olivermartin.multichat.bungee.events.PostBroadcastEvent; /** * Bulletins Management @@ -106,12 +107,15 @@ public void run() { } else { message = bulletin.get(nextBulletin); - + message = ChatControl.applyChatRules(message, "bulletins", "").get(); for (ProxiedPlayer onlineplayer : ProxyServer.getInstance().getPlayers()) { onlineplayer.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&',message))); } + + // Trigger PostBroadcastEvent + ProxyServer.getInstance().getPluginManager().callEvent(new PostBroadcastEvent("bulletin", message)); } diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/BungeeComm.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/BungeeComm.java index 240536df..4417fc4c 100644 --- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/BungeeComm.java +++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/BungeeComm.java @@ -79,6 +79,25 @@ public static void sendCommandMessage(String command, ServerInfo server) { server.sendData("multichat:action", stream.toByteArray()); } + + public static void sendPlayerCommandMessage(String command, String playerRegex, ServerInfo server) { + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(stream); + + try { + + // Command + out.writeUTF(playerRegex); + out.writeUTF(command); + + } catch (IOException e) { + e.printStackTrace(); + } + + server.sendData("multichat:paction", stream.toByteArray()); + + } @EventHandler public static void onPluginMessage(PluginMessageEvent ev) { diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/ChatManipulation.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/ChatManipulation.java index d2808ed8..69ae2102 100644 --- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/ChatManipulation.java +++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/ChatManipulation.java @@ -47,6 +47,58 @@ public String replaceMsgVars(String messageFormat, String message, ProxiedPlayer } + public String replaceMsgConsoleTargetVars(String messageFormat, String message, ProxiedPlayer sender) { + + messageFormat = messageFormat.replace("%MESSAGE%", message); + messageFormat = messageFormat.replace("%DISPLAYNAME%", sender.getDisplayName()); + messageFormat = messageFormat.replace("%NAME%", sender.getName()); + + Optional opm = PlayerMetaManager.getInstance().getPlayer(sender.getUniqueId()); + if (opm.isPresent()) { + messageFormat = messageFormat.replace("%PREFIX%", opm.get().prefix); + messageFormat = messageFormat.replace("%SUFFIX%", opm.get().suffix); + messageFormat = messageFormat.replace("%NICK%", opm.get().nick); + } + + messageFormat = messageFormat.replace("%DISPLAYNAMET%", "CONSOLE"); + messageFormat = messageFormat.replace("%NAMET%", "CONSOLE"); + + messageFormat = messageFormat.replace("%PREFIXT%", ""); + messageFormat = messageFormat.replace("%SUFFIXT%", ""); + messageFormat = messageFormat.replace("%NICKT%", "CONSOLE"); + + messageFormat = messageFormat.replace("%SERVER%", sender.getServer().getInfo().getName()); + messageFormat = messageFormat.replace("%SERVERT%", "CONSOLE"); + return messageFormat; + + } + + public String replaceMsgConsoleSenderVars(String messageFormat, String message, ProxiedPlayer target) { + + messageFormat = messageFormat.replace("%MESSAGE%", message); + messageFormat = messageFormat.replace("%DISPLAYNAME%", "CONSOLE"); + messageFormat = messageFormat.replace("%NAME%", "CONSOLE"); + + messageFormat = messageFormat.replace("%PREFIX%", ""); + messageFormat = messageFormat.replace("%SUFFIX%", ""); + messageFormat = messageFormat.replace("%NICK%", "CONSOLE"); + + messageFormat = messageFormat.replace("%DISPLAYNAMET%", target.getDisplayName()); + messageFormat = messageFormat.replace("%NAMET%", target.getName()); + + Optional opmt = PlayerMetaManager.getInstance().getPlayer(target.getUniqueId()); + if (opmt.isPresent()) { + messageFormat = messageFormat.replace("%PREFIXT%", opmt.get().prefix); + messageFormat = messageFormat.replace("%SUFFIXT%", opmt.get().suffix); + messageFormat = messageFormat.replace("%NICKT%", opmt.get().nick); + } + + messageFormat = messageFormat.replace("%SERVER%", "CONSOLE"); + messageFormat = messageFormat.replace("%SERVERT%", target.getServer().getInfo().getName()); + return messageFormat; + + } + public String replaceModChatVars(String messageFormat, String playername, String displayname, String server, String message, ProxiedPlayer target) { messageFormat = messageFormat.replace("%DISPLAYNAME%", displayname); diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/ChatStream.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/ChatStream.java index c92ca378..4675d00c 100644 --- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/ChatStream.java +++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/ChatStream.java @@ -12,6 +12,8 @@ import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; +import xyz.olivermartin.multichat.bungee.events.PostBroadcastEvent; +import xyz.olivermartin.multichat.bungee.events.PostGlobalChatEvent; /** * Chat Stream @@ -102,12 +104,16 @@ public void sendMessage(ProxiedPlayer sender, String message) { } } } + + // Trigger PostGlobalChatEvent + ProxyServer.getInstance().getPluginManager().callEvent(new PostGlobalChatEvent(sender, message, format)); ProxyServer.getInstance().getConsole().sendMessage(buildFormatConsole(sender,format,message)); } public void sendMessage(String message) { + for (ProxiedPlayer receiver : ProxyServer.getInstance().getPlayers()) { if ( (whitelistMembers && members.contains(receiver.getUniqueId())) || (!whitelistMembers && !members.contains(receiver.getUniqueId()))) { if ( (whitelistServers && servers.contains(receiver.getServer().getInfo().getName())) || (!whitelistServers && !servers.contains(receiver.getServer().getInfo().getName()))) { @@ -119,6 +125,10 @@ public void sendMessage(String message) { } } } + + // Trigger PostBroadcastEvent + ProxyServer.getInstance().getPluginManager().callEvent(new PostBroadcastEvent("cast", message)); + //TODO System.out.println("\033[33m[MultiChat][CHAT]" + message); diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/CommandManager.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/CommandManager.java index 91c55704..a391eaf4 100644 --- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/CommandManager.java +++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/CommandManager.java @@ -21,6 +21,7 @@ import xyz.olivermartin.multichat.bungee.commands.MsgCommand; import xyz.olivermartin.multichat.bungee.commands.MultiChatBypassCommand; import xyz.olivermartin.multichat.bungee.commands.MultiChatCommand; +import xyz.olivermartin.multichat.bungee.commands.MultiChatExecuteCommand; import xyz.olivermartin.multichat.bungee.commands.MuteCommand; import xyz.olivermartin.multichat.bungee.commands.ReplyCommand; import xyz.olivermartin.multichat.bungee.commands.SocialSpyCommand; @@ -51,6 +52,7 @@ public class CommandManager { msg = new MsgCommand(); multichat = new MultiChatCommand(); multichatbypass = new MultiChatBypassCommand(); + multichatexecute = new MultiChatExecuteCommand(); mute = new MuteCommand(); reply = new ReplyCommand(); socialspy = new SocialSpyCommand(); @@ -79,6 +81,20 @@ public class CommandManager { private static Command msg; private static Command multichat; private static Command multichatbypass; + private static Command multichatexecute; + /** + * @return the multichatexecute + */ + public static Command getMultiChatExecute() { + return multichatexecute; + } + /** + * @param multichatexecute the multichatexecute to set + */ + public static void setMultiChatExecute(Command multichatexecute) { + CommandManager.multichatexecute = multichatexecute; + } + private static Command mute; private static Command reply; private static Command socialspy; @@ -410,6 +426,7 @@ public static void reload() { msg = new MsgCommand(); multichat = new MultiChatCommand(); multichatbypass = new MultiChatBypassCommand(); + multichatexecute = new MultiChatExecuteCommand(); mute = new MuteCommand(); reply = new ReplyCommand(); socialspy = new SocialSpyCommand(); diff --git a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/MessageManager.java b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/MessageManager.java index caf87882..872a7bc6 100644 --- a/multichat/src/main/java/xyz/olivermartin/multichat/bungee/MessageManager.java +++ b/multichat/src/main/java/xyz/olivermartin/multichat/bungee/MessageManager.java @@ -239,6 +239,12 @@ public class MessageManager { + "&c&oThis command causes your chat messages to bypass MultiChat and be handled directly by spigot."); defaultMessages.put("command_multichatbypass_enabled", "&aMultiChat BYPASS Enabled"); defaultMessages.put("command_multichatbypass_disabled", "&bMultiChat BYPASS Disabled"); + + defaultMessages.put("command_execute_usage", "&2Usage: /mce [-s ] [-p ] \n" + + "&a&oThis command allows you to execute a command over all your spigot servers (&lwhich have at least 1 player online!&a&o)\n" + + "By default the command will be executed by console, you can instead make players execute the command using the -p flag\n" + + "By default the command will be executed on all servers, you can limit which servers using the -s flag."); + defaultMessages.put("command_execute_sent", "&2The command has been sent"); defaultMessages.put("command_reply_usage", "&bUsage: /r "); 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]