From 8799fd4ed40eb5bb5c792b1e40bf7b8294076cec Mon Sep 17 00:00:00 2001 From: "Glitch (presence-button)" Date: Wed, 10 Jun 2020 23:40:05 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=B8=F0=9F=91=80=20Checkpoint=20./serve?= =?UTF-8?q?r.js:933874/21736?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.js | 249 +++++++++++++++++++++++++++++------------------------- 1 file changed, 133 insertions(+), 116 deletions(-) diff --git a/server.js b/server.js index 9efc557..8b81d03 100644 --- a/server.js +++ b/server.js @@ -4,20 +4,25 @@ const request = require("request"); var fuzIsOpen = false; var lastSeen = new Date("1970-01-01"); -var lastNofified = new Date("1970-01-01"); +var lastOpened = new Date("1970-01-01"); var lastClosed = new Date("1970-01-01"); const fs = require("fs"); +const path = require("path"); const db = "./.data/data.json"; const defaultClosingTimeout = 5 * 60 * 1000; // 5 mins +try { + fs.mkdirSync(path.dirname(db), { recursive: true }); +} catch (err) {} try { var content = fs.readFileSync(db, "utf8"); + fuzIsOpen = JSON.parse(content)["fuzIsOpen"] || fuzIsOpen; lastSeen = new Date(JSON.parse(content)["lastSeen"] || lastSeen); - lastNofified = new Date(JSON.parse(content)["lastNofified"] || lastNofified); + lastOpened = new Date(JSON.parse(content)["lastOpened"] || lastOpened); lastClosed = new Date(JSON.parse(content)["lastClosed"] || lastClosed); -} catch (err) {} +} catch (err) {console.log("err", err)} app.use(express.static("public")); app.enable("trust proxy"); // needed for HTTP -> HTTPS redirect and successful test against req.secure @@ -33,36 +38,36 @@ const redirectToHTTPS = (req, res, next) => { } }; app.use("/api", redirectToHTTPS); -app.use("/img", redirectToHTTPS); - -app.all("/", redirectToHTTPS); // no app.use here because it would match every path https://github.com/expressjs/express/issues/3260 -app.get("/", (req, res) => { - res.sendFile(__dirname + "/views/index.html"); -}); - -app.get("/img", (req, res) => { - const closingTimeout = (typeof req.query.closingTimeout !== 'undefined')? req.query.closingTimeout : defaultClosingTimeout; - res.header( - "Cache-Control", - "no-store, no-cache, must-revalidate, proxy-revalidate" - ); - res.header("Pragma", "no-cache"); - res.header("Expires", "0"); - if (fuzIsOpen && new Date() - closingTimeout < lastSeen) { - // https://www.iconfinder.com/icons/1871431/online_open_shop_shopping_sign_icon - // formerly https://www.flaticon.com/free-icon/open_1234189, maybe try https://flaticons.net/customize.php?dir=Miscellaneous&icon=Open.png without attribution - return res.sendFile(__dirname + "/views/open.svg"); - } - // https://www.iconfinder.com/icons/1871435/closed_online_shop_shopping_sign_icon - // formerly https://www.flaticon.com/free-icon/closed_1234190, maybe try https://flaticons.net/customize.php?dir=Miscellaneous&icon=Closed.png without attribution - res.sendFile(__dirname + "/views/closed.svg"); -}); - -app.get("/api", (req, res) => { - res.header("Access-Control-Allow-Origin", "*"); - res.header( - "Access-Control-Allow-Headers", - "Origin, X-Requested-With, Content-Type, Accept" +app.use("/img", redirectToHTTPS); + +app.all("/", redirectToHTTPS); // no app.use here because it would match every path https://github.com/expressjs/express/issues/3260 +app.get("/", (req, res) => { + res.sendFile(__dirname + "/views/index.html"); +}); + +app.get("/img", (req, res) => { + const closingTimeout = (typeof req.query.closingTimeout !== 'undefined')? req.query.closingTimeout : defaultClosingTimeout; + res.header( + "Cache-Control", + "no-store, no-cache, must-revalidate, proxy-revalidate" + ); + res.header("Pragma", "no-cache"); + res.header("Expires", "0"); + if (fuzIsOpen && new Date() - closingTimeout < lastSeen) { + // https://www.iconfinder.com/icons/1871431/online_open_shop_shopping_sign_icon + // formerly https://www.flaticon.com/free-icon/open_1234189, maybe try https://flaticons.net/customize.php?dir=Miscellaneous&icon=Open.png without attribution + return res.sendFile(__dirname + "/views/open.svg"); + } + // https://www.iconfinder.com/icons/1871435/closed_online_shop_shopping_sign_icon + // formerly https://www.flaticon.com/free-icon/closed_1234190, maybe try https://flaticons.net/customize.php?dir=Miscellaneous&icon=Closed.png without attribution + res.sendFile(__dirname + "/views/closed.svg"); +}); + +app.get("/api", (req, res) => { + res.header("Access-Control-Allow-Origin", "*"); + res.header( + "Access-Control-Allow-Headers", + "Origin, X-Requested-With, Content-Type, Accept" ); res.header("Content-Type", "application/json"); res.send( @@ -70,6 +75,7 @@ app.get("/api", (req, res) => { { fuzIsOpen, lastSeen, + lastOpened, lastClosed, processUptime: formatSeconds(process.uptime()) }, @@ -97,107 +103,118 @@ app.get("/status", (req, res) => { login !== auth.login || password !== auth.password ) { - console.log(login, password); res.set("WWW-Authenticate", 'Basic realm="Authentication required"'); return res.status(401).send("Authentication required."); } fuzIsOpen = req.query.fuzisopen === "1"; lastSeen = new Date(); try { - fs.writeFileSync(db, JSON.stringify({ fuzIsOpen, lastSeen, lastClosed })); + fs.writeFileSync(db, JSON.stringify({ fuzIsOpen, lastSeen, lastOpened, lastClosed })); } catch (err) {} res.sendStatus(200); + if ( + fuzIsOpen && + lastOpened < lastClosed + ) { + // the Fuz is newly opened, notify on matrix and write file to survive reboot + request.put( + { + url: + "https://" + + process.env.MATRIXUSERNAME.substring( + process.env.MATRIXUSERNAME.indexOf(":") + 1 + ) + + "/_matrix/client/r0/rooms/" + + process.env.MATRIXROOM + + "/send/m.room.message/" + + new Date().getTime() + + "?access_token=" + + accessToken + + "&limit=1", + body: JSON.stringify({ + msgtype: "m.text", + body: + process.env.MATRIXOPENINGMESSAGE + }), + headers: { + "Content-Type": "application/json" + } + }, + function(error, response, body2) { + if (!error) { + try { + lastOpened = new Date(); + fs.writeFileSync( + db, + JSON.stringify({ fuzIsOpen, lastSeen, lastOpened, lastClosed }) + ); + } catch (err) {} + } + console.log(body2); + } + ); + } }); const listener = app.listen(process.env.PORT, function() { console.log("Your app is listening on port " + listener.address().port); }); -request.post( - { - url: - "https://" + - process.env.MATRIXUSERNAME.substring( - process.env.MATRIXUSERNAME.indexOf(":") + 1 - ) + - "/_matrix/client/r0/login", - body: JSON.stringify({ - type: "m.login.password", - user: process.env.MATRIXUSERNAME.substring( - 0, - process.env.MATRIXUSERNAME.indexOf(":") - ), - password: process.env.MATRIXPASSWORD, - identifier: { - type: "m.id.user", - user: process.env.MATRIXUSERNAME.substring( - 0, - process.env.MATRIXUSERNAME.indexOf(":") - ) - } - }), - headers: { - "Content-Type": "application/json" - } - }, - function(error, response, body) { - console.log(body); - const accessToken = JSON.parse(body)["access_token"]; - const loop = () => { - console.log("loop", lastClosed); - if ( - //fuzIsOpen && - lastSeen < new Date() - defaultClosingTimeout && - lastClosed < lastSeen - ) { - // the Fuz is newly closed, notify on matrix and write file to survive reboot - //https.put ... send message to Fuz process.env.MATRIXROOM - request.put( - { - url: - "https://" + - process.env.MATRIXUSERNAME.substring( - process.env.MATRIXUSERNAME.indexOf(":") + 1 - ) + - "/_matrix/client/r0/rooms/" + - process.env.MATRIXROOM + - "/send/m.room.message/" + - new Date().getTime() + - "?access_token=" + - accessToken + - "&limit=1", - body: JSON.stringify({ - msgtype: "m.text", - body: - process.env.MATRIXMESSAGE + - (fuzIsOpen ? "" : " (crash, oubli, passage bref…)") - }), - headers: { - "Content-Type": "application/json" - } - }, - function(error, response, body2) { - if (!error) { - try { - lastClosed = new Date(); - fs.writeFileSync( - db, - JSON.stringify({ fuzIsOpen, lastSeen, lastClosed }) - ); - } catch (err) {} - } - console.log(body2); - setTimeout(loop, 10 * 1000); - } - ); - } else { + +const accessToken = process.env.MATRIXACCESSTOKEN; +const loop = () => { + console.log("loop", JSON.stringify({ fuzIsOpen, lastSeen, lastOpened, lastClosed })); + if ( + //fuzIsOpen && + lastSeen < new Date() - defaultClosingTimeout && + lastClosed < lastSeen + ) { + // the Fuz is newly closed, notify on matrix and write file to survive reboot + //https.put ... send message to Fuz process.env.MATRIXROOM + request.put( + { + url: + "https://" + + process.env.MATRIXUSERNAME.substring( + process.env.MATRIXUSERNAME.indexOf(":") + 1 + ) + + "/_matrix/client/r0/rooms/" + + process.env.MATRIXROOM + + "/send/m.room.message/" + + new Date().getTime() + + "?access_token=" + + accessToken + + "&limit=1", + body: JSON.stringify({ + msgtype: "m.text", + body: + process.env.MATRIXCLOSINGMESSAGE + + (fuzIsOpen ? "" : " (crash, oubli, passage bref…)") + }), + headers: { + "Content-Type": "application/json" + } + }, + function(error, response, body2) { + if (!error) { + try { + lastClosed = new Date(); + fs.writeFileSync( + db, + JSON.stringify({ fuzIsOpen, lastSeen, lastOpened, lastClosed }) + ); + } catch (err) {} + } + console.log(body2); setTimeout(loop, 10 * 1000); } - }; - setTimeout(loop, 1 * 60 * 1000); // give some time for presence button to show up (1 min) + ); + } else { + setTimeout(loop, 10 * 1000); } -); +}; +setTimeout(loop, 1 * 60 * 1000); // give some time for presence button to show up (1 min) const formatSeconds = function (seconds) { // https://stackoverflow.com/a/13368349 var seconds = Math.floor(seconds),