diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index c0c2c24..dd1c2a7 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -1,15 +1,14 @@
{
"appName": {
- "message": "wIRC Chat Client",
+ "message": "Spongy Chat Client",
"description": "Application name"
},
"appShortName": {
- "message": "wIRC",
+ "message": "Spongy Chat",
"description": "Short application name"
},
"appDesc": {
- "message": "Chat client for the wIRC bouncer thingamajiggy",
+ "message": "Chat client for the Spongy bouncer thingamajiggy",
"description": "Application description for app store listing"
}
-}
-
+}
\ No newline at end of file
diff --git a/app/server.js b/app/server.js
index 4749e41..cdbcdb4 100644
--- a/app/server.js
+++ b/app/server.js
@@ -2,7 +2,7 @@
var maxScrollback = 500;
-function Server(baseURL, network, authtok, messageHandler) {
+function Server(network, baseURL, authtok, messageHandler) {
function handleEventSourceLine(line) {
var lhs = line.split(" :", 1)[0]
var parts = lhs.split(' ')
@@ -20,9 +20,9 @@ function Server(baseURL, network, authtok, messageHandler) {
function handleEventSourceMessage(oEvent) {
msgs = oEvent.data.split("\n");
- var first = Math.min(0, msgs.length - maxScrollback);
+ var first = Math.max(0, msgs.length - maxScrollback);
for (var i = first; i < msgs.length; i += 1) {
- handleEeventSourceLine(msgs[i]);
+ handleEventSourceLine(msgs[i]);
}
}
@@ -31,8 +31,8 @@ function Server(baseURL, network, authtok, messageHandler) {
messageHandler(timestamp, null, "ERROR", null, null, [], null);
}
- var pullURL = baseURL + "?network=" + encodeURIComponent(network) + "&authtok=" + encodeURIComponent(authtok);
- this.eventSource = new EventSource(baseURL);
+ var pullURL = baseURL + "?network=" + encodeURIComponent(network) + "&auth=" + encodeURIComponent(authtok);
+ this.eventSource = new EventSource(pullURL);
this.eventSource.addEventListener("message", handleEventSourceMessage);
this.eventSource.addEventListener("error", handleEventSourceError);
}
diff --git a/app/wirc.html b/app/wirc.html
index 27dd1db..8175e83 100644
--- a/app/wirc.html
+++ b/app/wirc.html
@@ -5,6 +5,8 @@
+
+
diff --git a/app/wirc.js b/app/wirc.js
index 349e824..1bc91b6 100644
--- a/app/wirc.js
+++ b/app/wirc.js
@@ -4,7 +4,9 @@ var urlRe = /[a-z]+:\/\/[^ ]*/;
var nick = "Mme. M";
+// XXX: get rid of this
var scrollbackLength = 500;
+var current;
if (String.prototype.startsWith == null) {
String.prototype.startsWith = function(needle) {
@@ -13,7 +15,7 @@ if (String.prototype.startsWith == null) {
}
function getTemplate(className) {
- return document.templates.getElementsByClassName(className)[0].cloneNode(true);
+ return templates.getElementsByClassName(className)[0].cloneNode(true);
}
function isinView(oObject) {
@@ -21,21 +23,19 @@ function isinView(oObject) {
}
function selectForum(room) {
- var kids = document.rooms_list.childNodes;
+ if (current) {
+ current.classList.remove("selected");
+ // XXX: do this with a class, too
+ current.messages.display = "none";
+ }
- for (i = 0; i < kids.length; i += 1) {
- e = kids[i];
- if (e == room) {
- e.className = "room selected";
- e.messages.display = "block";
- } else {
- e.className = "room";
- e.messages.display = "none";
- }
- }
- if (room.lastChild) {
- room.lastChild.scrollIntoView(false);
+ current = room;
+ room.classList.add("selected");
+ room.messages.display = "block";
+
+ if (room.messages.lastChild) {
+ room.messages.lastChild.scrollIntoView(false);
}
}
@@ -45,15 +45,17 @@ function getForumElement(forum) {
if (! fe) {
var room = getTemplate("channel room");
- room.textContent = forum;
- document.rooms_list.appendChild(room);
+ var content = room.getElementsByClassName("content-item");
+
+ content.textContent = forum;
+ rooms.appendChild(room);
fe = getTemplate("messages");
fe.room = room;
room.messages = fe;
// XXX: split out into non-anon function
- room.addEventListener("click", function() {selectForum(fe)});
+ room.addEventListener("click", function() {selectForum(room)});
fora[forum] = fe;
document.getElementById("messages-container").appendChild(fe);
@@ -127,21 +129,13 @@ function focus(e) {
}, 50)
}
-function addMessage(txt) {
- var lhs = txt.split(" :", 1)[0]
- var parts = lhs.split(' ')
- var ts = new Date(parts[0] * 1000);
- var fullSender = parts[1];
- var command = parts[2];
- var sender = parts[3];
- var forum = parts[4];
- var args = parts.slice(5);
- var msg = txt.substr(lhs.length + 2)
-
+function addMessage(timestamp, fullSender, command, sender, forum, args, msg) {
var forumElement = getForumElement(forum);
var p = getTemplate("message");
- addMessagePart(p, "timestamp", ts.toLocaleTimeString());
+ console.log(timestamp, msg);
+
+ addMessagePart(p, "timestamp", timestamp.toLocaleTimeString());
switch (command) {
case "PING":
@@ -171,15 +165,6 @@ function addMessage(txt) {
p.scrollIntoView(false);
}
-function newmsg(oEvent) {
- msgs = oEvent.data.split("\n");
-
- var first = Math.max(0, msgs.length - scrollbackLength);
- for (var i = first; i < msgs.length; i += 1) {
- addMessage(msgs[i]);
- }
-}
-
function handleInput(oEvent) {
console.log(oEvent);
var oReq = new XMLHttpRequest();
@@ -190,8 +175,13 @@ function handleInput(oEvent) {
if (txt.startsWith("/connect ")) {
// XXX: should allow tokens with spaces
var parts = txt.split(" ");
+ var network = parts[1];
+ var url = parts[2];
+ var authtok = parts[3];
- connect(parts[1], parts[2], parts[3]);
+ connect(network, url, authtok);
+ storedConnections[network] = [url, authtok];
+ chrome.storage.sync.set({"connections": storedConnections});
} else {
oReq.onload = reqListener;
oReq.open("POST", window.postURL, true);
@@ -203,35 +193,47 @@ function handleInput(oEvent) {
return false;
}
-function connect(url, server, authtok) {
- document.postURL = url;
- var pullURL = url + "?server=" + server + "&auth=" + authtok
+var activeNetworks = {};
+var storedConnections = {};
- if (document.source != null) {
- document.source.close();
- }
- document.source = new EventSource(pullURL);
- document.source.onmessage = newmsg;
+function connect(network, url, authtok) {
+ var newServer = new Server(network, url, authtok, addMessage);
+ var element;
- chrome.storage.sync.set({"connections": [[url, server, authtok]]});
+ if (activeNetworks[network]) {
+ activeNetworks[network].close();
+ element = activeNetworks[network].element;
+ } else {
+ newServer.element = getTemplate("server-channels");
+ rooms.appendChild(newServer.element);
+ }
+
+ newServer.room = newServer.element.getElementsByClassName("server room")[0];
+ newServer.content = newServer.element.getElementsByClassName("content-item")[0];
+
+ newServer.content.textContent = network;
+
+ activeNetworks[network] = newServer;
}
+
+
function restore(items) {
- var connections = items["connections"];
+ storedConnections = items["connections"];
- for (var k = 0; k < connections.length; k += 1) {
- var conn = connections[k];
+ for (var network in storedConnections) {
+ var conn = storedConnections[network];
- connect(conn[0], conn[1], conn[2]);
+ connect(network, conn[0], conn[1]);
}
}
function init() {
- chrome.storage.sync.get("connections", restore);
+ chrome.storage.sync.get(["connections"], restore);
document.getElementById("input").addEventListener("change", handleInput);
- document.templates = document.getElementById("templates");
- document.rooms_list = document.getElementById("rooms-container").getElementsByClassName("rooms")[0];
+ templates = document.getElementById("templates");
+ rooms = document.getElementById("rooms-container").getElementsByClassName("rooms")[0];
}
window.addEventListener("load", init);