Dynamic Leaderboard update on group update

This commit is contained in:
jeffcheasey88 2023-04-23 22:18:03 +02:00
parent 43d97b4f97
commit 09dbe344d5
8 changed files with 53 additions and 22 deletions

View file

@ -10,8 +10,6 @@ import java.util.regex.Matcher;
import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory; import javax.net.ssl.SSLServerSocketFactory;
import be.jeffcheasey88.peeratcode.bonus.discord.Bot;
import be.jeffcheasey88.peeratcode.bonus.extract.RouteExtracter;
import be.jeffcheasey88.peeratcode.framework.Client; import be.jeffcheasey88.peeratcode.framework.Client;
import be.jeffcheasey88.peeratcode.framework.HttpReader; import be.jeffcheasey88.peeratcode.framework.HttpReader;
import be.jeffcheasey88.peeratcode.framework.HttpUtil; import be.jeffcheasey88.peeratcode.framework.HttpUtil;
@ -21,6 +19,7 @@ import be.jeffcheasey88.peeratcode.framework.Response;
import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.Route;
import be.jeffcheasey88.peeratcode.framework.Router; import be.jeffcheasey88.peeratcode.framework.Router;
import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.framework.User;
import be.jeffcheasey88.peeratcode.model.Completion;
import be.jeffcheasey88.peeratcode.model.Group; import be.jeffcheasey88.peeratcode.model.Group;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;
import be.jeffcheasey88.peeratcode.routes.BadgeDetails; import be.jeffcheasey88.peeratcode.routes.BadgeDetails;
@ -67,7 +66,7 @@ public class Main{
initRoutes(router, config); initRoutes(router, config);
// RouteExtracter extracter = new RouteExtracter(router); // RouteExtracter extracter = new RouteExtracter(router);
// extracter.extractDoc(); // extracter.extract();
startWebServer(config, router); startWebServer(config, router);
} }
@ -83,20 +82,21 @@ public class Main{
router.register(new PlayerDetails(router.getDataBase())); router.register(new PlayerDetails(router.getDataBase()));
router.register(new BadgeDetails(router.getDataBase())); router.register(new BadgeDetails(router.getDataBase()));
router.register(new GroupList(router.getDataBase()));
router.register(new GroupJoin(router.getDataBase(), config.getGroupJoinMinutes(), config.getGroupQuitMinutes()));
router.register(new GroupQuit(router.getDataBase(), config.getGroupJoinMinutes()));
Locker<Group> groupLock = new Locker<>(); Locker<Group> groupLock = new Locker<>();
router.register(new GroupCreate(router.getDataBase(), groupLock, config.getGroupJoinMinutes())); router.register(new GroupCreate(router.getDataBase(), groupLock, config.getGroupJoinMinutes()));
DynamicLeaderboard dlb = new DynamicLeaderboard(router.getDataBase()); DynamicLeaderboard dlb = new DynamicLeaderboard(router.getDataBase());
router.register(dlb); router.register(dlb);
router.register(new PuzzleResponse(router.getDataBase(), config.getUsersFiles(), dlb.getLocker())); Locker<Completion> leaderboard = dlb.getLocker();
Bot bot = new Bot(config, router.getDataBase(), groupLock); router.register(new PuzzleResponse(router.getDataBase(), config.getUsersFiles(), leaderboard));
bot.start(); router.register(new GroupList(router.getDataBase()));
router.register(new GroupJoin(router.getDataBase(), config.getGroupJoinMinutes(), config.getGroupQuitMinutes(), leaderboard));
router.register(new GroupQuit(router.getDataBase(), config.getGroupJoinMinutes(), leaderboard));
// Bot bot = new Bot(config, router.getDataBase(), groupLock);
// bot.start();
} }
private static void startWebServer(Configuration config, Router router) throws IOException { private static void startWebServer(Configuration config, Router router) throws IOException {

View file

@ -27,6 +27,7 @@ public class Bot extends Thread{
@Override @Override
public void run(){ public void run(){
if(token == null) return;
try{ try{
JDA jda = JDABuilder.createDefault(token).build(); JDA jda = JDABuilder.createDefault(token).build();
jda.awaitReady(); jda.awaitReady();

View file

@ -27,7 +27,7 @@ public class RouteExtracter {
Map<RequestType, Map<Response, Route>> responses = (Map<RequestType, Map<Response, Route>>) field.get(this.router); Map<RequestType, Map<Response, Route>> responses = (Map<RequestType, Map<Response, Route>>) field.get(this.router);
for(Entry<RequestType, Map<Response, Route>> types : responses.entrySet()){ for(Entry<RequestType, Map<Response, Route>> types : responses.entrySet()){
for(Entry<Response, Route> routes : types.getValue().entrySet()){ for(Entry<Response, Route> routes : types.getValue().entrySet()){
System.out.println("["+types.getKey()+"] "+routes.getValue().path()); System.out.println("["+types.getKey()+"] ("+routes.getValue().needLogin()+") "+routes.getValue().path());
} }
} }
} }

View file

@ -34,6 +34,11 @@ public class Completion {
addTry(currentPuzzle, response); addTry(currentPuzzle, response);
} }
@Override
public String toString(){
return "Completion[puzzleId="+puzzleId+", userId="+playerId+",tries="+tries+",score="+score+"]";
}
public int getPuzzleId() { public int getPuzzleId() {
return puzzleId; return puzzleId;
} }
@ -60,6 +65,10 @@ public class Completion {
} }
} }
public void updatePlayer(int playerId){
this.playerId = playerId;
}
public String getFileName() { public String getFileName() {
return fileName; return fileName;
} }

View file

@ -57,7 +57,7 @@ public enum DatabaseQuery {
INSERT_COMPLETION( INSERT_COMPLETION(
"INSERT INTO completions (fk_puzzle, fk_player, tries, code, fileName, score) values (?, ?, ?, ?, ?, ?)"), "INSERT INTO completions (fk_puzzle, fk_player, tries, code, fileName, score) values (?, ?, ?, ?, ?, ?)"),
UPDATE_COMPLETION( UPDATE_COMPLETION(
"UPDATE completions SET tries = ?, score = ? WHERE fk_puzzle = ? AND fk_player = ?"), "UPDATE completions SET tries = ?, score = ?, fk_player = ? WHERE fk_puzzle = ? AND fk_player = ?"),
SCORE("SELECT score FROM completions WHERE fk_player = ? AND fk_puzzle = ?"), SCORE("SELECT score FROM completions WHERE fk_player = ? AND fk_puzzle = ?"),
SCORE_GROUP("SELECT c.score\r\n" SCORE_GROUP("SELECT c.score\r\n"
+ "FROM completions c\r\n" + "FROM completions c\r\n"

View file

@ -572,11 +572,15 @@ public class DatabaseRepository {
ensureConnection(); ensureConnection();
Completion completion = getCompletionGroup(userId, puzzleId); Completion completion = getCompletionGroup(userId, puzzleId);
if (completion == null){ if (completion == null){
System.out.println("Completion is null");
completion = new Completion(userId, puzzleId, fileName, code, response, currentPuzzle); completion = new Completion(userId, puzzleId, fileName, code, response, currentPuzzle);
insertCompletion(completion); insertCompletion(completion);
} else { } else {
System.out.println(completion);
completion.addTry(currentPuzzle, response); completion.addTry(currentPuzzle, response);
updateCompletion(completion); int lastUserId = completion.getPlayerId();
completion.updatePlayer(userId);
updateCompletion(completion, lastUserId);
} }
return completion; return completion;
} catch (SQLException e) { } catch (SQLException e) {
@ -662,12 +666,14 @@ public class DatabaseRepository {
return false; return false;
} }
private void updateCompletion(Completion completionToUpdate) throws SQLException { private void updateCompletion(Completion completionToUpdate, int user) throws SQLException{
System.out.println("update "+completionToUpdate);
PreparedStatement statement = DatabaseQuery.UPDATE_COMPLETION.prepare(this.con); PreparedStatement statement = DatabaseQuery.UPDATE_COMPLETION.prepare(this.con);
statement.setInt(1, completionToUpdate.getTries()); statement.setInt(1, completionToUpdate.getTries());
statement.setInt(2, completionToUpdate.getScore()); statement.setInt(2, completionToUpdate.getScore());
statement.setInt(3, completionToUpdate.getPuzzleId()); statement.setInt(3, completionToUpdate.getPlayerId());
statement.setInt(4, completionToUpdate.getPlayerId()); statement.setInt(4, completionToUpdate.getPuzzleId());
statement.setInt(5, user);
statement.executeUpdate(); statement.executeUpdate();
} }
} }

View file

@ -11,10 +11,12 @@ import be.jeffcheasey88.peeratcode.bonus.extract.RouteDoc;
import be.jeffcheasey88.peeratcode.framework.HttpReader; import be.jeffcheasey88.peeratcode.framework.HttpReader;
import be.jeffcheasey88.peeratcode.framework.HttpUtil; import be.jeffcheasey88.peeratcode.framework.HttpUtil;
import be.jeffcheasey88.peeratcode.framework.HttpWriter; import be.jeffcheasey88.peeratcode.framework.HttpWriter;
import be.jeffcheasey88.peeratcode.framework.Locker;
import be.jeffcheasey88.peeratcode.framework.Response; import be.jeffcheasey88.peeratcode.framework.Response;
import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.Route;
import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.framework.User;
import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Chapter;
import be.jeffcheasey88.peeratcode.model.Completion;
import be.jeffcheasey88.peeratcode.model.Group; import be.jeffcheasey88.peeratcode.model.Group;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;
@ -24,10 +26,13 @@ public class GroupJoin implements Response{
private int groupDelay; private int groupDelay;
private String waitTime; private String waitTime;
public GroupJoin(DatabaseRepository repo, int groupDelay, String waitTime){ private final Locker<Completion> leaderboard;
public GroupJoin(DatabaseRepository repo, int groupDelay, String waitTime, Locker<Completion> locker){
this.repo = repo; this.repo = repo;
this.groupDelay = groupDelay; this.groupDelay = groupDelay;
this.waitTime = waitTime; this.waitTime = waitTime;
this.leaderboard = locker;
} }
@RouteDoc(path = "/groupJoin", responseCode = 200, responseDescription = "L'utilisateur a rejoint le groupe") @RouteDoc(path = "/groupJoin", responseCode = 200, responseDescription = "L'utilisateur a rejoint le groupe")
@ -64,6 +69,8 @@ public class GroupJoin implements Response{
if (this.repo.insertUserInGroup(group, user)) { if (this.repo.insertUserInGroup(group, user)) {
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *");
leaderboard.setValue(new Completion(0, 0, 0, null, 0));
} else { } else {
HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *"); HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *");
} }

View file

@ -11,10 +11,12 @@ import be.jeffcheasey88.peeratcode.bonus.extract.RouteDoc;
import be.jeffcheasey88.peeratcode.framework.HttpReader; import be.jeffcheasey88.peeratcode.framework.HttpReader;
import be.jeffcheasey88.peeratcode.framework.HttpUtil; import be.jeffcheasey88.peeratcode.framework.HttpUtil;
import be.jeffcheasey88.peeratcode.framework.HttpWriter; import be.jeffcheasey88.peeratcode.framework.HttpWriter;
import be.jeffcheasey88.peeratcode.framework.Locker;
import be.jeffcheasey88.peeratcode.framework.Response; import be.jeffcheasey88.peeratcode.framework.Response;
import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.Route;
import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.framework.User;
import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.model.Chapter;
import be.jeffcheasey88.peeratcode.model.Completion;
import be.jeffcheasey88.peeratcode.model.Group; import be.jeffcheasey88.peeratcode.model.Group;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;
@ -23,9 +25,13 @@ public class GroupQuit implements Response{
private DatabaseRepository repo; private DatabaseRepository repo;
private int groupDelay; private int groupDelay;
public GroupQuit(DatabaseRepository repo, int groupDelay){ private final Locker<Completion> leaderboard;
public GroupQuit(DatabaseRepository repo, int groupDelay, Locker<Completion> locker){
this.repo = repo; this.repo = repo;
this.groupDelay = groupDelay; this.groupDelay = groupDelay;
this.leaderboard = locker;
} }
@RouteDoc(path = "/groupQuit", responseCode = 200, responseDescription = "L'utilisateur à quitter le groupe") @RouteDoc(path = "/groupQuit", responseCode = 200, responseDescription = "L'utilisateur à quitter le groupe")
@ -55,6 +61,8 @@ public class GroupQuit implements Response{
if (this.repo.leaveGroup(group, user)) { if (this.repo.leaveGroup(group, user)) {
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *");
leaderboard.setValue(new Completion(0, 0, 0, null, 0));
} else { } else {
HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *"); HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *");
} }