diff --git a/src/at/nanopenguin/mtcg/application/Battle.java b/src/at/nanopenguin/mtcg/application/Battle.java index 2e3dd0b..52b31df 100644 --- a/src/at/nanopenguin/mtcg/application/Battle.java +++ b/src/at/nanopenguin/mtcg/application/Battle.java @@ -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 combatants; @Getter private volatile List 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); } } diff --git a/src/at/nanopenguin/mtcg/application/BattleHandler.java b/src/at/nanopenguin/mtcg/application/BattleHandler.java index c9914c6..b6c0d9f 100644 --- a/src/at/nanopenguin/mtcg/application/BattleHandler.java +++ b/src/at/nanopenguin/mtcg/application/BattleHandler.java @@ -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(); + battle.notify(); + } return battle.getLog().toArray(new String[0]); } } diff --git a/src/at/nanopenguin/mtcg/application/Combatant.java b/src/at/nanopenguin/mtcg/application/Combatant.java index 767e399..663042a 100644 --- a/src/at/nanopenguin/mtcg/application/Combatant.java +++ b/src/at/nanopenguin/mtcg/application/Combatant.java @@ -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 deck = new ArrayList(); 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(1, SqlArithmeticOperators.ADD)) + .parameter("elo = elo", new Pair( + win ? 3 : 5, + win ? SqlArithmeticOperators.ADD : SqlArithmeticOperators.SUBTRACT)) // stupid hack to use my own code + .condition("uuid", userUuid) + .executeUpdate(); + }; } diff --git a/src/at/nanopenguin/mtcg/application/Trade.java b/src/at/nanopenguin/mtcg/application/Trade.java index 1ed537e..79c63a4 100644 --- a/src/at/nanopenguin/mtcg/application/Trade.java +++ b/src/at/nanopenguin/mtcg/application/Trade.java @@ -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; diff --git a/src/at/nanopenguin/mtcg/application/User.java b/src/at/nanopenguin/mtcg/application/User.java index 5f81969..4684c4f 100644 --- a/src/at/nanopenguin/mtcg/application/User.java +++ b/src/at/nanopenguin/mtcg/application/User.java @@ -67,7 +67,7 @@ public class User { .column("elo") .column("wins") .column("losses") - .postfix(" ORDER BY elo"); + .postfix(" ORDER BY elo DESC"); ArrayList stats = new ArrayList<>(); for (val row : dbQueryBuilder.executeQuery()) { diff --git a/src/at/nanopenguin/mtcg/application/service/GameService.java b/src/at/nanopenguin/mtcg/application/service/GameService.java index 0b3cff1..768db05 100644 --- a/src/at/nanopenguin/mtcg/application/service/GameService.java +++ b/src/at/nanopenguin/mtcg/application/service/GameService.java @@ -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); diff --git a/src/at/nanopenguin/mtcg/db/DbQuery.java b/src/at/nanopenguin/mtcg/db/DbQuery.java index 7594fb7..abd5059 100644 --- a/src/at/nanopenguin/mtcg/db/DbQuery.java +++ b/src/at/nanopenguin/mtcg/db/DbQuery.java @@ -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> result = new ArrayList<>(); diff --git a/src/at/nanopenguin/mtcg/db/SqlArithmeticOperators.java b/src/at/nanopenguin/mtcg/db/SqlArithmeticOperators.java new file mode 100644 index 0000000..6301743 --- /dev/null +++ b/src/at/nanopenguin/mtcg/db/SqlArithmeticOperators.java @@ -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; +} diff --git a/src/at/nanopenguin/mtcg/db/SqlComparisonOperator.java b/src/at/nanopenguin/mtcg/db/SqlComparisonOperator.java index 3f2b4b3..fbc3969 100644 --- a/src/at/nanopenguin/mtcg/db/SqlComparisonOperator.java +++ b/src/at/nanopenguin/mtcg/db/SqlComparisonOperator.java @@ -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; } diff --git a/src/at/nanopenguin/mtcg/db/SqlCompoundOperator.java b/src/at/nanopenguin/mtcg/db/SqlCompoundOperator.java new file mode 100644 index 0000000..c30b1bd --- /dev/null +++ b/src/at/nanopenguin/mtcg/db/SqlCompoundOperator.java @@ -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; +} diff --git a/src/at/nanopenguin/mtcg/db/SqlOperator.java b/src/at/nanopenguin/mtcg/db/SqlOperator.java new file mode 100644 index 0000000..5790479 --- /dev/null +++ b/src/at/nanopenguin/mtcg/db/SqlOperator.java @@ -0,0 +1,8 @@ +package at.nanopenguin.mtcg.db; + +import lombok.RequiredArgsConstructor; + +public interface SqlOperator { + default String operator() { return "="; }; +} +