diff --git a/src/java/scheme/ClajIntegration.java b/src/java/scheme/ClajIntegration.java index 24342d6..2101570 100644 --- a/src/java/scheme/ClajIntegration.java +++ b/src/java/scheme/ClajIntegration.java @@ -41,10 +41,13 @@ public static void load() { public static Client createRoom(String ip, int port, Cons link, Runnable disconnected) throws IOException { Client client = new Client(8192, 8192, new Serializer()); - Threads.daemon("CLaJ Client", client::run); + Threads.daemon("CLaJ Room", client::run); - client.addListener(serverListener); client.addListener(new NetListener() { + + /** Used when creating redirectors. */ + public String key; + @Override public void connected(Connection connection) { client.sendTCP("new"); @@ -58,9 +61,14 @@ public void disconnected(Connection connection, DcReason reason) { @Override public void received(Connection connection, Object object) { if (object instanceof String message) { - if (message.startsWith("CLaJ")) - link.get(message + "#" + ip + ":" + port); - else + if (message.startsWith("CLaJ")) { + this.key = message; + link.get(key + "#" + ip + ":" + port); + } else if (message.equals("new")) { + try { + createRedirector(ip, port, key); + } catch (Exception ignored) {} + } else Call.sendMessage(message); } } @@ -72,6 +80,22 @@ public void received(Connection connection, Object object) { return client; } + public static void createRedirector(String ip, int port, String key) throws IOException { + Client client = new Client(8192, 8192, new Serializer()); + Threads.daemon("CLaJ Redirector", client::run); + + client.addListener(serverListener); + client.addListener(new NetListener() { + @Override + public void connected(Connection connection) { + client.sendTCP("host" + key); + } + }); + + client.connect(5000, ip, port, port); + clients.add(client); + } + public static void joinRoom(String ip, int port, String key, Runnable success) { logic.reset(); net.reset(); @@ -83,7 +107,7 @@ public static void joinRoom(String ip, int port, String key, Runnable success) { ByteBuffer buffer = ByteBuffer.allocate(8192); buffer.put(Serializer.linkID); - TypeIO.writeString(buffer, key); + TypeIO.writeString(buffer, "join" + key); buffer.limit(buffer.position()).position(0); net.send(buffer, true);