1
0
mirror of https://api.glitch.com/git/presence-button synced 2024-12-05 02:37:30 +00:00

🐸👀 Checkpoint

./server.js:933874/21736
This commit is contained in:
Glitch (presence-button) 2020-06-10 23:40:05 +00:00
parent 77a59a8f23
commit 8799fd4ed4

249
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 defaultClosingTimeout = 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
@ -33,36 +38,36 @@ const redirectToHTTPS = (req, res, next) => {
} }
}; };
app.use("/api", redirectToHTTPS); app.use("/api", redirectToHTTPS);
app.use("/img", 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.all("/", redirectToHTTPS); // no app.use here because it would match every path https://github.com/expressjs/express/issues/3260
app.get("/", (req, res) => { app.get("/", (req, res) => {
res.sendFile(__dirname + "/views/index.html"); res.sendFile(__dirname + "/views/index.html");
}); });
app.get("/img", (req, res) => { app.get("/img", (req, res) => {
const closingTimeout = (typeof req.query.closingTimeout !== 'undefined')? req.query.closingTimeout : defaultClosingTimeout; 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"
); );
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) {
// https://www.iconfinder.com/icons/1871431/online_open_shop_shopping_sign_icon // 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 // 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"); return res.sendFile(__dirname + "/views/open.svg");
} }
// https://www.iconfinder.com/icons/1871435/closed_online_shop_shopping_sign_icon // 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 // 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"); res.sendFile(__dirname + "/views/closed.svg");
}); });
app.get("/api", (req, res) => { app.get("/api", (req, res) => {
res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Origin", "*");
res.header( res.header(
"Access-Control-Allow-Headers", "Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept" "Origin, X-Requested-With, Content-Type, Accept"
); );
res.header("Content-Type", "application/json"); res.header("Content-Type", "application/json");
res.send( res.send(
@ -70,6 +75,7 @@ app.get("/api", (req, res) => {
{ {
fuzIsOpen, fuzIsOpen,
lastSeen, lastSeen,
lastOpened,
lastClosed, lastClosed,
processUptime: formatSeconds(process.uptime()) processUptime: formatSeconds(process.uptime())
}, },
@ -97,107 +103,118 @@ 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 &&
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() { const listener = app.listen(process.env.PORT, function() {
console.log("Your app is listening on port " + listener.address().port); console.log("Your app is listening on port " + listener.address().port);
}); });
request.post(
{ const accessToken = process.env.MATRIXACCESSTOKEN;
url: const loop = () => {
"https://" + console.log("loop", JSON.stringify({ fuzIsOpen, lastSeen, lastOpened, lastClosed }));
process.env.MATRIXUSERNAME.substring( if (
process.env.MATRIXUSERNAME.indexOf(":") + 1 //fuzIsOpen &&
) + lastSeen < new Date() - defaultClosingTimeout &&
"/_matrix/client/r0/login", lastClosed < lastSeen
body: JSON.stringify({ ) {
type: "m.login.password", // the Fuz is newly closed, notify on matrix and write file to survive reboot
user: process.env.MATRIXUSERNAME.substring( //https.put ... send message to Fuz process.env.MATRIXROOM
0, request.put(
process.env.MATRIXUSERNAME.indexOf(":") {
), url:
password: process.env.MATRIXPASSWORD, "https://" +
identifier: { process.env.MATRIXUSERNAME.substring(
type: "m.id.user", process.env.MATRIXUSERNAME.indexOf(":") + 1
user: process.env.MATRIXUSERNAME.substring( ) +
0, "/_matrix/client/r0/rooms/" +
process.env.MATRIXUSERNAME.indexOf(":") process.env.MATRIXROOM +
) "/send/m.room.message/" +
} new Date().getTime() +
}), "?access_token=" +
headers: { accessToken +
"Content-Type": "application/json" "&limit=1",
} body: JSON.stringify({
}, msgtype: "m.text",
function(error, response, body) { body:
console.log(body); process.env.MATRIXCLOSINGMESSAGE +
const accessToken = JSON.parse(body)["access_token"]; (fuzIsOpen ? "" : " (crash, oubli, passage bref…)")
const loop = () => { }),
console.log("loop", lastClosed); headers: {
if ( "Content-Type": "application/json"
//fuzIsOpen && }
lastSeen < new Date() - defaultClosingTimeout && },
lastClosed < lastSeen function(error, response, body2) {
) { if (!error) {
// the Fuz is newly closed, notify on matrix and write file to survive reboot try {
//https.put ... send message to Fuz process.env.MATRIXROOM lastClosed = new Date();
request.put( fs.writeFileSync(
{ db,
url: JSON.stringify({ fuzIsOpen, lastSeen, lastOpened, lastClosed })
"https://" + );
process.env.MATRIXUSERNAME.substring( } catch (err) {}
process.env.MATRIXUSERNAME.indexOf(":") + 1 }
) + console.log(body2);
"/_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 {
setTimeout(loop, 10 * 1000); 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 const formatSeconds = function (seconds) { // https://stackoverflow.com/a/13368349
var seconds = Math.floor(seconds), var seconds = Math.floor(seconds),