133 lines
5.1 KiB
Java
133 lines
5.1 KiB
Java
package web;
|
|
|
|
import additional.config;
|
|
import database.ContactInputData;
|
|
import io.javalin.Javalin;
|
|
import lombok.Getter;
|
|
import main.Main;
|
|
import org.tinylog.Logger;
|
|
|
|
import static additional.Somecodes.ValidString;
|
|
import static additional.Somecodes.gson;
|
|
|
|
public class WebServer {
|
|
private Javalin app;
|
|
private @Getter boolean isRunning = false;
|
|
|
|
/**
|
|
* Start the web server on the specified port.
|
|
* @param listenport the port to listen on
|
|
*/
|
|
public void Start(int listenport){
|
|
isRunning = false;
|
|
app = null;
|
|
|
|
try{
|
|
var xx = Javalin.create(config -> {
|
|
config.useVirtualThreads = true;
|
|
config.staticFiles.add("/html");
|
|
|
|
}).start(listenport);
|
|
isRunning = true;
|
|
app = xx;
|
|
Logger.info("Web server started on port {}", listenport);
|
|
AssignRoutes();
|
|
} catch (Exception e){
|
|
Logger.error("Failed to start web server: {}", e.getMessage());
|
|
}
|
|
}
|
|
|
|
private void AssignRoutes(){
|
|
if (app == null) {
|
|
Logger.error("Web server is not running, cannot assign routes.");
|
|
return;
|
|
}
|
|
|
|
app.ws("/ws", ws->{
|
|
ws.onConnect(ctx -> {
|
|
Logger.info("WebSocket connected: {}", ctx.session.getRemoteAddress());
|
|
});
|
|
|
|
ws.onMessage(ctx -> {
|
|
Logger.info("WebSocket message received: {}", ctx.message());
|
|
try{
|
|
webRequest req = ctx.messageAsClass(webRequest.class);
|
|
if (ValidString(req.request())){
|
|
String cmd = req.request().trim().toUpperCase();
|
|
switch(cmd){
|
|
case "GET_SETTING" :
|
|
webSettingArgs args1 = additional.config.To_webSettingArgs(Main.config);
|
|
webResponse response = new webResponse("GET_SETTING", gson.toJson(args1));
|
|
ctx.send(response);
|
|
break;
|
|
case "RESET_DEFAULT":
|
|
Main.config.MakeDefaults();
|
|
webResponse resetResponse = new webResponse("RESET_DEFAULT", "Default settings restored.");
|
|
ctx.send(resetResponse);
|
|
|
|
// Send updated settings after reset
|
|
webSettingArgs args2 = additional.config.To_webSettingArgs(Main.config);
|
|
webResponse response2 = new webResponse("GET_SETTING", gson.toJson(args2));
|
|
ctx.send(response2);
|
|
break;
|
|
case "SET_SETTING":
|
|
webSettingArgs args3 = gson.fromJson(req.args(), webSettingArgs.class);
|
|
config newConfig = additional.config.From_webSettingArgs(args3);
|
|
if (Main.config.IsEqual(newConfig)) {
|
|
Logger.info("No changes detected in settings, not updating.");
|
|
ctx.send(new webResponse("SET_SETTING", "No changes made."));
|
|
} else {
|
|
Main.config = newConfig;
|
|
Main.config.Save();
|
|
Logger.info("Settings updated successfully.");
|
|
ctx.send(new webResponse("SET_SETTING", "Settings updated successfully."));
|
|
}
|
|
|
|
break;
|
|
case "GET_CONTACT_SETUP":
|
|
// ambil dari database ContactInputData, kirim balik
|
|
ContactInputData[] contactInputs = Main.db.contactInputDataList.toArray(new ContactInputData[0]);
|
|
|
|
break;
|
|
case "GET_CONTACT_STATUS":
|
|
// ambil dari Nanopi Gpio, kirim balik
|
|
break;
|
|
}
|
|
}
|
|
} catch (Exception e){
|
|
Logger.error("Not processing web request: {} because {}", ctx.message(), e.getMessage());
|
|
webResponse response = new webResponse("ERROR", e.getMessage());
|
|
ctx.send(response);
|
|
}
|
|
|
|
|
|
});
|
|
|
|
ws.onClose(ctx -> {
|
|
Logger.info("WebSocket closed: {} ", ctx.session.getRemoteAddress());
|
|
});
|
|
|
|
ws.onError(ctx -> {
|
|
if (ctx.error()!=null && ValidString(ctx.error().getMessage())){
|
|
Logger.error("WebSocket error: {}", ctx.error().getMessage());
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Stop the web server if it is running.
|
|
*/
|
|
public void Stop(){
|
|
if (app!=null){
|
|
try{
|
|
app.stop();
|
|
} catch (Exception e){
|
|
Logger.error("Failed to stop web server: {}", e.getMessage());
|
|
}
|
|
app = null;
|
|
}
|
|
isRunning = false;
|
|
}
|
|
}
|