9
0
mirror of https://github.com/Lomanic/presence-button-web synced 2024-11-24 22:47:29 +00:00

Last nodejs version

This commit is contained in:
Lomanic 2020-10-04 21:15:18 +02:00
parent 2ef36a2670
commit 96acdfd493
4 changed files with 141 additions and 107 deletions

133
server.js
View File

@ -4,20 +4,25 @@ const request = require("request");
var fuzIsOpen = false; var fuzIsOpen = false;
var lastSeen = new Date("1970-01-01"); 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"); var lastClosed = new Date("1970-01-01");
const fs = require("fs"); const fs = require("fs");
const path = require("path");
const db = "./.data/data.json"; const db = "./.data/data.json";
const closingTimeout = 5 * 60 * 1000; // 5 mins const defaultClosingTimeout = 5 * 60 * 1000; // 5 mins
try {
fs.mkdirSync(path.dirname(db), { recursive: true });
} catch (err) {}
try { try {
var content = fs.readFileSync(db, "utf8"); var content = fs.readFileSync(db, "utf8");
fuzIsOpen = JSON.parse(content)["fuzIsOpen"] || fuzIsOpen; fuzIsOpen = JSON.parse(content)["fuzIsOpen"] || fuzIsOpen;
lastSeen = new Date(JSON.parse(content)["lastSeen"] || lastSeen); 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); lastClosed = new Date(JSON.parse(content)["lastClosed"] || lastClosed);
} catch (err) {} } catch (err) {console.log("err", err)}
app.use(express.static("public")); app.use(express.static("public"));
app.enable("trust proxy"); // needed for HTTP -> HTTPS redirect and successful test against req.secure app.enable("trust proxy"); // needed for HTTP -> HTTPS redirect and successful test against req.secure
@ -41,6 +46,7 @@ app.get("/", (req, res) => {
}); });
app.get("/img", (req, res) => { app.get("/img", (req, res) => {
const closingTimeout = (typeof req.query.closingTimeout !== 'undefined')? req.query.closingTimeout : defaultClosingTimeout;
res.header( res.header(
"Cache-Control", "Cache-Control",
"no-store, no-cache, must-revalidate, proxy-revalidate" "no-store, no-cache, must-revalidate, proxy-revalidate"
@ -48,9 +54,13 @@ app.get("/img", (req, res) => {
res.header("Pragma", "no-cache"); res.header("Pragma", "no-cache");
res.header("Expires", "0"); res.header("Expires", "0");
if (fuzIsOpen && new Date() - closingTimeout < lastSeen) { if (fuzIsOpen && new Date() - closingTimeout < lastSeen) {
return res.sendFile(__dirname + "/views/open.svg"); // https://www.flaticon.com/free-icon/open_1234189, maybe try https://flaticons.net/customize.php?dir=Miscellaneous&icon=Open.png without attribution // 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");
} }
res.sendFile(__dirname + "/views/closed.svg"); // https://www.flaticon.com/free-icon/closed_1234190, maybe try https://flaticons.net/customize.php?dir=Miscellaneous&icon=Closed.png without attribution // 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) => { app.get("/api", (req, res) => {
@ -59,7 +69,20 @@ app.get("/api", (req, res) => {
"Access-Control-Allow-Headers", "Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept" "Origin, X-Requested-With, Content-Type, Accept"
); );
res.send({ fuzIsOpen, lastSeen, lastClosed }); res.header("Content-Type", "application/json");
res.send(
JSON.stringify(
{
fuzIsOpen,
lastSeen,
lastOpened,
lastClosed,
processUptime: formatSeconds(process.uptime())
},
null,
4
)
);
}); });
app.get("/status", (req, res) => { app.get("/status", (req, res) => {
@ -80,58 +103,71 @@ app.get("/status", (req, res) => {
login !== auth.login || login !== auth.login ||
password !== auth.password password !== auth.password
) { ) {
console.log(login, password);
res.set("WWW-Authenticate", 'Basic realm="Authentication required"'); res.set("WWW-Authenticate", 'Basic realm="Authentication required"');
return res.status(401).send("Authentication required."); return res.status(401).send("Authentication required.");
} }
fuzIsOpen = req.query.fuzisopen === "1"; fuzIsOpen = req.query.fuzisopen === "1";
lastSeen = new Date(); lastSeen = new Date();
try { try {
fs.writeFileSync(db, JSON.stringify({ fuzIsOpen, lastSeen, lastClosed })); fs.writeFileSync(db, JSON.stringify({ fuzIsOpen, lastSeen, lastOpened, lastClosed }));
} catch (err) {} } catch (err) {}
res.sendStatus(200); res.sendStatus(200);
}); if (
fuzIsOpen &&
const listener = app.listen(process.env.PORT, function() { lastOpened < lastClosed
console.log("Your app is listening on port " + listener.address().port); ) {
}); // the Fuz is newly opened, notify on matrix and write file to survive reboot
request.put(
request.post(
{ {
url: url:
"https://" + "https://" +
process.env.MATRIXUSERNAME.substring( process.env.MATRIXUSERNAME.substring(
process.env.MATRIXUSERNAME.indexOf(":") + 1 process.env.MATRIXUSERNAME.indexOf(":") + 1
) + ) +
"/_matrix/client/r0/login", "/_matrix/client/r0/rooms/" +
process.env.MATRIXROOM +
"/send/m.room.message/" +
new Date().getTime() +
"?access_token=" +
accessToken +
"&limit=1",
body: JSON.stringify({ body: JSON.stringify({
type: "m.login.password", msgtype: "m.text",
user: process.env.MATRIXUSERNAME.substring( body:
0, (new Date().getDay() === 3 ? "C'est Fuzcredi ! " : "") + process.env.MATRIXOPENINGMESSAGE
process.env.MATRIXUSERNAME.indexOf(":")
),
password: process.env.MATRIXPASSWORD,
identifier: {
type: "m.id.user",
user: process.env.MATRIXUSERNAME.substring(
0,
process.env.MATRIXUSERNAME.indexOf(":")
)
}
}), }),
headers: { headers: {
"Content-Type": "application/json" "Content-Type": "application/json"
} }
}, },
function(error, response, body) { function(error, response, body2) {
console.log(body); if (!error) {
const accessToken = JSON.parse(body)["access_token"]; try {
const loop = () => { lastOpened = new Date();
console.log("loop", lastClosed); 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);
});
const accessToken = process.env.MATRIXACCESSTOKEN;
const loop = () => {
console.log("loop", JSON.stringify({ fuzIsOpen, lastSeen, lastOpened, lastClosed }));
if ( if (
//fuzIsOpen && //fuzIsOpen &&
lastSeen < new Date() - closingTimeout && lastSeen < new Date() - defaultClosingTimeout &&
lastClosed < lastSeen lastClosed < lastSeen
) { ) {
// the Fuz is newly closed, notify on matrix and write file to survive reboot // the Fuz is newly closed, notify on matrix and write file to survive reboot
@ -153,8 +189,8 @@ request.post(
body: JSON.stringify({ body: JSON.stringify({
msgtype: "m.text", msgtype: "m.text",
body: body:
process.env.MATRIXMESSAGE + process.env.MATRIXCLOSINGMESSAGE +
(fuzIsOpen ? "" : " (crash ou oubli)") (fuzIsOpen ? "" : " (crash, oubli, passage bref…)")
}), }),
headers: { headers: {
"Content-Type": "application/json" "Content-Type": "application/json"
@ -166,7 +202,7 @@ request.post(
lastClosed = new Date(); lastClosed = new Date();
fs.writeFileSync( fs.writeFileSync(
db, db,
JSON.stringify({ fuzIsOpen, lastSeen, lastClosed }) JSON.stringify({ fuzIsOpen, lastSeen, lastOpened, lastClosed })
); );
} catch (err) {} } catch (err) {}
} }
@ -177,10 +213,21 @@ request.post(
} else { } else {
setTimeout(loop, 10 * 1000); setTimeout(loop, 10 * 1000);
} }
}; };
setTimeout(loop, 1 * 60 * 1000); // give some time for presence button to show up (1 min) 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),
hours = Math.floor(seconds / 3600);
seconds -= hours*3600;
var minutes = Math.floor(seconds / 60);
seconds -= minutes*60;
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
return hours+':'+minutes+':'+seconds;
}
if (process.env.PROJECT_DOMAIN != "") { if (process.env.PROJECT_DOMAIN != "") {
process.on("SIGTERM", function() { process.on("SIGTERM", function() {

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -1,12 +1,3 @@
<!-- This is a static file -->
<!-- served from your routes in server.js -->
<!-- You might want to try something fancier: -->
<!-- html/nunjucks docs: https://mozilla.github.io/nunjucks/ -->
<!-- pug: https://pugjs.org/ -->
<!-- haml: http://haml.info/ -->
<!-- hbs(handlebars): http://handlebarsjs.com/ -->
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
@ -48,7 +39,7 @@
<ul id="dreams"> <ul id="dreams">
<li> <li>
<a href="/img">image API</a <a href="/img">image API</a
><img src="/img" height="15px" width="15px" /> ><img src="/img" height="15px" width="15px" />, you can define a custom closingTimeout parameter to customize the delay after which the space is shown closed (milliseconds, defaults to 5 mins)
</li> </li>
<li><a href="/api">ajax API</a></li> <li><a href="/api">ajax API</a></li>
</ul> </ul>
@ -64,11 +55,7 @@
</p> </p>
</main> </main>
<footer> <footer>Made with <a href="https://glitch.com">Glitch</a>!</footer>
Made with <a href="https://glitch.com">Glitch</a>! Icons made by
<a href="https://www.flaticon.com/authors/smashicons">Smashicons</a> from
<a href="https://www.flaticon.com/">www.flaticon.com</a>
</footer>
<!-- include the Glitch button to show what the webpage is about and <!-- include the Glitch button to show what the webpage is about and
to make it easier for folks to view source and remix --> to make it easier for folks to view source and remix -->

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB