{"name":".ndb","enabled":true,"description":"Name Database","type":"group","id":1,"items":[{"type":"function","name":"onGMCP","enabled":true,"id":3,"code":"var matches = arguments[0]\nvar r = matches.gmcp_method\nvar n = matches.gmcp_args\n\nif (typeof ndb != 'undefined') {\n ndb.gmcp(null, r, n)\n}"},{"type":"group","name":"Functions","enabled":true,"id":19,"items":[{"type":"function","name":"ndb.utilities","enabled":true,"id":20,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.options = ndb.options || {}\n\nndb.options.tag = '⟪ ndb ⟫'\nndb.options.tagc = 'rgba( 75, 75, 145, 1 )'\nndb.options.msgc = 'rgba( 33, 145, 175, 1 )'\nndb.options.sysc = 'rgba( 33, 145, 199, 1 )'\n\n// Server-side Operation\nndb.hardsave = function() { client.gmcp_save_system(true) }\n\n// Helper Functions\nndb.write = function(msg) { ow_Write('#output_main', '
' + msg + '
') }\nndb.report = function(msg) { ow_Write('#output_main', '
' + ndb.options.tag + ': ' + msg + '
') }\n\nndb.title = function(str) { return str.replace(/\\w\\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}) }\n \nndb.lpad = function(str, len, ch) {\n if (typeof str == 'number') { str = str.toString() }\n if (ch == null) { ch = ' ' }\n var r = len - str.length\n if (r < 0) { r = 0 }\n return ch.repeat(r) + str }\n \nndb.rpad = function(str, len, ch) {\n if (typeof str == 'number') { str = str.toString() }\n if (ch == null) { ch = ' ' }\n var r = len - str.length\n if (r < 0) { r = 0 }\n return str + ch.repeat(r) }\n \nndb.clone = function(obj) {\n var copy;\n if (null == obj || 'object' != typeof obj) return obj;\n if (obj instanceof Date) { copy = new Date(); copy.setTime(obj.getTime()); return copy };\n if (obj instanceof Array) { copy = []; for (var i=0;i b) - (b > a)); //^ Return a zero if the two fields are equal!\n } }\n\nndb.chainSortBy = function(sortByArr) {\n return function(a, b) {\n for (var i=0; i -1; i--) {\n var k = seq[i]\n if (typeof m[k] != 'undefined' && m[k] > 0) {\n s = m[k] + ' ' + k\n if (m[k] > 1) { s += 's' }\n if (i < (seq.length - 1)) {\n if (b) {\n str = s + ' & ' + str\n b = false\n } else {\n str = s + ', ' + str\n }\n } else {\n str = s + str \n }\n }\n }\n return str\n}\n\nndb.report(' ndb ∘ utilities')"},{"type":"function","name":"ndb.styles","enabled":true,"id":25,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.classr = 'ndb-rule'\n\nndb.inject = function(rule, addedClass) {\n var c = ndb.classr\n if (typeof addedClass == 'string') { c += ' ' + addedClass }\n $('body').append('
­
') }\n\nndb.stylize = function() {\n $('.' + ndb.classr).remove() \n ndb.inject('.ndb { font-family: \"LiberationMono\"; font-size: 9pt; }')\n ndb.inject('.ndb.mini { font-size: 7pt; }')\n ndb.inject('.ndb.gold { color: rgba( 255, 195, 17, 1); }')\n ndb.inject('.ndb.darkgold { color: rgba( 232, 176, 9, 1); }')\n ndb.inject('.ndb.green { color: rgba( 45, 216, 26, 1); }')\n ndb.inject('.ndb.red { color: rgba( 222, 15, 15, 1); }')\n ndb.inject('.ndb.grey { color: rgba( 155, 155, 155, 1); }')\n ndb.inject('.ndb.dimgrey { color: rgba( 79, 79, 79, 1); }')\n ndb.inject('.ndb.black { color: rgba( 12, 12, 12, 1); }')\n ndb.inject('.ndb.border { color: rgba( 63, 5, 188, 1); }')\n /*\n for (var k in coptions) {\n var c = coptions[k]\n var r = k\n if (r == 'B.E.A.S.T.') { r = 'BEAST' }\n inject('.ndb.' + r + ' { color: rgba( ' + c.r + ',' + c.g + ',' + c.b + ',' + c.a + '); }')\n }\n */\n \n var rules = ''\n rules += '#ndb-colormap {position:absolute; left:50%; top:50%; height:400px; width:600px; transform:translate(-50%,-50%); z-index: 999;} '\n rules += '#ndb-colormap {background:rgba(1,1,1,0.88); border:1px solid rgba(88,88,88,0.67); border-radius:3px;} '\n rules += '#ndb-cm-closer {position:absolute; right:0%; top:0%; height:18px; width:18px;} '\n rules += '#ndb-cm-closer {background:rgba(120,25,50,0.25); color:rgba(200,2,55,1); border-top-right-radius:3px; cursor:pointer;} '\n rules += '#ndb-cm-closer:hover {color:rgba(232,2,55,1);} '\n rules += '#ndb-cm-closer {font-family:Futura,sans serif; font-size:9pt; text-align:center; line-height:15px;} '\n rules += '#ndb-cm-reader {position:absolute; left:0%; top:18px; height:calc(100% - 18px - 18px); width:calc(49% - 14px - 7px); } '\n rules += '#ndb-cm-reader {margin-left:14px; padding-right:7px; margin-top:21px;} '\n rules += '#ndb-cm-reader {border-right:1px solid rgba(88,88,88,0.45);} '\n rules += '#ndb-cm-reader {font-family:\"LiberationMono\",sans serif; font-size:8pt;} '\n rules += '#ndb-cm-palette {position:absolute; left:50%; top:18px; height:calc(100% - 18px - 18px); width:50%; } '\n \n rules += '#ndb-cm-targetC {position:absolute; left:50%; top:23px; height:44px; width:calc(88% - 4px - 3px - 3px - 14px); transform:translate(calc(-50% - 6px),0%);} '\n rules += '#ndb-cm-targetC {background:rgba(200,200,200,0.11); border:3px solid rgba(1,1,1,0);} '\n rules += '#ndb-cm-target {font-size:11pt; text-align:center; line-height:44px;} ' \n rules += '#ndb-cm-targetLeft {position:absolute; left:-3px; top:-3px; height:100%; width:16px;} '\n rules += '#ndb-cm-targetLeft {border-top:3px solid rgba(255,255,255,0.23); border-left:3px solid rgba(255,255,255,0.23); border-bottom:3px solid rgba(255,255,255,0.23);} '\n rules += '#ndb-cm-targetRight {position:absolute; right:-3px; top:-3px; height:100%; width:16px;} '\n rules += '#ndb-cm-targetRight {border-top:3px solid rgba(255,255,255,0.23); border-right:3px solid rgba(255,255,255,0.23); border-bottom:3px solid rgba(255,255,255,0.23);} '\n rules += '.sliderC {position:relative; left:40px; top:92px; margin-top:8px; margin-bottom:8px; width: 160px;} '\n rules += '.sliderI {width: 160px;} '\n rules += '.sliderF {position:absolute; right:-44px; top:50%; height:100%; width:42px; transform:translate(0%, -50%);} '\n rules += '.sliderF {font-family:\"LiberationMono\"; font-size:10pt; text-align:center; line-height:22px; white-space:pre-wrap;} '\n rules += '.sliderF {background:rgba(255,1,1,0);} '\n rules += '.ndb.elem.Song, .ndb.elem.Scatterhome, .ndb.elem.Celestine, .ndb.elem.target { cursor: pointer; } '\n rules += '#ndb-cm-RsliderF {color:rgba(255,1,1,1);} '\n rules += '#ndb-cm-GsliderF {color:rgba(1,255,1,1);} '\n rules += '#ndb-cm-BsliderF {color:rgba(1,1,255,1);} '\n \n // Progress meter rules\n rules += '#ndb-progress-meter {position:absolute; left:65%; top:77%; height:23px; width:134px; background:rgba(14,14,14,0.67); border: rgba(88,88,88,1); border-radius:4px; } '\n rules += '#ndb-progress-outer {position:absolute; left:4px; top:50%; height:3px; width:100px; background:rgba(45,45,45,1); transform:translate(0%,-50%); } '\n rules += '#ndb-progress-inner {position:absolute; left:0px; height:3px; width:0%; background:rgba(45,240,45,1); } '\n rules += '#ndb-progress-current { } '\n rules += '#ndb-progress-total { } '\n rules += '#ndb-progress-closer {position:absolute; right:0%; top:0%; height:18px; width:18px; } '\n rules += '#ndb-progress-closer {font-family:Futura,sans serif; font-size:9pt; text-align:center; line-height:15px;} '\n rules += '#ndb-progress-closer {background:rgba(120,25,50,0.25); color:rgba(200,2,55,1); border-top-right-radius:3px; cursor:pointer;} '\n \n ndb.inject(rules)\n}\n\nndb.stylize()\n\nndb.report(' ndb ∘ styles')"},{"type":"function","name":"ndb.options","enabled":true,"id":28,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.options = ndb.options || {}\n\nndb.optionsTemplate = {\n doHighlight : true,\n doSuppress : true,\n useUnitColors : true,\n tag : '⟪ ndb ⟫',\n tagc : 'rgba( 75, 75, 145, 1 )',\n msgc : 'rgba( 33, 145, 175, 1 )',\n sysc : 'rgba( 33, 145, 199, 1 )',\n defaultColor : {r: 144, g: 144, b: 144, a: 1},\n}\n\n// Client-side Operations\nndb.loadOptions = function() {\n var opts = get_variable('ndb-options')\n if (opts) {\n ndb.options = opts\n ndb.report('ndb general options loaded.')\n // Harmonise with template\n for (var k in ndb.optionsTemplate) {\n if (typeof ndb.options[k] == 'undefined') {\n ndb.options[k] = ndb.clone(ndb.optionsTemplate[k])\n }\n }\n } else {\n ndb.options = ndb.clone(ndb.optionsTemplate)\n ndb.saveOptions(true)\n ndb.report('Initialised ndb options with template.')\n } }\n\nndb.saveOptions = function(suppress) {\n if (!suppress) { ndb.report('Saving ndb\\'s options.') }\n set_variable('ndb-options', ndb.options)\n if (!suppress) { ndb.report('Complete.') }\n}\n\nndb.setOption = function(option, value) {\n if (typeof ndb.options[option] == 'undefined') { console.log('Setting undefined option (' + option + ') to ' + value + '.') }\n ndb.options[option] = value\n return ndb.options[option] }\n\nndb.getOption = function(option) {\n if (typeof ndb.options[option] != 'undefined') { return ndb.options[option] }\n return undefined }\n\nndb.report(' ndb ∘ options')"},{"type":"function","name":"ndb.mainDB","enabled":true,"id":22,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n_db = typeof _db != 'undefined' ? _db : {}\n\n// Client-side Operations\nndb.saveDB = function(suppress) {\n if (!suppress) { ndb.report('Saving ndb.') }\n set_variable('ndb', _db )\n if (!suppress) { ndb.report('Complete.') } }\n \nndb.loadDB = function() {\n var saved = get_variable('ndb')\n if (saved) {\n _db = saved\n var c = 0\n for (var k in _db) {\n _db[k].regex = new RegExp('\\\\b' + _db[k].name + '\\\\b', 'g')\n if (typeof _db[k].keyed == 'undefined') { _db[k].keyed = new Date().getTime() }\n // Harmonise with current template\n for (var m in ndb.template) {\n if (typeof _db[k][m] == 'undefined') {\n _db[k][m] = ndb.clone( ndb.template[m] )\n }\n }\n c += 1\n }\n ndb.report('Loading ndb complete. ' + c + ' records intact.')\n } else {\n _db = {}\n ndb.saveDB(true)\n ndb.report('Initialised ndb with empty table.')\n } }\n \n// Batched Interactions\nndb.remake = function() {\n var temp = []\n for (var k in _db) {\n temp.push(_db[k].name) }\n ndb.destroy()\n for (var i = 0; i < temp.length; i++) {\n ndb.add(temp[i]) \n } }\n \nndb.destroy = function() {\n _db = {}\n ndb.save()\n ndb.hardsave()\n ndb.report('Destroyed existing & recreated empty ndb.') }\n\n// Unit Interactions\nndb.template = {\n name : '',\n faction : '',\n prof : '',\n race : '',\n gender : '',\n regex : new RegExp('templated', 'g'),\n keyed : new Date().getTime(),\n \n qualified : '',\n level : '1',\n age : '18',\n captaincy : '',\n explorer : '',\n \n met : false,\n first : false,\n color : {r: 255, g: 255, b: 255, a: 1},\n useColor : false,\n}\n\nndb.player = function(name) {\n if (typeof _db[name] == 'undefined') { return false }\n return true }\n\nndb.add = function(name, ex) {\n if (!name) { return }\n var suppress = !ex || ndb.options.doSuppress\n if (ndb.player(name)) { \n if (!suppress) { ndb.report(name + ' already exists in ndb.') }\n return _db[name]\n } else {\n _db[name] = {}\n _db[name].name = name\n _db[name].regex = new RegExp('\\\\b' + name + '\\\\b', 'g')\n _db[name].keyed = new Date().getTime()\n for (var k in ndb.template) {\n if (typeof _db[name][k] == 'undefined') { _db[name][k] = ndb.clone( ndb.template[k] ) }\n }\n if (!suppress) { ndb.report(name + ' successfully added to ndb.') }\n }\n return _db[name] }\n \nndb.remove = function(name, suppress) {\n if (!name) { return }\n delete _db[name]\n if (!suppress) { ndb.report('Successfully removed ' + name + ' from ndb.') }\n console.log('(ndb): Removed ' + name + ' from ndb.') }\n \nndb.meet = function(name) {\n if (!ndb.player(name)) { return }\n var now = new Date().getTime()\n ndb.setDBParam(name, 'met', now)\n if (ndb.getDBParam(name, 'first') == false) { ndb.setDBParam(name, 'first', now) } }\n\nndb.setDBParam = function(name, param, value) {\n if (!ndb.player(name)) { ndb.report('Unable to set ' + param + ' to ' + value + ' as ' + name + ' does not exist.'); return false }\n _db[name][param] = value\n return _db[name] }\n\nndb.getDBParam = function(name, param) {\n if (!ndb.player(name)) { ndb.report('Unable to get ' + param + ' from ' + name + ' as they do no exist in ndb.'); return false }\n return _db[name][param] }\n \nndb.setDBColor = function(name, r, g, b) {\n name = ndb.title(name)\n if (!ndb.player(name)) { ndb.report('No such player (' + name + ') to generate unique highlight.'); return } else {\n _db[name].color = {r: parseInt(r), g: parseInt(g), b: parseInt(b), a: 1}\n _db[name].useColor = true\n ndb.report('Set ' + name + '\\'s color to rgba(' + r + ',' + g + ',' + b + ', 1).')\n return _db[name] } }\n\nndb.getDBColor = function(name) {\n if (!ndb.player(name)) { return }\n if (typeof _db[name].color == 'undefined') { return false }\n return _db[name].color }\n\nndb.getCurrentColor = function(name) {\n if (!ndb.player(name)) { return }\n // pseudo-code; \n // if options.useIndividual & useColor, use individual color\n // if faction, use faction\n // return defaultColor\n if (typeof ndb.options != 'undefined' && ndb.options.doHighlight && typeof _db[name].useColor == true && typeof _db[name].color != 'undefined') {\n var c = _db[name].color || {}\n return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + c.a + ')'\n } else if (typeof _db[name].faction != 'undefined' && typeof ndb.coptions != 'undefined' && typeof ndb.coptions[_db[name].faction] != 'undefined') {\n var c = ndb.coptions[_db[name].faction]\n return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + c.a + ')'\n } else {\n var c = ndb.options.defaultColor\n return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + c.a + ')'\n } }\n\nndb.report(' ndb ∘ main')"},{"type":"function","name":"ndb.gmcp","enabled":true,"id":35,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.gmcp = function(e, r, n) {\n if (r == 'Room.Players') {\n for (var i = 0; i < n.length; i++) {\n if (!ndb.player(n[i].name)) { ndb.add(n[i].name) }\n ndb.meet(n[i].name)\n }\n } else if (r == 'Room.AddPlayer') {\n if (!ndb.player(n.name)) { ndb.add(n.name) }\n ndb.meet(n.name)\n } else if (r == 'Room.RemovePlayer') {\n if (!ndb.player(n)) { ndb.add(n) }\n ndb.meet(n)\n }\n}\n\n\nndb.report(' ndb ∘ gmcp')"},{"type":"function","name":"ndb.interface","enabled":true,"id":23,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.symbols = {\n ['B.E.A.S.T.'] : '‡',\n ['Scoundrel'] : '♥',\n ['Engineer'] : '♦',\n ['Nanoseer'] : '⥈',\n ['Fury'] : '⥉',\n}\n\nndb.interface = function(matches) { \n var nvar = matches[1]\n if (typeof nvar == 'undefined') { nvar = 'undefined' }\n nvar = nvar.replace('.','')\n nvar = nvar.trim()\n \n switch(nvar) {\n case 'undefined': ndb.menu(); break;\n case 'u' :\n case 'up' :\n case 'update' : ndb.limitUpdate(); break;\n case 'fu' :\n case 'fupdate' : ndb.forceUpdate(); break;\n case 'set' :\n case 'settings' : ndb.showSettings(); break;\n case 'sum' : ndb.showSummary(); break;\n case 'f' :\n case 'factions' : ndb.showFactions(); break;\n case 'ro' :\n case 'roster' : ndb.showFactions(true); break;\n case 's' :\n case 'stats' : ndb.showStats(); break;\n case 'hl' : ndb.useHighlight(); break;\n case 'uhl' : ndb.noHighlight(); break;\n case 'colors' : ndb.setColours(); break;\n case 'm' :\n case 'met' : ndb.showMet(); break;\n \n case 'save' : ndb.save(); break;\n case 'remake' : ndb.remakeDB(); break;\n case 'reset' : ndb.destroy(); break;\n case 'shh' : ndb.quietDB(); break;\n case 'yup' : ndb.alertDB(); break;\n \n case 'p' : \n case 'poll' : ndb.updatePolling(); break;\n case 'ps' :\n case 'pstop' : ndb.updateUnpoll(); break;\n case 'c' :\n case 'classes' : showClasses(); break;\n case 'r' :\n case 'races' : showRaces(); break;\n \n default : ndb.infoPlayer(nvar); break;\n } }\n\nndb.addPlayer = function(name, ex) {\n if (!ndb.player(name)) {\n ndb.add(name, ex)\n } else {\n if (ex) { ndb.report('' + name + ' already exists.') }\n } }\n\nndb.deletePlayer = function(name) {\n if (ndb.player(name)) {\n ndb.remove(name)\n } else {\n ndb.report('' + name + ' does not exist.')\n } }\n\nndb.infoPlayer = function(name) {\n name = ndb.title(name)\n var player = _db[name]\n if (typeof player == 'undefined') { ndb.report('Player ' + name + ' not found.'); return }\n var coptions = ndb.coptions || {}\n var f = _db[name].faction\n var c = 'rgba( 111, 111, 111, 1 )'\n var e = 'rgba( 111, 111, 111, 1 )'\n if (typeof _db[name].color != 'undefined' && _db[name].useColor == true) {\n c = 'rgba( ' + _db[name].color.r + ',' + _db[name].color.g + ',' + _db[name].color.b + ',' + _db[name].color.a + ')'\n } else if (typeof coptions[f] != 'undefined') {\n c = 'rgba( ' + coptions[f].r + ',' + coptions[f].g + ',' + coptions[f].b + ',' + coptions[f].a + ')'\n }\n if (typeof coptions[f] != 'undefined') {\n e = 'rgba( ' + coptions[f].r + ',' + coptions[f].g + ',' + coptions[f].b + ',' + coptions[f].a + ')'\n }\n var age = player.age\n if (player.age.charAt(0) == '8' || player.age == '18') { age = 'an ' + age } else { age = 'a ' + age }\n var str = '
'\n str += '======================================================================== NDB ===

' \n str += '' + name + ' is ' + age + ' year old ' + player.race\n str += ' belonging to the faction ' + player.faction + '.'\n str += '
'\n str += ' They are a Level ' + player.level + ' ' + player.prof + '.'\n str += '
'\n if (player.met != false) {\n str += ' We last met ' + name + ' ' + ndb.ageify(player.met) + ' ago.
' \n str += ' We have known ' + name + ' for ' + ndb.ageify(player.first) + '.
'\n } else {\n str += ' We have never met ' + name + '.
'\n }\n str += ' We have previously elected to highlight ' + name + ' in this color.'\n str += '
'\n str += '--------------------------------------------------------------------------------
' \n str += ' Our data on ' + name + ' is ' + ndb.ageify(player.keyed) + ' old.
'\n str += '
'\n str += '=== NDB ========================================================================
' \n ndb.write(str)\n}\n\nndb.remakeDB = function() {\n ndb.report('Attempting remake of ndb...')\n ndb.remake()\n var c = 0\n for (var k in _db) { c += 1 }\n ndb.report('Recreated ndb with ' + c + ' records.')\n}\nndb.quietDB = function() { ndb.options.doSuppress = true; ndb.report('Reducing ndb reporting.') }\nndb.alertDB = function() { ndb.options.doSuppress = false; ndb.report('ndb will be verbose in reporting.') }\n\nndb.showMet = function() {\n var lpad = ndb.lpad\n var str = ''\n var c = 0\n var haveMets = []\n var lastMets = []\n \n for (var name in _db) {\n c += 1\n var t = _db[name]\n if (typeof t.first != 'undefined' && t.first != false) { haveMets.push(ndb.clone(t)) }\n if (typeof t.met != 'undefined' && t.met != false) { lastMets.push(ndb.clone(t)) }\n }\n \n haveMets.sort( ndb.chainSortBy([\n ndb.sort_by('first', true, null)\n ]))\n var ourFirst = haveMets[0]\n var ourFirstT = 0; if (typeof ourFirst != 'undefined' && typeof ourFirst.first != 'undefined') { ourFirstT = ndb.ageify(ourFirst.first) };\n var ourLast = haveMets[(haveMets.length - 1)]\n var ourLastT = 0; if (typeof ourLast != 'undefined' && typeof ourLast.first != 'undefined') { ourLastT = ndb.ageify(ourLast.first) };\n lastMets.sort( ndb.chainSortBy([\n ndb.sort_by('met', true, null)\n ]))\n var curLast = lastMets[(lastMets.length - 1)]\n var curLastT = ndb.ageify(curLast.met)\n \n // console.log(haveMets); console.log(lastMets)\n \n var _pct = haveMets.length / c * 100\n _pct = _pct.toFixed(2)\n \n str += '
'\n str += '======================================================================== NDB ===
' \n str += '
'\n str += ' Statistics about people you have met:
'\n str += ' We have met ' + lpad(haveMets.length, 4) + ' of ' + lpad(c, 4) + ' people known to ndb. (' + lpad(_pct, 7) + '%)
'\n str += ' The first person we have met ever is ' + ourFirst.name + ', who we met ' + ourFirstT + ' ago.
'\n str += ' The last person we met for the first time is ' + ourLast.name + ', who we met ' + ourLastT + ' ago.
'\n str += ' The most recent person we met is ' + curLast.name + ', who we met ' + curLastT + ' ago.
'\n str += '
'\n str += '======================================================================== NDB ===
' \n ndb.write(str)\n}\n\nndb.showFactions = function(online) {\n var rpad = ndb.rpad\n var lpad = ndb.lpad\n var symbols = ndb.symbols\n var coptions = ndb.coptions\n var regcap = /\\((\\d+\\.\\d+)\\)$/\n var str = ''\n \n var wholist = []\n if (typeof GMCP != 'undefined' && typeof GMCP.WhoList != 'undefined') {\n for (var i = 0; i < GMCP.WhoList.length; i++) {\n wholist.push(GMCP.WhoList[i].name)\n } }\n var t = []\n var factions = []\n var profs = []\n for (var name in _db) {\n if (online) { \n if (wholist.indexOf(name) != -1) { t.push(ndb.clone(_db[name])) } \n } else {\n t.push(ndb.clone(_db[name])) }\n }\n // modifications\n for (var i = 0; i < t.length; i++) {\n t[i].level = parseInt(t[i].level)\n t[i].explorer = parseInt(t[i].explorer)\n var cap = t[i].captaincy.match(regcap)\n if (cap != null) {\n cap = cap[1]\n cap = parseFloat(cap) }\n t[i].capitan = cap || 'Unknown'\n if (t[i].faction == 'N/A' || t[i].faction == '') { t[i].faction = 'Unknown' }\n if (t[i].prof == 'Unclassed' || t[i].prof == '') { t[i].prof = 'Unknown' }\n \n if (profs.indexOf(t[i].prof) == -1) { profs.push(t[i].prof) } // profession list\n if (factions.indexOf(t[i].faction) == -1) { factions.push(t[i].faction) } // faction list\n }\n // main table\n var out = {}\n for (var i = 0; i < t.length; i++) {\n if (typeof out[t[i].faction] == 'undefined') { out[t[i].faction] = [] }\n if (typeof out[t[i].faction][t[i].prof] == 'undefined') { out[t[i].faction][t[i].prof] = [] }\n out[t[i].faction][t[i].prof].push(t[i])\n }\n // sorting\n profs.sort()\n factions.sort()\n for (var faction in out) {\n for (var profession in out[faction]) {\n out[faction][profession].sort(ndb.chainSortBy([\n ndb.sort_by('level', false, null),\n ndb.sort_by('capitan', false, null),\n ndb.sort_by('explorer', false, null),\n ndb.sort_by('name', true, null)\n ]))\n }\n }\n \n var truncate = function(strf) {\n var len = 9\n if (strf.length > len) { strf = strf.substring(0, (len - 2)) + '..' }\n return strf\n }\n \n str += '
' + lpad('', 12)\n for (var i = 0; i < profs.length; i++) {\n str += ' ⌈ ' + lpad(profs[i], 11) + ' ⌋ '\n }\n for (var i = 0; i < factions.length; i++) {\n var a = lpad('',12), b = lpad('',12), c = lpad('',12), d = lpad('',12), e = lpad('',12);\n if (typeof out[factions[i]] != 'undefined') {\n var style = ''\n if (typeof coptions[factions[i]] != 'undefined') {\n var z = coptions[factions[i]]\n style = 'rgba(' + z.r + ',' + z.g + ',' + z.b + ',' + z.a + ')'\n }\n str += '
' + lpad(factions[i], 12) + ''\n for (var j = 0; j < profs.length; j++) {\n if (typeof out[factions[i]][profs[j]] != 'undefined') {\n str += ' ' + lpad(out[factions[i]][profs[j]].length, 11) + ' '\n var m = out[factions[i]][profs[j]]\n for (var k = 0; k < 5; k++) {\n var person = m[k] || {}\n var name = person.name || ''\n var level = person.level || ''\n switch (k) {\n case 0:\n a += ' ' + lpad(truncate(name), 9) + ' ' + lpad(level, 3) + ' '\n break;\n case 1:\n b += ' ' + lpad(truncate(name), 9) + ' ' + lpad(level, 3) + ' '\n break;\n case 2:\n c += ' ' + lpad(truncate(name), 9) + ' ' + lpad(level, 3) + ' '\n break;\n case 3:\n d += ' ' + lpad(truncate(name), 9) + ' ' + lpad(level, 3) + ' '\n break;\n case 4:\n e += ' ' + lpad(truncate(name), 9) + ' ' + lpad(level, 3) + ' '\n break;\n }\n } \n } else {\n str += ' ' + lpad('', 11) + ' '\n a += ' ' + lpad('', 12) + ' '\n }\n }\n str += '
' + a + '
' + b + '
' + c + '
' + d + '
' + e\n }\n }\n console.log(out)\n ndb.write(str)\n}\n\nndb.showStats = function() {\n var lpad = ndb.lpad\n /* Do your calculations first */\n var mn = 0\n var fn = {'Celestine':0, 'Song':0, 'Scatterhome':0, 'Unaffiliated':0}\n var cn = {'B.E.A.S.T.':0, 'Scoundrel':0, 'Engineer':0, 'Nanoseer':0, 'Fury':0}\n var rn = {'Amaian':0, 'Decheeran':0, 'Elgan':0, 'Jin':0, 'Krona':0, 'Human':0, 'Nath-el':0, 'Nusriza':0, 'Ry\\'nari':0, 'Shen':0, 'Tukkav':0, 'W\\'hoorn':0}\n \n var ot = []\n var tt = 0\n var up = {'median':0, 'mean':0, 'newest':0, 'oldest':0}\n var now = new Date().getTime()\n for (var k in _db) {\n mn += 1\n var p = _db[k]\n if (typeof fn[p.faction] != 'undefined') { fn[p.faction] += 1 }\n if (typeof cn[p.prof] != 'undefined') { cn[p.prof] += 1 }\n if (typeof rn[p.race] != 'undefined') { rn[p.race] += 1 }\n // do time calculations\n if (typeof p.keyed != 'undefined') {\n var n = now - p.keyed\n tt += n\n ot.push(n)\n if (n > up.oldest) { up.oldest = n }\n if (n < up.newest) { up.newest = n }\n up.mean = Math.floor((tt / mn) / 60000)\n \n var median = function(values) { \n values.sort(function(a,b){return a-b}); if (values.length === 0) { return 0 }; var half = Math.floor(values.length / 2);\n if (values.length % 2) { return values[half] } else { return (values[half - 1] + values[half]) / 2.0 } }\n\n up.median = Math.floor(median(ot) / 60000)\n }\n }\n up.oldest = Math.floor(up.oldest / 60000)\n up.newest = Math.floor(up.newest / 60000)\n // Calculate Unaffiliated\n var short = 0\n for (var faction in fn) { short += fn[faction] }\n fn['Unaffiliated'] = mn - short\n \n var _median = ndb.ageify(new Date().getTime() - up.median * 60000)\n var _mean = ndb.ageify(new Date().getTime() - up.mean * 60000)\n var _oldest = ndb.ageify(new Date().getTime() - up.oldest * 60000)\n var _newest = ndb.ageify(new Date().getTime() - up.newest * 60000)\n \n var str = ''\n str += '
'\n str += '======================================================================== NDB ===
' \n str += ' Data Statistics:
'\n str += ' Median : ' + lpad(up.median, 5) + '
'\n str += ' Mean : ' + lpad(up.mean, 5) + '
'\n str += ' Oldest : ' + lpad(up.oldest, 5) + '
'\n str += ' Newest : ' + lpad(up.newest, 5) + '
'\n str += ' Median : ' + lpad(_median, 15) + '
'\n str += ' Mean : ' + lpad( _mean, 15) + '
'\n str += ' Oldest : ' + lpad(_oldest, 15) + '
'\n str += ' Newest : ' + lpad(_newest, 15) + '
'\n str += '================================================================================
'\n str += '
'\n str += ' ndb is currently tracking
'\n str += '
'\n str += ' Players, total ' + lpad(mn, 16) + '
'\n str += ' Players, by faction
'\n str += ' Celestine Ascendancy : ' + lpad(fn['Celestine'], 5) + ' ' + lpad((100 * fn['Celestine']/mn).toFixed(2), 7) + '%
'\n str += ' Song Dominion : ' + lpad(fn['Song'], 5) + ' ' + lpad((100 * fn['Song']/mn).toFixed(2), 7) + '%
'\n str += ' Scatterhome : ' + lpad(fn['Scatterhome'], 5) + ' ' + lpad((100 * fn['Scatterhome']/mn).toFixed(2), 7) + '%
'\n str += ' Unaffiliated : ' + lpad(fn['Unaffiliated'], 5) + ' ' + lpad((100 * fn['Unaffiliated']/mn).toFixed(2), 7) + '%
'\n str += '
'\n str += ' Players, by class:
'\n str += ' B.E.A.S.T. : ' + lpad(cn['B.E.A.S.T.'], 5) + ' ' + lpad((100 * cn['B.E.A.S.T.']/mn).toFixed(2), 7) + '%
'\n str += ' Scoundrel : ' + lpad(cn['Scoundrel'], 5) + ' ' + lpad((100 * cn['Scoundrel']/mn).toFixed(2), 7) + '%
'\n str += ' Engineer : ' + lpad(cn['Engineer'], 5) + ' ' + lpad((100 * cn['Engineer']/mn).toFixed(2), 7) + '%
'\n str += ' Nanoseer : ' + lpad(cn['Nanoseer'], 5) + ' ' + lpad((100 * cn['Nanoseer']/mn).toFixed(2), 7) + '%
'\n str += ' Fury : ' + lpad(cn['Fury'], 5) + ' ' + lpad((100 * cn['Fury']/mn).toFixed(2), 7) + '%
'\n str += '
'\n str += ' Players, by race:
'\n str += ' Amaians : ' + lpad(rn['Amaian'], 5) + ' ' + lpad((100 * rn['Amaian']/mn).toFixed(2), 7) + '%
'\n str += ' Decheerans : ' + lpad(rn['Decheeran'], 5) + ' ' + lpad((100 * rn['Decheeran']/mn).toFixed(2), 7) + '%
'\n str += ' Elgan : ' + lpad(rn['Elgan'], 5) + ' ' + lpad((100 * rn['Elgan']/mn).toFixed(2), 7) + '%
'\n str += ' Jin : ' + lpad(rn['Jin'], 5) + ' ' + lpad((100 * rn['Jin']/mn).toFixed(2), 7) + '%
'\n str += ' Krona : ' + lpad(rn['Krona'], 5) + ' ' + lpad((100 * rn['Krona']/mn).toFixed(2), 7) + '%
'\n str += ' Human : ' + lpad(rn['Human'], 5) + ' ' + lpad((100 * rn['Human']/mn).toFixed(2), 7) + '%
'\n str += ' Nath-el : ' + lpad(rn['Nath-el'], 5) + ' ' + lpad((100 * rn['Nath-el']/mn).toFixed(2), 7) + '%
'\n str += ' Nusriza : ' + lpad(rn['Nusriza'], 5) + ' ' + lpad((100 * rn['Nusriza']/mn).toFixed(2), 7) + '%
'\n str += ' Ry\\'nari : ' + lpad(rn['Ry\\'nari'], 5) + ' ' + lpad((100 * rn['Ry\\'nari']/mn).toFixed(2), 7) + '%
'\n str += ' Shen : ' + lpad(rn['Shen'], 5) + ' ' + lpad((100 * rn['Shen']/mn).toFixed(2), 7) + '%
'\n str += ' Tukkav : ' + lpad(rn['Tukkav'], 5) + ' ' + lpad((100 * rn['Tukkav']/mn).toFixed(2), 7) + '%
'\n str += ' W\\'hoorn : ' + lpad(rn['W\\'hoorn'], 5) + ' ' + lpad((100 * rn['W\\'hoorn']/mn).toFixed(2), 7) + '%
'\n str += '
'\n str += '======================================================================== NDB ===
' \n str += '
'\n ndb.write(str) }\n\nndb.showSettings = function() {\n var opts = ndb.options || {}\n var copts = ndb.coptions || {}\n var popts = ndb.poptions || {}\n \n var str = '
'\n str += '================================= NDB SETTINGS =================================
'\n str += ' GENERAL OPTIONS
'\n str += ' Generic Reported Message : ' + opts.tag + ': Generic Message.
' \n if (opts.doHighlight == true) {\n str += ' Highlighting Names : YES / NO
'\n } else {\n str += ' Highlighting Names : YES / NO
'\n }\n if (opts.doSuppress == true) {\n str += ' Suppressing Reports : YES / NO
'\n } else {\n str += ' Suppressing Reports : YES / NO
'\n } \n if (opts.useUnitColors == true) {\n str += ' Using Individual Color : YES / NO
'\n } else {\n str += ' Using Individual Color : YES / NO
'\n }\n \n str += '
'\n str += ' GENERIC COLORS R G B A
'\n for (var k in copts) {\n var r = copts[k].r || '155'; var g = copts[k].g || '155'; var b = copts[k].b || '155'; var a = copts[k].a || '1';\n var c = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'\n str += ' ' + k + ''\n str += ndb.rpad('', 16 - k.length)\n str += ndb.lpad(r, 3) + ' ' + ndb.lpad(g, 3) + ' ' + ndb.lpad(b, 3) + ' ' + ndb.lpad(a, 3)\n str += '
' \n }\n \n str += '
'\n str += ' POLLING OPTIONS
'\n if (popts.usePolling == true) {\n str += ' Using POLLING Method : YES / NO
'\n } else {\n str += ' Using POLLING Method : YES / NO
'\n }\n str += ' Idle check every : ' + ndb.lpad((popts.idleChecks / 60000).toFixed(2), 5) + ' minutes
'\n str += ' Idle status starts after : ' + ndb.lpad((popts.idleThreshold / 60000).toFixed(2), 5) + ' minutes of idling
'\n str += ' Loop request every : ' + ndb.lpad((popts.loopFrequency / 60000).toFixed(2), 5) + ' minutes
'\n str += ' Request sizes : ' + ndb.lpad( popts.requestSize, 5) + ' minutes
'\n str += ' Update when record is : ' + ndb.lpad((popts.decay / 60000).toFixed(2), 5) + ' minutes old
'\n if (popts.autoRemovals == true) {\n str += ' Delete if server unknown : YES / NO
'\n } else {\n str += ' Delete if server unknown : YES / NO
'\n }\n if (popts.autoDeletions == true) {\n str += ' Delete if unmet? : YES / NO
'\n } else {\n str += ' Delete if unmet? : YES / NO
'\n }\n var n = new Date().getTime()\n var m = n - popts.deletionThreshold\n var L = ndb.ageify(m)\n str += ' Delete if unmet after : ' + L + '
'\n \n str += '
'\n str += ' Current Polling Exclusions :
'\n str += '
'\n str += '======================================================================== NDB ===
' \n str += '
'\n ndb.write(str) }\n\nndb.showSummary = function() {\n var lpad = ndb.lpad\n var rpad = ndb.rpad\n var coptions = ndb.coptions\n \n // For sorting logic (not extremely necessary) & cumulative stats\n var fn = {}\n var cn = {}\n var listFactions = ['Celestine','Scatterhome','Song']\n var listClasses = ['B.E.A.S.T.','Scoundrel','Engineer','Nanoseer','Fury']\n // Cumulative stats only\n for (var i = 0; i < listFactions.length; i++) {\n if (typeof fn[listFactions[i]] == 'undefined') { fn[listFactions[i]] = {} }\n for (var j = 0; j < listClasses.length; j++) {\n if (typeof fn[listFactions[i]][listClasses[j]] == 'undefined') { fn[listFactions[i]][listClasses[j]] = 0 } \n }\n }\n fn['Unaffiliated'] = {}\n for (var i = 0; i < listClasses.length; i++) {\n fn['Unaffiliated'][listClasses[i]] = 0\n cn[listClasses[i]] = 0\n }\n \n // Begin\n var str = ''\n var tdb = []\n var c = 0\n for (var k in _db) { c += 1; tdb.push(_db[k]) }\n tdb.sort(ndb.chainSortBy([ \n ndb.sort_by('faction', true, null), \n ndb.sort_by('prof', true, null),\n ndb.sort_by('name', true, null),\n ]) )\n // str += '== Displaying ' + lpad(c, 4)\n // str += ' players =====================================================
'\n \n var loop = 0\n for (var k in tdb) {\n var p = tdb[k]\n var f = p.faction\n if (typeof fn[f] == 'undefined') { f = 'Unaffiliated' }\n if (typeof fn[f][p.prof] == 'undefined') { fn[f][p.prof] = 0 }\n fn[f][p.prof] += 1\n if (typeof cn[p.prof] != 'undefined') { cn[p.prof] += 1 }\n var r = p.prof\n if (r == 'B.E.A.S.T.') { r = 'BEAST' }\n // if (loop >= 3) { str += '
'; loop = 0 }\n // str += '' + rpad(p.name, 15) + ' ' + lpad(p.prof,10) + ' '\n loop += 1\n }\n str += '
'\n str += '======================================================================== NDB ===
' \n str += '
'\n \n str += ''\n for (var i = 0; i < listClasses.length; i++) {\n var prof = listClasses[i]\n str += lpad(prof, 14)\n }\n str += '
'\n for (var i = 0; i < listFactions.length; i++) {\n var m = coptions[listFactions[i]]\n var br = m.r; var bg = m.g; var bb = m.b;\n var tally = 0\n var faction = listFactions[i]\n var n = fn[faction]\n str += ''\n for (var j = 0; j < listClasses.length; j++) {\n var prof = listClasses[j]\n var o = n[prof]\n // There should not be missing elements here\n str += lpad(o, 14)\n tally += o\n }\n str += lpad(tally, 9) + '
'\n }\n str += ''\n var tally = 0\n for (var i = 0; i < listClasses.length; i++) {\n str += lpad(fn.Unaffiliated[listClasses[i]], 14)\n tally += fn.Unaffiliated[listClasses[i]]\n }\n str += lpad(tally, 9) + '
'\n \n str += '--------------------------------------------------------------------------------
'\n str += ''\n for (var i = 0; i < listClasses.length; i++) {\n str += lpad( cn[listClasses[i]], 14 )\n }\n str += lpad(c, 9)\n str += '
'\n str += '--------------------------------------------------------------------------------
'\n str += '' + lpad('', 17) + ' '\n for (var i = 0; i < listFactions.length; i++) {\n var m = coptions[listFactions[i]]\n var br = m.r; var bg = m.g; var bb = m.b;\n str += '
'\n str += '
'\n str += ' ' + rpad(listFactions[i],16) + '
'\n }\n str += '

'\n str += '======================================================================== NDB ===
' \n ndb.write(str) }\n\n\nndb.menu = function() {\n var str = '
'\n str += '================================================================================
'\n str += '
'\n str += ' Welcome to ndb. Commands are below:
'\n str += '
'\n str += '================================================================================
'\n str += ' ndb.
'\n str += ' settings Shows settings.
'\n str += ' update Requests API data from Starmourn.
'\n str += ' fupdate Forces API requests from Starmourn for all entries in ndb.
'\n /*\n str += ' poll Starts polling your input to request API updates on idling.
'\n str += ' pstop Stops polling for idle state.
'\n */\n str += '============================== INFORMATION ==============================
'\n str += ' ndb.
'\n /*\n str += ' classes Shows players by class.
'\n str += ' races Shows players by race.
'\n */\n str += ' stats Shows player composition by varying filters.
'\n str += ' sum Tabulates professions by faction.
'\n str += ' factions Shows players by factions.
'\n str += ' roster Shows online players by factions.
'\n str += ' met Shows statistics about players you have met.
'\n str += '============================== USER INTERACTION ==============================
'\n str += ' hl Turns ON Highlighting.
'\n str += ' uhl Turns OFF Highlighting.
'\n str += ' <name> Display information regarding player.
'\n str += ' <name> r g b Specify a color for a player.
'\n str += ' add <name> Add player.
'\n str += ' del <name> Delete player.
'\n str += ' colors Opens window to set colors.
'\n str += '============================== DATABASE FUNCTIONS ==============================
'\n str += ' save Attempts hard save to ndb to Starmourn server.
'\n str += ' remake Recreates all players in the database.
'\n str += ' reset Deletes all existing players in the database. Irreversible.
'\n str += ' shh Reduces notifications from ndb.
'\n str += ' yup Allows increased notifications from ndb.
'\n str += '
'\n str += '================================================================================
'\n str += ' * If you get stuck, use the Developer Console to manipulate your data as required.
'\n str += '
'\n ndb.write(str)\n}\n\nndb.report(' ndb ∘ interface')"},{"type":"function","name":"ndb.uiFunctions","enabled":true,"id":26,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.useHighlight = function() { ndb.options.doHighlight = true; ndb.report('ndb WILL HIGHLIGHT players.') }\nndb.noHighlight = function() { ndb.options.doHighlight = false; ndb.report('ndb WILL NOT HIGHLIGHT players.') }\n\nndb.sub = function(msg) {\n if (!ndb.options.doHighlight) { return }\n if (typeof client.current_line.parsed_line == 'undefined') { return }\n if (typeof current_text != 'function') { return }\n var rcl = replace_current_line\n var line = current_text()\n var coptions = ndb.coptions || {}\n \n for (var k in _db) {\n var RE = _db[k].regex\n var f = _db[k].faction\n var c = 'rgba( 111, 111, 111, 1 )'\n if (typeof _db[k].color != 'undefined' && _db[k].useColor == true) {\n c = 'rgba( ' + _db[k].color.r + ',' + _db[k].color.g + ',' + _db[k].color.b + ',' + _db[k].color.a + ')'\n } else if (typeof coptions[f] != 'undefined') {\n c = 'rgba( ' + coptions[f].r + ',' + coptions[f].g + ',' + coptions[f].b + ',' + coptions[f].a + ')'\n }\n while((match = RE.exec(line)) != null) {\n var cp = match[0]\n rcl(match.index, cp.length, cp, c)\n }\n } }\n\nndb.report(' ndb ∘ uiFunctions')"},{"type":"function","name":"ndb.colors","enabled":true,"id":29,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.coptions = ndb.coptions || {}\n\nndb.coptionsTemplate = {\n ['target' ] : {r: 240, g: 15, b: 15, a: 1},\n ['Song' ] : {r: 169, g: 26, b: 216, a: 1},\n ['Scatterhome'] : {r: 145, g: 45, b: 45, a: 1},\n ['Celestine' ] : {r: 113, g: 168, b: 214, a: 1},\n ['B.E.A.S.T.'] : {r: 111, g: 111, b: 111, a: 1},\n ['Scoundrel' ] : {r: 111, g: 111, b: 111, a: 1},\n ['Nanoseer' ] : {r: 111, g: 111, b: 111, a: 1},\n ['Engineer' ] : {r: 111, g: 111, b: 111, a: 1},\n ['Fury' ] : {r: 111, g: 111, b: 111, a: 1},\n}\n\n// Client-side Operations\nndb.loadCoptions = function() {\n var opts = get_variable('ndb-coptions')\n if (opts) {\n ndb.coptions = opts\n ndb.report('ndb color options loaded.')\n // Harmonise with template\n for (var k in ndb.coptionTemplate) {\n if (typeof ndb.coptions[k] == 'undefined') {\n ndb.coptions[k] = ndb.clone(ndb.coptionsTemplate[k])\n }\n }\n } else {\n ndb.coptions = ndb.clone(ndb.coptionsTemplate)\n ndb.saveCoptions(true)\n ndb.report('Initialised ndb color options with template.')\n } }\n\nndb.saveCoptions = function(suppress) {\n if (!suppress) { ndb.report('Saving ndb\\'s color options.') }\n set_variable('ndb-coptions', ndb.coptions)\n if (!suppress) { ndb.report('Complete.') }\n}\n\n// Interface\nndb.cmCoptions = {}\nndb.cmTarget = undefined\nndb.cmLastCSS = ''\n\nndb.setColours = function() {\n ndb.cmCoptions = ndb.clone(ndb.coptions)\n for (var k in ndb.cmCoptions) {\n ndb.inject('.ndb.' + k + '{color:rgba(' + ndb.cmCoptions[k].r + ',' + ndb.cmCoptions[k].g + ',' + ndb.cmCoptions[k].b + ', 1);}', 'coptions')\n }\n \n if ($('#ndb-colormap').length) { $('#ndb-colormap').remove() }\n $('body').append('
')\n $('#ndb-colormap').append('
x
')\n $('#ndb-colormap').append('
')\n $('#ndb-colormap').append('
')\n \n $('#ndb-cm-palette').append('
') \n \n var slider = '
'\n slider += ''\n slider += '
' + ndb.lpad(0,3) + '
'\n $('#ndb-cm-palette').append(slider.replace(/Xslider/g,'Rslider') + slider.replace(/Xslider/g,'Gslider') + slider.replace(/Xslider/g,'Bslider'))\n \n var para = `\n \"Welcome to the Song Dominion,\" Matias greets warmly.

\n \"The Celestine Ascendancy extends her regards,\" says Kimera.

\n \"Make yourself at home in Scatterhome,\" cackles Maddox.

\n Your target screams in terror.\n `\n $('#ndb-cm-readerContent').append(para)\n}\n\nndb.cmAdjust = function(target) {\n ndb.cmTarget = target\n ndb.cmCoptions = ndb.clone(ndb.coptions)\n \n $('#ndb-cm-target').empty()\n $('#ndb-cm-target').append('' + ndb.cmTarget + '')\n // Adjust sliders\n if (typeof ndb.cmCoptions[ndb.cmTarget] != 'undefined') {\n $('#ndb-cm-RsliderF').empty().append(ndb.cmCoptions[ndb.cmTarget].r)\n $('#ndb-cm-GsliderF').empty().append(ndb.cmCoptions[ndb.cmTarget].g)\n $('#ndb-cm-BsliderF').empty().append(ndb.cmCoptions[ndb.cmTarget].b)\n $('#ndb-cm-RsliderI').val(ndb.cmCoptions[ndb.cmTarget].r)\n $('#ndb-cm-GsliderI').val(ndb.cmCoptions[ndb.cmTarget].g)\n $('#ndb-cm-BsliderI').val(ndb.cmCoptions[ndb.cmTarget].b)\n }\n}\n \nndb.cmClose = function() {\n // Update Underlying Data Structure\n ndb.coptions = ndb.clone(ndb.cmCoptions)\n $('#ndb-colormap').remove() \n $('.ndb-rule.coptions').remove()\n}\n \nndb.cmSlide = function(rgb, val) {\n var r = $('#ndb-cm-RsliderI').val()\n var g = $('#ndb-cm-GsliderI').val()\n var b = $('#ndb-cm-BsliderI').val()\n if (rgb == 'Rslider') {\n r = val\n } else if (rgb == 'Gslider') {\n g = val\n } else if (rgb == 'Bslider') {\n b = val \n }\n ndb.cmLastCSS = '.ndb.' + ndb.cmTarget + ' {color:rgba(' + r + ',' + g + ',' + b + ', 1);} '\n ndb.inject(ndb.cmLastCSS, 'remove')\n // update the underlying structure\n if (typeof ndb.cmCoptions[ndb.cmTarget] != 'undefined') {\n ndb.cmCoptions[ndb.cmTarget].r = r\n ndb.cmCoptions[ndb.cmTarget].g = g\n ndb.cmCoptions[ndb.cmTarget].b = b\n }\n // Update the Text\n $('#ndb-cm-' + rgb + 'F').empty().append(val)\n}\n \nndb.cmSlideOff = function() {\n // Update Underlying Data Structure\n ndb.coptions = ndb.clone(ndb.cmCoptions)\n // remove additionally created css rules but keep the last one\n ndb.inject(ndb.cmLastCSS)\n $('.ndb-rule.remove').remove()\n}\n\nndb.report(' ndb ∘ colors')"},{"type":"function","name":"ndb.pollingGlobals","enabled":true,"id":39,"code":"ndb_last_send = typeof ndb_last_send != 'undefined' ? ndb_last_send : new Date().getTime()\n\nif (typeof client.upIdlingInterval != 'undefined') { clearInterval(client.upIdlingInterval) }\nif (typeof client.upLoopingInterval != 'undefined') { clearInterval(client.upLoopingInterval) }\n\nclient.send_direct = function(input, no_expansion) {\n if (!input || typeof input == 'undefined') { return false }\n var do_expansion = !no_expansion\n if (typeof input != 'string') { input = input.toString() }\n client.command_counter++\n if (client.command_counter >= 200) {\n if (client.command_counter == 200)\n print('You seem to have sent more than 200 commands within a second. You probably have some runaway trigger or an endless alias loop - disabling commands for a while.', '#FF8080');\n client.setup_command_counter(); // just in case -- had the interval disappear at one point\n return;\n }\n var real_cmds = []\n if (do_expansion) {\n var commands = []\n var split_regex = new RegExp(escapeRegExp(client.stack_delimiter), 'gm')\n var parts = input.split(split_regex)\n for (var i = 0; i < parts.length; ++i) {\n var cmd = parts[i]\n if (cmd == '') continue;\n var cmds = []\n if (aliases_enabled) {\n cmds = handle_aliases(cmd)\n } else {\n cmds.push(cmd)\n }\n for (var j = 0; j < cmds.length; ++j) { commands.push(cmds[j]) }\n }\n for (var i = 0; i < commands.length; ++i) {\n var cmd = commands[i]\n if (cmd.indexOf('@set') == 0) {\n var temp = cmd.split(/ /)\n if (temp[1] != '' && temp[2] != '') {\n if (client.set_variable(temp[1], temp[2])) {\n print('Set ' + temp[1] + ' to ' + temp[2])\n display_variables()\n }\n continue;\n }\n }\n if (variables_enabled) { cmd = handle_variables(cmd) }\n if (functions_enabled) { cmd = handle_functions(cmd); if (!cmd) { continue; } }\n real_cmds.push(cmd)\n }\n } else {\n real_cmds.push(input)\n }\n if (!real_cmds.length) { return }\n if (!ws) { return }\n for (var i = 0; i < real_cmds.length; ++i) {\n var s = real_cmds[i]\n if (client.echo_input) { print(s, client.color_inputecho) }\n ws_send(s + '\\r\\n')\n }\n last_send = new Date().getTime()\n ndb_last_send = new Date().getTime()\n}"},{"type":"function","name":"ndb.polling","enabled":true,"id":30,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.updateState = ndb.updateState || 0\nndb.poptions = ndb.poptions || {}\nndb.updateDebug = false\n\nndb.poptionsTemplate = {\n usePolling : true,\n idleChecks : 1 * 60 * 1000,\n idleThreshold : 5 * 60 * 1000,\n loopFrequency : 3 * 60 * 1000,\n requestSize : 25,\n decay : 90 * 60 * 1000,\n autoRemovals : true, // Server does not recognize player\n autoDeletions : true, // Automatically delete very old unmet players\n deletionThreshold: 10 * 7 * 24 * 60 * 60 * 1000 + 5000, // 10 weeks\n exclusions : [],\n}\n\n// Client-side Operations\nndb.loadPoptions = function() {\n var opts = get_variable('ndb-poptions')\n if (opts) {\n ndb.poptions = opts\n ndb.report('ndb polling options loaded.')\n // Harmonise with template\n for (var k in ndb.poptionsTemplate) {\n if (typeof ndb.poptions[k] == 'undefined') {\n ndb.poptions[k] = ndb.clone(ndb.poptionsTemplate[k])\n }\n }\n } else {\n ndb.poptions = ndb.clone(ndb.poptionsTemplate)\n ndb.savePoptions(true)\n ndb.report('Initialised ndb polling options with template.')\n } }\n\nndb.savePoptions = function(suppress) {\n if (!suppress) { ndb.report('Saving ndb\\'s polling options.') }\n set_variable('ndb-poptions', ndb.poptions)\n if (!suppress) { ndb.report('Complete.') }\n}\n\n// Guts\nclient.upIdlingInterval = ''\nclient.upLoopingInterval = ''\n\nndb.updateInitiate = function() {\n clearInterval(client.upIdlingInterval)\n client.upIdlingInterval = setInterval(ndb.updateIdleInterval, ndb.poptions.idleChecks)\n clearInterval(client.upLoopingInterval)\n client.upLoopingInterval = setInterval(ndb.updateLoopInterval, ndb.poptions.loopFrequency)\n}\n\nndb.updateIdleInterval = function() {\n if (!ndb.poptions.usePolling) { return }\n var now = new Date().getTime()\n var last = ndb_last_send || now // never work if last_send doesn't exist\n if (ndb.updateDebug) { console.log('Comparing now (' + now + ') to ndb_last_send (' + last + '): ' + (now - last) + ' milliseconds cf ' + ndb.poptions.idleThreshold) }\n if ((now - last) > ndb.poptions.idleThreshold) {\n if (ndb.updateDebug) { console.log('Is considered idle.') }\n ndb.updateState = 1\n } else { // implement upState logic here if sending commands to server in IDLE state, otherwise simple upState reset suffices\n // if (ndb.updateDebug) { console.log('Not idle.') }\n ndb.updateState = 0\n } }\n\nndb.updateLoopInterval = function() {\n if (!ndb.poptions.usePolling) { return }\n if (ndb.updateState == 1) {\n var now = new Date().getTime()\n var out = []\n var p = []\n var n = 0\n for (var name in _db) {\n if (ndb.poptions.exclusions.indexOf(name) == -1) {\n out.push(name) \n }\n }\n out.sort(function() { return Math.random() - 0.5 })\n for (var i = 0; i < out.length; i++) {\n if (n > ndb.poptions.requestSize) { break }\n var name = out[i]\n var obj = _db[name]\n if (typeof obj.keyed != 'undefined') {\n if ((now - obj.keyed) > ndb.poptions.decay) {\n n += 1\n p.push(obj.name)\n }\n }\n }\n out = p.concat(ndb.poptions.exclusions)\n if (ndb.updateDebug) { console.log(out) }\n if (!ndb.options.doSuppress) { ndb.report('(idle) Requesting ' + out.length + ' records for update.') }\n ndb.chainUpdate(out, ndb.options.doSuppress) \n } }\n\nndb.report(' ndb ∘ polling')"},{"type":"function","name":"ndb.pollingInterface","enabled":true,"id":37,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.poptions = ndb.poptions || {}\n\nndb.pollInterface = function(matches) {\n // console.log(matches)\n var nvar = matches[1]\n if (typeof nvar == 'undefined') { nvar = 'undefined' }\n nvar = nvar.replace('.','')\n nvar = nvar.trim()\n \n var m = matches[2]\n if (typeof m != 'undefined') { m = m.trim() }\n if (parseInt(m) != NaN) { m = parseInt(m) }\n \n switch(nvar) {\n case 'undefined': ndb.updateMenu(); break;\n case 'start' : ndb.updatePolling(); break;\n case 'stop' : ndb.updateUnpoll(); break;\n case 'autod' : ndb.updateAutodeletions(m); break;\n case 'autor' : ndb.updateAutoremovals(m); break;\n case 'decay' : ndb.updateDecay(m); break;\n case 'delwhen' : ndb.updateDeletionThreshold(m); break;\n case 'idf' : ndb.updateIdlechecks(m); break;\n case 'idwhen' : ndb.updateIdlethreshold(m); break;\n case 'freq' : ndb.updateLoopfrequency(m); break;\n case 'size' : ndb.updateRequestsize(m); break;\n case 'add' : ndb.updateAddexclusion(m); break;\n case 'del' : ndb.updateRemoveexclusion(m); break;\n case 'ce' : ndb.updateClearexclusions(m); break;\n default : break;\n }\n}\n\nndb.updatePolling = function() {\n ndb.poptions.usePolling = true\n ndb.report('ndb will use idle polling to keep itself up to date.') }\n\nndb.updateUnpoll = function() {\n ndb.poptions.usePolling = false\n ndb.report('ndb will not use idle polling to keep itself up to date.') }\n\nndb.updateAutodeletions = function(val) {\n if (val !== false || val !== true) { return }\n var m = new Date().getTime()\n ndb.poptions.autoDeletions = val\n ndb.report('ndb will now delete players that have not been met by us for ' + ndb.ageify(m - ndb.poptions.deletionThreshold) + '.') }\n\nndb.updateAutoremovals = function(val) {\n if (val !== false || val !== true) { return }\n ndb.poptions.autoRemovals = val\n ndb.report('ndb will now remove players that the server does not recognize (404 error).') }\n\nndb.updateDecay = function(n) {\n if (typeof n != 'number' || n == 0) { return }\n var f = ndb.poptions.decay\n var m = new Date().getTime()\n ndb.poptions.decay = (n * 1000)\n ndb.report('ndb will now update records that are at least ' + ndb.ageify(m - ndb.poptions.decay) + ' old. Previously, we updated when they were ' + ndb.ageify(m - f) + ' old.') }\n\nndb.updateDeletionThreshold = function(n) {\n if (typeof n != 'number' || n == 0) { return }\n var f = ndb.poptions.deletionThreshold\n var m = new Date().getTime()\n ndb.poptions.deletionThreshold = (n * 1000)\n ndb.report('ndb will now set the threshold for deleting players that we have not met for ' + ndb.ageify(m - ndb.poptions.deletionThreshold) + '. Previously, we deleted when they were not met for ' + ndb.ageify(m - f) + '.') }\n\nndb.updateIdlechecks = function(n) {\n if (typeof n != 'number' || n == 0) { return }\n var f = ndb.poptions.idleChecks\n var m = new Date().getTime()\n ndb.poptions.idleChecks = (n * 1000)\n ndb.report('ndb will now check for idling every ' + ndb.ageify(m - ndb.poptions.idleChecks) + '. Previously, we checked every ' + ndb.ageify(m - f) + '.')\n ndb.updateInitiate() }\n\nndb.updateIdlethreshold = function(n) {\n if (typeof n != 'number' || n == 0) { return }\n var f = ndb.poptions.idleThreshold\n var m = new Date().getTime()\n ndb.poptions.idleThreshold = (n * 1000)\n ndb.report('ndb will now consider us idle after ' + ndb.ageify(m - ndb.poptions.idleThreshold) + '. Previously, we considered us idle after ' + ndb.ageify(m - f) + '.')\n ndb.updateInitiate() }\n\nndb.updateLoopfrequency = function(n) {\n if (typeof n != 'number' || n == 0) { return }\n var f = ndb.poptions.loopFrequency\n var m = new Date().getTime()\n ndb.poptions.loopFrequency = (n * 1000)\n ndb.report('While idle, ndb will batch updates of ' + ndb.poptions.requestSize + ' every ' + ndb.ageify(m - ndb.poptions.loopFrequency) + '. Previously, we batched updates every ' + ndb.ageify(m - f) + '.')\n ndb.updateInitiate() }\n\nndb.updateRequestsize = function(n) {\n if (typeof n != 'number' || n == 0) { return }\n var f = ndb.poptions.requestSize\n ndb.poptions.requestSize = n\n ndb.report('While idle, ndb will batch updates of ' + ndb.poptions.requestSize + ' every ' + ndb.ageify(new Date().getTime() - ndb.poptions.loopFrequency) + '. Previously, we requested updates in batches of ' + f + '.') }\n\nndb.updateAddexclusion = function(name) {\n var m = ndb.poptions.exclusions\n if (m.indexOf(name) == -1) {\n ndb.poptions.exclusions.push(name)\n ndb.report('Added ' + name + ' to ndb\\'s exclusion list.')\n } else {\n ndb.report('We are informed that ' + name + ' already belongs to ndb\\'s exclusion list.') \n } }\n\nndb.updateRemoveexclusion = function(name) {\n var m = ndb.poptions.exclusions\n if (m.indexOf(name) != -1) {\n for (var i = (m.length - 1); i > -1; i--) {\n if (m[i] == name) {\n m.splice(i, 1) \n }\n }\n ndb.poptions.exclusions = m\n ndb.report('Removed ' + name + ' from ndb\\'s exclusion list.')\n } else {\n ndb.report('' + name + ' doesn\\'t seem to belong to ndb\\' exclusion list.') \n } }\n\nndb.updateClearexclusions = function() {\n ndb.poptions.exclusions = []\n ndb.report('ndb\\'s exclusion list cleared.') }\n\nndb.updateMenu = function() {\n var n = new Date().getTime()\n var popts = ndb.poptions\n var decay = ndb.ageify(n - popts.decay)\n var delwhen = ndb.ageify(n - popts.deletionThreshold)\n var idf = ndb.ageify(n - popts.idleChecks)\n var idwhen = ndb.ageify(n - popts.idleThreshold)\n var freq = ndb.ageify(n - popts.loopFrequency)\n \n var str = '
'\n str += '================================================================================
'\n str += '
'\n str += ' ndb\\'s Polling Interface. Commands are below:
'\n str += '
'\n str += '================================================================================
'\n str += ' ndbp.
'\n str += ' start Starts polling your input to request API updates while idle.
'\n str += ' stop Stops polling for idle state.
'\n str += ' autod Deletes players when they are not recognized by the server (404 error).
'\n str += ' autor Deletes players when we have not met them for a period of time.
'\n str += ' decay Requests updates only when ndb record is ' + decay + ' old.
'\n str += ' delwhen Delete players after not meeting them for ' + delwhen + '.
'\n str += ' idf Check for idle state every ' + idf + '.
'\n str += ' idwhen Set idle state after no input for ' + idwhen + '.
'\n str += ' freq While idle, batch ndb updates every ' + freq + '.
'\n str += ' size Batch ndb requests in sizes of ' + ndb.poptions.requestSize + '.
'\n str += ' add name Add <name> to ndb\\'s exclusion list. These are force updated on simple updates.
'\n str += ' del name Remove <name> from ndb\\'s exclusion list.
'\n str += ' ce Clear ndb\\'s exclusion list.
'\n str += '================================================================================
'\n str += ' * If you get stuck, use the Developer Console to manipulate your data as required.
'\n str += '
'\n ndb.write(str)\n}\n\nndb.report(' ndb ∘ pollingInterface')"},{"type":"function","name":"ndb.updates","enabled":true,"id":34,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.progress = ndb.progress || []\nndb.urlAPI = 'https://www.starmourn.com/api/characters/ALPHA.json'\n\nndb.retrieveAPI = function(url) {\n return $.ajax({ url: url, header: {'X-Requested-With': 'XMLHttpRequest'} }).done(function(){ ndb.progress.push(true) }).fail(function(){ ndb.progress.push(false) }) }\n\nndb.forceUpdate = function() {\n var out = []\n for (var name in _db) { out.push(name) }\n ndb.chainUpdate(out) }\n\nndb.limitUpdate = function() {\n var popts = ndb.poptions || {}\n var decay = popts.decay || 90 * 60 * 1000\n var out = []\n var now = new Date().getTime()\n var c = 0\n for (var name in _db) {\n c += 1\n var interval = now - _db[name].keyed\n if (interval > decay) { out.push(name) }\n }\n ndb.report('ndb requesting truncated update of ' + out.length + ' from ' + c + ' records.')\n ndb.chainUpdate(out) }\n\nndb.chainUpdate = function(list, suppress) {\n if (list.length <= 0) {\n if (!suppress) { ndb.report('List for API updates is empty, terminating request.') }\n return\n }\n ndb.progress = []\n \n if ($('#ndb-progress-meter').length) { $('#ndb-progress-meter').remove() }\n if (!suppress) {\n $('body').append('
x
')\n }\n var url = ndb.urlAPI\n \n var p = $.when(1)\n var dels = []\n list.forEach(function(item,index) {\n p = p.then(function() { return ndb.retrieveAPI(url.replace('ALPHA', item)) }).then( function(data) {\n // console.log(data) \n if (typeof data == 'string') { console.log(data) } else {\n // player exists\n if (!ndb.player( data.name )) { ndb.add(data.name) }\n ndb.setDBParam( data.name, 'faction', data.faction )\n ndb.setDBParam( data.name, 'prof', data.class )\n ndb.setDBParam( data.name, 'race', data.race )\n _db[data.name].keyed = new Date().getTime()\n \n ndb.setDBParam( data.name, 'age', data.age )\n ndb.setDBParam( data.name, 'level', data.level )\n ndb.setDBParam( data.name, 'captaincy', data.captaincy )\n ndb.setDBParam( data.name, 'explorer', data.explorer )\n }\n // update progress UI here\n var r = ndb.progress.length / list.length * 100\n if ($('#ndb-progress-inner').length) { $('#ndb-progress-inner').css('width', r + 'px') }\n }).catch(function(data) {\n var err = ', error is '\n if (typeof data.state == 'function') {\n var nerr = data.state()\n if (nerr == 'rejected') {\n err += ' player no longer exists. Attempting deletion.'\n dels.push(item)\n } else {\n err += nerr \n }\n } else { err = '' }\n ndb.report('Error accessing name: ' + item + err + '.') \n })\n })\n p.then(function() {\n console.log('Completion with progress at ' + ndb.progress.length + '.')\n if (!suppress) { ndb.report('ndb completed retrieval of ' + ndb.progress.length + ' records.') }\n if (dels.length > 0) {\n if (!suppress) { ndb.report('Attempting deletion of ' + dels.length + ' records.') }\n for (var i = 0; i < dels.length; i++) {\n ndb.remove(dels[i]) \n }\n }\n })\n}\n \n \nndb.report(' ndb ∘ updates complete.')"},{"type":"function","name":"ndb.qwf","enabled":true,"id":36,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.qw = ndb.qw || []\nndb.qwState = ndb.qwState || 0\n\nndb.qwStateQ = function(val) {\n if (typeof val != 'undefined') {\n ndb.qwState = val\n if (val == 0) { ndb.qw = [] }\n if (val == 1) { ndb.qw = [] }\n if (val == 3) { ndb.qwRequest() }\n }\n return ndb.qwState\n}\n\nndb.qwCapture = function(arg) {\n if (arg) { ndb.qw.push(arg) }\n return ndb.qw }\n\nndb.qwRequest = function() {\n var c = ndb.qw[0]\n c = c.trim()\n var t = c.split(',')\n var L = t[(t.length - 1)]\n t[(t.length - 1)] = L.trim().replace('and ','')\n for (var i = 0; i < t.length; i++) {\n t[i] = t[i].trim() }\n ndb.chainUpdate(t) }\n\nndb.report(' ndb ∘ qwf complete.')"},{"type":"function","name":"ndb.honorsSetup","enabled":true,"id":40,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.hstate = 0\nndb.hname = ''\nndb.hfaction = ''\nndb.hrace = ''\nndb.hgender = ''\n\nndb.honorsState = function() {\n if (ndb.hstate == 1) { ndb.hstate = 2 }\n else if (ndb.hstate == 2) { ndb.hstate = 0 }\n}\n\nndb.honorsName = function(name) {\n ndb.hstate = 1\n ndb.hfaction = ''\n ndb.hrace = ''\n ndb.hgender = ''\n ndb.hname = name\n}\n\nndb.honorsFaction = function(v) { ndb.hfaction = v }\nndb.honorsRace = function(v) { ndb.hrace = v }\nndb.honorsGender = function(v) { ndb.hgender = v }\nndb.honorsParse = function() {\n if (ndb.hstate < 2) { return }\n if (!ndb.player(ndb.hname)) { ndb.add(ndb.hname) }\n ndb.setDBParam(ndb.hname, 'faction', ndb.hfaction)\n ndb.setDBParam(ndb.hname, 'race', ndb.hrace )\n ndb.setDBParam(ndb.hname, 'gender', ndb.hgender )\n ndb.hname = ''\n ndb.hfaction = ''\n ndb.hrace = ''\n ndb.hgender = ''\n ndb.hstate = 0\n}\n\nndb.report(' ndb ∘ honorsSetup complete.')"},{"type":"function","name":"ndb.loadSequence","enabled":true,"id":27,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.report('Commencing ndb ∘ loadSequence...')\n \nif (typeof ndb.loadOptions == 'function') { ndb.loadOptions() }\nif (typeof ndb.loadDB == 'function') { ndb.loadDB() }\nif (typeof ndb.loadCoptions == 'function') { ndb.loadCoptions() }\nif (typeof ndb.loadPoptions == 'function') { ndb.loadPoptions() }\nif (typeof ndb.updateInitiate == 'function') { ndb.updateInitiate() }\n\nndb.report(' ndb ∘ loadSequence complete.')"},{"type":"function","name":"ndb.saveSequence","enabled":true,"id":33,"code":"ndb = typeof ndb != 'undefined' ? ndb : {}\n\nndb.save = function() {\n if (typeof ndb.saveOptions == 'function') { ndb.saveOptions() }\n if (typeof ndb.saveDB == 'function') { ndb.saveDB() }\n if (typeof ndb.saveCoptions == 'function') { ndb.saveCoptions() }\n if (typeof ndb.savePoptions == 'function') { ndb.savePoptions() }\n}\n\nndb.report(' ndb ∘ saveSequence complete.')"}],"actions":[]},{"type":"alias","name":"ndb","enabled":true,"id":21,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"function","fn":"ndb.utilities"},{"action":"function","fn":"ndb.styles"},{"action":"function","fn":"ndb.options"},{"action":"function","fn":"ndb.mainDB"},{"action":"function","fn":"ndb.gmcp"},{"action":"function","fn":"ndb.interface"},{"action":"function","fn":"ndb.uiFunctions"},{"action":"function","fn":"ndb.colors"},{"action":"function","fn":"ndb.pollingGlobals"},{"action":"function","fn":"ndb.polling"},{"action":"function","fn":"ndb.pollingInterface"},{"action":"function","fn":"ndb.updates"},{"action":"function","fn":"ndb.qwf"},{"action":"function","fn":"ndb.honorsSetup"},{"action":"function","fn":"ndb.saveSequence"},{"action":"function","fn":"ndb.loadSequence"}],"text":"^ndb$"},{"type":"group","name":"Aliases","enabled":true,"id":17,"items":[{"type":"alias","name":"db.xxx","enabled":true,"id":4,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var matches = arguments[0]\n\nif (typeof ndb != 'undefined') {\n ndb.interface(matches)\n}"}],"text":"^db((?:\\.)\\w+)*$"},{"type":"alias","name":"db.add/del player","enabled":true,"id":32,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var matches = arguments[0]\nvar fx = matches[1]\nvar name = matches[2]\n\nif (typeof ndb != 'undefined') {\n name = ndb.title(name)\n if (fx == 'add') {\n ndb.addPlayer(name, true)\n } else if (fx == 'del') {\n ndb.deletePlayer(name)\n }\n}"}],"text":"^db\\.(add|del)[ ]+(\\w+)$"},{"type":"alias","name":"db.Name R G B","enabled":true,"id":12,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var matches = arguments[0]\nvar name = matches[1]\nvar r = matches[2]\nvar g = matches[3]\nvar b = matches[4]\n\nif (typeof ndb != 'undefined') {\n ndb.setDBColor(name,r,g,b)\n}"}],"text":"^db\\.(\\w+)[ ]+(\\d+)[ ]+(\\d+)[ ]+(\\d+)$"},{"type":"alias","name":"dbp.xxx","enabled":true,"id":38,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var matches = arguments[0]\n\nif (typeof ndb != 'undefined') {\n ndb.pollInterface(matches)\n}"}],"text":"^dbp((?:\\.)\\w+)*([ ]+.*)*$"},{"type":"alias","name":"qwf, QW Forced","enabled":true,"id":15,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"if (typeof ndb != 'undefined') {\n ndb.qwStateQ(1)\n send_direct('qw')\n}"}],"text":"^qwf$"},{"type":"alias","name":"-h, honors","enabled":true,"id":7,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var matches = arguments[0]\n\nvar name = matches[1]\n name = ndb.title(name)\n\nsend_direct('setalias NDB++ honors ' + name, 1)\nsend_direct('NDB++')"}],"text":"^\\-h (\\w+)$"}],"actions":[]},{"type":"group","name":"Triggers","enabled":true,"id":18,"items":[{"type":"trigger","name":"match-all","enabled":true,"id":11,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"^(.*)$","actions":[{"action":"script","script":"if (typeof ndb != 'undefined') {\n ndb.sub(args[1])\n \n if (ndb.qwState == 2) {\n ndb.qwCapture(args[1])\n } else if (ndb.qwState > 2) {\n ndb.qwStateQ(0) \n }\n}"}]},{"type":"trigger","name":"QW start","enabled":true,"id":13,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"^-- Users connected to the commsphere ------------------------------------------$","actions":[{"action":"script","script":"if (typeof ndb != 'undefined') {\n if (ndb.qwState == 1) { ndb.qwStateQ(2) }\n}"}]},{"type":"trigger","name":"QW end","enabled":true,"id":14,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"^---------------------------------------------------------------[-]+ Total: (\\d+) [-]+$","actions":[{"action":"script","script":"if (typeof ndb != 'undefined') {\n if (ndb.qwState >= 1) { ndb.qwStateQ(3) }\n}"}]},{"type":"trigger","name":"setalias","enabled":true,"id":5,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"^NDB\\+\\+ will now execute\\: honors (\\w+)\\.$","actions":[{"action":"script","script":"var matches = arguments[0]\n\nif (typeof ndb != 'undefined') {\n ndb.honorsName(matches[1])\n}\n"}]},{"type":"trigger","name":"honors, race","enabled":true,"id":8,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"^Race\\:[ ]+(.*?)[ ]+Experience.*$","actions":[{"action":"script","script":"var matches = arguments[0]\nvar race = matches[1]\n\nif (typeof ndb != 'undefined') {\n ndb.honorsRace(race)\n ndb.honorsState()\n}\n"}]},{"type":"trigger","name":"honors, gender","enabled":true,"id":41,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"^Gender\\:[ ]+(.*?)[ ]+Exploration.*$","actions":[{"action":"script","script":"var matches = arguments[0]\nvar gender = matches[1]\n\nif (typeof ndb != 'undefined') {\n ndb.honorsGender(gender)\n}"}]},{"type":"trigger","name":"honors, faction","enabled":true,"id":9,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"^Faction\\:[ ]+(.*?)( \\(.*?\\))*[ ]+Captaincy","actions":[{"action":"script","script":"var matches = arguments[0]\nvar faction = matches[1]\n\nif (faction == 'The Song Dominion') { faction = 'Song' }\nif (faction == 'The Celestine Ascendancy') { faction = 'Celestine' }\n\nif (typeof ndb != 'undefined') {\n ndb.honorsFaction(faction)\n}"}]}],"actions":[]},{"type":"trigger","name":"Prompt","enabled":true,"id":10,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"^Health\\: \\d+\\/\\d+","actions":[{"action":"script","script":"if (typeof ndb != 'undefined') {\n ndb.honorsParse() \n}"}]},{"type":"trigger","name":"Quit","enabled":true,"id":42,"matching":"exact","whole_words":true,"case_sensitive":true,"text":"You settle into cold storage while the Starmourn sector awaits your return to space.","actions":[{"action":"script","script":"if (typeof ndb != 'undefined') {\n ndb.save() \n}"}]}]}