From 009e60d9848e2546e936a11bc2786e131f3b3c9a Mon Sep 17 00:00:00 2001 From: leca Date: Sat, 6 Apr 2024 05:53:37 +0300 Subject: [PATCH] remade old shit --- Dockerfile | 3 +-- README.md | 4 +-- docker-compose.yml | 9 +++---- html/logic.js | 47 +++++++++++++++++++++++++--------- src/index.js | 63 ++++++++++++++++++++++++++++++++-------------- 5 files changed, 86 insertions(+), 40 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4d8a0c5..f2d30c6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,5 @@ RUN npm ci --omit=dev COPY html ./html COPY views ./views COPY src ./src - CMD ["node", "src/index.js"] -EXPOSE 7865 8080 \ No newline at end of file +EXPOSE 7865 8080 diff --git a/README.md b/README.md index c78c882..69a77b5 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ That's it! # Tips & tricks -1. Server settings are located in `./settings.json`, you need to change serverAddress in order to deploy +1. Server settings are located in `./pb-data/settings.json`, you need to change serverAddress after frist launch in order to deploy -2. When catches SIGUSR1, server will save a board with name read from settings file. SIGINT (CTRL + C) does the same but exit server when board is saved **KILL WITH SIGTERM WILL NOT SAVE THE BOARD!** +2. When catches SIGUSR1, server will save a board with name read from settings file. SIGINT (CTRL + C) and SIGTERM does the same but exit server when board is saved diff --git a/docker-compose.yml b/docker-compose.yml index ca2df0c..67567d3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,9 +5,8 @@ services: image: pixelbattle build: . ports: - - 8080:8080 - - 7865:7865 + - 8089:8089 volumes: - - ./board.png:/usr/src/app/board.png - - ./settings.json:/usr/src/app/settings.json - container_name: pixelbattle \ No newline at end of file + - ./pb-data:/usr/src/app/data +# - ./settings.json:/usr/src/app/settings.json + container_name: pixelbattle diff --git a/html/logic.js b/html/logic.js index 874a36a..18c9830 100644 --- a/html/logic.js +++ b/html/logic.js @@ -27,16 +27,7 @@ function drawTimer() { function connect() { // socket.close(); - serverAddress = document.getElementById("server-address").value; - serverPort = document.getElementById("server-port").value - console.log(`Connecting ${serverAddress}:${serverPort}`) - socket = new WebSocket(`wss://${serverAddress}:${serverPort}`) - timer.textContent="Board is loading, please wait"; - socket.addEventListener("open", (event) => { - socket.send(JSON.stringify({code:0})); - }); - - socket.addEventListener("message", (event) => { + const handler = (event) => { event.data.text().then(function(packet){ packet = JSON.parse(packet) let code = packet.code @@ -74,9 +65,36 @@ function connect() { break } }); - }); + } - // socket.send("{\"code\":0}"); + serverAddress = document.getElementById("server-address").value; + serverPort = document.getElementById("server-port").value + + console.log() + + if (location.protocol == "https:") { + console.log(`Connecting wss://${serverAddress}:${serverPort}`) + socket = new WebSocket(`wss://${serverAddress}:${serverPort}`) + + } else { + console.log(`Connecting ws://${serverAddress}:${serverPort}`) + socket = new WebSocket(`ws://${serverAddress}:${serverPort}`) + } + socket.addEventListener("open", (event) => { + socket.send(JSON.stringify({code:0})); + setInterval(() => {pingServer(socket)}, 10000); + }); + + socket.addEventListener("message", (event) => { + handler(event); + }); + + socket.addEventListener('close', (socket) => { + console.log(`Connecting ws://${serverAddress}:${serverPort}`) + socket = new WebSocket(`ws://${serverAddress}:${serverPort}`); + + }) + timer.textContent="Board is loading, please wait"; } function drawPixel(x, y, color) { @@ -300,3 +318,8 @@ function trackTransforms(ctx){ return pt.matrixTransform(xform.inverse()); } } + +const pingServer = (socket) => { + console.log("Pinging server"); + socket.send(JSON.stringify({})); +} diff --git a/src/index.js b/src/index.js index e5786b7..1d9fd72 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,5 @@ +const config_path = "/usr/src/app/data/settings.json"; + const WebSocket = require('ws'); const path = require('path'); const pug = require('pug'); @@ -10,15 +12,30 @@ const app = express(); app.use(express.static(path.join(__dirname, '../html'))); app.set('view engine', 'pug'); -const config = require("../settings.json"); +let config; + +if (!fs.existsSync(config_path)) { + config = { + "listenPort": 8080, + "boardWidth": 1920, + "boardHeight": 1080, + "serverAddress": "example.com", + "saveFile": "/usr/src/app/data/board.png", + "timeBetweenPixels": 5, + "autoSaveTime": 120 + } + fs.writeFileSync(config_path, JSON.stringify(config)); +} else { + config = JSON.parse(fs.readFileSync(config_path)); +} + const httpPort = config.listenPort; -const exposedPort = config.exposedPort; const serverAddress = config.serverAddress; const saveFile = config.saveFile; const boardWidth = config.boardWidth; const boardHeight = config.boardHeight; const timeBetweenPixels = config.timeBetweenPixels; - +const autoSaveTime = config.autoSaveTime; var toQuit = false; var board = new Array(boardWidth * boardHeight * 4); @@ -26,9 +43,10 @@ var board = new Array(boardWidth * boardHeight * 4); if (!fs.existsSync(saveFile)) { console.log("No save file found, creating blank board."); board.fill(255); + } else { console.log("Save file found, loading") - let image = Jimp.read(`./${saveFile}`, (err, image) => { + let image = Jimp.read(`${saveFile}`, (err, image) => { for (let x = 0; x < boardWidth; x++) { for (let y = 0; y < boardHeight; y++) { pixelNumber = evaulatePixelNumber(x * 4, y * 4); @@ -111,6 +129,8 @@ server.on('connection', (client) => { // client.send("{\"code\":3}") } break; + case undefined: + break; default: console.log("Packet cannot be understood: ", packet); client.send("{\"code\":-1}"); @@ -130,9 +150,8 @@ const pingClient = () => { }; setInterval(pingClient, 15000) - app.get('/', (req, res) => { - res.render('index.pug', { root: __dirname, server: serverAddress, port: exposedPort }); + res.render('index.pug', { root: __dirname, server: serverAddress, port: httpPort }); }) app.use(function (err, req, res, next) { if (err) console.log(err); @@ -157,7 +176,7 @@ const save = (err, image) => { } } - image.write(`./${saveFile}`, (err) => { + image.write(`${saveFile}`, (err) => { if (err) throw err; console.log("Saved") if (toQuit) process.exit(); @@ -167,16 +186,22 @@ const save = (err, image) => { process.stdin.resume(); -process.on('SIGUSR1', () => { - //save - console.log(`Caught SIGUSR1, saving ${boardWidth}x${boardHeight} image`) - toQuit = false; - let image = new Jimp(boardWidth, boardHeight, save); -}); +const save_notify = (signal) => { + console.log(`Caught ${signal}, saving ${boardWidth}x${boardHeight} image`) -process.on('SIGINT', () => { - //save - console.log(`Caught SIGINT, saving ${boardWidth}x${boardHeight} image and quitting`) - toQuit = true; - let image = new Jimp(boardWidth, boardHeight, save); -}); \ No newline at end of file + // if (signal == 'SIGUSR') { + // toQuit = false; + // } else { + // toQuit = true; + // } + toQuit = signal == 'SIGUSR1' || signal == 'AUTOSAVE'? false : true; + let image = new Jimp(boardWidth, boardHeight, save); +} + +setInterval(() => { save_notify('AUTOSAVE'); }, autoSaveTime * 1000); + +process.on('SIGUSR1', () => { save_notify('SIGUSR'); }); + +process.on('SIGINT', () => { save_notify('SIGINT'); }); + +process.on('SIGTERM', () => { save_notify('SIGTERM'); });