From 29570e357237e97fcc332b7cb936540ce4f2302b Mon Sep 17 00:00:00 2001 From: 132ikl <132@ikl.sh> Date: Tue, 24 Dec 2019 16:09:31 -0500 Subject: [PATCH 1/2] Start command override --- .../networking/io/CommandMessage.java | 31 ++++++++++++++++--- .../server/command/MinecraftCommand.java | 8 +++-- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandMessage.java index eeeaaf6..5879d40 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandMessage.java @@ -23,26 +23,40 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.util.ArrayList; public class CommandMessage extends AbstractMessage{ protected static final short MESSAGE_TYPE_ID = 6; - private final String serverID; - private final String command; - private final String channel; + private final String serverID, name, command, channel; + private final int listSize; + private ArrayList args; - public CommandMessage(String serverID, String command, String channel) { + public CommandMessage(String serverID, String name, String command, ArrayList args, String channel) { this.serverID = serverID; + this.name = name; this.command = command; + this.args = args; + this.listSize = args.size(); this.channel = channel; } public CommandMessage(DataInputStream istream) throws IOException { this.serverID = istream.readUTF(); + this.name = istream.readUTF(); this.command = istream.readUTF(); + this.listSize = istream.readInt(); + this.args = new ArrayList<>(); + for (int i = 0; i < listSize; i++) { + args.add(istream.readUTF()); + } this.channel = istream.readUTF(); } + public ArrayList getArgs() { + return args; + } + public String getServerID() { return serverID; } @@ -55,11 +69,20 @@ public String getChannel() { return channel; } + public String getName() { + return name; + } + @Override protected void send(DataOutputStream dataOutputStream) throws IOException { dataOutputStream.writeShort(MESSAGE_TYPE_ID); dataOutputStream.writeUTF(serverID); + dataOutputStream.writeUTF(name); dataOutputStream.writeUTF(command); + dataOutputStream.writeInt(this.args.size()); + for (String arg : this.args) { + dataOutputStream.writeUTF(arg); + } dataOutputStream.writeUTF(channel); } } diff --git a/Server/src/club/moddedminecraft/polychat/server/command/MinecraftCommand.java b/Server/src/club/moddedminecraft/polychat/server/command/MinecraftCommand.java index 55c19b4..0b54d03 100644 --- a/Server/src/club/moddedminecraft/polychat/server/command/MinecraftCommand.java +++ b/Server/src/club/moddedminecraft/polychat/server/command/MinecraftCommand.java @@ -48,14 +48,16 @@ public int calculateParameters(String command) { } public String run(String[] inputArgs, String channel) { - ArrayList executeServers = new ArrayList<>(); String command = this.command; + ArrayList executeServers = new ArrayList<>(); if (inputArgs.length < 1) { return "Error running command: Server prefix required"; } - if (inputArgs.length < (this.argCount - 1)) { + System.out.println(this.argCount); + System.out.println(inputArgs.length); + if (inputArgs.length < (this.argCount + 1)) { return "Expected at least " + this.argCount + " parameters, received " + (inputArgs.length - 1); } @@ -92,7 +94,7 @@ public String run(String[] inputArgs, String channel) { command = command.replace("$args", String.join(" ", args)); for (OnlineServer server : executeServers) { - server.getMessageBus().sendMessage(new CommandMessage(server.getServerID(), command, channel)); + server.getMessageBus().sendMessage(new CommandMessage(server.getServerID(), this.getName(), command, args, channel)); } return ""; From 33905b7a5d25724550e10cd00070633ea3e3e2f9 Mon Sep 17 00:00:00 2001 From: 132ikl <132@ikl.sh> Date: Thu, 21 May 2020 01:05:22 -0400 Subject: [PATCH 2/2] Add total online players, add color to command output, fix username escape bug, move command parsing to client, format code --- .../networking/io/AbstractMessage.java | 2 +- .../networking/io/BroadcastMessage.java | 2 +- .../polychat/networking/io/ChatMessage.java | 2 +- .../networking/io/CommandMessage.java | 16 ++++---- .../networking/io/CommandOutputMessage.java | 12 +++++- .../networking/io/PlayerListMessage.java | 4 +- .../networking/io/PlayerStatusMessage.java | 2 +- .../networking/io/ServerInfoMessage.java | 2 +- .../networking/io/ServerStatusMessage.java | 2 +- .../networking/util/ThreadedQueue.java | 8 ++-- .../polychat/server/PrintMessageQueue.java | 21 +++++++++- .../server/command/CommandOnline.java | 1 + .../server/command/MinecraftCommand.java | 39 ++++--------------- .../polychat/server/info/OnlineServer.java | 6 ++- .../polychat/server/info/OnlineServers.java | 9 ++++- 15 files changed, 72 insertions(+), 56 deletions(-) diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/AbstractMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/AbstractMessage.java index 38d543f..0698f66 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/AbstractMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/AbstractMessage.java @@ -19,7 +19,7 @@ import java.io.DataOutputStream; import java.io.IOException; -public abstract class AbstractMessage{ +public abstract class AbstractMessage { protected abstract void send(DataOutputStream dataOutputStream) throws IOException; diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/BroadcastMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/BroadcastMessage.java index 6e68c4f..a9907ec 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/BroadcastMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/BroadcastMessage.java @@ -21,7 +21,7 @@ import java.io.DataOutputStream; import java.io.IOException; -public final class BroadcastMessage extends AbstractMessage{ +public final class BroadcastMessage extends AbstractMessage { protected static final short MESSAGE_TYPE_ID = 0; private final String prefix, message; private final int prefix_color; diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ChatMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ChatMessage.java index 54ba810..efa21d8 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ChatMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ChatMessage.java @@ -21,7 +21,7 @@ import java.io.DataOutputStream; import java.io.IOException; -public final class ChatMessage extends AbstractMessage{ +public final class ChatMessage extends AbstractMessage { protected static final short MESSAGE_TYPE_ID = 1; private final String username, message, componentJson; diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandMessage.java index 5879d40..377542b 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandMessage.java @@ -25,17 +25,17 @@ import java.io.IOException; import java.util.ArrayList; -public class CommandMessage extends AbstractMessage{ +public class CommandMessage extends AbstractMessage { protected static final short MESSAGE_TYPE_ID = 6; - private final String serverID, name, command, channel; + private final String serverID, name, defaultcmd, channel; private final int listSize; - private ArrayList args; + private final ArrayList args; - public CommandMessage(String serverID, String name, String command, ArrayList args, String channel) { + public CommandMessage(String serverID, String name, String defaultcmd, ArrayList args, String channel) { this.serverID = serverID; this.name = name; - this.command = command; + this.defaultcmd = defaultcmd; this.args = args; this.listSize = args.size(); this.channel = channel; @@ -44,7 +44,7 @@ public CommandMessage(String serverID, String name, String command, ArrayList(); for (int i = 0; i < listSize; i++) { @@ -62,7 +62,7 @@ public String getServerID() { } public String getCommand() { - return command; + return defaultcmd; } public String getChannel() { @@ -78,7 +78,7 @@ protected void send(DataOutputStream dataOutputStream) throws IOException { dataOutputStream.writeShort(MESSAGE_TYPE_ID); dataOutputStream.writeUTF(serverID); dataOutputStream.writeUTF(name); - dataOutputStream.writeUTF(command); + dataOutputStream.writeUTF(defaultcmd); dataOutputStream.writeInt(this.args.size()); for (String arg : this.args) { dataOutputStream.writeUTF(arg); diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandOutputMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandOutputMessage.java index 14de741..6d5358c 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandOutputMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/CommandOutputMessage.java @@ -24,19 +24,21 @@ import java.io.DataOutputStream; import java.io.IOException; -public class CommandOutputMessage extends AbstractMessage{ +public class CommandOutputMessage extends AbstractMessage { protected static final short MESSAGE_TYPE_ID = 7; private final String command; private final String commandOutput; private final String channel; private final String serverID; + private final String color; - public CommandOutputMessage(String serverID, String command, String commandOutput, String channel) { + public CommandOutputMessage(String serverID, String command, String commandOutput, String channel, String color) { this.serverID = serverID; this.command = command; this.commandOutput = commandOutput; this.channel = channel; + this.color = color; } public CommandOutputMessage(DataInputStream istream) throws IOException { @@ -44,6 +46,7 @@ public CommandOutputMessage(DataInputStream istream) throws IOException { this.command = istream.readUTF(); this.commandOutput = istream.readUTF(); this.channel = istream.readUTF(); + this.color = istream.readUTF(); } public String getServerID() { @@ -62,6 +65,10 @@ public String getChannel() { return channel; } + public String getColor() { + return color; + } + @Override protected void send(DataOutputStream dataOutputStream) throws IOException { dataOutputStream.writeShort(MESSAGE_TYPE_ID); @@ -69,6 +76,7 @@ protected void send(DataOutputStream dataOutputStream) throws IOException { dataOutputStream.writeUTF(command); dataOutputStream.writeUTF(commandOutput); dataOutputStream.writeUTF(channel); + dataOutputStream.writeUTF(color); } } diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/PlayerListMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/PlayerListMessage.java index 9ddedc0..63d2595 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/PlayerListMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/PlayerListMessage.java @@ -5,12 +5,12 @@ import java.io.IOException; import java.util.ArrayList; -public class PlayerListMessage extends AbstractMessage{ +public class PlayerListMessage extends AbstractMessage { protected static final short MESSAGE_TYPE_ID = 5; private final String serverID; private final int listSize; - private ArrayList playerList; + private final ArrayList playerList; public PlayerListMessage(String serverID, ArrayList playerList) { this.serverID = serverID; diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/PlayerStatusMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/PlayerStatusMessage.java index 40679af..d96514e 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/PlayerStatusMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/PlayerStatusMessage.java @@ -24,7 +24,7 @@ import java.io.DataOutputStream; import java.io.IOException; -public class PlayerStatusMessage extends AbstractMessage{ +public class PlayerStatusMessage extends AbstractMessage { protected static final short MESSAGE_TYPE_ID = 3; private final String userName, serverID, prefixJson; private final boolean joined, silent; diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ServerInfoMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ServerInfoMessage.java index 18ca5c6..f287148 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ServerInfoMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ServerInfoMessage.java @@ -26,7 +26,7 @@ //Sends data to main polychat server when the game launches //Data is used when displaying info about all servers in discord -public class ServerInfoMessage extends AbstractMessage{ +public class ServerInfoMessage extends AbstractMessage { protected static final short MESSAGE_TYPE_ID = 4; private final String serverID, serverName, serverAddress; private final int maxPlayers; diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ServerStatusMessage.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ServerStatusMessage.java index 85dac38..88cde6e 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ServerStatusMessage.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/io/ServerStatusMessage.java @@ -25,7 +25,7 @@ import java.io.IOException; //Used for broadcasting server online/offline events -public class ServerStatusMessage extends AbstractMessage{ +public class ServerStatusMessage extends AbstractMessage { protected static final short MESSAGE_TYPE_ID = 2; private final String serverID, prefixJson; private final short state; diff --git a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/util/ThreadedQueue.java b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/util/ThreadedQueue.java index 1fd23a0..d706ef5 100644 --- a/NetworkLibrary/src/club/moddedminecraft/polychat/networking/util/ThreadedQueue.java +++ b/NetworkLibrary/src/club/moddedminecraft/polychat/networking/util/ThreadedQueue.java @@ -26,9 +26,9 @@ public abstract class ThreadedQueue { public final void start() { executorService = Executors.newSingleThreadExecutor(); executorService.submit(() -> { - try{ + try { init(); - }catch(Throwable t){ + } catch (Throwable t) { t.printStackTrace(); } }); @@ -40,9 +40,9 @@ public final void stop() { public final synchronized void enqueue(final T obj) { executorService.submit(() -> { - try{ + try { handle(obj); - }catch(Throwable t){ + } catch (Throwable t) { t.printStackTrace(); } }); diff --git a/Server/src/club/moddedminecraft/polychat/server/PrintMessageQueue.java b/Server/src/club/moddedminecraft/polychat/server/PrintMessageQueue.java index a2a63d5..a3295ed 100644 --- a/Server/src/club/moddedminecraft/polychat/server/PrintMessageQueue.java +++ b/Server/src/club/moddedminecraft/polychat/server/PrintMessageQueue.java @@ -22,11 +22,30 @@ import discord4j.core.object.entity.*; import java.awt.*; +import java.util.HashMap; import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PrintMessageQueue extends ThreadedQueue { + private static final HashMap colorHashMap = new HashMap() {{ + put("0", new Color(0x000000)); + put("1", new Color(0x0000AA)); + put("2", new Color(0x00AA00)); + put("3", new Color(0x00AAAA)); + put("4", new Color(0xAA0000)); + put("5", new Color(0xAA00AA)); + put("6", new Color(0xFFAA00)); + put("7", new Color(0xAAAAAA)); + put("8", new Color(0x555555)); + put("9", new Color(0x5555FF)); + put("a", new Color(0x55FF55)); + put("b", new Color(0x55FFFF)); + put("c", new Color(0xFF5555)); + put("d", new Color(0xFF55FF)); + put("e", new Color(0xFFFF55)); + put("f", new Color(0xFFFFFF)); + }}; @Override protected void init() { @@ -91,7 +110,7 @@ protected void handle(MessageData messageData) { } embedSpec.setDescription(message.getCommandOutput()); Random random = new Random(System.currentTimeMillis()); - embedSpec.setColor(new Color(random.nextInt(0xFFFFFF))); + embedSpec.setColor(colorHashMap.get(message.getColor())); }).block(); } } diff --git a/Server/src/club/moddedminecraft/polychat/server/command/CommandOnline.java b/Server/src/club/moddedminecraft/polychat/server/command/CommandOnline.java index 5df9979..2f209cd 100644 --- a/Server/src/club/moddedminecraft/polychat/server/command/CommandOnline.java +++ b/Server/src/club/moddedminecraft/polychat/server/command/CommandOnline.java @@ -51,6 +51,7 @@ public String run(String[] args, String channel) { String prefix = Main.config.getProperty("prefix", "!"); info.append("WARNING: This command is deprecated and will soon be removed in favor of ").append(prefix).append(oc).append(".\n"); } + info.append(String.format("**Total Players Online: %d**", Main.serverInfo.getTotalPlayers())).append("\n"); info.append(String.format("**Servers Online [%d]:**", Main.serverInfo.getServers().size())).append("\n"); for (OnlineServer server : Main.serverInfo.getServers()) { info.append(String.format( diff --git a/Server/src/club/moddedminecraft/polychat/server/command/MinecraftCommand.java b/Server/src/club/moddedminecraft/polychat/server/command/MinecraftCommand.java index 0b54d03..f274c48 100644 --- a/Server/src/club/moddedminecraft/polychat/server/command/MinecraftCommand.java +++ b/Server/src/club/moddedminecraft/polychat/server/command/MinecraftCommand.java @@ -25,20 +25,21 @@ import club.moddedminecraft.polychat.server.info.OnlineServer; import java.util.ArrayList; +import java.util.Arrays; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MinecraftCommand extends RoleCommand { - private final String command; + private final String defaultcmd; private final int argCount; private String channel; public MinecraftCommand(String name, Map args) { super(name, args); - this.command = (String) args.get("command"); - this.argCount = calculateParameters(command); + this.defaultcmd = (String) args.get("command"); + this.argCount = calculateParameters(defaultcmd); } public int calculateParameters(String command) { @@ -48,25 +49,13 @@ public int calculateParameters(String command) { } public String run(String[] inputArgs, String channel) { - String command = this.command; - ArrayList executeServers = new ArrayList<>(); if (inputArgs.length < 1) { return "Error running command: Server prefix required"; } - - System.out.println(this.argCount); - System.out.println(inputArgs.length); - if (inputArgs.length < (this.argCount + 1)) { - return "Expected at least " + this.argCount + " parameters, received " + (inputArgs.length - 1); - } - String serverID = inputArgs[0]; - ArrayList args = new ArrayList<>(); - for (int i = 1; i < inputArgs.length; i++) { - args.add(inputArgs[i]); - } + ArrayList executeServers = new ArrayList<>(); if (serverID.equals("")) { executeServers.addAll(Main.serverInfo.getServers()); } else { @@ -77,24 +66,12 @@ public String run(String[] inputArgs, String channel) { executeServers.add(server); } - // get the last instance of every unique $(number) - // ie. /ranks set $1 $2 $1 $3 returns $2 $1 $3 - Pattern pattern = Pattern.compile("(\\$\\d+)(?!.*\\1)"); - Matcher matcher = pattern.matcher(this.command); - while (matcher.find()) { - for (int i = 0; i <= matcher.groupCount(); i++) { - String toBeReplaced = matcher.group(i); - String replaceWith; - int argNum = Integer.parseInt(toBeReplaced.substring(1)); - replaceWith = args.get(argNum - 1); - command = command.replace(toBeReplaced, replaceWith); - } - } - command = command.replace("$args", String.join(" ", args)); + // process arguments into ArrayList (exclude the first element which is the prefix) + ArrayList args = new ArrayList<>(Arrays.asList(inputArgs).subList(1, inputArgs.length)); for (OnlineServer server : executeServers) { - server.getMessageBus().sendMessage(new CommandMessage(server.getServerID(), this.getName(), command, args, channel)); + server.getMessageBus().sendMessage(new CommandMessage(server.getServerID(), this.getName(), defaultcmd, args, channel)); } return ""; diff --git a/Server/src/club/moddedminecraft/polychat/server/info/OnlineServer.java b/Server/src/club/moddedminecraft/polychat/server/info/OnlineServer.java index 70f7f03..1d747f4 100644 --- a/Server/src/club/moddedminecraft/polychat/server/info/OnlineServer.java +++ b/Server/src/club/moddedminecraft/polychat/server/info/OnlineServer.java @@ -57,7 +57,11 @@ public int playerCount() { } public ArrayList getOnlinePlayers() { - return this.onlinePlayers; + ArrayList players = new ArrayList<>(); + for (String player : this.onlinePlayers) { + players.add(player.replace("_", "\\_")); // escape underscore from italicizing on Discord + } + return players; } //The maximum players on this server diff --git a/Server/src/club/moddedminecraft/polychat/server/info/OnlineServers.java b/Server/src/club/moddedminecraft/polychat/server/info/OnlineServers.java index 98e6c1f..efb15b6 100644 --- a/Server/src/club/moddedminecraft/polychat/server/info/OnlineServers.java +++ b/Server/src/club/moddedminecraft/polychat/server/info/OnlineServers.java @@ -40,7 +40,6 @@ public ArrayList getServers() { } public OnlineServer getServer(String serverID) { - System.out.println(serverMap); return serverMap.getOrDefault(serverID, null); } @@ -102,4 +101,12 @@ public void playerLeave(String serverID, String username) { } } + public int getTotalPlayers() { + int total = 0; + for (OnlineServer server : onlineServers) { + total += server.getOnlinePlayers().size(); + } + return total; + } + }