From 86180f047ce063b49f824ff968ca29c6c64bc74a Mon Sep 17 00:00:00 2001 From: Seraina Date: Sun, 27 Mar 2022 14:30:54 +0200 Subject: [PATCH 1/8] Added Alexandrs class --- .../cs108/multiplayer/server/AllClientNames.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/AllClientNames.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/AllClientNames.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/AllClientNames.java new file mode 100644 index 0000000..aea8c71 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/AllClientNames.java @@ -0,0 +1,14 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.server; + +/* This class is built to contain the usernames of all players in a single string. +* This allows a duplicate check (--> ClientHandler) when a new player chooses +* a name: does the string with all the previous names contain the new player's +* desired username? If yes, he is being assigned a random name. If no, he can keep +* his desired name. */ + +public class AllClientNames { + static StringBuilder names = new StringBuilder(); + public static String allNames(String currentName) { + return names.append(currentName).toString(); + } +} From 83991587d6d0ca642ef3a3f4ca01ee2ee3d7b56f Mon Sep 17 00:00:00 2001 From: Seraina Date: Sun, 27 Mar 2022 14:35:15 +0200 Subject: [PATCH 2/8] Added Alexandrs Random Generator commit --- .../dbis/cs108/multiplayer/client/Client.java | 10 +++++++--- .../multiplayer/client/NameGenerator.java | 20 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/NameGenerator.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 8d6cecf..a4f5127 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -2,12 +2,12 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ClientPinger; -import ch.unibas.dmi.dbis.cs108.multiplayer.server.MessageFormatter; + import java.net.Socket; import java.io.*; import java.net.UnknownHostException; import java.util.Scanner; -import org.apache.logging.log4j.message.Message; + public class Client { @@ -23,7 +23,7 @@ public class Client { this.out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); this.in = new BufferedReader((new InputStreamReader((socket.getInputStream())))); - //TODO add the system based generated username here. + String randomUserName = NameGenerator.randomName(); //TODO hide connecting logik(next 4 lines) this.userName = userName; this.out.write(getUsername()); @@ -36,6 +36,10 @@ public class Client { } } + /** + * + */ + public void sendMessage() { try { Scanner sc = new Scanner(System.in); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/NameGenerator.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/NameGenerator.java new file mode 100644 index 0000000..7ec6886 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/NameGenerator.java @@ -0,0 +1,20 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client; + +import java.util.Random; + +// Creates a String beginning with "player_" followed by 4 random letters + +public class NameGenerator { + static String randomName() { + StringBuilder name = new StringBuilder(); + Random r = new Random(); + for (int i = 0; i < 4; i++) { + char c = (char)(r.nextInt(26) + 'a'); + name.append(c); + } + return "player_" + name; + } + public static void main (String[] args) { + System.out.println(randomName()); + } +} From 0e39f06f9e437b20c85a22610e93c95de14a8c06 Mon Sep 17 00:00:00 2001 From: Seraina Date: Sun, 27 Mar 2022 14:44:55 +0200 Subject: [PATCH 3/8] Added Alexandrs "Added name duplicate handler by modifying the ClientHandler class as well as adding a class where all Client names are stored" commit --- .../ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java | 1 - .../dmi/dbis/cs108/multiplayer/server/ClientHandler.java | 6 ++++++ .../cs108/multiplayer/{client => server}/NameGenerator.java | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) rename src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/{client => server}/NameGenerator.java (90%) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index a4f5127..98e7232 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -2,7 +2,6 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ClientPinger; - import java.net.Socket; import java.io.*; import java.net.UnknownHostException; diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java index 6b204bf..5c072cf 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java @@ -29,6 +29,12 @@ public class ClientHandler implements Runnable { this.out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); this.in = new BufferedReader((new InputStreamReader((socket.getInputStream())))); this.clientUserName = in.readLine(); + // duplicate handling: if username already taken, assign random name to client + if (AllClientNames.allNames("").contains(clientUserName)) { + clientUserName = NameGenerator.randomName(); + } + // add username to list of all client names for future duplicate checking + AllClientNames.allNames(clientUserName); connectedClients.add(this); serverPinger = new ServerPinger(out, socket); Thread sP = new Thread(serverPinger); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/NameGenerator.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/NameGenerator.java similarity index 90% rename from src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/NameGenerator.java rename to src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/NameGenerator.java index 7ec6886..2739cf7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/NameGenerator.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/NameGenerator.java @@ -1,4 +1,4 @@ -package ch.unibas.dmi.dbis.cs108.multiplayer.client; +package ch.unibas.dmi.dbis.cs108.multiplayer.server; import java.util.Random; From 4a5bc49aa75aaa3444f8a6146db5449701b5ca4b Mon Sep 17 00:00:00 2001 From: Seraina Date: Sun, 27 Mar 2022 14:49:53 +0200 Subject: [PATCH 4/8] Added Alexandrs "Tried implementing logout handling (changes only on Server side) " commit --- .../ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java | 1 - .../ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 98e7232..88ff023 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -22,7 +22,6 @@ public class Client { this.out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); this.in = new BufferedReader((new InputStreamReader((socket.getInputStream())))); - String randomUserName = NameGenerator.randomName(); //TODO hide connecting logik(next 4 lines) this.userName = userName; this.out.write(getUsername()); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java index 31b72ba..534e936 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java @@ -26,6 +26,12 @@ public class Server { Thread th = new Thread(nextClient); connectedClients.add(nextClient); th.start(); + // close socket + remove client if client is disconnected + if (socket.getInputStream().read() == -1) { + System.out.println("client disconnected. closing socket"); + socket.close(); + connectedClients.remove(nextClient); + } } } catch (IOException e) { From 665428099001f779e2c6a6cdf1c75387f4304af7 Mon Sep 17 00:00:00 2001 From: Seraina Date: Sun, 27 Mar 2022 15:25:14 +0200 Subject: [PATCH 5/8] Adjusted Random Name generator to include wanted username and switched to numbers instead of character for readability --- .../multiplayer/server/ClientHandler.java | 2 +- .../multiplayer/server/NameGenerator.java | 25 +++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java index 5c072cf..4464437 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java @@ -31,7 +31,7 @@ public class ClientHandler implements Runnable { this.clientUserName = in.readLine(); // duplicate handling: if username already taken, assign random name to client if (AllClientNames.allNames("").contains(clientUserName)) { - clientUserName = NameGenerator.randomName(); + clientUserName = NameGenerator.randomName(clientUserName); } // add username to list of all client names for future duplicate checking AllClientNames.allNames(clientUserName); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/NameGenerator.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/NameGenerator.java index 2739cf7..b080320 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/NameGenerator.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/NameGenerator.java @@ -5,16 +5,21 @@ import java.util.Random; // Creates a String beginning with "player_" followed by 4 random letters public class NameGenerator { - static String randomName() { - StringBuilder name = new StringBuilder(); - Random r = new Random(); - for (int i = 0; i < 4; i++) { - char c = (char)(r.nextInt(26) + 'a'); - name.append(c); + static String randomName(String username) { + StringBuilder name; + while (true) { + + name = new StringBuilder(); + Random r = new Random(); + for (int i = 0; i < 4; i++) { + int c = r.nextInt(10); + name.append(c); + } + if (!AllClientNames.allNames("").contains(username + name)) { + break; + } } - return "player_" + name; - } - public static void main (String[] args) { - System.out.println(randomName()); + return username + name; } + } From 15cabe2d189c4c62434abcd307cb6a84309cd9a5 Mon Sep 17 00:00:00 2001 From: Seraina Date: Sun, 27 Mar 2022 16:11:43 +0200 Subject: [PATCH 6/8] Added Name suggestion based on System name to Client --- .../ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 88ff023..613cd8b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -134,7 +134,8 @@ public class Client { } else { hostname = args[0]; } - System.out.println("Choose a nickname: "); + String systemName = System.getProperty("user.name"); + System.out.println("Choose a nickname (Suggestion: " + systemName + "): "); String username = sc.next(); Socket socket; try { From 1c03b5d9c7e7f06fb2abae15031c17a733eaeb00 Mon Sep 17 00:00:00 2001 From: Seraina Date: Sun, 27 Mar 2022 16:41:03 +0200 Subject: [PATCH 7/8] Added nickname change /n newName --- .../{server => client}/MessageFormatter.java | 16 ++++++++-------- .../cs108/multiplayer/server/ClientHandler.java | 9 ++++++++- .../server/JServerProtocolParser.java | 3 +++ 3 files changed, 19 insertions(+), 9 deletions(-) rename src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/{server => client}/MessageFormatter.java (75%) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/MessageFormatter.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/MessageFormatter.java similarity index 75% rename from src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/MessageFormatter.java rename to src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/MessageFormatter.java index b2c7984..d1a4680 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/MessageFormatter.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/MessageFormatter.java @@ -1,6 +1,4 @@ -package ch.unibas.dmi.dbis.cs108.multiplayer.server; - -import java.io.StringBufferInputStream; +package ch.unibas.dmi.dbis.cs108.multiplayer.client; public class MessageFormatter { @@ -23,15 +21,17 @@ public class MessageFormatter { } switch (header) { case "/c": - stringBuilder.append("CHATA"); - s = msg.substring(2); + stringBuilder.append("CHATA$"); + s = msg.substring(3); break; case "/q": - stringBuilder.append("QUITS"); - s = msg.substring(2); + stringBuilder.append("QUITS$"); + s = msg.substring(3); break; case "/n": - stringBuilder.append("NAMEC"); + stringBuilder.append("NAMEC$"); + s = msg.substring(3); + break; default: s = msg; } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java index 4464437..6fb8c49 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java @@ -79,7 +79,7 @@ public class ClientHandler implements Runnable { * The main logic of the client handler. * Since every client is put on a string this is where * most interactions between client and server are held - */ + **/ public void run() { String msg; while (socket.isConnected()) { @@ -98,6 +98,13 @@ public class ClientHandler implements Runnable { return clientUserName; } + public void changeUsername(String newName) { + + String h = this.clientUserName; //just a friendly little helper + this.clientUserName = newName; + broadcastMessage(h +" have changed their nickname to " + clientUserName); + } + public void broadcastMessage(String msg) { for (ClientHandler client : connectedClients) { client.sendMsgToClient("CHATM:" + clientUserName + ": \"" + msg + "\""); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java index 85971a9..29fff16 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java @@ -21,6 +21,9 @@ public class JServerProtocolParser { case "CHATA": h.broadcastMessage(msg.substring(6)); break; + case "NAMEC": + h.changeUsername(msg.substring(6)); + break; case "CPING": h.sendMsgToClient("PINGB"); break; From bc7896dafadfd5ab37e2acef8f3f2630860b7365 Mon Sep 17 00:00:00 2001 From: Seraina Date: Sun, 27 Mar 2022 17:04:05 +0200 Subject: [PATCH 8/8] Enforced duplication check on nickname change --- .../dmi/dbis/cs108/multiplayer/client/MessageFormatter.java | 2 +- .../dmi/dbis/cs108/multiplayer/server/ClientHandler.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/MessageFormatter.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/MessageFormatter.java index d1a4680..0913fa4 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/MessageFormatter.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/MessageFormatter.java @@ -7,7 +7,7 @@ public class MessageFormatter { * handle it. May need to be redesigned one the games uses a GUI * * @param msg the Messaged to be reformatted - * @return the reformatted message + * @return the reformatted message in the form HEADR$msg */ public static String formatMsg(String msg) { diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java index 6fb8c49..b64ebe7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java @@ -99,9 +99,12 @@ public class ClientHandler implements Runnable { } public void changeUsername(String newName) { - + if (AllClientNames.allNames("").contains(newName)) { + newName = NameGenerator.randomName(newName); + } String h = this.clientUserName; //just a friendly little helper this.clientUserName = newName; + AllClientNames.allNames(newName); broadcastMessage(h +" have changed their nickname to " + clientUserName); }