2022-02-23 21:55:13 +01:00
|
|
|
const express = require("express");
|
|
|
|
const fs = require("fs");
|
|
|
|
const bodyParser = require("body-parser");
|
2022-03-06 00:44:28 +01:00
|
|
|
const helper = require("./helpers.js");
|
2022-02-23 21:55:13 +01:00
|
|
|
|
2022-03-02 21:10:34 +01:00
|
|
|
console.log("Preparing server...");
|
2022-02-23 21:55:13 +01:00
|
|
|
const app = express();
|
|
|
|
|
|
|
|
app.use(express.static("static"));
|
|
|
|
app.use(express.static("node_modules"));
|
|
|
|
|
|
|
|
app.use(bodyParser.json());
|
|
|
|
app.use(
|
|
|
|
bodyParser.urlencoded({
|
|
|
|
// to support URL-encoded bodies
|
|
|
|
extended: true,
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
2022-03-04 21:09:28 +01:00
|
|
|
let loadedData = {}
|
|
|
|
|
2022-03-06 00:44:28 +01:00
|
|
|
if (fs.existsSync("data-persistence.json")) {
|
2022-03-04 21:09:28 +01:00
|
|
|
const loadedDataRaw = fs.readFileSync("data-persistence.json", "utf8");
|
|
|
|
loadedData = JSON.parse(loadedDataRaw);
|
2022-03-06 00:44:28 +01:00
|
|
|
} else {
|
2022-03-04 21:09:28 +01:00
|
|
|
console.warn("Unable to load persistent data");
|
|
|
|
}
|
|
|
|
|
2022-02-23 21:55:13 +01:00
|
|
|
currentState = {
|
|
|
|
mode: "clock",
|
2022-02-24 19:11:13 +01:00
|
|
|
countdownGoal: new Date().getTime(),
|
|
|
|
showMilliSeconds: true,
|
2022-02-24 20:17:24 +01:00
|
|
|
defaultFullScreen: true,
|
|
|
|
timeAmountInital: 0,
|
2022-03-04 21:09:28 +01:00
|
|
|
timerRunState: false,
|
2022-02-24 21:08:31 +01:00
|
|
|
pauseMoment: 0,
|
|
|
|
showTimeOnCountdown: true,
|
|
|
|
message: "",
|
|
|
|
showMessage: false,
|
2022-02-24 22:18:21 +01:00
|
|
|
messageAppearTime: 0,
|
|
|
|
showProgressbar: true,
|
2022-03-06 00:44:28 +01:00
|
|
|
colorSegments: { 20000: "#FFAE00", 5000: "#ff0000", "START": "yellow" },
|
2022-02-25 17:22:59 +01:00
|
|
|
textColors: {},
|
|
|
|
srvTime: 0,
|
|
|
|
enableColoredText: true,
|
|
|
|
debug: false
|
2022-02-23 21:55:13 +01:00
|
|
|
};
|
|
|
|
|
2022-03-04 21:09:28 +01:00
|
|
|
const dataToBeWritten = {};
|
|
|
|
|
|
|
|
currentState = Object.assign({}, currentState, loadedData);
|
|
|
|
|
|
|
|
console.log(currentState)
|
|
|
|
|
2022-02-25 17:22:59 +01:00
|
|
|
currentState.textColors = currentState.colorSegments
|
|
|
|
|
2022-03-04 21:09:28 +01:00
|
|
|
|
|
|
|
|
2022-03-02 21:10:34 +01:00
|
|
|
console.log("Preparing routes...");
|
2022-02-23 21:55:13 +01:00
|
|
|
app.get("/", function (req, res) {
|
2022-02-25 22:24:45 +01:00
|
|
|
const data = fs.readFileSync("templates/newAdminPanel.html", "utf8");
|
|
|
|
res.send(data);
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get("/old", function (req, res) {
|
2022-02-23 21:55:13 +01:00
|
|
|
const data = fs.readFileSync("templates/adminPanel.html", "utf8");
|
|
|
|
res.send(data);
|
|
|
|
});
|
|
|
|
|
2022-02-25 22:24:45 +01:00
|
|
|
|
2022-02-23 21:55:13 +01:00
|
|
|
app.get("/timer", function (req, res) {
|
|
|
|
const data = fs.readFileSync("templates/timerPage.html", "utf8");
|
|
|
|
res.send(data);
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get("/api/v1/data", function (req, res) {
|
2022-02-25 17:22:59 +01:00
|
|
|
currentState.srvTime = new Date().getTime()
|
2022-02-23 21:55:13 +01:00
|
|
|
res.json(currentState);
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get("/api/v1/set/mode", function (req, res) {
|
|
|
|
currentState.mode = req.query.mode;
|
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
|
|
|
|
2022-02-25 17:22:59 +01:00
|
|
|
app.get("/api/v1/set/layout/showMillis", function (req, res) {
|
2022-03-06 00:44:28 +01:00
|
|
|
const resy = helper.wrapBooleanConverter(req.query.show, res)
|
|
|
|
if (resy) {
|
|
|
|
currentState.showMilliSeconds = resy;
|
|
|
|
if (req.query.persist === 'true') {
|
|
|
|
dataToBeWritten.showMilliSeconds = currentState.showMilliSeconds
|
|
|
|
}
|
|
|
|
res.json({ status: "ok" });
|
2022-03-04 21:09:28 +01:00
|
|
|
}
|
2022-03-06 00:44:28 +01:00
|
|
|
|
2022-02-24 19:11:13 +01:00
|
|
|
});
|
|
|
|
|
2022-02-23 22:17:12 +01:00
|
|
|
app.get("/api/v1/set/timerGoal", function (req, res) {
|
2022-02-25 17:22:59 +01:00
|
|
|
currentState.countdownGoal = new Date(parseInt(req.query.time)).getTime(); // ToDO error handling
|
2022-02-23 21:55:13 +01:00
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
|
|
|
|
2022-02-24 19:11:13 +01:00
|
|
|
app.get("/api/v1/set/addMillisToTimer", function (req, res) {
|
2022-02-24 20:17:24 +01:00
|
|
|
currentState.timeAmountInital = req.query.time;
|
2022-02-24 19:11:13 +01:00
|
|
|
currentState.countdownGoal = new Date().getTime() + parseInt(req.query.time)
|
|
|
|
res.json({ status: "ok" });
|
2022-03-06 00:44:28 +01:00
|
|
|
});
|
2022-02-23 21:55:13 +01:00
|
|
|
|
2022-02-24 20:17:24 +01:00
|
|
|
app.get("/api/v1/ctrl/timer/pause", function (req, res) {
|
|
|
|
currentState.timerRunState = false;
|
|
|
|
currentState.pauseMoment = new Date().getTime();
|
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get("/api/v1/ctrl/timer/play", function (req, res) {
|
2022-03-06 00:44:28 +01:00
|
|
|
|
|
|
|
if (currentState.timerRunState == false) {
|
2022-02-26 23:22:53 +01:00
|
|
|
currentState.timerRunState = true
|
|
|
|
currentState.countdownGoal += new Date().getTime() - currentState.pauseMoment;
|
|
|
|
}
|
2022-02-24 20:17:24 +01:00
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get("/api/v1/ctrl/timer/restart", function (req, res) {
|
|
|
|
currentState.countdownGoal = new Date().getTime() + parseInt(currentState.timeAmountInital)
|
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
|
|
|
|
2022-02-25 17:22:59 +01:00
|
|
|
app.get("/api/v1/set/layout/showTime", function (req, res) {
|
2022-03-06 00:44:28 +01:00
|
|
|
const resy = helper.wrapBooleanConverter(req.query.show, res)
|
|
|
|
if (resy) {
|
|
|
|
currentState.showTimeOnCountdown = resy;
|
|
|
|
if (req.query.persist === 'true') {
|
|
|
|
dataToBeWritten.showTimeOnCountdown = currentState.showTimeOnCountdown
|
|
|
|
}
|
|
|
|
res.json({ status: "ok" });
|
2022-03-04 21:09:28 +01:00
|
|
|
}
|
2022-02-24 21:08:31 +01:00
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
|
|
|
|
2022-02-25 17:22:59 +01:00
|
|
|
app.get("/api/v1/set/progressbar/show", function (req, res) {
|
2022-02-24 22:18:21 +01:00
|
|
|
currentState.showProgressbar = (req.query.show === 'true');
|
2022-03-06 00:44:28 +01:00
|
|
|
if (req.query.persist === 'true') {
|
2022-03-04 21:09:28 +01:00
|
|
|
dataToBeWritten.showProgressbar = currentState.showProgressbar
|
|
|
|
}
|
2022-02-24 22:18:21 +01:00
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
|
|
|
|
2022-02-25 17:22:59 +01:00
|
|
|
app.get("/api/v1/set/progressbar/colors", function (req, res) {
|
|
|
|
try {
|
|
|
|
currentState.colorSegments = JSON.parse(req.query.colors);
|
2022-03-06 00:44:28 +01:00
|
|
|
if (req.query.persist === 'true') {
|
2022-03-04 21:09:28 +01:00
|
|
|
dataToBeWritten.colorSegments = currentState.colorSegments
|
|
|
|
}
|
2022-02-25 17:22:59 +01:00
|
|
|
res.json({ status: "ok" });
|
|
|
|
} catch (error) {
|
|
|
|
res.json({ status: "error", message: error });
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get("/api/v1/set/text/colors", function (req, res) {
|
|
|
|
try {
|
2022-03-06 00:44:28 +01:00
|
|
|
if (req.query.copy === "true") {
|
2022-02-25 17:22:59 +01:00
|
|
|
currentState.textColors = currentState.colorSegments;
|
|
|
|
} else {
|
|
|
|
currentState.textColors = JSON.parse(req.query.colors);
|
|
|
|
}
|
2022-03-06 00:44:28 +01:00
|
|
|
if (req.query.persist === 'true') {
|
2022-03-04 21:09:28 +01:00
|
|
|
dataToBeWritten.textColors = currentState.textColors
|
|
|
|
}
|
2022-02-25 17:22:59 +01:00
|
|
|
res.json({ status: "ok" });
|
|
|
|
} catch (error) {
|
|
|
|
res.json({ status: "error", message: error });
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
app.get("/api/v1/set/text/enableColoring", function (req, res) {
|
|
|
|
currentState.enableColoredText = (req.query.enable === 'true');
|
2022-03-06 00:44:28 +01:00
|
|
|
if (req.query.persist === 'true') {
|
2022-03-04 21:09:28 +01:00
|
|
|
dataToBeWritten.enableColoredText = currentState.enableColoredText
|
|
|
|
}
|
2022-03-02 21:10:34 +01:00
|
|
|
res.json({ status: "ok" });
|
2022-02-25 17:22:59 +01:00
|
|
|
});
|
2022-02-24 22:18:21 +01:00
|
|
|
|
2022-02-24 21:08:31 +01:00
|
|
|
app.get("/api/v1/ctrl/message/show", function (req, res) {
|
|
|
|
currentState.message = req.query.msg
|
|
|
|
currentState.showMessage = true
|
|
|
|
currentState.messageAppearTime = new Date().getTime()
|
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
|
|
|
|
2022-02-25 17:22:59 +01:00
|
|
|
app.get("/api/v1/debug", function (req, res) {
|
|
|
|
currentState.debug = (req.query.enable === 'true');
|
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
|
|
|
|
2022-02-24 21:08:31 +01:00
|
|
|
app.get("/api/v1/ctrl/message/hide", function (req, res) {
|
|
|
|
currentState.showMessage = false
|
|
|
|
res.json({ status: "ok" });
|
|
|
|
});
|
2022-03-04 21:09:28 +01:00
|
|
|
|
|
|
|
app.get("/api/v1/storage/commit", function (req, res) {
|
|
|
|
const tempString = JSON.stringify(dataToBeWritten);
|
2022-03-06 00:44:28 +01:00
|
|
|
try {
|
|
|
|
fs.writeFileSync("data-persistence.json", tempString);
|
|
|
|
res.json({ status: "ok" });
|
|
|
|
} catch (error) {
|
|
|
|
res.json({ status: "error", reason: error });
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
app.get("/api/v1/storage/delete", function (req, res) {
|
|
|
|
if (req.query.delete === "true") {
|
|
|
|
if (fs.existsSync("data-persistence.json")) {
|
|
|
|
fs.unlinkSync("data-persistence.json");
|
|
|
|
res.json({ status: "ok" });
|
|
|
|
} else {
|
|
|
|
res.json({ status: "error", reason: "No persistence data was found" });
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
} res.json({ status: "error", reason: "Missing delete argument" });
|
|
|
|
|
2022-03-04 21:09:28 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
|
2022-03-02 21:10:34 +01:00
|
|
|
console.log("Starting server...");
|
2022-03-02 22:09:27 +01:00
|
|
|
const port = 8005
|
|
|
|
app.listen(port);
|
2022-02-27 23:40:33 +01:00
|
|
|
|
2022-03-06 00:44:28 +01:00
|
|
|
console.info("Server running on port " + port);
|
2022-03-02 22:09:27 +01:00
|
|
|
console.info("Visit localhost:" + port + "/timer for the timer page");
|
|
|
|
console.info("Visit localhost:" + port + " for the admin page");
|