Nathaniel van Diepen 10 лет назад
Родитель
Сommit
c40984935f

+ 47 - 2
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',
@@ -54,8 +55,52 @@ var fs = require('fs'),
 						res.write('500 Internal server error\n');
 						res.end();
 					}
-				};
-			serveFile(path.join('./www/',unescape(uri)),req,res);
+				},
+				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);
+						}
+					});
+				}else{
+					res.writeHead(404,{
+						'Content-Type': 'text/javascript'
+					});
+					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


+ 3 - 0
app/www/index.html

@@ -4,6 +4,8 @@
 		<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 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 +15,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>
 	</head>

+ 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);

+ 15 - 1
app/www/js/omnomirc.js

@@ -78,7 +78,7 @@
 				fn: function(args){
 					var i,ret='';
 					for(i=1;i<args.length;i++){
-						ret += args[i];
+						ret += ' '+args[i];
 					}
 					socket.emit('message',{
 						from: 0,
@@ -375,6 +375,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({