From 326016a93ac6062d70ecc202210dad84629c6be6 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Sat, 22 Apr 2023 14:34:24 +0200 Subject: [PATCH] GL Hot Fix --- .../peeratcode/bonus/discord/Bot.java | 8 +++--- .../peeratcode/model/Completion.java | 2 +- .../jeffcheasey88/peeratcode/model/Group.java | 27 +++++++++++-------- .../peeratcode/repository/DatabaseQuery.java | 12 ++++----- .../repository/DatabaseRepository.java | 24 ++++++++--------- .../peeratcode/routes/PuzzleElement.java | 19 ++++++++++++- .../peeratcode/routes/PuzzleResponse.java | 26 +++++++++++++++--- .../peeratcode/routes/groups/GroupCreate.java | 4 +-- .../peeratcode/routes/groups/GroupJoin.java | 6 ++--- .../peeratcode/routes/groups/GroupQuit.java | 4 +-- 10 files changed, 87 insertions(+), 45 deletions(-) diff --git a/src/be/jeffcheasey88/peeratcode/bonus/discord/Bot.java b/src/be/jeffcheasey88/peeratcode/bonus/discord/Bot.java index d6cfcf5..e84b629 100644 --- a/src/be/jeffcheasey88/peeratcode/bonus/discord/Bot.java +++ b/src/be/jeffcheasey88/peeratcode/bonus/discord/Bot.java @@ -40,8 +40,8 @@ public class Bot extends Thread{ List groups = this.repo.getAllGroups(); for(Group group : groups){ Integer chapter = group.getLinkToChapter(); - Integer puzzle = group.getLinkToPuzzle(); - if((chapter == null || chapter == 0) && (puzzle == null || puzzle == 0)) continue; +// Integer puzzle = group.getLinkToPuzzle(); + if((chapter == null || chapter == 0)) continue; boolean contains = false; for(VoiceChannel channel : event.getVoiceChannels()){ if(channel.getName().equalsIgnoreCase(group.getName())){ @@ -57,8 +57,8 @@ public class Bot extends Thread{ locker.lock(key); Group group = locker.getValue(key); Integer chapter = group.getLinkToChapter(); - Integer puzzle = group.getLinkToPuzzle(); - if((chapter == null || chapter == 0) && (puzzle == null || puzzle == 0)) continue; +// Integer puzzle = group.getLinkToPuzzle(); + if((chapter == null || chapter == 0)) continue; boolean contains = false; for(VoiceChannel channel : event.getVoiceChannels()){ if(channel.getName().equalsIgnoreCase(group.getName())){ diff --git a/src/be/jeffcheasey88/peeratcode/model/Completion.java b/src/be/jeffcheasey88/peeratcode/model/Completion.java index ec9f3d8..fb81496 100644 --- a/src/be/jeffcheasey88/peeratcode/model/Completion.java +++ b/src/be/jeffcheasey88/peeratcode/model/Completion.java @@ -47,7 +47,7 @@ public class Completion { } public void addTry(Puzzle currentPuzzle, byte[] response) { - if (score <= 0) { + if (score <= 0){ tries++; if (response != null && Arrays.equals(currentPuzzle.getSoluce(), response)) { if (tries > 1) { // Loose 5% each try with a minimum of 1 for score diff --git a/src/be/jeffcheasey88/peeratcode/model/Group.java b/src/be/jeffcheasey88/peeratcode/model/Group.java index 0fa288b..1a30a45 100644 --- a/src/be/jeffcheasey88/peeratcode/model/Group.java +++ b/src/be/jeffcheasey88/peeratcode/model/Group.java @@ -10,21 +10,26 @@ import org.json.simple.JSONObject; public class Group implements Comparable { private String name; private Integer linkToChapter; - private Integer linkToPuzzle; +// private Integer linkToPuzzle; private List players; + + @Override + public String toString(){ + return "Group[name="+name+", chapter="+linkToChapter+"]"; + } public Group(JSONObject json) { this.name = (String) json.get("name"); if (json.containsKey("chapter")) this.linkToChapter = ((Number) json.get("chapter")).intValue(); - if (json.containsKey("puzzle")) - this.linkToPuzzle = ((Number) json.get("puzzle")).intValue(); +// if (json.containsKey("puzzle")) +// this.linkToPuzzle = ((Number) json.get("puzzle")).intValue(); } public Group(String name, Integer initChap, Integer initPuzz) { this.name = name; this.linkToChapter = initChap; - this.linkToPuzzle = initPuzz; +// this.linkToPuzzle = initPuzz; } public void addPlayer(Player newPlayer) { @@ -71,9 +76,9 @@ public class Group implements Comparable { return linkToChapter; } - public Integer getLinkToPuzzle() { - return linkToPuzzle; - } +// public Integer getLinkToPuzzle() { +// return linkToPuzzle; +// } public JSONObject toJson() { return this.toJson(null); @@ -86,8 +91,8 @@ public class Group implements Comparable { groupJSON.put("rank", rank); else if (linkToChapter != null) groupJSON.put("chapter", linkToChapter); - else if (linkToPuzzle != null) - groupJSON.put("puzzle", linkToPuzzle); +// else if (linkToPuzzle != null) +// groupJSON.put("puzzle", linkToPuzzle); if (players != null) { JSONArray groupsPlayerJSON = new JSONArray(); for (Player p : players) { @@ -124,12 +129,12 @@ public class Group implements Comparable { } @Override - public boolean equals(Object obj) { + public boolean equals(Object obj){ if(obj == this) return true; if(obj == null) return false; if(!(obj instanceof Group)) return false; Group other = (Group) obj; - return this.name.equals(other.name) && integerEquals(this.linkToChapter, other.linkToChapter) && integerEquals(this.linkToPuzzle, other.linkToPuzzle); + return this.name.equals(other.name) && integerEquals(this.linkToChapter, other.linkToChapter); // && integerEquals(this.linkToPuzzle, other.linkToPuzzle); } private boolean integerEquals(Integer a, Integer b){ diff --git a/src/be/jeffcheasey88/peeratcode/repository/DatabaseQuery.java b/src/be/jeffcheasey88/peeratcode/repository/DatabaseQuery.java index e9ebc9f..0039611 100644 --- a/src/be/jeffcheasey88/peeratcode/repository/DatabaseQuery.java +++ b/src/be/jeffcheasey88/peeratcode/repository/DatabaseQuery.java @@ -21,15 +21,15 @@ public enum DatabaseQuery { // GROUPS ALL_GROUPS("SELECT * FROM groups"), - GET_GROUP_FOR_PLAYER("SELECT g.* FROM groups g JOIN containsGroups cg ON cg.fk_group = g.id_group WHERE cg.fk_player = ? AND g.fk_chapter = ? AND g.fk_puzzle = ?"), - GET_GROUP_ID_BY_DATA("SELECT id_group FROM groups WHERE name = ? AND (fk_chapter = ? OR fk_puzzle = ?)"), - INSERT_GROUP("INSERT INTO groups (name, fk_chapter, fk_puzzle) VALUES (?,?,?)"), + GET_GROUP_FOR_PLAYER("SELECT g.* FROM groups g JOIN containsGroups cg ON cg.fk_group = g.id_group WHERE cg.fk_player = ? AND g.fk_chapter = ?"), // AND g.fk_puzzle = ? + GET_GROUP_ID_BY_DATA("SELECT id_group FROM groups WHERE name = ? AND (fk_chapter = ?)"), // OR fk_puzzle = ? + INSERT_GROUP("INSERT INTO groups (name, fk_chapter) VALUES (?,?)"), INSERT_PLAYER_IN_GROUP("INSERT INTO containsGroups (fk_player, fk_group) VALUES (?,?)"), LEAVE_GROUP("DELETE FROM containsGroups WHERE fk_player = ? AND fk_group = ?"), // LEADERBOARD ALL_PLAYERS_FOR_LEADERBOARD( - "select p.*, scores.*, g.* from players p ,(SELECT fk_player, SUM(c.score) AS score, COUNT(c.id_completion) AS completions, SUM(c.tries) AS tries, rank() over(ORDER BY score DESC) AS rank FROM completions c GROUP BY c.fk_player) AS scores LEFT JOIN containsGroups cg ON scores.fk_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group WHERE p.id_player = scores.fk_player ORDER BY g.fk_chapter, g.fk_puzzle"), + "select p.*, scores.*, g.* from players p ,(SELECT fk_player, SUM(c.score) AS score, COUNT(c.id_completion) AS completions, SUM(c.tries) AS tries, rank() over(ORDER BY score DESC) AS rank FROM completions c GROUP BY c.fk_player) AS scores LEFT JOIN containsGroups cg ON scores.fk_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group WHERE p.id_player = scores.fk_player ORDER BY g.fk_chapter"), ALL_GROUP_FOR_CHAPTER_LEADERBOARD( "SELECT g.*, pl.pseudo, co.score, co.tries FROM groups g LEFT JOIN containsGroups cg ON g.id_group = cg.fk_group LEFT JOIN players pl ON cg.fk_player = pl.id_player LEFT JOIN completions co ON pl.id_player = co.fk_player WHERE fk_chapter = ? AND (co.fk_puzzle IN (SELECT id_puzzle FROM puzzles puz WHERE puz.fk_chapter = g.fk_chapter) OR co.score IS NULL);"), @@ -46,8 +46,8 @@ public enum DatabaseQuery { // COMPLETIONS GET_COMPLETION( - "SELECT id_completion, tries, fileName, score FROM completions WHERE fk_puzzle = ? AND fk_player = ?"), - GET_COMPLETION_GROUP("SELECT c.tries, c.score\r\n" + "SELECT * FROM completions WHERE fk_puzzle = ? AND fk_player = ?"), + GET_COMPLETION_GROUP("SELECT c.*\r\n" + "FROM completions c\r\n" + "JOIN containsGroups cG on c.fk_player = cG.fk_player\r\n" + "JOIN containsGroups cGs on cGs.fk_group = cG.fk_group\r\n" diff --git a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java index c5b1bc4..6ae3820 100644 --- a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java +++ b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java @@ -115,12 +115,12 @@ public class DatabaseRepository { chapterResult.getTimestamp("start_date"), chapterResult.getTimestamp("end_date")); } - private Completion makeCompletion(int playerId, int puzzleId, ResultSet completionResult) throws SQLException { + private Completion makeCompletion(ResultSet completionResult) throws SQLException { String name = null; if (hasColumn(completionResult, "fileName")) name = completionResult.getString("fileName"); - return new Completion(playerId, puzzleId, completionResult.getInt("tries"), + return new Completion(completionResult.getInt("fk_player"), completionResult.getInt("fk_puzzle"), completionResult.getInt("tries"), name, completionResult.getInt("score")); } @@ -232,7 +232,7 @@ public class DatabaseRepository { stmt.setInt(2, puzzle); ResultSet result = stmt.executeQuery(); if (result.next()) - return makeCompletion(user, puzzle, result); + return makeCompletion(result); } catch (SQLException e) { e.printStackTrace(); } @@ -246,7 +246,7 @@ public class DatabaseRepository { completionsStmt.setInt(2, playerId); ResultSet result = completionsStmt.executeQuery(); if (result.next()) { - return makeCompletion(playerId, puzzleId, result); + return makeCompletion(result); } } catch (SQLException e) { e.printStackTrace(); @@ -570,8 +570,8 @@ public class DatabaseRepository { byte[] response, Puzzle currentPuzzle) { try { ensureConnection(); - Completion completion = getCompletion(userId, puzzleId); - if (completion == null) { + Completion completion = getCompletionGroup(userId, puzzleId); + if (completion == null){ completion = new Completion(userId, puzzleId, fileName, code, response, currentPuzzle); insertCompletion(completion); } else { @@ -603,18 +603,18 @@ public class DatabaseRepository { PreparedStatement statement = DatabaseQuery.INSERT_GROUP.prepare(this.con); statement.setString(1, group.getName()); statement.setObject(2, group.getLinkToChapter()); - statement.setObject(3, group.getLinkToPuzzle()); +// statement.setObject(3, group.getLinkToPuzzle()); if (statement.executeUpdate() >= 0) return insertUserInGroup(group, creator); return false; } - public Group getPlayerGroup(int user, Integer chapter, Integer puzzle) throws SQLException { + public Group getPlayerGroup(int user, Integer chapter) throws SQLException { ensureConnection(); PreparedStatement stmt = DatabaseQuery.GET_GROUP_FOR_PLAYER.prepare(this.con); stmt.setInt(1, user); stmt.setObject(2, chapter); - stmt.setObject(3, puzzle); +// stmt.setObject(3, puzzle); ResultSet result = stmt.executeQuery(); if (result.next()) @@ -627,17 +627,17 @@ public class DatabaseRepository { PreparedStatement stmt = DatabaseQuery.GET_GROUP_ID_BY_DATA.prepare(this.con); stmt.setString(1, group.getName()); stmt.setObject(2, group.getLinkToChapter()); - stmt.setObject(3, group.getLinkToPuzzle()); +// stmt.setObject(3, group.getLinkToPuzzle()); ResultSet result = stmt.executeQuery(); if (result.next()) return result.getInt("id_group"); - throw null; + return null; } public boolean insertUserInGroup(Group group, User user) throws SQLException { Integer id = getGroupId(group); - Group alreadyInGroup = getPlayerGroup(user.getId(), group.getLinkToChapter(), group.getLinkToPuzzle()); + Group alreadyInGroup = getPlayerGroup(user.getId(), group.getLinkToChapter()); if (id != null && alreadyInGroup == null) { PreparedStatement stmt = DatabaseQuery.INSERT_PLAYER_IN_GROUP.prepare(this.con); diff --git a/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java b/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java index 04921f6..fc8bd6b 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java +++ b/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java @@ -1,5 +1,6 @@ package be.jeffcheasey88.peeratcode.routes; +import java.time.LocalDateTime; import java.util.regex.Matcher; import org.json.simple.JSONObject; @@ -11,6 +12,7 @@ import be.jeffcheasey88.peeratcode.framework.HttpWriter; import be.jeffcheasey88.peeratcode.framework.Response; import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.User; +import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Completion; import be.jeffcheasey88.peeratcode.model.Puzzle; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; @@ -25,11 +27,26 @@ public class PuzzleElement implements Response { @RouteDoc(path = "/puzzle/", responseCode = 200, responseDescription = "JSON contenant les informations du puzzle") @RouteDoc(responseCode = 400, responseDescription = "puzzle introuvable dans la base de donnée") + @RouteDoc(responseCode = 423, responseDescription = "L'utilisateur essaye de voir le puzzle en dehors de l'event") @Route(path = "^\\/puzzle\\/([0-9]+)$", needLogin = true) public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { Puzzle puzzle = databaseRepo.getPuzzle(extractId(matcher)); - if (puzzle != null) { + if (puzzle != null){ + Chapter chapter = this.databaseRepo.getChapter(puzzle); + if(chapter.getStartDate() != null){ + if(LocalDateTime.now().isBefore(chapter.getStartDate().toLocalDateTime())){ + HttpUtil.responseHeaders(writer, 423, "Access-Control-Allow-Origin: *"); + return; + } + } +// if(chapter.getEndDate() != null){ +// if(LocalDateTime.now().isAfter(chapter.getEndDate().toLocalDateTime())){ +// HttpUtil.responseHeaders(writer, 423, "Access-Control-Allow-Origin: *"); +// return; +// } +// } + JSONObject puzzleJSON = new JSONObject(); puzzleJSON.put("id", puzzle.getId()); puzzleJSON.put("name", puzzle.getName()); diff --git a/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java b/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java index a26a95f..6f4365a 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java +++ b/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java @@ -7,6 +7,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; @@ -43,7 +44,7 @@ public class PuzzleResponse implements Response { @RouteDoc(responseCode = 400, responseDescription = "Pas de réponse") @RouteDoc(responseCode = 403, responseDescription = "Déjà répondu") @RouteDoc(responseCode = 406, responseDescription = "Mauvaise réponse") - @RouteDoc(responseCode = 423, responseDescription = "L'utilisateur essaye de répondre après la fin de l'event") + @RouteDoc(responseCode = 423, responseDescription = "L'utilisateur essaye de répondre en dehors de l'event") @Route(path = "^\\/puzzleResponse\\/([0-9]+)$", type = POST, needLogin = true) public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception{ @@ -61,12 +62,31 @@ public class PuzzleResponse implements Response { Puzzle currentPuzzle = databaseRepo.getPuzzle(received.getPuzzleId()); Chapter chapter = this.databaseRepo.getChapter(currentPuzzle); - if(chapter.getEndDate() != null){ - if(LocalDateTime.now().isAfter(chapter.getEndDate().toLocalDateTime())){ + if(chapter.getStartDate() != null){ + if(LocalDateTime.now().isBefore(chapter.getStartDate().toLocalDateTime())){ HttpUtil.responseHeaders(writer, 423, "Access-Control-Allow-Origin: *"); return; } } + if(chapter.getEndDate() != null){ + if(LocalDateTime.now().isAfter(chapter.getEndDate().toLocalDateTime())){ + if(Arrays.equals(currentPuzzle.getSoluce(), received.getResponse())){ + HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *", "Content-Type: application/json"); + JSONObject theoSaisPasJusteRecevoir200 = new JSONObject(); + theoSaisPasJusteRecevoir200.put("success", true); + writer.write(theoSaisPasJusteRecevoir200.toJSONString()); + return; + } + HttpUtil.responseHeaders(writer, 423, "Access-Control-Allow-Origin: *"); + return; + } + Group group = this.databaseRepo.getPlayerGroup(user.getId(), chapter.getId()); + if(group == null){ + HttpUtil.responseHeaders(writer, 423, "Access-Control-Allow-Origin: *"); + return; + } + } + Completion completion = databaseRepo.insertOrUpdatePuzzleResponse(received.getPuzzleId(), user.getId(), received.getFileName(), received.getSourceCode(), received.getResponse(), currentPuzzle); diff --git a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupCreate.java b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupCreate.java index a5f3549..8081cc8 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupCreate.java +++ b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupCreate.java @@ -39,7 +39,7 @@ public class GroupCreate implements Response { public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception{ Group newGroup = new Group((JSONObject) HttpUtil.readJson(reader)); - if (this.repo.getPlayerGroup(user.getId(), newGroup.getLinkToChapter(), newGroup.getLinkToPuzzle()) == null) { + if (this.repo.getPlayerGroup(user.getId(), newGroup.getLinkToChapter()) == null) { try { if(this.repo.getGroupId(newGroup) == null) throw new NullPointerException(); HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *"); @@ -49,7 +49,7 @@ public class GroupCreate implements Response { Chapter chapter = this.repo.getChapter(newGroup.getLinkToChapter()); if(chapter.getStartDate() != null){ LocalDateTime start = chapter.getStartDate().toLocalDateTime().plusMinutes(this.groupDelay); - if(start.isAfter(LocalDateTime.now())){ + if(LocalDateTime.now().isAfter(start)){ HttpUtil.responseHeaders(writer, 423, "Access-Control-Allow-Origin: *"); return; } diff --git a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupJoin.java b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupJoin.java index b58ef3d..10a6900 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupJoin.java +++ b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupJoin.java @@ -39,13 +39,13 @@ public class GroupJoin implements Response{ public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception{ Group group = new Group((JSONObject) HttpUtil.readJson(reader)); - Group userGroup = this.repo.getPlayerGroup(user.getId(), group.getLinkToChapter(), group.getLinkToPuzzle()); + Group userGroup = this.repo.getPlayerGroup(user.getId(), group.getLinkToChapter()); if(group.equals(userGroup)){ HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *"); return; } - if(group.getLinkToChapter() == null && group.getLinkToPuzzle() == null){ + if(group.getLinkToChapter() == null){ HttpUtil.responseHeaders(writer, 409, "Access-Control-Allow-Origin: *"); writer.write(waitTime); return; @@ -55,7 +55,7 @@ public class GroupJoin implements Response{ Chapter chapter = this.repo.getChapter(group.getLinkToChapter()); if(chapter.getStartDate() != null){ LocalDateTime start = chapter.getStartDate().toLocalDateTime().plusMinutes(this.groupDelay); - if(start.isAfter(LocalDateTime.now())){ + if(LocalDateTime.now().isAfter(start)){ HttpUtil.responseHeaders(writer, 423, "Access-Control-Allow-Origin: *"); return; } diff --git a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupQuit.java b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupQuit.java index 517818c..ec87dc7 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupQuit.java +++ b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupQuit.java @@ -36,7 +36,7 @@ public class GroupQuit implements Response{ public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception{ Group group = new Group((JSONObject) HttpUtil.readJson(reader)); - Group userGroup = this.repo.getPlayerGroup(user.getId(), group.getLinkToChapter(), group.getLinkToPuzzle()); + Group userGroup = this.repo.getPlayerGroup(user.getId(), group.getLinkToChapter()); if(!group.equals(userGroup)){ HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *"); return; @@ -46,7 +46,7 @@ public class GroupQuit implements Response{ Chapter chapter = this.repo.getChapter(group.getLinkToChapter()); if(chapter.getStartDate() != null){ LocalDateTime start = chapter.getStartDate().toLocalDateTime().plusMinutes(this.groupDelay); - if(start.isAfter(LocalDateTime.now())){ + if(LocalDateTime.now().isAfter(start)){ HttpUtil.responseHeaders(writer, 423, "Access-Control-Allow-Origin: *"); return; }