Ver código fonte

upstream update

Florian DORMONT 11 anos atrás
pai
commit
621210efdf

+ 84 - 30
app/OmnomIRC.js

@@ -2,6 +2,7 @@
 var fs = require('fs'),
 	url = require('url'),
 	path = require('path'),
+	vm = require('vm'),
 	mimeTypes = {
 		'html': 'text/html',
 		'js': 'text/javascript',
@@ -13,40 +14,93 @@ var fs = require('fs'),
 		req.addListener('end',function(){
 			logger.debug('served static content for '+req.url);
 			var uri = url.parse(req.url).pathname,
-				filename = path.join('./www/',unescape(uri)),
-				stats;
-				try{
-					stats = fs.lstatSync(filename);
-				}catch(e){
-					res.writeHead(404,{
-						'Content-type': 'text/plain'
-					});
-					res.write('404 Not Found\n');
-					res.end();
-					return;
-				}
-				if(stats.isFile()){
-					var fileStream,
-						mimetype = mimeTypes[path.extname(filename).split('.')[1]];
-					res.writeHead(200,{
-						'Content-Type': mimetype
+				serveFile = function(filename,req,res){
+					try{
+						stats = fs.lstatSync(filename);
+					}catch(e){
+						res.writeHead(404,{
+							'Content-type': 'text/plain'
+						});
+						res.write('404 Not Found\n');
+						res.end();
+						return;
+					}
+					if(stats.isFile()){
+						var fileStream,
+							mimetype = mimeTypes[path.extname(filename).split('.')[1]];
+						res.writeHead(200,{
+							'Content-Type': mimetype
+						});
+						fileStream = fs.createReadStream(filename);
+						fileStream.pipe(res);
+					}else if(stats.isDirectory()){
+						if(fs.existsSync(path.join(filename,'index.html'))){
+							serveFile(path.join(filename,'index.html'),req,res);
+						}else if(fs.existsSync(path.join(filename,'index.htm'))){
+							serveFile(path.join(filename,'index.htm'),req,res);
+						}else if(fs.existsSync(path.join(filename,'index.txt'))){
+							serveFile(path.join(filename,'index.txt'),req,res);
+						}else{
+							res.writeHead(200,{
+								'Content-Type': 'text/plain'
+							});
+							res.write('Index of '+url+'\n');
+							res.write('TODO, show index');
+							res.end();
+						}
+					}else{
+						res.writeHead(500,{
+							'Content-Type': 'text/plain'
+						});
+						res.write('500 Internal server error\n');
+						res.end();
+					}
+				},
+				filepath = unescape(uri);
+			if(filepath.substr(0,5) == '/api/'){
+				filepath = path.join('./api/',filepath.substr(5));
+				logger.debug('Attempting to run api script '+filepath);
+				if(fs.existsSync(filepath)){
+					fs.readFile(filepath,function(e,data){
+						if(e){
+							logger.error(e);
+							res.end('null;');
+						}else{
+							var output = '',
+								sandbox = {
+									log: function(text){
+										output += text;
+									},
+									error: function(msg){
+										logger.error(msg);
+									},
+									info: function(msg){
+										logger.info(msg);
+									},
+									debug: function(msg){
+										logger.debug(msg);
+									},
+									head: {
+										'Content-Type': 'text/javascript'
+									},
+									returnCode: 200,
+									vm: vm,
+									fs: fs
+								};
+							vm.runInNewContext(data,sandbox,filepath);
+							res.writeHead(sandbox.returnCode,sandbox.head);
+							res.end(output);
+						}
 					});
-					fileStream = fs.createReadStream(filename);
-					fileStream.pipe(res);
-				}else if(stats.isDirectory()){
-					res.writeHead(200,{
-						'Content-Type': 'text/plain'
-					});
-					res.write('Index of '+url+'\n');
-					res.write('TODO, show index');
-					res.end();
 				}else{
-					res.writeHead(500,{
-						'Content-Type': 'text/plain'
+					res.writeHead(404,{
+						'Content-Type': 'text/javascript'
 					});
-					res.write('500 Internal server error\n');
-					res.end();
+					res.end('null;');
 				}
+			}else{
+				serveFile(path.join('./www/',filepath),req,res);
+			}
 		}).resume();
 	}).listen(80),
 	io = require('socket.io').listen(app)

+ 6 - 0
app/api/themes.js

@@ -0,0 +1,6 @@
+var files = fs.readdirSync('./www/data/themes/');
+log('(function($o){');
+for(var i in files){
+	log('$o.register.theme("'+files[i]+'");');
+}
+log('})(OmnomIRC);');

+ 0 - 0
app/www/data/themes/omnimaga/script.js


+ 0 - 0
app/www/data/themes/omnimaga/style.css


+ 4 - 0
app/www/index.html

@@ -4,6 +4,9 @@
 		<title>OmnomIRC3</title>
 		<meta charset='utf-8'> 
 		<script type="text/javascript" src="js/console-shim-min.js"></script>
+		<script type="text/javascript" src="js/html5shiv.js"></script>
+		<script type="text/javascript" src="js/html5shiv-printshiv.js"></script>
+		<script src="http://bestiejs.github.io/json3/lib/json3.js"></script>
 		<script type="text/javascript" src="js/jquery-1.10.1.min.js"></script>
 		<script type="text/javascript" src="js/jquery.hoverIntent.minified.js"></script>
 		<script type="text/javascript" src="js/jquery.timeago.js"></script>
@@ -13,6 +16,7 @@
 		<script type="text/javascript" src="js/jquery.storage.js"></script>
 		<script type="text/javascript" src="socket.io/socket.io.js"></script>
 		<script type="text/javascript" src="js/omnomirc.js"></script>
+		<script type="text/javascript" src="api/themes.js"></script>
 		<link rel="stylesheet" href="css/style.css"></link>
 		<link rel="stylesheet" href="css/jquery.contextMenu.css"></link>
 		<link rel="stylesheet" href="themes/omnom.css"></link>

+ 11 - 0
app/www/js/html5shiv-printshiv.js

@@ -0,0 +1,11 @@
+/*
+ HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
+*/
+(function(j,f){function s(a,b){var c=a.createElement("p"),m=a.getElementsByTagName("head")[0]||a.documentElement;c.innerHTML="x<style>"+b+"</style>";return m.insertBefore(c.lastChild,m.firstChild)}function o(){var a=d.elements;return"string"==typeof a?a.split(" "):a}function n(a){var b=t[a[u]];b||(b={},p++,a[u]=p,t[p]=b);return b}function v(a,b,c){b||(b=f);if(e)return b.createElement(a);c||(c=n(b));b=c.cache[a]?c.cache[a].cloneNode():y.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);
+return b.canHaveChildren&&!z.test(a)?c.frag.appendChild(b):b}function A(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();a.createElement=function(c){return!d.shivMethods?b.createElem(c):v(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+o().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(d,b.frag)}
+function w(a){a||(a=f);var b=n(a);if(d.shivCSS&&!q&&!b.hasCSS)b.hasCSS=!!s(a,"article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}");e||A(a,b);return a}function B(a){for(var b,c=a.attributes,m=c.length,f=a.ownerDocument.createElement(l+":"+a.nodeName);m--;)b=c[m],b.specified&&f.setAttribute(b.nodeName,b.nodeValue);f.style.cssText=a.style.cssText;return f}function x(a){function b(){clearTimeout(d._removeSheetTimer);c&&c.removeNode(!0);
+c=null}var c,f,d=n(a),e=a.namespaces,j=a.parentWindow;if(!C||a.printShived)return a;"undefined"==typeof e[l]&&e.add(l);j.attachEvent("onbeforeprint",function(){b();var g,i,d;d=a.styleSheets;for(var e=[],h=d.length,k=Array(h);h--;)k[h]=d[h];for(;d=k.pop();)if(!d.disabled&&D.test(d.media)){try{g=d.imports,i=g.length}catch(j){i=0}for(h=0;h<i;h++)k.push(g[h]);try{e.push(d.cssText)}catch(n){}}g=e.reverse().join("").split("{");i=g.length;h=RegExp("(^|[\\s,>+~])("+o().join("|")+")(?=[[\\s,>+~#.:]|$)","gi");
+for(k="$1"+l+"\\:$2";i--;)e=g[i]=g[i].split("}"),e[e.length-1]=e[e.length-1].replace(h,k),g[i]=e.join("}");e=g.join("{");i=a.getElementsByTagName("*");h=i.length;k=RegExp("^(?:"+o().join("|")+")$","i");for(d=[];h--;)g=i[h],k.test(g.nodeName)&&d.push(g.applyElement(B(g)));f=d;c=s(a,e)});j.attachEvent("onafterprint",function(){for(var a=f,c=a.length;c--;)a[c].removeNode();clearTimeout(d._removeSheetTimer);d._removeSheetTimer=setTimeout(b,500)});a.printShived=!0;return a}var r=j.html5||{},z=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,
+y=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q,u="_html5shiv",p=0,t={},e;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";q="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}e=b}catch(d){e=q=!0}})();var d={elements:r.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",
+version:"3.6.2",shivCSS:!1!==r.shivCSS,supportsUnknownElements:e,shivMethods:!1!==r.shivMethods,type:"default",shivDocument:w,createElement:v,createDocumentFragment:function(a,b){a||(a=f);if(e)return a.createDocumentFragment();for(var b=b||n(a),c=b.frag.cloneNode(),d=0,j=o(),l=j.length;d<l;d++)c.createElement(j[d]);return c}};j.html5=d;w(f);var D=/^$|\b(?:all|print)\b/,l="html5shiv",C=!e&&function(){var a=f.documentElement;return!("undefined"==typeof f.namespaces||"undefined"==typeof f.parentWindow||
+"undefined"==typeof a.applyElement||"undefined"==typeof a.removeNode||"undefined"==typeof j.attachEvent)}();d.type+=" print";d.shivPrint=x;x(f)})(this,document);

+ 8 - 0
app/www/js/html5shiv.js

@@ -0,0 +1,8 @@
+/*
+ HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
+*/
+(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
+a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}</style>";
+c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
+"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();
+for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);

+ 67 - 16
app/www/js/omnomirc.js

@@ -45,13 +45,15 @@
 			colour: false,
 			timestamp: 'exact',
 			server: location.origin,
+			autoconnect: true,
 			autojoin: [
 				'#omnimaga',
 				'#omnimaga-fr',
 				'#irp'
 			],
 			scrollspeed: 100,
-			theme: 'default'
+			theme: 'default',
+			nick: 'User'
 		},
 		tabs = [],
 		properties = {
@@ -63,7 +65,7 @@
 			]
 		},
 		commands = [
-			{
+			{ // names
 				cmd: 'names',
 				fn: function(args){
 					socket.emit('names',{
@@ -71,13 +73,13 @@
 					});
 				}
 			},
-			{
+			{ // me
 				cmd: 'me',
 				help: 'Say something in third person',
 				fn: function(args){
 					var i,ret='';
 					for(i=1;i<args.length;i++){
-						ret += args[i] + ' ';
+						ret += ' '+args[i];
 					}
 					socket.emit('message',{
 						from: 0,
@@ -86,11 +88,24 @@
 					});
 				}
 			},
-			{
+			{ // connect
+				cmd: 'connect',
+				fn: function(){
+					if(!$o.connected()){
+						$o.connect();
+					}
+				}
+			},
+			{	// disconnect
+				cmd: 'disconnect',
+				fn: function(){
+					$o.disconnect();
+				}
+			},
+			{ // nick
 				cmd: 'nick',
 				fn: function(args){
-					properties.nick = args[1];
-					$o.auth();
+					$o.set('nick',args[1]);
 				}
 			},
 			{
@@ -288,12 +303,14 @@
 					return true;
 				}
 				return false;
+			},
+			plugin: function(){
+				
 			}
 		},
 		connect: function(server){
 			if($o.connected()){
-				socket.disconnect();
-				socket = undefined;
+				$o.disconnect();
 			}
 			if(typeof server == 'undefined'){
 				server = settings.server;
@@ -304,9 +321,19 @@
 			}
 			$o.auth();
 		},
+		disconnect: function(){
+			if($o.connected()){
+				socket.disconnect();
+				socket = undefined;
+			}
+		},
 		auth: function(){
+			if(settings.nick == ''){
+				$o.set('nick','User');
+				return;
+			}
 			socket.emit('auth',{
-				nick: properties.nick
+				nick: settings.nick
 				// TODO - send authorization info
 			});
 		},
@@ -351,6 +378,9 @@
 							$('.date_cell').css('visibility','visible');
 						}
 					break;
+					case 'nick':
+						$o.auth();
+					break;
 				}
 				if(typeof render == 'undefined'){
 					$o.renderSettings();
@@ -365,6 +395,20 @@
 			for(name in settings){
 				setting = $o.get(name,true);
 				switch(setting.type){
+					case 'select':
+						item = $('<select>')
+									.attr('id','setting_'+name)
+									.change(function(){
+										$o.set(this.id.substr(8),$(this).find(':selected').text(),false);
+									});
+						for(var i in setting.values){
+							item.append(
+								$('<option>')
+									.text(setting.values[i])
+							);
+						}
+						item.find(':contains('+setting.val+')').attr('selected','selected');
+					break;
 					case 'array':
 						item = $('<input>')
 									.attr({
@@ -492,7 +536,8 @@
 				});
 				scroll.push({
 					name: tabs[i].name,
-					body: html
+					body: html,
+					date: new Date().toString()
 				});
 			}
 			$.localStorage('tabs',scroll);
@@ -516,9 +561,11 @@
 			abbrDate('abbr.date');
 			$o.renderUsers();
 			setTimeout(function scrollContent(){
-				if($cl.scrollTop() < $cl[0].scrollHeight){
-					$cl.scrollTop($cl.scrollTop()+1);
+				if($c.scrollTop() < $c[0].scrollHeight){
+					$c.scrollTop($c.scrollTop()+1);
 					setTimeout(scrollContent,settings.scrollspeed);
+				}else{
+					event('scrolling stopped');
 				}
 			},settings.scrollspeed);
 		},
@@ -548,10 +595,11 @@
 					frag = document.createDocumentFragment();
 				for(i in scroll){
 					if(scroll[i].name == name){
+						scroll[i].body = $(scroll[i].body).slice(-10);
 						$(frag)
 							.append(scroll[i].body)
 							.append(
-								$('<li>').html('<span class="to_remove">-- loaded old scrollback --</span>')
+								$('<li>').html('<span class="to_remove">-- loaded old scrollback for '+scroll[i].date+' --</span>')
 							)
 							.children()
 							.children('.remove')
@@ -561,7 +609,7 @@
 							.children('.to_remove')
 							.removeClass('to_remove')
 							.addClass('remove');
-						event('loading old tab scrollback for '+name);
+						event('loading old tab scrollback for '+name+' last saved +'+scroll[i].date);
 					}
 				}
 				tabs.push({
@@ -663,6 +711,7 @@
 		$i = $('#input');
 		$s = $('#send');
 		$cl = $('#content-list');
+		$c = $('#content');
 		$tl = $('#tabs-list');
 		$h = $('#head');
 		$s.click(function(){
@@ -799,7 +848,9 @@
 			$h.removeClass('hovered');
 		},1000);
 		$o.renderSettings();
-		$o.connect();
+		if(settings.autoconnect){
+			$o.connect();
+		}
 	});
 	delete window.io;
 })(window,jQuery,io);