diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index c903857..4f80df6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,6 +20,12 @@
4.13.1
test
+
+
+ com.google.guava
+ guava
+ 33.4.8-jre
+
\ No newline at end of file
diff --git a/src/main/java/org/toop/GlobalEventBus.java b/src/main/java/org/toop/GlobalEventBus.java
new file mode 100644
index 0000000..0d2d355
--- /dev/null
+++ b/src/main/java/org/toop/GlobalEventBus.java
@@ -0,0 +1,13 @@
+package org.toop;
+
+import com.google.common.eventbus.EventBus;
+
+public enum GlobalEventBus {
+ INSTANCE;
+
+ private final EventBus eventBus = new EventBus("global-bus");
+
+ public EventBus get() {
+ return eventBus;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/toop/LoggerListener.java b/src/main/java/org/toop/LoggerListener.java
new file mode 100644
index 0000000..b7feb61
--- /dev/null
+++ b/src/main/java/org/toop/LoggerListener.java
@@ -0,0 +1,14 @@
+package org.toop;
+
+import com.google.common.eventbus.Subscribe;
+import org.toop.server.*;
+
+public class LoggerListener {
+ @Subscribe
+ public void onCommand(CommandEvent event) {
+ System.out.printf("LOG: %s args=%s -> %s%n",
+ event.command(),
+ String.join(",", event.args()),
+ event.result());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/toop/Main.java b/src/main/java/org/toop/Main.java
index b0126c8..94d32b9 100644
--- a/src/main/java/org/toop/Main.java
+++ b/src/main/java/org/toop/Main.java
@@ -1,7 +1,20 @@
package org.toop;
+import org.toop.server.Server;
+
public class Main {
public static void main(String[] args) {
- Server server = new Server("0.0.0.0", "5000");
+
+ Server server = new Server(Server.ServerBackend.LOCAL, "127.0.0.1", "5000");
+ server.setBackend(Server.ServerBackend.REMOTE);
+
+ GlobalEventBus.INSTANCE.get().register(new LoggerListener());
+
+ Server.Message msg = server.sendCommand(Server.Command.LOGIN, "move");
+ server.sendCommand(Server.Command.LOGIN, "test");
+
+ System.out.println(msg);
+ System.out.println(server);
+
}
}
\ No newline at end of file
diff --git a/src/main/java/org/toop/Server.java b/src/main/java/org/toop/Server.java
deleted file mode 100644
index d05ac1b..0000000
--- a/src/main/java/org/toop/Server.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.toop;
-
-public class Server {
-
- String ip;
- String port;
-
- public Server(String set_ip, String set_port) {
- ip = set_ip;
- port = set_port;
- }
-
- public String getIp() {
- return ip;
- }
-
- public void setIp(String ip) {
- this.ip = ip;
- }
-
- public String getPort() {
- return port;
- }
-
- public void setPort(String port) {
- this.port = port;
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/org/toop/server/CommandEvent.java b/src/main/java/org/toop/server/CommandEvent.java
new file mode 100644
index 0000000..1e65c76
--- /dev/null
+++ b/src/main/java/org/toop/server/CommandEvent.java
@@ -0,0 +1,3 @@
+package org.toop.server;
+
+public record CommandEvent(Server.Command command, String[] args, Server.Message result) {}
diff --git a/src/main/java/org/toop/server/Server.java b/src/main/java/org/toop/server/Server.java
new file mode 100644
index 0000000..c0b54e8
--- /dev/null
+++ b/src/main/java/org/toop/server/Server.java
@@ -0,0 +1,148 @@
+package org.toop.server;
+
+import org.toop.GlobalEventBus;
+import org.toop.server.backend.*;
+import java.util.EnumSet;
+
+public class Server {
+
+ public enum ServerBackend {
+ LOCAL,
+ REMOTE,
+ }
+
+ public enum Command {
+ /**
+ * Login, "username"
+ */
+ LOGIN,
+ /**
+ * Logout, "username"
+ */
+ LOGOUT,
+ EXIT,
+ QUIT,
+ DISCONNECT,
+ BYE,
+ GET,
+ SUBSCRIBE,
+ MOVE,
+ CHALLENGE,
+ FORFEIT,
+ MESSAGE,
+ HELP,
+ }
+
+ private static final EnumSet VALID_COMMANDS = EnumSet.of(
+ Command.LOGIN, Command.LOGOUT, Command.EXIT, Command.QUIT,
+ Command.DISCONNECT, Command.BYE, Command.GET, Command.SUBSCRIBE,
+ Command.MOVE, Command.CHALLENGE, Command.FORFEIT,
+ Command.MESSAGE, Command.HELP
+ );
+
+ public enum Message {
+ OK,
+ ERR,
+ SVR,
+ }
+
+ String ip;
+ String port;
+ Backend backend;
+
+ public Server(ServerBackend set_backend, String set_ip, String set_port) {
+ ip = set_ip;
+ port = set_port;
+ setBackend(set_backend);
+
+ }
+
+ public Backend getBackend() {
+ return backend;
+ }
+
+ public void setBackend(ServerBackend backend) {
+ if (backend == ServerBackend.LOCAL) { this.backend = new Local(); }
+ else { this.backend = new Remote(); }
+ }
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+
+ public String getPort() {
+ return port;
+ }
+
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+ private Message sendCommandString(String sentence) {
+ return Message.OK;
+ }
+
+ private boolean isCommandValid(Command command) {
+ return VALID_COMMANDS.contains(command);
+ }
+
+ /**
+ * Sends a command to the server.
+ *
+ * @param command the command to execute
+ * @return a Message indicating success or error
+ */
+ public Message sendCommand(Command command) {
+ if (!isCommandValid(command)) {
+ throw new IllegalArgumentException("Invalid command: " + command);
+ }
+ Message result = sendCommandString(command.toString());
+
+ GlobalEventBus.INSTANCE.get().post(new CommandEvent(command, new String[0], result));
+
+ return sendCommandString(command.toString());
+ }
+
+ /**
+ * Sends a command to the server.
+ *
+ * @param command the command to execute
+ * @param args command arguments.
+ * @return a Message indicating success or error
+ */
+ public Message sendCommand(Command command, String... args) {
+ if (!isCommandValid(command)) {
+ throw new IllegalArgumentException("Invalid command: " + command);
+ }
+
+ for (int i = 0; i < args.length; i++) {
+ args[i] = args[i].trim();
+ if (args[i].isEmpty()) {
+ throw new IllegalArgumentException("Empty argument");
+ }
+ }
+
+ String[] fullCommand = new String[args.length + 1];
+ fullCommand[0] = command.toString();
+ System.arraycopy(args, 0, fullCommand, 1, args.length);
+
+ Message result = sendCommandString(String.join(" ", fullCommand));
+
+ GlobalEventBus.INSTANCE.get().post(new CommandEvent(command, args, result));
+
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ "Server {ip: \"%s\", port: \"%s\", backend: \"%s\"}",
+ ip, port, backend
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/toop/server/backend/Backend.java b/src/main/java/org/toop/server/backend/Backend.java
new file mode 100644
index 0000000..6ba54c7
--- /dev/null
+++ b/src/main/java/org/toop/server/backend/Backend.java
@@ -0,0 +1,8 @@
+package org.toop.server.backend;
+
+import org.toop.server.Server;
+
+public interface Backend {
+ Server.Message login(String username);
+}
+
diff --git a/src/main/java/org/toop/server/backend/Local.java b/src/main/java/org/toop/server/backend/Local.java
new file mode 100644
index 0000000..e12fb67
--- /dev/null
+++ b/src/main/java/org/toop/server/backend/Local.java
@@ -0,0 +1,21 @@
+package org.toop.server.backend;
+
+import org.toop.server.Server;
+
+public class Local implements Backend {
+ @Override
+ public Server.Message login(String username) {
+ return null;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return o instanceof Local; // TODO
+ }
+
+ @Override
+ public String toString() {
+ return "Local";
+ }
+
+}
diff --git a/src/main/java/org/toop/server/backend/Remote.java b/src/main/java/org/toop/server/backend/Remote.java
new file mode 100644
index 0000000..4322e37
--- /dev/null
+++ b/src/main/java/org/toop/server/backend/Remote.java
@@ -0,0 +1,21 @@
+package org.toop.server.backend;
+
+import org.toop.server.Server;
+
+public class Remote implements Backend {
+ @Override
+ public Server.Message login(String username) {
+ return null;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return o instanceof Remote; // TODO
+ }
+
+ @Override
+ public String toString() {
+ return "Remote";
+ }
+
+}
diff --git a/src/test/java/ServerTest.java b/src/test/java/ServerTest.java
index 304b71f..d91ed67 100644
--- a/src/test/java/ServerTest.java
+++ b/src/test/java/ServerTest.java
@@ -1,7 +1,8 @@
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.toop.Server;
+import org.toop.server.Server;
+import org.toop.server.backend.*;
public class ServerTest {
@@ -9,7 +10,7 @@ public class ServerTest {
@Before
public void setUp() {
- server = new Server("127.0.0.1", "8080");
+ server = new Server(Server.ServerBackend.LOCAL, "127.0.0.1", "8080");
}
@Test
@@ -30,6 +31,17 @@ public class ServerTest {
Assert.assertEquals("9090", server.getPort());
}
+ @Test
+ public void testSetLocalBackend() {
+ Assert.assertEquals(new Local(), server.getBackend());
+ }
+
+ @Test
+ public void testSetRemoteBackend() {
+ server.setBackend(Server.ServerBackend.REMOTE);
+ Assert.assertEquals(new Remote(), server.getBackend());
+ }
+
@Test
public void testNotNullAfterConstruction() {
Assert.assertNotNull(server);