2013-11-01 14:17:50 +00:00
|
|
|
function chatEvent(nym, status, utterance, stamp) {
|
|
|
|
return ["chatEvent", nym, status, utterance, stamp || +(new Date())];
|
|
|
|
}
|
|
|
|
function chatEventNym(c) { return c[1]; }
|
|
|
|
function chatEventStatus(c) { return c[2]; }
|
|
|
|
function chatEventUtterance(c) { return c[3]; }
|
|
|
|
function chatEventStamp(c) { return c[4]; }
|
|
|
|
|
2013-10-31 17:38:38 +00:00
|
|
|
function outputItem(item) {
|
|
|
|
var stamp = $("<span/>").text((new Date()).toGMTString()).addClass("timestamp");
|
|
|
|
var item = $("<div/>").append([stamp].concat(item));
|
|
|
|
var o = $("#chat_output");
|
|
|
|
o.append(item);
|
|
|
|
o[0].scrollTop = o[0].scrollHeight;
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
|
2013-10-31 13:03:50 +00:00
|
|
|
function updateNymList(rs) {
|
2013-10-31 17:38:38 +00:00
|
|
|
var statuses = {};
|
2013-10-31 13:03:50 +00:00
|
|
|
for (var i = 0; i < rs.length; i++) {
|
|
|
|
var p = rs[i].pattern;
|
2013-11-01 14:17:50 +00:00
|
|
|
if (p[0] === "broker" && p[1] === 0 && p[2][0] === "chatEvent") {
|
|
|
|
statuses[chatEventNym(p[2])] = chatEventStatus(p[2]);
|
2013-10-31 17:38:38 +00:00
|
|
|
}
|
|
|
|
}
|
2013-11-01 14:17:50 +00:00
|
|
|
var nyms = [];
|
|
|
|
for (var nym in statuses) { nyms.push(nym); }
|
|
|
|
nyms.sort();
|
2013-10-31 17:38:38 +00:00
|
|
|
|
|
|
|
var container = $("#nymlist");
|
|
|
|
container[0].innerHTML = ""; // remove all children
|
|
|
|
for (var i = 0; i < nyms.length; i++) {
|
|
|
|
var n = $("<span/>").text(nyms[i]).addClass("nym");
|
|
|
|
var s = statuses[nyms[i]];
|
|
|
|
if (s) {
|
|
|
|
container.append($("<div/>").append([n, $("<span/>").text(s).addClass("nym_status")]));
|
|
|
|
} else {
|
|
|
|
container.append($("<div/>").append(n));
|
|
|
|
}
|
2013-10-31 13:03:50 +00:00
|
|
|
}
|
2013-10-31 17:38:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function outputState(state) {
|
|
|
|
outputItem([$("<span/>").text(state).addClass(state).addClass("state")])
|
|
|
|
.addClass("state_" + state);
|
2013-10-31 13:03:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function outputUtterance(who, what) {
|
2013-10-31 17:38:38 +00:00
|
|
|
outputItem([$("<span/>").text(who).addClass("nym"),
|
|
|
|
$("<span/>").text(what).addClass("utterance")]).addClass("utterance");
|
2013-10-31 13:03:50 +00:00
|
|
|
}
|
|
|
|
|
2013-11-01 10:28:22 +00:00
|
|
|
var G;
|
2013-10-31 12:10:53 +00:00
|
|
|
$(document).ready(function () {
|
|
|
|
$("#chat_form").submit(function (e) { e.preventDefault(); return false; });
|
2013-10-31 13:03:50 +00:00
|
|
|
$("#nym_form").submit(function (e) { e.preventDefault(); return false; });
|
2013-11-01 00:18:51 +00:00
|
|
|
if (!($("#nym").val())) { $("#nym").val("nym" + Math.floor(Math.random() * 65536)); }
|
2013-10-31 12:10:53 +00:00
|
|
|
|
2013-11-01 10:28:22 +00:00
|
|
|
G = new Ground(function () {
|
2013-10-31 12:10:53 +00:00
|
|
|
console.log('starting ground boot');
|
2013-10-31 13:03:50 +00:00
|
|
|
// World.spawn(new Spy());
|
2013-10-31 12:10:53 +00:00
|
|
|
spawnJQueryDriver();
|
2014-03-10 19:18:20 +00:00
|
|
|
spawnDOMDriver();
|
2014-03-10 19:22:31 +00:00
|
|
|
spawnRoutingTableWidget("#spy-holder", "spy");
|
2014-03-10 19:18:20 +00:00
|
|
|
|
2013-11-01 11:57:50 +00:00
|
|
|
World.spawn(new WakeDetector());
|
2013-10-31 23:08:28 +00:00
|
|
|
var wsconn = new WebSocketConnection("broker", $("#wsurl").val(), true);
|
|
|
|
World.spawn(wsconn);
|
2013-10-31 12:10:53 +00:00
|
|
|
World.spawn({
|
2013-10-31 17:38:38 +00:00
|
|
|
// Monitor connection, notifying connectivity changes
|
2013-11-03 20:56:50 +00:00
|
|
|
state: "crashed", // start with this to avoid spurious initial message print
|
2013-10-31 12:10:53 +00:00
|
|
|
boot: function () {
|
2013-10-31 17:38:38 +00:00
|
|
|
World.updateRoutes([sub(["broker_state", __], 0, 1)]);
|
2013-10-31 12:10:53 +00:00
|
|
|
},
|
2013-10-31 17:38:38 +00:00
|
|
|
handleEvent: function (e) {
|
|
|
|
if (e.type === "routes") {
|
2013-11-03 20:56:50 +00:00
|
|
|
var newState = (e.routes.length > 0) ? e.routes[0].pattern[1] : "crashed";
|
|
|
|
if (this.state != newState) {
|
|
|
|
outputState(newState);
|
|
|
|
this.state = newState;
|
2013-10-31 17:38:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
World.spawn({
|
|
|
|
// Actual chat functionality
|
|
|
|
peers: new PresenceDetector(),
|
|
|
|
peerMap: {},
|
|
|
|
boot: function () {
|
|
|
|
World.updateRoutes(this.subscriptions());
|
2013-10-31 12:10:53 +00:00
|
|
|
},
|
2013-10-31 17:38:38 +00:00
|
|
|
nym: function () { return $("#nym").val(); },
|
|
|
|
currentStatus: function () { return $("#status").val(); },
|
2013-10-31 12:10:53 +00:00
|
|
|
subscriptions: function () {
|
2013-11-01 11:57:50 +00:00
|
|
|
return [sub("wake"),
|
|
|
|
sub(["jQuery", "#send_chat", "click", __]),
|
2013-10-31 12:10:53 +00:00
|
|
|
sub(["jQuery", "#nym", "change", __]),
|
2013-10-31 17:38:38 +00:00
|
|
|
sub(["jQuery", "#status", "change", __]),
|
2013-10-31 23:08:28 +00:00
|
|
|
sub(["jQuery", "#wsurl", "change", __]),
|
2013-11-01 14:17:50 +00:00
|
|
|
pub(["broker", 0, chatEvent(this.nym(), this.currentStatus(), __, __)]),
|
|
|
|
sub(["broker", 0, chatEvent(__, __, __, __)], 0, 1)];
|
2013-10-31 12:10:53 +00:00
|
|
|
},
|
|
|
|
handleEvent: function (e) {
|
2013-10-31 17:38:38 +00:00
|
|
|
var self = this;
|
2013-10-31 13:03:50 +00:00
|
|
|
switch (e.type) {
|
|
|
|
case "routes":
|
|
|
|
updateNymList(e.routes);
|
|
|
|
break;
|
|
|
|
case "message":
|
2013-11-01 11:57:50 +00:00
|
|
|
if (e.message === "wake") {
|
|
|
|
wsconn.forceclose();
|
|
|
|
return;
|
|
|
|
}
|
2013-10-31 12:10:53 +00:00
|
|
|
switch (e.message[0]) {
|
|
|
|
case "jQuery":
|
|
|
|
switch (e.message[1]) {
|
|
|
|
case "#send_chat":
|
|
|
|
var inp = $("#chat_input");
|
|
|
|
var utterance = inp.val();
|
|
|
|
inp.val("");
|
2013-10-31 13:03:50 +00:00
|
|
|
if (utterance) {
|
2013-11-01 14:17:50 +00:00
|
|
|
World.send(["broker", 0, chatEvent(this.nym(),
|
|
|
|
this.currentStatus(),
|
|
|
|
utterance)]);
|
2013-10-31 13:03:50 +00:00
|
|
|
}
|
2013-10-31 12:10:53 +00:00
|
|
|
break;
|
|
|
|
case "#nym":
|
2013-10-31 17:38:38 +00:00
|
|
|
case "#status":
|
2013-10-31 12:10:53 +00:00
|
|
|
World.updateRoutes(this.subscriptions());
|
|
|
|
break;
|
2013-10-31 23:08:28 +00:00
|
|
|
case "#wsurl":
|
|
|
|
wsconn.forceclose();
|
|
|
|
wsconn.wsurl = $("#wsurl").val();
|
|
|
|
break;
|
2013-10-31 12:10:53 +00:00
|
|
|
default:
|
|
|
|
console.log("Got jquery event from as-yet-unhandled subscription",
|
|
|
|
e.message[2], e.message[3]);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "broker":
|
2013-11-01 14:17:50 +00:00
|
|
|
if (e.message[2][0] === "chatEvent") {
|
|
|
|
outputUtterance(chatEventNym(e.message[2]),
|
|
|
|
chatEventUtterance(e.message[2]));
|
2013-10-31 13:03:50 +00:00
|
|
|
}
|
2013-10-31 12:10:53 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2013-10-31 13:03:50 +00:00
|
|
|
break;
|
2013-10-31 12:10:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2013-10-17 14:50:51 +00:00
|
|
|
});
|
2013-11-01 10:28:22 +00:00
|
|
|
G.startStepping();
|
2013-10-17 14:50:51 +00:00
|
|
|
});
|