2022-03-20 15:56:05 +01:00
|
|
|
|
import java.time.LocalDate;
|
|
|
|
|
import java.time.temporal.ChronoUnit;
|
2022-03-03 10:32:34 +01:00
|
|
|
|
import java.util.HashMap;
|
2022-02-06 22:10:10 +01:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Server für das WORDLE Spiel.
|
|
|
|
|
*/
|
|
|
|
|
public class WordleServer extends Server {
|
|
|
|
|
|
2022-03-03 11:20:18 +01:00
|
|
|
|
public static final int DEFAULT_PORT = 1000;
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
new WordleServer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private HashMap<String, User> users;
|
|
|
|
|
private Query query;
|
|
|
|
|
|
|
|
|
|
public WordleServer() {
|
|
|
|
|
this(DEFAULT_PORT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public WordleServer(int pPort) {
|
|
|
|
|
super(pPort);
|
|
|
|
|
query = new Query();
|
|
|
|
|
users = new HashMap<>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void processNewConnection(String pClientIP, int pClientPort) {
|
|
|
|
|
String connectionID = pClientIP + ":" + Integer.toString(pClientPort);
|
|
|
|
|
User u = new User(connectionID);
|
|
|
|
|
users.put(connectionID, u);
|
2022-03-18 19:09:19 +01:00
|
|
|
|
send(pClientIP, pClientPort, "+OK Connection to Wordle-Server successful");
|
2022-03-03 11:20:18 +01:00
|
|
|
|
u.setState(1);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void processClosingConnection(String pClientIP, int pClientPort) {
|
2022-03-23 21:01:11 +01:00
|
|
|
|
String connectionID = pClientIP + ":" + Integer.toString(pClientPort);
|
|
|
|
|
User u = users.get(connectionID);
|
|
|
|
|
if (u.loggedIn()) {
|
|
|
|
|
query.pushStats(u);
|
|
|
|
|
}
|
2022-03-03 11:20:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void processMessage(String pClientIP, int pClientPort, String pMessage) {
|
2022-03-03 11:30:40 +01:00
|
|
|
|
String connectionID = pClientIP + ":" + Integer.toString(pClientPort);
|
|
|
|
|
User u = users.get(connectionID);
|
|
|
|
|
u.setConnectionID(connectionID);
|
2022-03-26 00:34:14 +01:00
|
|
|
|
u.getGame().updateGuessCount();
|
2022-03-20 15:56:05 +01:00
|
|
|
|
if (pMessage.length() < 4) {
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR Command not valid in this state");
|
|
|
|
|
} else {
|
|
|
|
|
String m = pMessage.substring(0, 4);
|
|
|
|
|
System.out.println("Message: " + m + " State: " + u.getState());
|
2022-03-23 21:01:11 +01:00
|
|
|
|
if (pMessage.equalsIgnoreCase("QUIT")) {
|
2022-03-20 15:56:05 +01:00
|
|
|
|
send(pClientIP, pClientPort, "+OK Bye");
|
2022-03-26 00:34:14 +01:00
|
|
|
|
closeConnection(pClientIP, pClientPort);
|
2022-03-20 15:56:05 +01:00
|
|
|
|
}
|
|
|
|
|
switch (u.getState()) {
|
|
|
|
|
case 1:
|
|
|
|
|
// Anmeldephase
|
2022-03-25 19:06:43 +01:00
|
|
|
|
if (m.equalsIgnoreCase("USER") && !u.loggedIn()) {
|
2022-03-24 11:33:46 +01:00
|
|
|
|
m = pMessage.substring(5, pMessage.length());
|
2022-03-20 15:56:05 +01:00
|
|
|
|
u.setUsername(m);
|
|
|
|
|
send(pClientIP, pClientPort, "+OK");
|
2022-03-25 19:06:43 +01:00
|
|
|
|
} else if (m.equalsIgnoreCase("PASS") && !u.loggedIn()) {
|
2022-03-24 11:33:46 +01:00
|
|
|
|
m = pMessage.substring(5, pMessage.length());
|
2022-03-20 15:56:05 +01:00
|
|
|
|
u.setPassword(m);
|
2022-03-28 20:58:16 +02:00
|
|
|
|
if (u.loggedIn()) {
|
2022-03-20 15:56:05 +01:00
|
|
|
|
if (query.checkLogin(u.getUsername(), u.getPassword())) {
|
|
|
|
|
send(pClientIP, pClientPort, "+OK welcome");
|
2022-03-24 23:41:45 +01:00
|
|
|
|
query.pullStats(u);
|
2022-03-20 15:56:05 +01:00
|
|
|
|
} else {
|
|
|
|
|
u.setPassword("");
|
|
|
|
|
u.setUsername("");
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR login not valid");
|
|
|
|
|
}
|
2022-03-28 20:58:16 +02:00
|
|
|
|
} else {
|
|
|
|
|
u.setPassword("");
|
|
|
|
|
u.setUsername("");
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR login not valid");
|
2022-03-20 15:56:05 +01:00
|
|
|
|
}
|
|
|
|
|
} else if (m.equalsIgnoreCase("WOTD")) {
|
2022-03-23 21:01:11 +01:00
|
|
|
|
if (!isToday(u.getLastDayWOTDPlayed())) {
|
|
|
|
|
send(pClientIP, pClientPort, "+OK game ready");
|
2022-03-26 00:34:14 +01:00
|
|
|
|
u.getGame().startGame(query.getWOTD(), 1);
|
2022-03-23 21:01:11 +01:00
|
|
|
|
u.setState(2);
|
|
|
|
|
u.updateLastDayWOTDPlayed();
|
2022-03-26 00:34:14 +01:00
|
|
|
|
} else if (u.getGame().getGameStatus() == 1 && u.getGame().getIsWOTD() == 1) {
|
2022-03-23 21:01:11 +01:00
|
|
|
|
send(pClientIP, pClientPort, "+OK Game continues");
|
|
|
|
|
u.setState(2);
|
|
|
|
|
u.updateLastDayWOTDPlayed();
|
|
|
|
|
} else {
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR game finished");
|
|
|
|
|
}
|
2022-03-25 19:06:43 +01:00
|
|
|
|
} else if (m.equalsIgnoreCase("PLAY")) {
|
2022-03-28 20:58:16 +02:00
|
|
|
|
if (u.loggedIn()) {
|
|
|
|
|
if (isToday(u.getLastDayWOTDPlayed())) {
|
|
|
|
|
if (u.getGame().getGameStatus() != 1) {
|
|
|
|
|
u.getGame().startGame(query.getWord(), 0);
|
|
|
|
|
u.setState(2);
|
|
|
|
|
send(pClientIP, pClientPort, "+OK Game ready");
|
|
|
|
|
} else if (u.getGame().getIsWOTD() == 0) {
|
|
|
|
|
u.setState(2);
|
|
|
|
|
send(pClientIP, pClientPort, "+OK Game continues");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR wotd not finished");
|
2022-03-26 00:34:14 +01:00
|
|
|
|
}
|
2022-03-25 19:06:43 +01:00
|
|
|
|
} else {
|
2022-03-28 20:58:16 +02:00
|
|
|
|
send(pClientIP, pClientPort, "-ERR Not logged in");
|
2022-03-25 19:06:43 +01:00
|
|
|
|
}
|
2022-03-20 15:56:05 +01:00
|
|
|
|
} else {
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR Command not valid in this state");
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
// Spielphase
|
|
|
|
|
if (m.equalsIgnoreCase("SEND")) {
|
|
|
|
|
m = pMessage.substring(5, pMessage.length());
|
2022-03-23 21:01:11 +01:00
|
|
|
|
if (m.length() == 5) {
|
|
|
|
|
if (query.checkWord(m)) {
|
2022-03-20 15:56:05 +01:00
|
|
|
|
String a = "+OK " + u.getGame().giveGuess(m);
|
2022-03-23 21:01:11 +01:00
|
|
|
|
switch (u.getGame().getGameStatus()) {
|
|
|
|
|
case (1):
|
|
|
|
|
a += " game continues";
|
|
|
|
|
break;
|
|
|
|
|
case (2):
|
|
|
|
|
a += " game won";
|
2022-03-25 19:06:43 +01:00
|
|
|
|
u.increaseWonInTurnIndex(u.getGame().getGuessesCount() - 1);
|
2022-03-26 00:34:14 +01:00
|
|
|
|
u.setCurrentStreak(u.getCurrentStreak() + 1);
|
|
|
|
|
u.setTimesPlayed(u.getTimesPlayed() + 1);
|
|
|
|
|
u.updateWinPercentage();
|
2022-03-23 21:01:11 +01:00
|
|
|
|
u.setState(3);
|
|
|
|
|
break;
|
|
|
|
|
case (3):
|
|
|
|
|
a += " game lost";
|
2022-03-26 00:34:14 +01:00
|
|
|
|
u.setTimesPlayed(u.getTimesPlayed() + 1);
|
|
|
|
|
u.setCurrentStreak(0);
|
|
|
|
|
u.updateWinPercentage();
|
2022-03-23 21:01:11 +01:00
|
|
|
|
u.setState(3);
|
|
|
|
|
break;
|
2022-03-20 15:56:05 +01:00
|
|
|
|
}
|
|
|
|
|
send(pClientIP, pClientPort, a);
|
|
|
|
|
} else {
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR word not in dict");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR wrong format");
|
|
|
|
|
}
|
|
|
|
|
} else if (m.equalsIgnoreCase("INFO")) {
|
2022-03-25 19:06:43 +01:00
|
|
|
|
bruh();
|
2022-03-24 11:33:46 +01:00
|
|
|
|
String substring = "0";
|
2022-03-25 19:06:43 +01:00
|
|
|
|
if (pMessage.length() > 4) {
|
|
|
|
|
substring += pMessage.substring(4, pMessage.length()).replaceAll(" ", "");
|
2022-03-24 11:33:46 +01:00
|
|
|
|
}
|
|
|
|
|
int n = Integer.parseInt("0" + substring);
|
|
|
|
|
String[] guesses = u.getGame().getGuesses();
|
|
|
|
|
if (6 >= n && n >= 1) {
|
2022-03-25 19:06:43 +01:00
|
|
|
|
if (guesses[n - 1] != null) {
|
|
|
|
|
String guess = guesses[n - 1];
|
|
|
|
|
send(pClientIP, pClientPort, "+OK " + guess + " " + u.getGame().checkGuess(guess));
|
|
|
|
|
} else {
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR word not typed yet");
|
|
|
|
|
}
|
2022-03-24 11:33:46 +01:00
|
|
|
|
} else if (n == 0) {
|
2022-03-26 00:34:14 +01:00
|
|
|
|
String a = "+OK";
|
2022-03-25 19:06:43 +01:00
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
|
if (guesses[i] != null) {
|
2022-03-26 00:34:14 +01:00
|
|
|
|
send(pClientIP, pClientPort, guesses[i] + " " + u.getGame().checkGuess(guesses[i]));
|
2022-03-24 11:33:46 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-03-26 00:34:14 +01:00
|
|
|
|
send(pClientIP, pClientPort, ".");
|
2022-03-03 11:30:40 +01:00
|
|
|
|
}
|
2022-03-20 15:56:05 +01:00
|
|
|
|
} else if (m.equalsIgnoreCase("EXIT")) {
|
2022-03-25 19:06:43 +01:00
|
|
|
|
u.updateLastDayWOTDPlayed();
|
2022-03-24 11:33:46 +01:00
|
|
|
|
u.getGame().stopGame();
|
|
|
|
|
u.setState(3);
|
2022-03-25 19:06:43 +01:00
|
|
|
|
send(pClientIP, pClientPort, "+OK");
|
2022-03-20 15:56:05 +01:00
|
|
|
|
} else {
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR Command not valid in this state");
|
2022-03-03 11:20:18 +01:00
|
|
|
|
}
|
2022-03-20 15:56:05 +01:00
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
// Zwischenphase(Angemeldet)
|
|
|
|
|
if (m.equalsIgnoreCase("STAT")) {
|
2022-03-26 00:34:14 +01:00
|
|
|
|
send(pClientIP, pClientPort, "+OK");
|
|
|
|
|
send(pClientIP, pClientPort, "times played: " + u.getTimesPlayed());
|
|
|
|
|
send(pClientIP, pClientPort, "times played: " + u.getTimesPlayed());
|
|
|
|
|
send(pClientIP, pClientPort, "win percentage: " + u.getWinPercentage());
|
|
|
|
|
send(pClientIP, pClientPort, "current streak: " + u.getCurrentStreak());
|
|
|
|
|
send(pClientIP, pClientPort, "max streak: " + u.getMaxStreak());
|
|
|
|
|
send(pClientIP, pClientPort, "won in 1 turn: " + u.getWonInTurnIndex(0));
|
|
|
|
|
send(pClientIP, pClientPort, "won in 2 turn: " + u.getWonInTurnIndex(1));
|
|
|
|
|
send(pClientIP, pClientPort, "won in 3 turn: " + u.getWonInTurnIndex(2));
|
|
|
|
|
send(pClientIP, pClientPort, "won in 4 turn: " + u.getWonInTurnIndex(3));
|
|
|
|
|
send(pClientIP, pClientPort, "won in 5 turn: " + u.getWonInTurnIndex(4));
|
|
|
|
|
send(pClientIP, pClientPort, "won in 6 turn: " + u.getWonInTurnIndex(5));
|
2022-03-28 20:58:16 +02:00
|
|
|
|
} else if (m.equalsIgnoreCase("PLAY")) {
|
|
|
|
|
if (u.loggedIn()) {
|
|
|
|
|
if (isToday(u.getLastDayWOTDPlayed())) {
|
|
|
|
|
if (u.getGame().getGameStatus() != 1) {
|
|
|
|
|
u.getGame().startGame(query.getWord(), 0);
|
|
|
|
|
u.setState(2);
|
|
|
|
|
send(pClientIP, pClientPort, "+OK Game ready");
|
|
|
|
|
} else if (u.getGame().getIsWOTD() == 0) {
|
|
|
|
|
u.setState(2);
|
|
|
|
|
send(pClientIP, pClientPort, "+OK Game continues");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
send(pClientIP, pClientPort, "-ERR wotd not finished");
|
2022-03-26 00:34:14 +01:00
|
|
|
|
}
|
2022-03-20 15:56:05 +01:00
|
|
|
|
} else {
|
2022-03-28 20:58:16 +02:00
|
|
|
|
send(pClientIP, pClientPort, "-ERR not logged in");
|
2022-03-20 15:56:05 +01:00
|
|
|
|
}
|
2022-03-12 19:51:30 +01:00
|
|
|
|
} else {
|
2022-03-20 15:56:05 +01:00
|
|
|
|
send(pClientIP, pClientPort, "-ERR Command not valid in this state");
|
2022-03-12 19:51:30 +01:00
|
|
|
|
}
|
2022-03-20 15:56:05 +01:00
|
|
|
|
break;
|
2022-03-12 19:51:30 +01:00
|
|
|
|
}
|
2022-03-03 11:20:18 +01:00
|
|
|
|
}
|
2022-03-23 21:01:11 +01:00
|
|
|
|
|
2022-03-03 11:20:18 +01:00
|
|
|
|
}
|
2022-03-20 15:56:05 +01:00
|
|
|
|
|
2022-03-25 19:06:43 +01:00
|
|
|
|
/**
|
|
|
|
|
* Gibt zur<EFBFBD>ck ob es sich bei dem im Parameter angegebenen Tag um den heutigen
|
|
|
|
|
* handelt
|
|
|
|
|
*
|
|
|
|
|
* @param pDay ,die Anzahl der Tage seit dem Epoch-Day
|
|
|
|
|
* @return true oder false
|
|
|
|
|
*/
|
2022-03-12 19:51:30 +01:00
|
|
|
|
public boolean isToday(int pDay) {
|
2022-03-23 21:01:11 +01:00
|
|
|
|
return pDay == (int) ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now());
|
2022-03-12 19:51:30 +01:00
|
|
|
|
}
|
2022-03-25 19:06:43 +01:00
|
|
|
|
|
|
|
|
|
public void bruh() {
|
|
|
|
|
|
|
|
|
|
}
|
2022-02-06 22:10:10 +01:00
|
|
|
|
}
|