Skip to content
Snippets Groups Projects
Forked from jjlustig / EECS498-uBoard
34 commits behind the upstream repository.
server.js 6.29 KiB
'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);
    }
  });
});