fixed battle handler, implemented basis for battle

~2h work
This commit is contained in:
Benedikt Galbavy 2024-01-19 00:01:36 +01:00
parent 1517253bc7
commit 1b450f06a1
11 changed files with 103 additions and 21 deletions

View File

@ -2,16 +2,19 @@ package at.nanopenguin.mtcg.application;
import at.nanopenguin.mtcg.Pair;
import lombok.Getter;
import lombok.Setter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Battle {
private Pair<Combatant, Combatant> combatants;
@Getter
private volatile List<String> log = new ArrayList<>();
@Getter
private boolean waiting = true;
@Getter @Setter
private boolean firstPlayer = true;
public Battle(Combatant combatant) {
this.combatants = new Pair<>(combatant, null);
@ -21,7 +24,12 @@ public class Battle {
this.combatants.setRight(combatant);
}
public void start() {
public void start() throws SQLException {
// placeholder
boolean leftWins = new Random().nextBoolean();
this.combatants.left().updateStats(leftWins);
this.combatants.right().updateStats(!leftWins);
}
}

View File

@ -32,7 +32,8 @@ public class BattleHandler {
synchronized (battle) {
this.lock.unlock();
if (battle.isWaiting()) {
if (battle.isFirstPlayer()) {
battle.setFirstPlayer(false);
try {
battle.wait();
} catch (InterruptedException e) {
@ -45,9 +46,9 @@ public class BattleHandler {
battle.addCombatant(new Combatant(userUuid));
battle.start();
}
battle.notify();
}
return battle.getLog().toArray(new String[0]);
}
}

View File

@ -1,6 +1,8 @@
package at.nanopenguin.mtcg.application;
import at.nanopenguin.mtcg.Pair;
import at.nanopenguin.mtcg.application.service.schemas.Card;
import at.nanopenguin.mtcg.db.*;
import java.sql.SQLException;
import java.util.ArrayList;
@ -9,11 +11,23 @@ import java.util.List;
import java.util.UUID;
public class Combatant {
private UUID userUuid;
private final UUID userUuid;
private List<Card> deck = new ArrayList<Card>();
public Combatant(UUID userUuid) throws SQLException {
this.userUuid = userUuid;
this.deck = Arrays.asList(UserCards.get(userUuid, true));
}
public void updateStats(boolean win) throws SQLException {
DbQuery.builder()
.command(SqlCommand.UPDATE)
.table(Table.USERS)
.parameter(win ? "wins = wins" : "losses = losses", new Pair<Integer, SqlOperator>(1, SqlArithmeticOperators.ADD))
.parameter("elo = elo", new Pair<Integer, SqlOperator>(
win ? 3 : 5,
win ? SqlArithmeticOperators.ADD : SqlArithmeticOperators.SUBTRACT)) // stupid hack to use my own code
.condition("uuid", userUuid)
.executeUpdate();
};
}

View File

@ -2,10 +2,7 @@ package at.nanopenguin.mtcg.application;
import at.nanopenguin.mtcg.Pair;
import at.nanopenguin.mtcg.application.service.schemas.TradingDeal;
import at.nanopenguin.mtcg.db.DbQuery;
import at.nanopenguin.mtcg.db.SqlCommand;
import at.nanopenguin.mtcg.db.SqlComparisonOperator;
import at.nanopenguin.mtcg.db.Table;
import at.nanopenguin.mtcg.db.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.val;

View File

@ -67,7 +67,7 @@ public class User {
.column("elo")
.column("wins")
.column("losses")
.postfix(" ORDER BY elo");
.postfix(" ORDER BY elo DESC");
ArrayList<UserStats> stats = new ArrayList<>();
for (val row : dbQueryBuilder.executeQuery()) {

View File

@ -1,8 +1,6 @@
package at.nanopenguin.mtcg.application.service;
import at.nanopenguin.mtcg.application.SessionHandler;
import at.nanopenguin.mtcg.application.TokenValidity;
import at.nanopenguin.mtcg.application.User;
import at.nanopenguin.mtcg.application.*;
import at.nanopenguin.mtcg.http.HttpMethod;
import at.nanopenguin.mtcg.http.HttpRequest;
import at.nanopenguin.mtcg.http.HttpStatus;
@ -32,7 +30,9 @@ public class GameService implements Service {
}
if (request.getPath().split("/")[1].equals("battles") && request.getMethod() == HttpMethod.POST) {
return new Response(HttpStatus.NOT_IMPLEMENTED);
return new Response(HttpStatus.OK,
"text/plain",
String.join(System.lineSeparator(), BattleHandler.getInstance().startBattle(userUuid)));
}
return new Response(HttpStatus.NOT_FOUND);

View File

@ -104,11 +104,11 @@ public final class DbQuery {
continue;
}
if(parameter.getValue() instanceof Pair && ((Pair<?, ?>) parameter.getValue()).right() instanceof SqlComparisonOperator sqlComparisonOperator) {
if (parameter.getValue() instanceof Pair && ((Pair<?, ?>) parameter.getValue()).right() instanceof SqlOperator sqlOperator) {
stringBuilder
.append(parameter.getKey())
.append(" ")
.append(sqlComparisonOperator.Operator)
.append(sqlOperator.operator())
.append(" ?");
continue;
}
@ -132,6 +132,10 @@ public final class DbQuery {
new PreparedStatementExecutor(connection.prepareStatement(sql));
int i = 1;
for (val value : parameterValues) {
if (value instanceof Pair<?,?>) {
statementExecutor.setObject(i++, ((Pair<?, ?>) value).left());
continue;
}
if (value instanceof List<?>) {
for (Object o : (List<?>) value)
statementExecutor.setObject(i++, o);
@ -140,6 +144,7 @@ public final class DbQuery {
statementExecutor.setObject(i++, value);
}
System.out.println(sql);
return statementExecutor.executeUpdate();
}
}
@ -155,6 +160,10 @@ public final class DbQuery {
new PreparedStatementExecutor(connection.prepareStatement(sql));
int i = 1;
for (val value : parameterValues) {
if (value instanceof Pair<?,?>) {
statementExecutor.setObject(i++, ((Pair<?, ?>) value).left());
continue;
}
if (value instanceof List<?>) {
for (Object o : (List<?>) value)
statementExecutor.setObject(i++, o);
@ -163,6 +172,7 @@ public final class DbQuery {
statementExecutor.setObject(i++, value);
}
System.out.println(sql);
return statementExecutor.execute();
}
}
@ -190,6 +200,7 @@ public final class DbQuery {
statementExecutor.setObject(i++, value);
}
System.out.println(sql);
try (ResultSet resultSet = statementExecutor.executeQuery()) {
List<Map<String, Object>> result = new ArrayList<>();

View File

@ -0,0 +1,18 @@
package at.nanopenguin.mtcg.db;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;
@RequiredArgsConstructor
public enum SqlArithmeticOperators implements SqlOperator {
ADD("+"),
SUBTRACT("-"),
MULTIPLY("*"),
DIVIDE("/"),
MODULO("%");
@Accessors(fluent = true)
@Getter(onMethod = @__(@Override))
public final String operator;
}

View File

@ -1,9 +1,11 @@
package at.nanopenguin.mtcg.db;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;
@RequiredArgsConstructor
public enum SqlComparisonOperator {
public enum SqlComparisonOperator implements SqlOperator {
EQUAL("="),
GREATER_THAN(">"),
LESS_THAN("<"),
@ -11,6 +13,7 @@ public enum SqlComparisonOperator {
LESS_EQUAL("<="),
NOT_EQUAL("!=");
public final String Operator;
@Accessors(fluent = true)
@Getter(onMethod = @__(@Override))
public final String operator;
}

View File

@ -0,0 +1,22 @@
package at.nanopenguin.mtcg.db;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;
@RequiredArgsConstructor
public enum SqlCompoundOperator implements SqlOperator {
// this class does not work with PostgreSQL https://c.tenor.com/MYZgsN2TDJAAAAAC/tenor.gif
ADD("+="),
SUBTRACT("-="),
MULTIPLY("*="),
DIVIDE("/="),
MODULO("%="),
BIT_AND("&="),
BIT_OR("|*="),
BIT_XOR("^-=");
@Accessors(fluent = true)
@Getter(onMethod = @__(@Override))
public final String operator;
}

View File

@ -0,0 +1,8 @@
package at.nanopenguin.mtcg.db;
import lombok.RequiredArgsConstructor;
public interface SqlOperator {
default String operator() { return "="; };
}