Files
wordle/WordleServer.java
maxlm128 81e54b9d39 Ifception der Wordle-Server Klasse
An der Bearbeitung der Abfragen gearbeitet, versucht die giveGuess-Methode zu fixen
2022-03-20 15:56:05 +01:00

161 lines
4.8 KiB
Java

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<String, User> 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);
}
}