irc:// protocol handling. UI access not implemented, and it appears to only work...
authorJack Allnutt <m2ys4u@Gmail.com>
Mon, 3 Oct 2011 13:28:54 +0000 (14:28 +0100)
committerJack Allnutt <m2ys4u@Gmail.com>
Mon, 3 Oct 2011 13:28:54 +0000 (14:28 +0100)
js/front.js
node/app.js

index a8c5351ca60b585c7829543001204e53d38c6114..c8b644f172cefc5244270be9d4d4b86f1c777020 100644 (file)
@@ -537,6 +537,20 @@ kiwi.front = {
         }(msg));
         
         return msg;
+    },
+    
+    registerProtocolHandler: function () {
+        var state, uri;
+        url = kiwi_server.replace(/\/kiwi$/, '/?ircuri=%s');
+        try {
+            //state = window.navigator.isProtocolHandlerRegistered('irc', url);
+            //if (state !== 'registered') {
+                window.navigator.registerProtocolHandler('irc', url, 'Kiwi IRC');
+            //}
+        } catch (e) {
+            console.log('Unable to register Kiwi IRC as a handler for irc:// links');
+            console.error(e);
+        }
     }
 
 };
index 8b066859f678959160ca7492014adcba22d68e8f..28b2f7aa8841f300b32c71471ea6c47f0cd5dd9b 100644 (file)
@@ -529,7 +529,7 @@ this.ircSocketDataHandler = function (data, websocket, ircSocket) {
 
 this.httpHandler = function (request, response) {
     var uri, uri_parts, subs, useragent, agent, server_set, server, nick, debug, touchscreen, hash,
-        min = {}, public_http_path, port, ssl,
+        min = {}, public_http_path, port, ssl, ircuri, pass, target, modifiers, query,
         secure = (typeof request.client.encrypted === 'object');
 
     //try {
@@ -538,7 +538,23 @@ this.httpHandler = function (request, response) {
             uri_parts = uri.pathname.split('/');
 
             subs = uri.pathname.substr(0, 4);
-            if (uri.pathname === '/js/all.js') {
+            if (typeof uri.query.ircuri !== 'undefined') {
+                ircuri = url.parse(uri.query.ircuri, true);
+                if (ircuri.protocol === 'irc:') {
+                    uri_parts = /^\/([^,\?]*)((,[^,\?]*)*)?$/.exec(ircuri.pathname);
+                    target = uri_parts[1];
+                    modifiers = (typeof uri_parts[2] !== 'undefined') ? uri_parts[2].split(',') : [];
+                    query = ircuri.query;
+
+                    nick = _.detect(modifiers, function (mod) {
+                        return mod === ',isnick';
+                    });
+                    console.log(request.headers);
+                    response.statusCode = 303;
+                    response.setHeader('Location', 'http' + ((secure) ? 's' : '') + '://' + request.headers.host + '/client/' + ircuri.host + '/' + ((!nick) ? target : ''));
+                    response.end();
+                }
+            } else if (uri.pathname === '/js/all.js') {
                 if (kiwi.cache.alljs === '') {
                     public_http_path = kiwi.kiwi_root + '/' + kiwi.config.public_http;