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:
parent
2ef36a2670
commit
96acdfd493
125
server.js
125
server.js
@ -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 {
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
const accessToken = process.env.MATRIXACCESSTOKEN;
|
||||||
const loop = () => {
|
const loop = () => {
|
||||||
console.log("loop", lastClosed);
|
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) {}
|
||||||
}
|
}
|
||||||
@ -179,8 +215,19 @@ request.post(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
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 |
@ -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 |
Loading…
Reference in New Issue
Block a user