import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.util.HashMap; /** * Server für das WORDLE Spiel. */ public class WordleServer extends Server { public static final int DEFAULT_PORT = 1000; public static void main(String[] args) { new WordleServer(); } private HashMap 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); send(pClientIP, pClientPort, "+OK Connection to Wordle-Server successful"); u.setState(1); } @Override public void processClosingConnection(String pClientIP, int pClientPort) { String connectionID = pClientIP + ":" + Integer.toString(pClientPort); User u = users.get(connectionID); if (u.loggedIn()) { query.pushStats(u); } } @Override public void processMessage(String pClientIP, int pClientPort, String pMessage) { String connectionID = pClientIP + ":" + Integer.toString(pClientPort); User u = users.get(connectionID); u.setConnectionID(connectionID); u.getGame().updateGuessCount(); 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()); if (pMessage.equalsIgnoreCase("QUIT")) { send(pClientIP, pClientPort, "+OK Bye"); closeConnection(pClientIP, pClientPort); } switch (u.getState()) { case 1: // Anmeldephase if (m.equalsIgnoreCase("USER") && !u.loggedIn()) { m = pMessage.substring(5, pMessage.length()); u.setUsername(m); send(pClientIP, pClientPort, "+OK"); } else if (m.equalsIgnoreCase("PASS") && !u.loggedIn()) { m = pMessage.substring(5, pMessage.length()); u.setPassword(m); if (u.loggedIn()) { if (query.checkLogin(u.getUsername(), u.getPassword())) { send(pClientIP, pClientPort, "+OK welcome"); query.pullStats(u); } else { u.setPassword(""); u.setUsername(""); send(pClientIP, pClientPort, "-ERR login not valid"); } } else { u.setPassword(""); u.setUsername(""); send(pClientIP, pClientPort, "-ERR login not valid"); } } else if (m.equalsIgnoreCase("WOTD")) { if (!isToday(u.getLastDayWOTDPlayed())) { send(pClientIP, pClientPort, "+OK game ready"); u.getGame().startGame(query.getWOTD(), 1); u.setState(2); u.updateLastDayWOTDPlayed(); } else if (u.getGame().getGameStatus() == 1 && u.getGame().getIsWOTD() == 1) { send(pClientIP, pClientPort, "+OK Game continues"); u.setState(2); u.updateLastDayWOTDPlayed(); } else { send(pClientIP, pClientPort, "-ERR game finished"); } } 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"); } } else { send(pClientIP, pClientPort, "-ERR Not logged in"); } } 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()); if (m.length() == 5) { if (query.checkWord(m)) { String a = "+OK " + u.getGame().giveGuess(m); switch (u.getGame().getGameStatus()) { case (1): a += " game continues"; break; case (2): a += " game won"; u.increaseWonInTurnIndex(u.getGame().getGuessesCount() - 1); u.setCurrentStreak(u.getCurrentStreak() + 1); u.setTimesPlayed(u.getTimesPlayed() + 1); u.updateWinPercentage(); u.setState(3); break; case (3): a += " game lost"; u.setTimesPlayed(u.getTimesPlayed() + 1); u.setCurrentStreak(0); u.updateWinPercentage(); u.setState(3); break; } 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")) { bruh(); String substring = "0"; if (pMessage.length() > 4) { substring += pMessage.substring(4, pMessage.length()).replaceAll(" ", ""); } int n = Integer.parseInt("0" + substring); String[] guesses = u.getGame().getGuesses(); if (6 >= n && n >= 1) { 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"); } } else if (n == 0) { String a = "+OK"; for (int i = 0; i < 5; i++) { if (guesses[i] != null) { send(pClientIP, pClientPort, guesses[i] + " " + u.getGame().checkGuess(guesses[i])); } } send(pClientIP, pClientPort, "."); } } else if (m.equalsIgnoreCase("EXIT")) { u.updateLastDayWOTDPlayed(); u.getGame().stopGame(); u.setState(3); send(pClientIP, pClientPort, "+OK"); } else { send(pClientIP, pClientPort, "-ERR Command not valid in this state"); } break; case 3: // Zwischenphase(Angemeldet) if (m.equalsIgnoreCase("STAT")) { 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)); } 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"); } } else { send(pClientIP, pClientPort, "-ERR not logged in"); } } else { send(pClientIP, pClientPort, "-ERR Command not valid in this state"); } break; } } } /** * Gibt zurü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 */ public boolean isToday(int pDay) { return pDay == (int) ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now()); } public void bruh() { } }