'use strict'; //-------External Libraries----------// var express = require('express'); var app = express(); var http = require('http').Server(app); var io = require('socket.io')(http); var robot = require('robotjs'); var config = require('./public/js/config.js'); var url = require("opn"); var fs = require("fs"); //---------GLOBAL STATE VARIABLES ----// var screenWidth = 1440; var screenHeight = 900; var adjustment = 2; var mouse = null; var newX = null; var newY = null; // Get screen size from NW desktop try { var gui = window.require('nw.gui'); gui.Screen.Init(); var screens = gui.Screen.screens; // XXX: currently only take first screen var rect = screens[0].bounds; screenWidth = rect.width; screenHeight = rect.height; } catch (e) { console.log(e); } //-------WEB SERVER FUNCTIONALITY -------// //Purpose: Sends client information when making http request to main entrypoint app.get('/', function(req, res) { res.sendFile(__dirname + '/public/client.html'); }); //Purpose: use the public directory to send information app.use('/public', express.static('public')); //Purpose: Lets the webserver listen for requests on port 8000 var PORT = 8000; http.listen(PORT, function() { console.log('listening on *:' + PORT); }); //-------MOBILE MOUSE FUNCTIONALITY -------// //General Connection Configuration io.on('connection', function(socket) { socket.broadcast.emit('hi'); console.log('a user connected'); socket.on('disconnect', function() { console.log('user disconnected'); }); var keys = [] var xpos = [] var ypos = [] //Load default keyboard var file = fs.readFileSync("configuration.json") var content = JSON.parse(file) for (var key in content) { keys.push(content[key][0]); xpos.push(content[key][1]); ypos.push(content[key][2]); } socket.emit('updateKeys', {k: keys, x: xpos, y: ypos}); content = [] //Load default numpad var file = fs.readFileSync("numpad.json") var content = JSON.parse(file) var keys = [] var xpos = [] var ypos = [] for (var key in content) { keys.push(content[key][0]); xpos.push(content[key][1]); ypos.push(content[key][2]); } socket.emit('updateNumPad', {k: keys, x: xpos, y: ypos}); content = [] //Load default urls var file = fs.readFileSync("url.json") content = JSON.parse(file) var keys = [] var xpos = [] var ypos = [] for (var key in content) { keys.push(content[key][0]); xpos.push(content[key][1]); ypos.push(content[key][2]); } socket.emit('updateUrls', {k: keys, x: xpos, y: ypos}); //Load custom keyboards fs.readdirSync('./custom_configs/').forEach(fileName => { var file = fs.readFileSync('./custom_configs/'+fileName) content = JSON.parse(file) var keys = [] var xpos = [] var ypos = [] for (var key in content) { keys.push(content[key][0]); xpos.push(content[key][1]); ypos.push(content[key][2]); } socket.emit('updateCustom', {fname: fileName.slice(0, -5), k: keys, x: xpos, y: ypos}); }); //Keyboard Functionality socket.on('string', function(str) { console.log("Trying to type") console.log(str); if (str === "Go"){ robot.keyTap('enter'); } else if (str === "space"){ robot.keyTap('space'); } else if (str === 'del'){ robot.keyTap('backspace'); } else{ robot.typeString(str); } }); socket.on('functionality', function(type) { console.log(type); switch (type) { case 'backspace': robot.keyTap('backspace'); break; case 'enter': robot.keyTap('enter'); break; case 'ArrowUp': robot.keyTap('up'); break; case 'ArrowDown': robot.keyTap('down'); break; case 'ArrowLeft': robot.keyTap('left'); break; case 'ArrowRight': robot.keyTap('right'); break; case 'Space': robot.keyTap('space'); break; } }); socket.on('text', function(text) { console.log('Typing ' + text); robot.typeString(text); }); socket.on('saveKey', function(key) { console.log(key.index.toString()) var file = fs.readFileSync("./custom_configs/custom" + key.index.toString() + ".json") var configuration = JSON.parse(file) configuration[key.id] = [key.val, key.x, key.y]; fs.writeFile("./custom_configs/custom" + key.index.toString() + ".json", JSON.stringify(configuration, null, 4), 'utf8', error=>{}); }); socket.on('newBoard', function(key) { fs.writeFile('./custom_configs/custom'+key.index.toString()+'.json', JSON.stringify({}, null, 4), 'utf8', error=>{}) }); socket.on('url', function(str) { console.log("Trying to open url") console.log(str) url(str) }); //Mouse Functionality socket.on('mouse', function(pos) { if (pos.pw) { if (config.passcode !== pos.pw) { //Password Checker return; } } if (pos.cmd == 'move') { mouse = robot.getMousePos(); //Get mouse state newX = mouse.x + pos.x * adjustment; newY = mouse.y + pos.y * adjustment; robot.moveMouse(newX, newY); mouse = robot.getMousePos(); //Update mouse state } else if (pos.cmd == 'scroll'){ mouse = robot.getMousePos(); //Get mouse state robot.scrollMouse(pos.x*5, pos.y*5); mouse = robot.getMousePos(); //Update mouse state } else if (pos.cmd == 'drag') { mouse = robot.getMousePos(); //Get mouse state newX = mouse.x + pos.x * adjustment; newY = mouse.y + pos.y * adjustment; robot.dragMouse(newX, newY); mouse = robot.getMousePos(); //Update mouse state } else if (pos.cmd == 'click') { robot.mouseClick(); } else if (pos.cmd == 'rightclick') { robot.mouseClick('right'); } else if (pos.cmd == 'scrollstart') { //robot.mouseToggle('down', 'middle'); } else if (pos.cmd == 'scrollend') { //robot.mouseToggle('up', 'middle'); } else if (pos.cmd == 'dragstart') { robot.mouseToggle('down', 'left'); } else if (pos.cmd == 'dragend') { robot.mouseToggle('up', 'left'); } else if (pos.cmd == 'right') { robot.keyTap("right"); } else if (pos.cmd == 'left') { robot.keyTap("left"); } else if (pos.cmd == 'doubleclick') { robot.mouseClick("left",true); } }); });