gif joker censor interface

This commit is contained in:
Astro 2011-12-13 19:25:38 +01:00
parent d1f86d6648
commit c6ee661bf9
5 changed files with 189 additions and 36 deletions

40
censor.html Normal file
View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html>
<head>
<title>███ interface</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery-1.4.2.js" defer></script>
<script type="text/javascript" src="censor.js" defer></script>
<style>
.image {
background-color: #ccc;
border-radius: 4px;
}
.image p {
float: right;
text-align: right;
}
</style>
</head>
<body>
<h1>Frontend keys</h1>
<dl>
<dt>Player select</dt>
<dd>a b c (Buzzers)</dd>
<dt>Answers</dt>
<dd>1 2 3 4</dd>
<dt>Confirm answer</dt>
<dd>\n</dd>
<dt>Switch to scoreboard</dt>
<dd>Space</dd>
<dt>Jokers</dt>
<dd><b>F</b>iftyfifty (Wikipedia)</dd>
<dd><b>N</b>edap (Poll)</dd>
<dd><b>I</b>RC</dd>
<dd><b>S</b>hift, then a b c for player</dd>
<dd><b>M</b>orse</dd>
<dd><b>L</b>eak</dd>
<dd><b>G</b>if (Nedap backend)</dd>
<h1>GIF joker</h1>
</body>
</html>

84
censor.js Normal file
View File

@ -0,0 +1,84 @@
var ws, sendToBackend, onBackendMessage;
function setupWs() {
var url = 'ws://' + document.location.host + '/';
ws = new WebSocket(url, 'censor');
ws.onerror = function(e) {
console.error(e.message);
window.setTimeout(setupWs, 100);
};
ws.onclose = function() {
console.error('WebSocket closed');
window.setTimeout(setupWs, 100);
};
ws.onmessage = function(event) {
try {
var data = event.data;
console.log({fromBackend: data});
var msg = JSON.parse(data);
if (onBackendMessage)
onBackendMessage(msg);
} catch(e) {
console.error(e.message);
}
};
sendToBackend = function(msg) {
console.log('toBackend: ' + JSON.stringify(msg));
ws.send(JSON.stringify(msg));
};
ws.onopen = function() {
/* TODO: rm debug */
sendToBackend({ nedap: "ping" });
};
}
setupWs();
var MAX_IMAGES = 3;
var imgsDisplayed = 0, queue = [];
function mayDisplayNext() {
if (imgsDisplayed >= MAX_IMAGES)
return;
displayImage(queue.shift());
}
function humanSize(size) {
var unit = "";
var units = ["K", "M"];
while(size > 1024 && units.length > 0) {
size /= 1024;
unit = units.shift();
}
return (Math.round(size * 10) / 10) + " " + unit + "B";
}
function displayImage(img) {
var div = $("<div class=\"image\"><p><a class=\"accept\">Accept</a> <a class=\"reject\">Reject</a> <a class=\"postpone\">Postpone</a></p><h2></h2><img/></div>");
div.find("h2").text(img.name + " (" + humanSize(img.size) + ")");
div.find("img").attr('src', img.path);
$('body').append(div);
imgsDisplayed++;
var goAway = function() {
div.remove();
imgsDisplayed--;
mayDisplayNext();
};
div.find(".accept").click(function() {
sendToBackend({ gif: img.path });
goAway();
});
div.find(".reject").click(goAway);
div.find(".postpone").click(function() {
queue.push(img);
goAway();
});
}
onBackendMessage = function(msg) {
if (msg.gif) {
queue.push(msg.gif);
mayDisplayNext();
}
};

View File

@ -6,7 +6,8 @@ var mime = require('mime');
var WS_KEY = 'nedap-kneemFothbedchoadHietEnobKavLub1';
var MIME_HTML = 'text/html; charset=UTF-8';
var UPLOAD_DIR="static/gifs";
var UPLOAD_DIR = "static/gifs";
var GIFS_PREFIX = "http://localhost:2342/gifs/";
try { fs.mkdirSync(UPLOAD_DIR); } catch (e) {}
var backend, question, answers, scores, mode;
@ -146,7 +147,10 @@ function nedap(app) {
path = path.split('/').pop();
console.log("file", gif.name, path, gif.type);
if (backend)
backend.sendUTF(JSON.stringify({ gif: "/gifs/" + path }));
backend.sendUTF(JSON.stringify({ gif: { path: GIFS_PREFIX + path,
name: gif.name,
size: gif.size
} }));
});
res.writeHead(200, { 'Content-type': MIME_HTML });

View File

@ -1,5 +1,3 @@
var GIF_PREFIX = "http://localhost:2342";
if (!window.console) {
var stub = function() { };
window.console = { log: stub, error: stub, warn: stub };
@ -394,12 +392,12 @@ function takeJoker(activePlayer, joker) {
$('#gifs img').remove();
$('#gifs').show();
onBackendMessage = function(msg) {
if (msg.nedap.gif) {
if (msg.gif) {
for(var imgs = $('#gifs img'); imgs.length > 2; imgs = $('#gifs img')) {
$(imgs[0]).remove();
}
var img = $('<img/>');
img.attr('src', GIF_PREFIX + msg.nedap.gif);
img.attr('src', msg.gif);
$('#gifs').append(img);
}
};

View File

@ -3,7 +3,7 @@ var wss = require('websocket').server;
var wsc = require('websocket').client;
var irc = require('irc-js');
var frontend;
var frontend, sendToCensor;
/*
@ -30,7 +30,10 @@ function connectNedap() {
try {
var msg = JSON.parse(wsmsg.utf8Data);
console.log({ fromNedap: msg });
sendToFrontend({ nedap: msg });
if (msg.gif) {
sendToCensor(msg);
} else
sendToFrontend({ nedap: msg });
} catch (e) {
console.error(e.stack);
}
@ -243,37 +246,61 @@ var gamestate = {};
new wss({ httpServer: server }).on('request', function(req) {
var conn = req.accept(null, req.origin);
frontend = conn;
conn.on('message', function(wsmsg) {
console.log(wsmsg);
try {
var msg = JSON.parse(wsmsg.utf8Data);
if (msg.nedap) {
console.log({ toNedap: msg.nedap });
if (nedap)
nedap.sendUTF(JSON.stringify(msg.nedap));
} else if (msg.irc === "activate") {
pushIrcInfo();
} else if (msg.buzzerLED) {
buzz.set_led(msg.buzzerLED[0], msg.buzzerLED[1]);
} else if (msg.morse) {
morse(msg.morse);
} else if (msg.gamestate) {
gamestate = msg.gamestate;
} else if (msg.requestGamestate) {
conn.sendUTF(JSON.stringify({ gamestate: gamestate }));
if (req.requestedProtocols && req.requestedProtocols.indexOf('censor') >= 0) {
/* Censor frontend */
sendToCensor = function(obj) {
conn.sendUTF(JSON.stringify(obj));
};
conn.on('message', function(wsmsg) {
console.log(wsmsg);
try {
var msg = JSON.parse(wsmsg.utf8Data);
if (msg.gif)
sendToFrontend(msg);
} catch (e) {
console.error(e.stack);
}
} catch (e) {
console.error(e.stack);
}
});
});
var reset = function() {
frontend = null;
};
conn.on('close', reset);
conn.on('error', reset);
var reset = function() {
sendToCensor = function() { };
};
conn.on('close', reset);
conn.on('error', reset);
} else {
/* Game frontend */
frontend = conn;
conn.on('message', function(wsmsg) {
console.log(wsmsg);
try {
var msg = JSON.parse(wsmsg.utf8Data);
if (msg.nedap) {
console.log({ toNedap: msg.nedap });
if (nedap)
nedap.sendUTF(JSON.stringify(msg.nedap));
} else if (msg.irc === "activate") {
pushIrcInfo();
} else if (msg.buzzerLED) {
buzz.set_led(msg.buzzerLED[0], msg.buzzerLED[1]);
} else if (msg.morse) {
morse(msg.morse);
} else if (msg.gamestate) {
gamestate = msg.gamestate;
} else if (msg.requestGamestate) {
conn.sendUTF(JSON.stringify({ gamestate: gamestate }));
}
} catch (e) {
console.error(e.stack);
}
});
var reset = function() {
frontend = null;
};
conn.on('close', reset);
conn.on('error', reset);
}
});
function sendToFrontend(obj) {