pixelnode/index.js

149 lines
3.6 KiB
JavaScript

// import all dependencies
const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const http_port = process.env.PORT || 61813;
const net = require('net');
const input_port = 1337;
const myip = require('quick-local-ip');
const ip4 = myip.getLocalIP4();
const ip6 = myip.getLocalIP6();
console.log(ip4);
console.log(ip6);
// define canvas
var canvas_size_x = 100;
var canvas_size_y = 100;
var canvas_background = 'ffffff';
var canvas_content = [];
// stats counter
var pixel_count = 0;
var pixel_count_flat = 0;
var conn_count = 0;
var conn_count_flat = 0;
// FUNCTIONS
// get color
function get_color(x, y) {
if (canvas_content[x] != undefined) {
if (canvas_content[x][y] != undefined) {
return canvas_content[x][y];
}
}
return canvas_background;
}
// str to color
function str_to_color(color) {
color = color.trim();
color = color.toLowerCase();
if (color.match(/^[a-f0-9]{6}$/i) == color) {
return color;
}
else if (color.match(/^[a-f0-9]{8}$/i) == color) {
return color.substr(0, 6);
}
else {
return false;
}
}
// color to HTML color
function color_to_html(color) {
return '#' + color;
}
// save color to canvas content
function color_to_canvas_content(x, y, color) {
if (canvas_content[x] == undefined) {
canvas_content[x] = [];
}
canvas_content[x][y] = color;
}
// STATS
function stats() {
pixel_count_flat = pixel_count;
pixel_count = 0;
conn_count_flat = conn_count;
io.sockets.emit('stats', {pixel: pixel_count_flat, connections: conn_count_flat})
}
setInterval(() => stats(), 1000);
// CONNECTIONS
// define static folder
app.use(express.static(__dirname + '/public'));
// output socket
io.on('connection', function (socket){
console.log("[HTTP] new connection");
socket.emit('setting', {
canvas: {
size: {
x: canvas_size_x,
y: canvas_size_y
}
},
network: {
ip4: ip4,
ip6: ip6,
port: input_port
}
});
});
// input socket
var server = net.createServer();
server.on('connection', function (server_socket) {
console.log(server_socket);
conn_count++;
server_socket.setEncoding('utf8');
console.log('[INPUT] new input');
server_socket.on('data', function (data) {
var command = data.split(" ");
if (command[0] == "PX") {
var x = parseInt(command[1]);
var y = parseInt(command[2]);
if (x <= canvas_size_x && y <= canvas_size_y) {
if (!isNaN(x) && !isNaN(y)) {
if (command[3] != undefined) {
console.log("c is there");
var color = str_to_color(command[3]);
console.log(color);
if (color !== false) {
console.log("c ok");
io.sockets.emit('draw', {type: 'pixel', x: x, y: y, color: color_to_html(color)});
pixel_count++;
color_to_canvas_content(x, y, color);
}
else {
console.log("c not ok");
}
}
server_socket.write('PX ' + x + ' ' + y + ' ' + get_color(x, y) + '\n');
}
}
}
else if (command[0] == 'SIZE') {
server_socket.write('SIZE ' + canvas_size_x + ' ' + canvas_size_x + '\n');
}
else if (command[1] == 'STATS') {
server_socket.write('STATS px:' + pixel_count_flat + ' conn:' + conn_count_flat + '\n');
}
});
server_socket.on('close', function() {
conn_count--;
});
});
// start http
http.listen(http_port, () => console.log('[HTTP] port: ' + http_port));
// start input socket
server.listen(input_port, () => console.log('[INPUT] port: ' + input_port));