diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..31db3b2 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +github: bra1n +custom: https://www.paypal.me/bra1n diff --git a/README.md b/README.md index 6193849..73c403f 100644 --- a/README.md +++ b/README.md @@ -30,3 +30,8 @@ It is supposed to aid storytellers and allow them to quickly set up and capture * All other images and icons are copyright to their respective owners This project and its website are provided free of charge and not affiliated with The Pandemonium Institute in any way. + +## Donations +This project will always be available free of charge, since I love building cool things and playing Blood on the Clocktower. If you still want to support me with a donation, you can do that here: + +[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/bra1n) diff --git a/package-lock.json b/package-lock.json index 96e2a39..88968a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,14 @@ "@fortawesome/fontawesome-common-types": "^0.2.28" } }, + "@fortawesome/free-brands-svg-icons": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.13.0.tgz", + "integrity": "sha512-/6xXiJFCMEQxqxXbL0FPJpwq5Cv6MRrjsbJEmH/t5vOvB4dILDpnY0f7zZSlA8+TG7jwlt12miF/yZpZkykucA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.28" + } + }, "@fortawesome/free-solid-svg-icons": { "version": "5.13.0", "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.0.tgz", diff --git a/package.json b/package.json index dff4f2c..ec34f8e 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "main": "App.vue", "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.28", + "@fortawesome/free-brands-svg-icons": "^5.13.0", "@fortawesome/free-solid-svg-icons": "^5.13.0", "@fortawesome/vue-fontawesome": "^0.1.9", "@vue/cli-service": "^4.3.1", diff --git a/server/index.js b/server/index.js index a61a557..7c9cd4a 100644 --- a/server/index.js +++ b/server/index.js @@ -7,17 +7,24 @@ const server = https.createServer({ key: fs.readFileSync("key.pem") }); const wss = new WebSocket.Server({ - server, - // port: 8081, + ...(process.env.NODE_ENV === "development" ? { port: 8081 } : { server }), verifyClient: info => !!info.origin.match(/^https?:\/\/(bra1n\.github\.io|localhost)/i) }); +function noop() {} + +function heartbeat() { + this.isAlive = true; +} + wss.on("connection", function connection(ws, req) { ws.channel = req.url .split("/") .pop() .toLocaleLowerCase(); + ws.isAlive = true; + ws.on("pong", heartbeat); ws.on("message", function incoming(data) { if (!data.match(/^\["ping/i)) { console.log(ws.channel, wss.clients.size, data); @@ -34,4 +41,18 @@ wss.on("connection", function connection(ws, req) { }); }); -server.listen(8080); +const interval = setInterval(function ping() { + wss.clients.forEach(function each(ws) { + if (ws.isAlive === false) return ws.terminate(); + ws.isAlive = false; + ws.ping(noop); + }); +}, 30000); + +wss.on("close", function close() { + clearInterval(interval); +}); + +if (process.env.NODE_ENV !== "development") { + server.listen(8080); +} diff --git a/src/App.vue b/src/App.vue index a27f522..574691a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -62,6 +62,12 @@ export default { case "a": this.$refs.menu.addPlayer(); break; + case "h": + this.$refs.menu.hostSession(); + break; + case "j": + this.$refs.menu.joinSession(); + break; case "r": this.$store.commit("toggleModal", "reference"); break; @@ -73,8 +79,8 @@ export default { if (this.session.isSpectator) return; this.$store.commit("toggleModal", "roles"); break; - case "Escape": - this.$store.commit("toggleMenu"); + case "escape": + this.$store.commit("toggleModal"); } } } diff --git a/src/components/Menu.vue b/src/components/Menu.vue index f08e68e..79ea96d 100644 --- a/src/components/Menu.vue +++ b/src/components/Menu.vue @@ -24,80 +24,99 @@