Compare commits
No commits in common. "def51bbf255daf3a0e210946f05e7f07bf26fa36" and "e4cbca8f1cfc6aa19242eb73d967c070c9ef86cf" have entirely different histories.
def51bbf25
...
e4cbca8f1c
13 changed files with 54 additions and 42 deletions
Binary file not shown.
|
@ -6,13 +6,13 @@ import java.lang.reflect.Method;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.function.Predicate;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
|
|
||||||
import dev.peerat.backend.bonus.extract.RouteExtracter;
|
import dev.peerat.backend.bonus.extract.RouteExtracter;
|
||||||
import dev.peerat.backend.model.Group;
|
import dev.peerat.backend.model.Group;
|
||||||
import dev.peerat.backend.model.PeerAtUser;
|
import dev.peerat.backend.model.PeerAtUser;
|
||||||
import dev.peerat.backend.repository.ConnectionManager;
|
import dev.peerat.backend.repository.ConnectionManager;
|
||||||
|
import dev.peerat.backend.repository.DatabaseBadgeRepository;
|
||||||
import dev.peerat.backend.repository.DatabaseRepository;
|
import dev.peerat.backend.repository.DatabaseRepository;
|
||||||
import dev.peerat.framework.Context;
|
import dev.peerat.framework.Context;
|
||||||
import dev.peerat.framework.DependencyInjector;
|
import dev.peerat.framework.DependencyInjector;
|
||||||
|
@ -35,7 +35,8 @@ public class Main{
|
||||||
private static Router<PeerAtUser> ACCESS_ROUTER;
|
private static Router<PeerAtUser> ACCESS_ROUTER;
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception{
|
public static void main(String[] args) throws Exception{
|
||||||
Configuration config = new Configuration("config.txt").addDefaultValue("users_files", "/tmp/users_files");
|
Configuration config = new Configuration("config.txt")
|
||||||
|
.addDefaultValue("users_files", "/tmp/users_files");
|
||||||
config.load();
|
config.load();
|
||||||
|
|
||||||
Class.forName("com.mysql.cj.jdbc.Driver");
|
Class.forName("com.mysql.cj.jdbc.Driver");
|
||||||
|
@ -127,6 +128,7 @@ public class Main{
|
||||||
locker.init(key);
|
locker.init(key);
|
||||||
try {
|
try {
|
||||||
while(true){
|
while(true){
|
||||||
|
locker.lock(key);
|
||||||
Context instance = locker.getValue(key);
|
Context instance = locker.getValue(key);
|
||||||
if(instance == null) continue;
|
if(instance == null) continue;
|
||||||
System.out.println("["+((instance.isLogged()) ? repo.getPlayerRepository().getPlayer(instance.<PeerAtUser>getUser().getId()).getPseudo() : "?")+"] "+instance.getType()+" "+instance.getPath()+" -> "+instance.getResponseCode());
|
System.out.println("["+((instance.isLogged()) ? repo.getPlayerRepository().getPlayer(instance.<PeerAtUser>getUser().getId()).getPseudo() : "?")+"] "+instance.getType()+" "+instance.getPath()+" -> "+instance.getResponseCode());
|
||||||
|
@ -140,7 +142,20 @@ public class Main{
|
||||||
|
|
||||||
new Thread(new Runnable(){
|
new Thread(new Runnable(){
|
||||||
public void run(){
|
public void run(){
|
||||||
router.getExceptionLogger().listen((throwable) -> throwable.printStackTrace(), (exception) -> exception.printStackTrace());
|
Key key = new Key();
|
||||||
|
|
||||||
|
Locker<Throwable> locker = router.getExceptionLogger();
|
||||||
|
|
||||||
|
locker.init(key);
|
||||||
|
try {
|
||||||
|
while(true){
|
||||||
|
locker.lock(key);
|
||||||
|
locker.getValue(key).printStackTrace();
|
||||||
|
}
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
locker.remove(key);
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
|
|
||||||
|
@ -149,16 +164,8 @@ public class Main{
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void initRoutes(Router<PeerAtUser> router, DatabaseRepository repo, Configuration config) throws Exception{
|
private static void initRoutes(Router<PeerAtUser> router, DatabaseRepository repo, Configuration config) throws Exception{
|
||||||
Predicate<PeerAtUser> isAdmin = (user) -> {
|
|
||||||
try {
|
|
||||||
Group group = repo.getGroupRepository().getPlayerGroup(user.getId(), 1);
|
|
||||||
return group.getName().equalsIgnoreCase("Quarter-Master - Battles PAC x CEI");
|
|
||||||
}catch(Exception ex){}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
router.registerPackages("dev.peerat.backend.routes",new DependencyInjector()
|
router.registerPackages("dev.peerat.backend.routes",new DependencyInjector()
|
||||||
.of(repo, router, config, new RouteExtracter(router), config.getMail(), isAdmin)
|
.of(repo, router, config, new RouteExtracter(router), config.getMail())
|
||||||
.of("waitting", new HashMap<>())
|
.of("waitting", new HashMap<>())
|
||||||
.of("leaderboard", new Locker<>())
|
.of("leaderboard", new Locker<>())
|
||||||
.of("groups", new Locker<>())
|
.of("groups", new Locker<>())
|
||||||
|
|
|
@ -55,6 +55,7 @@ public class Bot extends Thread{
|
||||||
}
|
}
|
||||||
|
|
||||||
while(true){
|
while(true){
|
||||||
|
locker.lock(key);
|
||||||
Group group = locker.getValue(key);
|
Group group = locker.getValue(key);
|
||||||
Integer chapter = group.getLinkToChapter();
|
Integer chapter = group.getLinkToChapter();
|
||||||
// Integer puzzle = group.getLinkToPuzzle();
|
// Integer puzzle = group.getLinkToPuzzle();
|
||||||
|
|
|
@ -41,6 +41,7 @@ public class DynamicLeaderboard extends Leaderboard{
|
||||||
}else{
|
}else{
|
||||||
playersLeaderboard(writer);
|
playersLeaderboard(writer);
|
||||||
}
|
}
|
||||||
|
locker.lock(key);
|
||||||
}
|
}
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
|
@ -1,27 +1,37 @@
|
||||||
package dev.peerat.backend.routes;
|
package dev.peerat.backend.routes;
|
||||||
|
|
||||||
import java.util.regex.Matcher;
|
import dev.peerat.backend.Configuration;
|
||||||
|
import dev.peerat.backend.model.Group;
|
||||||
|
import dev.peerat.backend.model.PeerAtUser;
|
||||||
|
import dev.peerat.backend.repository.DatabaseGroupRepository;
|
||||||
|
import dev.peerat.backend.repository.DatabaseRepository;
|
||||||
import dev.peerat.framework.Context;
|
import dev.peerat.framework.Context;
|
||||||
import dev.peerat.framework.HttpReader;
|
|
||||||
import dev.peerat.framework.HttpWriter;
|
import dev.peerat.framework.HttpWriter;
|
||||||
import dev.peerat.framework.Injection;
|
import dev.peerat.framework.Injection;
|
||||||
import dev.peerat.framework.Locker;
|
import dev.peerat.framework.Locker;
|
||||||
import dev.peerat.framework.Locker.Key;
|
import dev.peerat.framework.Locker.Key;
|
||||||
import dev.peerat.framework.Route;
|
import dev.peerat.framework.Route;
|
||||||
import dev.peerat.framework.utils.json.JsonMap;
|
|
||||||
|
|
||||||
public class EventSSE{
|
public class EventSSE{
|
||||||
|
|
||||||
private Locker<GroupMessage> locker;
|
private Locker<GroupMessage> locker;
|
||||||
|
private DatabaseGroupRepository repo;
|
||||||
|
private int eventChapter;
|
||||||
|
|
||||||
public EventSSE(@Injection("groupMessages") Locker<GroupMessage> locker){
|
public EventSSE(@Injection("groupMessages") Locker<GroupMessage> locker, DatabaseRepository repo, Configuration config){
|
||||||
this.locker = locker;
|
this.locker = locker;
|
||||||
|
this.repo = repo.getGroupRepository();
|
||||||
|
this.eventChapter = config.getEventChapter();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Route(path = "^/group/event/$", websocket = true)
|
@Route(path = "^/group/event/$", needLogin = true)
|
||||||
public void connect(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception {
|
public void connect(Context context, HttpWriter writer) throws Exception {
|
||||||
String group = reader.<JsonMap>readJson().get("group");
|
Group group = repo.getPlayerGroup(context.<PeerAtUser>getUser().getId(), this.eventChapter);
|
||||||
|
if(group == null){
|
||||||
|
context.response(401);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
context.response(200, "Content-Type: text/event-stream");
|
||||||
|
|
||||||
Key key = new Key();
|
Key key = new Key();
|
||||||
|
|
||||||
|
@ -29,12 +39,11 @@ public class EventSSE{
|
||||||
try {
|
try {
|
||||||
while(true){
|
while(true){
|
||||||
GroupMessage message = locker.getValue(key);
|
GroupMessage message = locker.getValue(key);
|
||||||
if(message.getGroup() == null || message.getGroup().equals(group)){
|
if(message.getGroup() == null || message.getGroup().equals(group.getName())){
|
||||||
JsonMap send = new JsonMap();
|
writer.write("data: "+message.getMessage()+"\n\n");
|
||||||
send.set("message", message.getMessage());
|
|
||||||
writer.write(send.toString()+"\n");
|
|
||||||
writer.flush();
|
writer.flush();
|
||||||
}
|
}
|
||||||
|
locker.lock(key);
|
||||||
}
|
}
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package dev.peerat.backend.routes;
|
package dev.peerat.backend.routes;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.function.Predicate;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
|
|
||||||
import dev.peerat.backend.bonus.extract.RouteDoc;
|
import dev.peerat.backend.bonus.extract.RouteDoc;
|
||||||
|
@ -20,11 +19,9 @@ import dev.peerat.framework.utils.json.JsonMap;
|
||||||
public class PuzzleElement implements Response {
|
public class PuzzleElement implements Response {
|
||||||
|
|
||||||
private final DatabaseRepository databaseRepo;
|
private final DatabaseRepository databaseRepo;
|
||||||
private Predicate<PeerAtUser> isAdmin;
|
|
||||||
|
|
||||||
public PuzzleElement(DatabaseRepository databaseRepo, Predicate<PeerAtUser> isAdmin){
|
public PuzzleElement(DatabaseRepository databaseRepo) {
|
||||||
this.databaseRepo = databaseRepo;
|
this.databaseRepo = databaseRepo;
|
||||||
this.isAdmin = isAdmin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@RouteDoc(path = "/puzzle/<id>", responseCode = 200, responseDescription = "JSON contenant les informations du puzzle")
|
@RouteDoc(path = "/puzzle/<id>", responseCode = 200, responseDescription = "JSON contenant les informations du puzzle")
|
||||||
|
@ -36,7 +33,7 @@ public class PuzzleElement implements Response {
|
||||||
Puzzle puzzle = databaseRepo.getPuzzleRepository().getPuzzle(extractId(matcher));
|
Puzzle puzzle = databaseRepo.getPuzzleRepository().getPuzzle(extractId(matcher));
|
||||||
if (puzzle != null){
|
if (puzzle != null){
|
||||||
Chapter chapter = this.databaseRepo.getChapterRepository().getChapter(puzzle);
|
Chapter chapter = this.databaseRepo.getChapterRepository().getChapter(puzzle);
|
||||||
if(chapter.getStartDate() != null && !isAdmin.test(context.getUser())){
|
if(chapter.getStartDate() != null){
|
||||||
if(LocalDateTime.now().isBefore(chapter.getStartDate().toLocalDateTime())){
|
if(LocalDateTime.now().isBefore(chapter.getStartDate().toLocalDateTime())){
|
||||||
context.response(423);
|
context.response(423);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -9,7 +9,6 @@ import java.nio.file.Paths;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Predicate;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
|
|
||||||
import dev.peerat.backend.Configuration;
|
import dev.peerat.backend.Configuration;
|
||||||
|
@ -35,13 +34,11 @@ public class PuzzleResponse implements Response {
|
||||||
private final String usersFilesPath;
|
private final String usersFilesPath;
|
||||||
|
|
||||||
private final Locker<Completion> leaderboard;
|
private final Locker<Completion> leaderboard;
|
||||||
private Predicate<PeerAtUser> isAdmin;
|
|
||||||
|
|
||||||
public PuzzleResponse(DatabaseRepository databaseRepo, Configuration config, @Injection("leaderboard") Locker<Completion> locker, Predicate<PeerAtUser> isAdmin){
|
public PuzzleResponse(DatabaseRepository databaseRepo, Configuration config, @Injection("leaderboard") Locker<Completion> locker){
|
||||||
this.databaseRepo = databaseRepo;
|
this.databaseRepo = databaseRepo;
|
||||||
usersFilesPath = config.getUsersFiles();
|
usersFilesPath = config.getUsersFiles();
|
||||||
this.leaderboard = locker;
|
this.leaderboard = locker;
|
||||||
this.isAdmin = isAdmin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@RouteDoc(path = "/puzzleResponse/<id>", responseCode = 200, responseDescription = "Bonne réponse, json contenant les points + tries")
|
@RouteDoc(path = "/puzzleResponse/<id>", responseCode = 200, responseDescription = "Bonne réponse, json contenant les points + tries")
|
||||||
|
@ -77,7 +74,7 @@ public class PuzzleResponse implements Response {
|
||||||
context.response(423);
|
context.response(423);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(chapter.getEndDate() != null && !isAdmin.test(context.getUser())){
|
if(chapter.getEndDate() != null){
|
||||||
if(LocalDateTime.now().isAfter(chapter.getEndDate().toLocalDateTime())){
|
if(LocalDateTime.now().isAfter(chapter.getEndDate().toLocalDateTime())){
|
||||||
if(Arrays.equals(currentPuzzle.getSoluce(), received.getResponse())){
|
if(Arrays.equals(currentPuzzle.getSoluce(), received.getResponse())){
|
||||||
context.response(200, "Content-Type: application/json");
|
context.response(200, "Content-Type: application/json");
|
||||||
|
@ -115,7 +112,7 @@ public class PuzzleResponse implements Response {
|
||||||
writer.write(responseJSON.toString());
|
writer.write(responseJSON.toString());
|
||||||
writer.flush();
|
writer.flush();
|
||||||
|
|
||||||
leaderboard.pushValue(completion);
|
leaderboard.setValue(completion);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveSourceCode(ReceivedResponse received, Player player){
|
private void saveSourceCode(ReceivedResponse received, Player player){
|
||||||
|
|
|
@ -5,7 +5,6 @@ import dev.peerat.framework.Context;
|
||||||
import dev.peerat.framework.HttpReader;
|
import dev.peerat.framework.HttpReader;
|
||||||
import dev.peerat.framework.Injection;
|
import dev.peerat.framework.Injection;
|
||||||
import dev.peerat.framework.Locker;
|
import dev.peerat.framework.Locker;
|
||||||
import dev.peerat.framework.RequestType;
|
|
||||||
import dev.peerat.framework.Route;
|
import dev.peerat.framework.Route;
|
||||||
import dev.peerat.framework.utils.json.JsonMap;
|
import dev.peerat.framework.utils.json.JsonMap;
|
||||||
|
|
||||||
|
@ -17,7 +16,7 @@ public class GroupController {
|
||||||
this.locker = locker;
|
this.locker = locker;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Route(path = "^/admin/event/$", type = RequestType.POST ,needLogin = true)
|
@Route(path = "^/admin/event/$", needLogin = true)
|
||||||
public void send(Context context, HttpReader reader) throws Exception{
|
public void send(Context context, HttpReader reader) throws Exception{
|
||||||
JsonMap json = reader.readJson();
|
JsonMap json = reader.readJson();
|
||||||
if(!json.has("message")){
|
if(!json.has("message")){
|
||||||
|
@ -25,7 +24,7 @@ public class GroupController {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
locker.pushValue(new GroupMessage(json.get("group"), json.get("message")));
|
locker.setValue(new GroupMessage(json.get("group"), json.get("message")));
|
||||||
context.response(200);
|
context.response(200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ public class LogController {
|
||||||
locker.init(key);
|
locker.init(key);
|
||||||
try {
|
try {
|
||||||
while(!reader.isClosed()){
|
while(!reader.isClosed()){
|
||||||
|
locker.lock(key);
|
||||||
T instance = locker.getValue(key);
|
T instance = locker.getValue(key);
|
||||||
JsonMap json = new JsonMap();
|
JsonMap json = new JsonMap();
|
||||||
consumer.accept(json, instance);
|
consumer.accept(json, instance);
|
||||||
|
|
|
@ -21,7 +21,7 @@ public class WebHookLeaderboard implements Response{
|
||||||
|
|
||||||
@Route(path = "^/admin/webhook/leaderboard/$", needLogin = true)
|
@Route(path = "^/admin/webhook/leaderboard/$", needLogin = true)
|
||||||
public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception{
|
public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception{
|
||||||
locker.pushValue(new Completion(0, 0));
|
locker.setValue(new Completion(0, 0));
|
||||||
context.response(200);
|
context.response(200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@ public class GroupCreate extends FormResponse {
|
||||||
if (this.repo.insertGroup(newGroup, user)) {
|
if (this.repo.insertGroup(newGroup, user)) {
|
||||||
context.response(200);
|
context.response(200);
|
||||||
|
|
||||||
locker.pushValue(newGroup);
|
locker.setValue(newGroup);
|
||||||
} else {
|
} else {
|
||||||
context.response(403);
|
context.response(403);
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ public class GroupJoin implements Response{
|
||||||
if (this.groupRepo.insertUserInGroup(group, user)) {
|
if (this.groupRepo.insertUserInGroup(group, user)) {
|
||||||
context.response(200);
|
context.response(200);
|
||||||
|
|
||||||
leaderboard.pushValue(new Completion(0, 0, 0, null, 0));
|
leaderboard.setValue(new Completion(0, 0, 0, null, 0));
|
||||||
} else {
|
} else {
|
||||||
context.response(403);
|
context.response(403);
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@ public class GroupQuit implements Response{
|
||||||
if (this.groupRepo.leaveGroup(group, user)) {
|
if (this.groupRepo.leaveGroup(group, user)) {
|
||||||
context.response(200);
|
context.response(200);
|
||||||
|
|
||||||
leaderboard.pushValue(new Completion(0, 0, 0, null, 0));
|
leaderboard.setValue(new Completion(0, 0, 0, null, 0));
|
||||||
} else {
|
} else {
|
||||||
context.response(403);
|
context.response(403);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue