141 lines
5.2 KiB
Java
141 lines
5.2 KiB
Java
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<Group> groupLock = new Locker<>();
|
|
router.register(new GroupCreate(repo, groupLock, config.getGroupJoinMinutes()));
|
|
|
|
DynamicLeaderboard dlb = new DynamicLeaderboard(repo);
|
|
router.register(dlb);
|
|
|
|
Locker<Completion> 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();
|
|
}
|
|
}
|
|
}
|
|
}
|