package be.jeffcheasey88.peeratcode; import static be.jeffcheasey88.peeratcode.framework.RequestType.OPTIONS; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.regex.Matcher; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import be.jeffcheasey88.peeratcode.framework.Client; import be.jeffcheasey88.peeratcode.framework.HttpReader; import be.jeffcheasey88.peeratcode.framework.HttpWriter; import be.jeffcheasey88.peeratcode.framework.Locker; import be.jeffcheasey88.peeratcode.framework.Response; import be.jeffcheasey88.peeratcode.framework.Route; import be.jeffcheasey88.peeratcode.framework.Router; import be.jeffcheasey88.peeratcode.framework.User; import be.jeffcheasey88.peeratcode.model.Completion; import be.jeffcheasey88.peeratcode.model.Group; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; import be.jeffcheasey88.peeratcode.routes.BadgeDetails; import be.jeffcheasey88.peeratcode.routes.ChapterElement; import be.jeffcheasey88.peeratcode.routes.ChapterList; import be.jeffcheasey88.peeratcode.routes.DynamicLeaderboard; import be.jeffcheasey88.peeratcode.routes.Leaderboard; import be.jeffcheasey88.peeratcode.routes.PlayerDetails; import be.jeffcheasey88.peeratcode.routes.PuzzleElement; import be.jeffcheasey88.peeratcode.routes.PuzzleResponse; import be.jeffcheasey88.peeratcode.routes.Result; import be.jeffcheasey88.peeratcode.routes.groups.GroupCreate; import be.jeffcheasey88.peeratcode.routes.groups.GroupJoin; import be.jeffcheasey88.peeratcode.routes.groups.GroupList; import be.jeffcheasey88.peeratcode.routes.groups.GroupQuit; import be.jeffcheasey88.peeratcode.routes.users.ChangePassword; import be.jeffcheasey88.peeratcode.routes.users.Login; import be.jeffcheasey88.peeratcode.routes.users.ProfileSettings; import be.jeffcheasey88.peeratcode.routes.users.Register; 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"); Router router = new Router(new DatabaseRepository(config), config.getTokenIssuer(), config.getTokenExpiration()); router.setDefault((matcher, user, reader, writer) -> { writer.response(404, "Access-Control-Allow-Origin: *"); writer.write("404 not Found.\n"); writer.flush(); writer.close(); }); router.register(new Response(){ @Route(path = "^(.*)$", type = OPTIONS) public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { writer.response(200, "Access-Control-Allow-Origin: *", "Access-Control-Allow-Methods: *", "Access-Control-Allow-Headers: *"); } }); initRoutes(router, config); // RouteExtracter extracter = new RouteExtracter(router); // extracter.extract(); startWebServer(config, router); } private static void initRoutes(Router router, Configuration config){ DatabaseRepository repo = router.getDataBase(); router.register(new Register(repo, router, config.getUsersFiles())); router.register(new Login(repo, router)); router.register(new ProfileSettings(repo)); router.register(new ChangePassword(repo)); router.register(new ChapterElement(repo)); router.register(new ChapterList(repo)); router.register(new PuzzleElement(repo)); 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(); } private static void startWebServer(Configuration config, Router router) throws IOException { if (config.useSsl()) { // Not needed with the use of a proxy SSLServerSocket server = null; try { System.setProperty("javax.net.ssl.keyStore", config.getSslKeystore()); System.setProperty("javax.net.ssl.keyStorePassword", config.getSslKeystorePasswd()); SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); server = (SSLServerSocket) ssf.createServerSocket(config.getTcpPort()); while (!server.isClosed()) { Socket socket = server.accept(); Client client = new Client(socket, router); client.start(); } } catch (Exception e) { e.printStackTrace(); } finally { if (server != null) { server.close(); } } } else { try (ServerSocket server = new ServerSocket(config.getTcpPort())) { while (!server.isClosed()) { Socket socket = server.accept(); Client client = new Client(socket, router); client.start(); } } catch (Exception e) { e.printStackTrace(); } } } }