package dev.peerat.backend; import static dev.peerat.framework.RequestType.OPTIONS; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import dev.peerat.backend.model.Completion; import dev.peerat.backend.model.Group; import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.model.Player; import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.backend.routes.BadgeDetails; import dev.peerat.backend.routes.ChapterElement; import dev.peerat.backend.routes.ChapterList; import dev.peerat.backend.routes.DynamicLeaderboard; import dev.peerat.backend.routes.Leaderboard; import dev.peerat.backend.routes.Login; import dev.peerat.backend.routes.MailConfirmation; import dev.peerat.backend.routes.PlayerDetails; import dev.peerat.backend.routes.PuzzleElement; import dev.peerat.backend.routes.PuzzleResponse; import dev.peerat.backend.routes.Register; import dev.peerat.backend.routes.Result; import dev.peerat.backend.routes.groups.GroupCreate; import dev.peerat.backend.routes.groups.GroupJoin; import dev.peerat.backend.routes.groups.GroupList; import dev.peerat.backend.routes.groups.GroupQuit; import dev.peerat.backend.utils.Mail; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Locker; import dev.peerat.framework.RequestType; import dev.peerat.framework.Response; import dev.peerat.framework.Route; import dev.peerat.framework.Router; public class Main{ public static void main(String[] args) throws Exception{ Configuration config = new Configuration("config.txt"); config.load(); Class.forName("com.mysql.cj.jdbc.Driver"); DatabaseRepository repo = new DatabaseRepository(config); Router router = new Router() .configureJwt( (builder) -> builder.setExpectedIssuer(config.getTokenIssuer()), (claims) -> { claims.setIssuer(config.getTokenIssuer()); // who creates the token and signs it claims.setExpirationTimeMinutesInTheFuture(config.getTokenExpiration()); }, (claims) -> new PeerAtUser(claims)); router.addDefaultHeaders(RequestType.GET, "Access-Control-Allow-Origin: *"); router.addDefaultHeaders(RequestType.POST, "Access-Control-Allow-Origin: *"); router.setDefault((matcher, context, reader, writer) -> { context.response(404); writer.write("404 not Found.\n"); writer.flush(); writer.close(); }); router.register(new Response(){ @Route(path = "^(.*)$", type = OPTIONS) public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception { context.response(200, "Access-Control-Allow-Origin: *", "Access-Control-Allow-Methods: *", "Access-Control-Allow-Headers: *"); } }); initRoutes(router, repo, config); // RouteExtracter extracter = new RouteExtracter(router); // extracter.extract(); if(config.useSsl()) router.configureSSL(config.getSslKeystore(), config.getSslKeystorePasswd()); router.listen(config.getTcpPort(), config.useSsl()); } private static void initRoutes(Router router, DatabaseRepository repo, Configuration config){ final Map playersWaiting = new HashMap<>(); router.register(new ChapterElement(repo)); router.register(new ChapterList(repo)); router.register(new PuzzleElement(repo)); router.register(new Register(repo, router, config.getUsersFiles(), playersWaiting)); router.register(new MailConfirmation(repo, router, config.getUsersFiles(), playersWaiting)); router.register(new Login(repo, router)); router.register(new Result(repo)); router.register(new Leaderboard(repo)); router.register(new PlayerDetails(repo)); router.register(new BadgeDetails(repo)); Locker groupLock = new Locker<>(); router.register(new GroupCreate(repo, groupLock, config.getGroupJoinMinutes())); DynamicLeaderboard dlb = new DynamicLeaderboard(repo); router.register(dlb); Locker leaderboard = dlb.getLocker(); router.register(new PuzzleResponse(repo, config.getUsersFiles(), leaderboard)); router.register(new GroupList(repo)); router.register(new GroupJoin(repo, config.getGroupJoinMinutes(), config.getGroupQuitMinutes(), leaderboard)); router.register(new GroupQuit(repo, config.getGroupJoinMinutes(), leaderboard)); // Bot bot = new Bot(config, repo, groupLock); // bot.start(); } }