Skip to content

Instantly share code, notes, and snippets.

@flexd
Created November 29, 2012 16:20
Show Gist options
  • Save flexd/4170111 to your computer and use it in GitHub Desktop.
Save flexd/4170111 to your computer and use it in GitHub Desktop.
var spawn = require('child_process').spawn;
var reader;
var util = require('util');
var csv = require('ya-csv');
var restify = require('restify');
var csvreader = csv.createCsvFileReader('folk.csv', {
'separator': ';',
'quote': '"',
'escape': '"',
'comment': '',
});
var check = require('validator').check,
sanitize = require('validator').sanitize
var mysql = require('mysql');
function spawnReader() {
reader = spawn('python', ['uidgrabber.py']);
console.log("uidgrabber running pid: " + reader.pid);
}
function handleReaderErrors(reader) {
reader.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
reader.on('exit', function (code) {
console.log('uidgrabber process exited with code ' + code);
handleReaderErrors(reader);
spawnReader();
});
}
var connection = mysql.createConnection({
host : 'localhost',
user : 'cardqueue',
password : 'superpassword123456',
database : 'cardqueue',
});
connection.connect();
spawnReader();
handleReaderErrors(reader);
function handleDisconnect(connection) {
connection.on('error', function(err) {
if (!err.fatal) {
return;
}
if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
throw err;
}
console.log('Re-connecting lost connection: ' + err.stack);
connection = mysql.createConnection(connection.config);
handleDisconnect(connection);
connection.connect();
});
}
handleDisconnect(connection);
folk = [];
uids = [];
csvreader.setColumnNames([ 'id', 'first', 'last' ]);
csvreader.addListener('data', function(data) {
//console.log("ID: " + data.id + " Fornavn: " + data.first + " Etternavn: " + data.last);
folk[data.id] = data;
});
// Web server
var express = require('express');
var app = require('express')();
var eserver = require('http').createServer(app),
io = require('socket.io').listen(eserver);
eserver.listen(8080);
console.log("static file server for index.html and assets listening on port 8080");
app.use(express.logger());
app.use(express.methodOverride());
app.use(express.bodyParser());
app.use(express.static(__dirname + '/public'));
var lastUID = "";
// Websocket stuff.
io.sockets.on('connection', function (socket) {
});
// Setup bits
var server = restify.createServer();
server.use(restify.bodyParser());
// Handle stuff
//
server.get('/queue', getQueue);
server.get('/people', getPeople);
function getQueue(req, res, next) {
res.send(uids);
}
function getPeople(req, res, next) {
connection.query('SELECT * FROM people ORDER BY lastname, firstname DESC LIMIT 10', function (err, rows, fields) {
if (err) {
return next(new restify.InternalError(err));
}
else {
res.send(rows);
}
});
}
// Now listen! (fairy voice from zelda is now in your head!)
server.listen(3000, function() {
console.log('%s listening at %s', server.name, server.url);
});
reader.stdout.on('data', function (data) {
var data = data.toString();
data = data.replace(/\u001b\[\d{0,2}m/g, ''); // Remove ANSI colors.
var uid = /UID: (.+)/.exec(data);
if (uid) {
uid = uid[1];
if (uid != lastUID) {
var person = folk[uid];
uids.push({
id: uid,
firstname: person.first,
lastname: person.last
});
io.sockets.emit("updated");
}
lastUID = uid;
}
});
console.log("This process has the pid: " + process.pid);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment