Skip to content

Commit

Permalink
re-write jsphi.ml with less Unsafe (tentative)
Browse files Browse the repository at this point in the history
  • Loading branch information
napthats committed Aug 26, 2012
1 parent 5d90ef0 commit aa4c552
Show file tree
Hide file tree
Showing 7 changed files with 227 additions and 151 deletions.
Binary file modified jsphi.byte
Binary file not shown.
Binary file modified jsphi.cmi
Binary file not shown.
Binary file modified jsphi.cmo
Binary file not shown.
3 changes: 1 addition & 2 deletions jsphi.command.js
Expand Up @@ -34,7 +34,6 @@ if (!com.napthats.jsphi) com.napthats.jsphi = {};
var state = 'ch-srv';
var ip;
var port;

return function(command) {
switch (state) {
case 'ch-srv':
Expand Down Expand Up @@ -302,4 +301,4 @@ if (!com.napthats.jsphi) com.napthats.jsphi = {};

return commandExecutor;
}
})();
})();
21 changes: 19 additions & 2 deletions jsphi.js
Expand Up @@ -173,7 +173,20 @@ function MlWrappedString (s) { this.string = s; }
MlWrappedString.prototype = new MlString();
function MlMakeString (l) { this.bytes = ""; this.len = l; }
MlMakeString.prototype = new MlString ();
function caml_js_eval_string () {return eval(arguments[0].toString());}
function caml_blit_string(s1, i1, s2, i2, len) {
if (len === 0) return;
if (i2 === s2.last && s2.bytes != null) {
var b = s1.bytes;
if (b == null) b = s1.toBytes ();
if (i1 > 0 || s1.last > len) b = b.slice(i1, i1 + len);
s2.bytes += b;
s2.last += b.length;
return;
}
var a = s2.array;
if (!a) a = s2.toArray(); else { s2.bytes = s2.string = null; }
s1.blitToArray (i1, a, i2, len);
}
function caml_call_gen(f, args) {
if(f.fun)
return caml_call_gen(f.fun, args);
Expand All @@ -186,6 +199,10 @@ function caml_call_gen(f, args) {
else
return function (x){ return caml_call_gen(f, args.concat([x])); };
}
function caml_create_string(len) {
if (len < 0) caml_invalid_argument("String.create");
return new MlMakeString(len);
}
function caml_js_wrap_callback(f) {
var toArray = Array.prototype.slice;
return function () {
Expand All @@ -200,4 +217,4 @@ var caml_named_values = {};
function caml_register_named_value(nm,v) {
caml_named_values[nm] = v; return 0;
}
(function(){caml_register_global(5,[0,new MlString("Division_by_zero")]);caml_register_global(3,[0,new MlString("Invalid_argument")]);caml_register_global(2,[0,new MlString("Failure")]);var g=new MlString("Pervasives.do_at_exit"),f=new MlString("\n var NS_JSPHI = com.napthats.jsphi;\n NS_JSPHI.CLIENT_VERSION = '05103010';\n var NS_WEBSOCKET = com.napthats.websocket;\n var URL_WEBSOCKT = 'ws://napthats.com/ws/';\n var CONTROL_COMMAND = {\n 49: ['1'],\n 50: ['2'],\n 51: ['3'],\n 52: ['4'],\n 53: ['5'],\n 54: ['6'],\n 55: ['7'],\n 56: ['8'],\n 57: ['9'],\n 65: ['read'],\n 66: ['board'],\n 67: ['use'],\n 68: ['erase'],\n 70: ['floor item'],\n 71: ['guard'],\n 72: ['hi'],\n 77: ['check', 'look'],\n //80: ['pay'],\n 81: ['equip'],\n 82: ['spells'],\n 83: ['write'],\n 86: ['sort'],\n 87: ['unequip'],\n 88: ['put'],\n 89: ['y'],\n 90: ['get'],\n 96: ['check', 'look'],\n 97: ['hit'],\n 98: ['go b'],\n 99: ['cast'],\n 100: ['go l'],\n 101: ['turn b'],\n 102: ['go r'],\n 103: ['turn l'],\n 104: ['go f'],\n 105: ['turn r'],\n 106: ['use'],\n 107: ['get'],\n 109: ['put'],\n 110: ['.'],\n 111: ['equip'],\n 190: ['.']\n };\n var CONTROL_COMMAND_SHIFT = {\n 65: ['cast', 'analyze'],\n 66: ['cast', 'call'],\n 67: ['cast', 'create'],\n 68: ['cast', 'detect'],\n 69: ['cast', 'eagle eye'],\n 70: ['cast', 'forget'],\n 73: ['cast', 'identify'],\n 75: ['cast', 'list'],\n 76: ['cast', 'wizard lock'],\n 77: ['cast', 'disappear'],\n 78: ['cast', 'appear'],\n 80: ['cast', 'party eye'],\n 81: ['cast', 'wizard light'],\n 82: ['cast', 'return'],\n 83: ['cast', 'search'],\n 85: ['cast', 'unlock'],\n 87: ['cast', 'wizard eye'],\n 88: ['cast', 'charge spell'],\n 90: ['cast', 'destroy']\n };\n var phiUI;\n var commandExecutor;\n var ws;\n var userId;\n var serverIpPort;\n\n var login = function(id, ipPort) {\n userId = id;\n serverIpPort = ipPort;\n if (!userId) {\n phiUI.showErrorMessage('Please set user id first.');\n return;\n }\n //tentative\n ws.send('$open$:' + serverIpPort);\n commandExecutor.setUserId(userId);\n ws.send('#open ' + userId);\n sendMessageEnterWorld();\n };\n\n var logout = function() {\n commandExecutor.resetExecutor();\n ws.send('exit');\n };\n\n var recvMessage = function(msg){\n var phidmMessage = NS_JSPHI.phidmMessageParse(msg.data);\n if (!phidmMessage) return; //message does not exist or not end\n commandExecutor.exec(phidmMessage);\n };\n\n var sendMessage = function(msg) {\n ws.send(msg);\n };\n\n var sendMessageEnterWorld = function() {\n //test default setting\n ws.send('#map-iv 1');\n ws.send('#status-iv 1');\n ws.send('#version-cli ' + NS_JSPHI.CLIENT_VERSION);\n ws.send('#ex-switch eagleeye=form');\n ws.send('#ex-map size=57');\n ws.send('#ex-map style=turn');\n ws.send('#ex-switch ex-move-recv=true');\n ws.send('#ex-switch ex-list-mode-end=true');\n ws.send('#ex-switch ex-disp-magic=false');\n //end test\n };\n\n var changeWorld = function(ipPort) {\n serverIpPort = ipPort;\n savePhirc(userId, serverIpPort);\n phiUI.setPhirc(readPhircCookie(), userId + '@' + serverIpPort);\n sendMessageEnterWorld();\n };\n\n var finishNewuser = function(id) {\n userId = id;\n savePhirc(userId, serverIpPort);\n phiUI.setPhirc(readPhircCookie(), userId + '@' + serverIpPort);\n commandExecutor.setUserId(id);\n sendMessageEnterWorld();\n };\n\n var startNewuser = function(name, ipPort) {\n serverIpPort = ipPort;\n ws.send('$open$:' + serverIpPort);\n commandExecutor.startNewuser(name);\n };\n\n var importPhirc = function(id, ipPort) {\n userId = id;\n serverIpPort = ipPort;\n savePhirc(userId, serverIpPort);\n phiUI.setPhirc(readPhircCookie(), userId + '@' + serverIpPort);\n phiUI.showClientMessage('.phirc load completed.');\n };\n\n var showPhirc = function() {\n if (userId) {\n phiUI.showClientMessage(userId + ' ' + serverIpPort);\n }\n else {\n phiUI.showErrorMessage('No user login.');\n }\n };\n\n var savePhirc = function(id, ipPort) {\n var savedPhircList = readPhircCookie();\n if (!savedPhircList) savedPhircList = [];\n for (var i = 0; i < savedPhircList.length; i++) {\n if (id === savedPhircList[i][0]) {\n savedPhircList[i][1] = ipPort;\n break;\n }\n }\n if (i === savedPhircList.length) {\n savedPhircList.push([id, ipPort]);\n }\n writePhircCookie(savedPhircList);\n };\n\n //var loadPhirc = function(id) {\n // var savedPhircList = readPhircCookie();\n // if (!savedPhircList) return;\n // for (var i = 0; i < savedPhircList.length; i++) {\n // if (id === savedPhircList[i][0]) {\n // return savedPhircList[i];\n // }\n // }\n //};\n\n NS_JSPHI.readCookie = function(key){\n var allcookies = document.cookie;\n var pos = allcookies.indexOf(key + '=');\n var value;\n if (pos !== -1) {\n var start = pos + key.length + 1;\n var end = allcookies.indexOf(';', start);\n if (end === -1) end = allcookies.length;\n value = allcookies.substring(start, end);\n value = decodeURIComponent(value);\n }\n return value;\n };\n\n var readPhircCookie = function() {\n var value = NS_JSPHI.readCookie('phirc');\n if (!value) return;\n var phircList = [];\n var _phircList = value.split(',');\n for (var i = 0; i < _phircList.length; i++) {\n phircList.push(_phircList[i].split('@'));\n }\n return phircList;\n };\n\n var writePhircCookie = function(_phircList) {\n var phircList = _phircList;\n for (var i = 0; i < phircList.length; i++) {\n phircList[i] = phircList[i].join('@');\n }\n document.cookie = 'phirc=' + encodeURIComponent(phircList.join(',')) + '; max-age=' + (60*60*24*365*10);\n };\n\n \n ws = NS_WEBSOCKET.connectWebSocket(URL_WEBSOCKT, recvMessage);\n phiUI = NS_JSPHI.makePhiUI();\n phiUI.setPhirc(readPhircCookie());\n phiUI.bind('send', sendMessage);\n phiUI.bind('login', login);\n phiUI.bind('logout', logout);\n phiUI.bind('newuser', startNewuser);\n phiUI.bind('phirc_load', importPhirc);\n phiUI.bind('phirc_show', showPhirc);\n commandExecutor = NS_JSPHI.makeCommandExecutor(phiUI, ws);\n commandExecutor.bind('change_world', changeWorld);\n commandExecutor.bind('finish_newuser', finishNewuser);\n\n //keypad control and shortcut key\n (function(){\n var isShiftPressed = false;\n\n phiUI.bind('control_keydown', function(e){\n var keycode = e.keyCode;\n var controlCommand = isShiftPressed ? CONTROL_COMMAND_SHIFT : CONTROL_COMMAND;\n if (keycode === 9) {\n $('#text').focus();\n }\n if (keycode === 16) {\n isShiftPressed = true;\n }\n if (controlCommand[keycode]) {\n var commands = controlCommand[keycode];\n for (var i = 0; i < commands.length; i++) {\n ws.send(commands[i]);\n }\n }\n e.preventDefault();\n });\n\n phiUI.bind('control_keyup', function(e) {\n var keycode = e.keyCode;\n if (keycode === 16) {\n isShiftPressed = false;\n }\n });\n })();\n\n");function e(d){var a=caml_ml_out_channels_list(0);for(;;){if(a){var b=a[2];try {}catch(c){}var a=b;continue;}return 0;}}caml_register_named_value(g,e);var h=[0,0],l=undefined,k=false,j=Array;function m(i){return i instanceof j?0:[0,new MlWrappedString(i.toString())];}h[1]=[0,m,h[1]];var n=window;window.HTMLElement===l;function p(o){caml_js_eval_string(f);return k;}n.onload=caml_js_wrap_callback(function(q){if(q){var r=p(q);if(!(r|0))q.preventDefault();return r;}var s=event,t=p(s);s.returnValue=t;return t;});e(0);return;}());
(function(){function ao(a1,a2,a3){return a1.length==2?a1(a2,a3):caml_call_gen(a1,[a2,a3]);}caml_register_global(5,[0,new MlString("Division_by_zero")]);caml_register_global(3,[0,new MlString("Invalid_argument")]);caml_register_global(2,[0,new MlString("Failure")]);var V=new MlString("Pervasives.do_at_exit"),U=new MlString(" "),T=new MlString("No user login."),S=new MlString("@"),R=new MlString(".phirc load compin leted."),Q=new MlString("$open$:"),P=new MlString("@"),O=new MlString("@"),N=new MlString("exit"),M=new MlString("Please set user id first."),L=new MlString("napthats.com:20017"),K=new MlString("$open$:"),J=new MlString("guest1"),I=new MlString("guest1"),H=new MlString("#open "),G=new MlString("#map-iv 1"),F=new MlString("#status-iv 1"),E=new MlString("05103010"),D=new MlString("#version-cli "),C=new MlString("#ex-switch eagleeye=form"),B=new MlString("#ex-map size=57"),A=new MlString("#ex-map style=turn"),z=new MlString("#ex-switch ex-move-recv=true"),y=new MlString("#ex-switch ex-list-mode-end=true"),x=new MlString("#ex-switch ex-disp-magic=false"),w=new MlString(""),v=new MlString(""),u=new MlString(""),t=new MlString("ws://napthats.com/ws/"),s=new MlString(""),r=new MlString("send"),q=new MlString("login"),p=new MlString("logout"),o=new MlString("newuser"),n=new MlString("phirc_load"),m=new MlString("phirc_show"),l=new MlString("change_world"),k=new MlString("finish_newuser");function j(a,c){var b=a.getLen(),d=c.getLen(),e=caml_create_string(b+d|0);caml_blit_string(a,0,e,0,b);caml_blit_string(c,0,e,b,d);return e;}function W(i){var f=caml_ml_out_channels_list(0);for(;;){if(f){var g=f[2];try {}catch(h){}var f=g;continue;}return 0;}}caml_register_named_value(V,W);var X=[0,0],aa=null,$=undefined,_=false,Z=Array;function ab(Y){return Y instanceof Z?0:[0,new MlWrappedString(Y.toString())];}X[1]=[0,ab,X[1]];function ad(ac){return ac;}var ae=window;window.HTMLElement===$;function aW(aV){var af=[0,v],ag=[0,u],ah=com.napthats.jsphi,ai=ah.makePhiUI(0),aj=[0,0];function an(ak){var al=ad(ah.phidmMessageParse(ak.data)),am=al==aa?0:[0,al];return am?aj[1].exec(am[1]):0;}var ap=ao(com.napthats.websocket.connectWebSocket,t.toString(),an);aj[1]=ah.makeCommandExecutor(ai,ap);function az(aq){return w;}function au(ar){ap.send(G.toString());ap.send(F.toString());ap.send(j(D,E).toString());ap.send(C.toString());ap.send(B.toString());ap.send(A.toString());ap.send(z.toString());ap.send(y.toString());return ap.send(x.toString());}function aM(as,at){ae.alert(as.toString());ae.alert(at.toString());af[1]=as;ag[1]=at;return 0?ai.showErrorMessage(M.toString()):(ap.send(j(K,L).toString()),aj[1].setUserId(J.toString()),ap.send(j(H,I).toString()),au(0));}function aN(av){aj[1].resetExecutor(0);return ap.send(N.toString());}function aO(aw){return ap.send(aw.toString());}function aP(ax){ag[1]=ax;var ay=j(O,ag[1]),aA=j(af[1],ay).toString();ai.setPhirc(az(0).toString(),aA);return au(0);}function aQ(aB){af[1]=aB;var aC=j(P,ag[1]),aD=j(af[1],aC).toString();ai.setPhirc(az(0).toString(),aD);aj[1].setUserId(aB.toString());return au(0);}function aR(aF,aE){ag[1]=aE;ap.send(j(Q,ag[1]).toString());return aj[1].startNewuser(aF);}function aS(aG,aH){af[1]=aG;ag[1]=aH;var aI=j(S,ag[1]),aJ=j(af[1],aI).toString();ai.setPhirc(az(0).toString(),aJ);return ai.showClientMessage(R.toString());}function aT(aL){if(0){var aK=j(U,ag[1]);return ai.showClientMessage(j(af[1],aK).toString());}return ai.showErrorMessage(T.toString());}var aU=s.toString();ai.setPhirc(az(0).toString(),aU);ai.bind(r.toString(),aO);ai.bind(q.toString(),aM);ai.bind(p.toString(),aN);ai.bind(o.toString(),aR);ai.bind(n.toString(),aS);ai.bind(m.toString(),aT);aj[1].bind(l.toString(),aP);aj[1].bind(k.toString(),aQ);return _;}ae.onload=ad(caml_js_wrap_callback(function(aX){if(aX){var aY=aW(aX);if(!(aY|0))aX.preventDefault();return aY;}var aZ=event,a0=aW(aZ);aZ.returnValue=a0;return a0;}));W(0);return;}());

0 comments on commit aa4c552

Please sign in to comment.