diff --git a/src/main/java/ru/nanit/limbo/connection/pipeline/PacketEncoder.java b/src/main/java/ru/nanit/limbo/connection/pipeline/PacketEncoder.java index 26e9282..4885aa8 100644 --- a/src/main/java/ru/nanit/limbo/connection/pipeline/PacketEncoder.java +++ b/src/main/java/ru/nanit/limbo/connection/pipeline/PacketEncoder.java @@ -60,7 +60,7 @@ public class PacketEncoder extends MessageToByteEncoder { try { packet.encode(msg, version); - if (Logger.getLevel() >= 3) { + if (Logger.getLevel() >= Logger.Level.DEBUG.getIndex()) { Logger.debug("Sending %s[0x%s] packet (%d bytes)", packet.toString(), Integer.toHexString(packetId), msg.readableBytes()); } } catch (Exception e) { diff --git a/src/main/java/ru/nanit/limbo/server/Command.java b/src/main/java/ru/nanit/limbo/server/Command.java new file mode 100644 index 0000000..c1c7419 --- /dev/null +++ b/src/main/java/ru/nanit/limbo/server/Command.java @@ -0,0 +1,9 @@ +package ru.nanit.limbo.server; + +public interface Command { + + void execute(); + + String description(); + +} diff --git a/src/main/java/ru/nanit/limbo/server/CommandManager.java b/src/main/java/ru/nanit/limbo/server/CommandManager.java index fbb9192..e05fc18 100644 --- a/src/main/java/ru/nanit/limbo/server/CommandManager.java +++ b/src/main/java/ru/nanit/limbo/server/CommandManager.java @@ -1,29 +1,59 @@ package ru.nanit.limbo.server; -import java.util.NoSuchElementException; -import java.util.Scanner; +import ru.nanit.limbo.server.commands.CmdConn; +import ru.nanit.limbo.server.commands.CmdHelp; +import ru.nanit.limbo.server.commands.CmdMem; +import ru.nanit.limbo.server.commands.CmdStop; + +import java.util.*; public final class CommandManager extends Thread { + private final Map commands = new HashMap<>(); + + public Map getCommands() { + return Collections.unmodifiableMap(commands); + } + + public Command getCommand(String name) { + return commands.get(name.toLowerCase()); + } + + public void register(String name, Command cmd) { + commands.put(name.toLowerCase(), cmd); + } + @Override public void run() { Scanner scanner = new Scanner(System.in); - String line; + String command; while (true) { try { - line = scanner.nextLine(); + command = scanner.nextLine().trim(); } catch (NoSuchElementException e) { break; } - if (line.equalsIgnoreCase("stop")) { - System.exit(0); + Command handler = getCommand(command); + + if (handler != null) { + try { + handler.execute(); + } catch (Throwable t) { + Logger.error("Cannot execute command:", t); + } continue; } - Logger.info("Unknown command"); + Logger.info("Unknown command. Type \"help\" to get commands list"); } } + public void registerAll(LimboServer server) { + register("help", new CmdHelp(server)); + register("conn", new CmdConn(server)); + register("mem", new CmdMem()); + register("stop", new CmdStop()); + } } diff --git a/src/main/java/ru/nanit/limbo/server/LimboServer.java b/src/main/java/ru/nanit/limbo/server/LimboServer.java index 74b3c5b..a9ada1c 100644 --- a/src/main/java/ru/nanit/limbo/server/LimboServer.java +++ b/src/main/java/ru/nanit/limbo/server/LimboServer.java @@ -49,6 +49,8 @@ public final class LimboServer { private EventLoopGroup bossGroup; private EventLoopGroup workerGroup; + private CommandManager commandManager; + public LimboConfig getConfig() { return config; } @@ -65,6 +67,10 @@ public final class LimboServer { return dimensionRegistry; } + public CommandManager getCommandManager() { + return commandManager; + } + public void start() throws Exception { Logger.info("Starting server..."); @@ -90,7 +96,11 @@ public final class LimboServer { Logger.setLevel(config.getDebugLevel()); - new CommandManager().start(); + commandManager = new CommandManager(); + commandManager.registerAll(this); + commandManager.start(); + + System.gc(); } private void startBootstrap() { diff --git a/src/main/java/ru/nanit/limbo/server/commands/CmdConn.java b/src/main/java/ru/nanit/limbo/server/commands/CmdConn.java new file mode 100644 index 0000000..b93e6f5 --- /dev/null +++ b/src/main/java/ru/nanit/limbo/server/commands/CmdConn.java @@ -0,0 +1,24 @@ +package ru.nanit.limbo.server.commands; + +import ru.nanit.limbo.server.Command; +import ru.nanit.limbo.server.LimboServer; +import ru.nanit.limbo.server.Logger; + +public class CmdConn implements Command { + + private final LimboServer server; + + public CmdConn(LimboServer server) { + this.server = server; + } + + @Override + public void execute() { + Logger.info("Connections: %d", server.getConnections().getCount()); + } + + @Override + public String description() { + return "Display connections count"; + } +} diff --git a/src/main/java/ru/nanit/limbo/server/commands/CmdHelp.java b/src/main/java/ru/nanit/limbo/server/commands/CmdHelp.java new file mode 100644 index 0000000..7adeb6f --- /dev/null +++ b/src/main/java/ru/nanit/limbo/server/commands/CmdHelp.java @@ -0,0 +1,37 @@ +package ru.nanit.limbo.server.commands; + +import ru.nanit.limbo.server.Command; +import ru.nanit.limbo.server.LimboServer; + +import java.util.Map; + +public class CmdHelp implements Command { + + private final LimboServer server; + + public CmdHelp(LimboServer server) { + this.server = server; + } + + @Override + public void execute() { + StringBuilder msg = new StringBuilder(); + Map commands = server.getCommandManager().getCommands(); + + for (Map.Entry entry : commands.entrySet()) { + msg.append("\n"); + msg.append(entry.getKey()); + msg.append(" - "); + msg.append(entry.getValue().description()); + } + + msg.append("\n"); + + System.out.println(msg); + } + + @Override + public String description() { + return "Show this message"; + } +} diff --git a/src/main/java/ru/nanit/limbo/server/commands/CmdMem.java b/src/main/java/ru/nanit/limbo/server/commands/CmdMem.java new file mode 100644 index 0000000..7809f81 --- /dev/null +++ b/src/main/java/ru/nanit/limbo/server/commands/CmdMem.java @@ -0,0 +1,27 @@ +package ru.nanit.limbo.server.commands; + +import ru.nanit.limbo.server.Command; +import ru.nanit.limbo.server.Logger; + +public class CmdMem implements Command { + + @Override + public void execute() { + Runtime runtime = Runtime.getRuntime(); + long mb = 1024 * 1024; + long used = (runtime.totalMemory() - runtime.freeMemory()) / mb; + long total = runtime.totalMemory() / mb; + long free = runtime.freeMemory() / mb; + long max = runtime.maxMemory() / mb; + + Logger.info("Used: %d MB", used); + Logger.info("Total: %d MB", total); + Logger.info("Free: %d MB", free); + Logger.info("Max: %d MB", max); + } + + @Override + public String description() { + return "Display memory usage"; + } +} diff --git a/src/main/java/ru/nanit/limbo/server/commands/CmdStop.java b/src/main/java/ru/nanit/limbo/server/commands/CmdStop.java new file mode 100644 index 0000000..4120211 --- /dev/null +++ b/src/main/java/ru/nanit/limbo/server/commands/CmdStop.java @@ -0,0 +1,16 @@ +package ru.nanit.limbo.server.commands; + +import ru.nanit.limbo.server.Command; + +public class CmdStop implements Command { + + @Override + public void execute() { + System.exit(0); + } + + @Override + public String description() { + return "Stop the server"; + } +}