import java.time.Instant; 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 DatabaseConnector db; private HashMap users; private Query query; public WordleServer() { this(DEFAULT_PORT); } public WordleServer(int pPort) { super(pPort); query = new Query(); db = new DatabaseConnector("", 0, "wordle.db", "", ""); 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) { } @Override public void processMessage(String pClientIP, int pClientPort, String pMessage) { String connectionID = pClientIP + ":" + Integer.toString(pClientPort); User u = users.get(connectionID); u.setConnectionID(connectionID); 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.equals("QUIT")) { send(pClientIP, pClientPort, "+OK Bye"); close(); } switch (u.getState()) { case 1: // Anmeldephase if (m.equalsIgnoreCase("USER")) { m = pMessage.substring(5, pMessage.length() - 1); u.setUsername(m); send(pClientIP, pClientPort, "+OK"); } else if (m.equalsIgnoreCase("PASS")) { m = pMessage.substring(5, pMessage.length() - 1); u.setPassword(m); if (u.getPassword() != null && u.getUsername() != null) { if (query.checkLogin(u.getUsername(), u.getPassword())) { send(pClientIP, pClientPort, "+OK welcome"); u.setState(3); } else { u.setPassword(""); u.setUsername(""); send(pClientIP, pClientPort, "-ERR login not valid"); } } } else if (m.equalsIgnoreCase("WOTD")) { // TODO: Prüfen, wie weit der Spieler schon mit dem Spiel ist u.getGame().startGame(query.getWOTD()); u.setState(2); send(pClientIP, pClientPort, "+OK Game ready"); } 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); if(!u.getGame().isGameRunning()) { if(u.getGame().won()) { a += " game won"; } else { a += " game lost"; } } else { a += " game continues"; } 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")) { int n = Integer.parseInt("0" + pMessage.substring(4, pMessage.length()).replaceAll(" ", "")); if (n != 0) { } else { } } else if (m.equalsIgnoreCase("EXIT")) { } else { send(pClientIP, pClientPort, "-ERR Command not valid in this state"); } break; case 3: // Zwischenphase(Angemeldet) if (m.equalsIgnoreCase("STAT")) { send(pClientIP, pClientPort, "+OK" + '\n' + "times played: " + u.getTimesPlayed() + '\n' + "win percentage: " + u.getWinPercentage() + '\n' + "current streak: " + u.getCurrentStreak() + '\n' + "max streak: " + u.getMaxStreak() + '\n' + "won in 1 turn: " + u.getWonInTurnIndex(1) + '\n' + "won in 2 turn: " + u.getWonInTurnIndex(2) + '\n' + "won in 3 turn: " + u.getWonInTurnIndex(3) + '\n' + "won in 4 turn: " + u.getWonInTurnIndex(4) + '\n' + "won in 5 turn: " + u.getWonInTurnIndex(5) + '\n' + "won in 6 turn: " + u.getWonInTurnIndex(6) + '\n' + "."); } else if (m.equalsIgnoreCase("PLAY")) { if (isToday(u.getLastDayWOTDFinished())) { u.getGame().startGame(query.getWord()); u.setState(2); send(pClientIP, pClientPort, "+OK Game ready"); } else { send(pClientIP, pClientPort, "-ERR wotd not finished"); } } else { send(pClientIP, pClientPort, "-ERR Command not valid in this state"); } break; } } } public boolean isToday(int pDay) { LocalDate now = LocalDate.now(); LocalDate epoch = LocalDate.ofEpochDay(0); return pDay == ChronoUnit.DAYS.between(epoch, now); } }