Return all badge info in player details route

This commit is contained in:
Francois G 2023-03-19 20:19:36 +01:00
parent 2d6b5c9005
commit 71c7e4e02c
6 changed files with 69 additions and 34 deletions

View file

@ -4,9 +4,12 @@ public class Badge {
private String name;
private byte[] logo;
private int level;
public Badge(String name, int level) {
this(name, null, level);
}
public Badge(String name, byte[] logo, int level) {
super();
this.name = name;
this.logo = logo;
this.level = level;
@ -35,6 +38,5 @@ public class Badge {
public void setLevel(int level) {
this.level = level;
}
}

View file

@ -1,11 +1,14 @@
package be.jeffcheasey88.peeratcode.model;
import java.util.Arrays;
import java.util.Base64;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
import java.util.SortedSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
@ -26,7 +29,7 @@ public class Player implements Comparable<Player> {
private int totalCompletion;
private int totalTries;
private String badges; // To change to a set of model
private Set<Badge> badges;
public Player(String pseudo, String email, String firstname, String lastname, String description) {
this(pseudo, email, firstname, lastname, description, null, null);
@ -41,7 +44,7 @@ public class Player implements Comparable<Player> {
this(pseudo, email, firstname, lastname, description, groups, avatar, null);
}
public Player(String pseudo, String email, String firstname, String lastname, String description, String groups,
byte[] avatar, String badges) {
byte[] avatar, Set<Badge> badges) {
this.pseudo = pseudo;
this.email = email;
this.firstname = firstname;
@ -54,7 +57,10 @@ public class Player implements Comparable<Player> {
totalCompletion = 0;
totalTries = 0;
this.badges = null;
if (badges != null)
this.badges = new HashSet<Badge>(badges);
else
this.badges = new HashSet<Badge>();
}
public String getPseudo() {
@ -99,7 +105,7 @@ public class Player implements Comparable<Player> {
public void setGroups(String groups) {
if (groups == null || groups.isEmpty())
groups = null;
this.groups = null;
else
this.groups = new LinkedHashSet<String>(Arrays.asList(groups.split(",")));
}
@ -148,11 +154,28 @@ public class Player implements Comparable<Player> {
this.totalTries = totalTries;
}
public String getBadges() {
public Set<Badge> getBadges() {
return badges;
}
public void setBadges(String initBadges) {
badges = initBadges;
/**
* SEE SET_TAGS IN PUZZLE
* @return DEATH
*/
public JSONArray getJsonBadges() {
if (badges == null)
return null;
JSONArray badgesJSON = new JSONArray();
for (Badge badge: badges) {
JSONObject badgeJSON = new JSONObject();
badgeJSON.put("name", badge.getName());
byte[] logo = badge.getLogo();
if (logo != null)
badgeJSON.put("logo", Base64.getEncoder().encodeToString(logo));
badgeJSON.put("level", badge.getLevel());
badgesJSON.add(badgeJSON);
}
return badgesJSON;
}
@Override
@ -172,4 +195,8 @@ public class Player implements Comparable<Player> {
return compare;
}
public void addBadge(Badge newBadge) {
badges.add(newBadge);
}
}

View file

@ -34,13 +34,14 @@ public class DatabaseRepository {
private static final String SCORE = "SELECT score FROM completions WHERE fk_player = ? AND fk_puzzle = ?";
private static final String GET_COMPLETION = "SELECT id_completion, tries, fileName, score FROM completions WHERE fk_puzzle = ? AND fk_player = ?";
private static final String GET_PLAYER_SIMPLE = "SELECT pseudo, email, firstname, lastname, description FROM players WHERE id_player = ?";
private static final String GET_PLAYER_DETAILS = "SELECT p.*, scores.score, scores.completions, scores.tries, scores.rank, GROUP_CONCAT(DISTINCT b.name ORDER BY b.name ASC) AS badges, GROUP_CONCAT(DISTINCT g.name ORDER BY g.fk_chapter, g.fk_puzzle) AS sgroup 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 containsBadges cb ON scores.fk_player = cb.fk_player LEFT JOIN badges b ON cb.fk_badge = b.id_badge 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 AND ";
private static final String GET_PLAYER_DETAILS = "SELECT p.*, scores.score, scores.completions, scores.tries, scores.rank, GROUP_CONCAT(DISTINCT g.name ORDER BY g.fk_chapter, g.fk_puzzle) AS sgroup 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 AND ";
private static final String GET_PLAYER_DETAILS_BY_ID = GET_PLAYER_DETAILS
+ " p.id_player = ? GROUP BY p.id_player;";
private static final String GET_PLAYER_DETAILS_BY_PSEUDO = GET_PLAYER_DETAILS
+ "p.pseudo = ? GROUP BY p.pseudo;";
private static final String ALL_PLAYERS_FOR_LEADERBOARD = "select DISTINCT p.*, scores.* 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 WHERE p.id_player = scores.fk_player";
private static final String GET_BADGE = "SELECT * FROM badges WHERE id_badge = ?";
private static final String GET_BADGES_OF_PLAYER = "SELECT * FROM badges b LEFT JOIN containsBadges cb ON cb.fk_badge = b.id_badge WHERE cb.fk_player = ?";
private static final String INSERT_COMPLETION = "INSERT INTO completions (fk_puzzle, fk_player, tries, code, fileName, score) values (?, ?, ?, ?, ?, ?)";
private static final String UPDATE_COMPLETION = "UPDATE completions SET tries = ?, filename = ?, score = ? WHERE fk_puzzle = ? AND fk_player = ?";
@ -77,7 +78,7 @@ public class DatabaseRepository {
private Player makePlayer(ResultSet playerResult) throws SQLException {
Player p = new Player(playerResult.getString("pseudo"), playerResult.getString("email"),
playerResult.getString("firstName"), playerResult.getString("LastName"),
playerResult.getString("firstName"), playerResult.getString("lastName"),
playerResult.getString("description"));
if (hasColumn(playerResult, "avatar")) {
p.setAvatar(playerResult.getBytes("avatar"));
@ -91,9 +92,6 @@ public class DatabaseRepository {
p.setTotalCompletion(playerResult.getInt("completions"));
p.setTotalTries(playerResult.getInt("tries"));
}
if (hasColumn(playerResult, "badges")) {
p.setBadges(playerResult.getString("badges"));
}
return p;
}
@ -192,28 +190,34 @@ public class DatabaseRepository {
}
public Player getPlayerDetails(int idPlayer) {
try {
ensureConnection();
PreparedStatement completionsStmt = con.prepareStatement(GET_PLAYER_DETAILS_BY_ID);
completionsStmt.setInt(1, idPlayer);
ResultSet result = completionsStmt.executeQuery();
if (result.next()) {
return makePlayer(result);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
return getPlayerDetails(idPlayer, null);
}
public Player getPlayerDetails(String pseudoPlayer) {
return getPlayerDetails(-1, pseudoPlayer);
}
private Player getPlayerDetails(int id, String pseudo) {
try {
ensureConnection();
PreparedStatement completionsStmt = con.prepareStatement(GET_PLAYER_DETAILS_BY_PSEUDO);
completionsStmt.setString(1, pseudoPlayer);
PreparedStatement completionsStmt;
if (pseudo != null) {
completionsStmt = con.prepareStatement(GET_PLAYER_DETAILS_BY_PSEUDO);
completionsStmt.setString(1, pseudo);
} else {
completionsStmt = con.prepareStatement(GET_PLAYER_DETAILS_BY_ID);
completionsStmt.setInt(1, id);
}
ResultSet result = completionsStmt.executeQuery();
if (result.next()) {
return makePlayer(result);
Player player = makePlayer(result);
completionsStmt = con.prepareStatement(GET_BADGES_OF_PLAYER);
completionsStmt.setInt(1, result.getInt("id_player"));
ResultSet resultBadges = completionsStmt.executeQuery();
while (resultBadges.next()) {
player.addBadge(makeBadge(resultBadges));
}
return player;
}
} catch (SQLException e) {
e.printStackTrace();

View file

@ -35,7 +35,7 @@ public class Leaderboard implements Response {
JSONObject playerJSON = new JSONObject();
playerJSON.put("pseudo", player.getPseudo());
if (player.getGroups() != null) playerJSON.put("groups", player.getJsonGroups());
//if(player.getAvatar() != null) playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar()));
if(player.getAvatar() != null) playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar()));
playerJSON.put("rank", player.getRank());
playerJSON.put("score", player.getTotalScore());
playerJSON.put("completions", player.getTotalCompletion());

View file

@ -44,7 +44,7 @@ public class PlayerDetails implements Response {
playerJSON.put("score", player.getTotalScore());
playerJSON.put("completions", player.getTotalCompletion());
playerJSON.put("tries", player.getTotalTries());
playerJSON.put("badges", player.getBadges());
if (player.getBadges().size() > 0) playerJSON.put("badges", player.getJsonBadges());
//if(player.getAvatar() != null) playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar()));
writer.write(playerJSON.toJSONString().replace("\\", ""));
} else {

View file

@ -34,7 +34,9 @@ public class Client extends Thread{
router.exec(headers[0], headers[1], isLogin(reader), reader, writer);
writer.flush();
writer.close();
} catch (Exception e){}
} catch (Exception e){
e.printStackTrace();
}
}
private User isLogin(HttpReader reader) throws Exception{