{"name":"character db","enabled":true,"description":"A character database","type":"group","id":1,"items":[{"type":"function","name":"README","enabled":true,"id":13,"code":"/*\nThis is a beta version of a characterDB (nameDB). \nIf you have questions please reach out to Voka in game.\n\nIf you do not see colourized lists in the player list\narea of the client after a few minutes of loading up\nthe game try CDB ONLOAD to reload the base system.\n\n/////////In Game Commands////////////\n\ncdb\t\t\t\t\t\t show this list in game\ncdb reload reload cdb in case something goes wrong\ncdb update update data for everyone online\ncdb citizens [city] show all users in this house\ncdb class [class] show all users of this class in the database\ncdb whois [character] show cached info on this user\ncdb house [house] show all characters in this house\ncdb stats show all visible online players per city\ncdb change [name] city [City] change a players city\ncdb change [name] city [Notes] Add a note for this player, this overwrites the last note\ncdb citycheck [name] Update a player that is hiding thier city\ncdb citycheck list\t\t\t\tList all players where the city was overridden by the above\ncdb huntwith List players from your city online that are within of your level, default is 10 levels\ncdb sparwith List players online that are within of your level, default is 10 levels\ncdb youth List players online that are under level , default is 50 levels\n\n/////////////API//////////////////////\n\nYou can use these commands in your scripts\n\ncdb_exists(name) \t\treturn if a character exists in the DB, you should call this before calling other API functions!\n\ncdb_getByName(name)\t\tget character info and add to the DB, does not return anything\ncdb_get_rank(name) \t\treturn ranking for the character\ncdb_get_city(name)\t\treturn a players city\ncdb_get_class(name)\t\treturn a players class\ncdb_get_level(name)\t\treturn a players level\ncdb_get_pk(name)\t\treturn a players kill count\ncdb_get_house(name)\t\treturn a players house\n\n//-->"},{"type":"function","name":"onLoad","enabled":true,"id":2,"code":"//Initialize variables\ncdb = {};\ncdb.characterServerList = {};\ncdb.manualCharacterServerList = {};\ncdb.city_colours = {};\ncdb.inverted_city_colours = {};\ncdb.city_list = {};\ncdb.nearby = {};\n\n//get a single person from the API and add them to the DB\ngetCharacterByURI = function(uri) {\n\t$.getJSON( uri, function( data ) {\n cdb.characterServerList[data.name] = data;\n if(cdb.manualCharacterServerList[data.name]) {\n if(cdb.manualCharacterServerList[data.name].city) {\n data.city = cdb.manualCharacterServerList[data.name].city;\n }\n }else{\n cdb.manualCharacterServerList[data.name] = {};\n }\n\t});\n loadCSS();\n};\n\ngetCharacterByName = function(name) {\n $.getJSON( \"https://api.achaea.com/characters/\" + name.toLowerCase() + \".json\", function ( data ) {\n cdb.characterServerList[data.name] = data;\n if(cdb.manualCharacterServerList[data.name]) {\n if(cdb.manualCharacterServerList[data.name].city) {\n data.city = cdb.manualCharacterServerList[data.name].city;\n }\n }else{\n cdb.manualCharacterServerList[data.name] = {};\n }\n\t});\n loadCSS();\n};\n \n\n//Get full list online and call getCharacter on each to add them to the DB\ngetCharacterServerList = function(mode) {\n\t$.getJSON( \"https://api.achaea.com/characters.json\", function( data ) {\n\t\tif(mode == \"full\") {\n\t\t\tfor ( i = 0; i < data.characters.length; i++) {\n\t\t\t\tgetCharacterByURI(data.characters[i].uri);\n\t\t\t}\n\t\t\tsetTimeout(saveDB, 2000);\n setTimeout(showDBUpdateString, 2000);\n\t\t}\n\t});\n};\n\n//update db function\nshowDBUpdateString = function() {\n display_notice(\"Character DB updated: \"+ getCharacterCount() + \" entries in database. Use CDB to view available commands.\",\"yellow\");\n}\n\n//save the DB\nsaveDB = function() {\n set_variable(\"nameDB\",cdb);\n}\n\n//Get a count of all characters in the DB\ngetCharacterCount = function() {\n\ti = 0;\n\tfor(var key in cdb.characterServerList) {\n\t\ti++;\n\t}\n\treturn i;\n};\n\n//add replaceAll function to String\nString.prototype.replaceAll = function(search, replacement) {\n var target = this;\n return target.replace(new RegExp(search, 'g'), replacement);\n};\n\n//Capitalize first letter of the string\nfixCaps = function(aword) {\n return aword.charAt(0).toUpperCase() + aword.substr(1).toLowerCase();\n}\n\nreset_online = function() {\n for(var key in cdb.characterServerList) {\n if(cdb.manualCharacterServerList[key]) {\n \tcdb.manualCharacterServerList[key].online = \"no\";\n }else{\n \tcdb.manualCharacterServerList[key] = {};\n \tcdb.manualCharacterServerList[key].online = \"no\";\n }\n \n //console.log(\"setting \" + key + \" to no\");\n } \n}\n\n//gather names from the database and apply colour to thier divs\nloadCSS = function() {\n $(\"#roomliststyles\").remove();\n var someCSS = \"\";\n for(var key in cdb.characterServerList) {\n if (cdb.characterServerList[key]) {\n\t\t\tsomeCSS = someCSS + \"#\" + cdb.characterServerList[key].name.toLowerCase() + \" { color:\" + cdb.city_colours[cdb.characterServerList[key].city] + \";} \";\n }\n\t}\n $('').appendTo('head');\n}\n\n//MUTATIONS===================================================\n\n//Check if the list in who's online is updated and if so apply city colours\n\nloadMutations = function () {\n var mutationObserver = new MutationObserver(function(mutations) {\n mutations.forEach(function(mutation) {\n if(mutation.addedNodes[0]) {\n name = mutation.addedNodes[0].innerText;\n if (cdb.characterServerList[name]) {\n city = cdb.characterServerList[name].city;\n mutation.addedNodes[0].style = \"padding: 2px 5px; cursor:pointer; color:\" + cdb.city_colours[city];\n } else {\n getCharacterByName(name.toLowerCase());\n }\n }\n });\n });\n\n mutationObserver.observe($(\"#div_who_players\")[0], {\n characterData: true,\n childList: true,\n subtree: true,\n });\n}\n\n//END MUTATIONS===================================================\n\n//API=============================================================\n\n//return if a character exists in the DB\n\ncdb_exists = function(name) {\n if (cdb.characterServerList[fixCaps(name)]) {\n return true;\n }else{\n return false;\n }\n}\n\n//get character info and add to the DB, does not return anything\ncdb_getByName = function(name) {\n getCharacterByName(name);\n}\n\n//return ranking for the character\ncdb_get_rank = function(name) {\n return cdb.characterServerList[fixCaps(name)].xp_rank; \n}\n\n//return players city\ncdb_get_city = function(name) {\n return cdb.characterServerList[fixCaps(name)].city; \n}\n\n//return players class\ncdb_get_class = function(name) {\n return cdb.characterServerList[fixCaps(name)].class; \n}\n\n//return players level\ncdb_get_level = function(name) {\n return cdb.characterServerList[fixCaps(name)].level; \n}\n\n//return PK count\ncdb_get_pk = function(name) {\n return cdb.characterServerList[fixCaps(name)].player_kills; \n}\n\n//return house\ncdb_get_house = function(name) {\n return cdb.characterServerList[fixCaps(name)].house; \n}\n\n//END API=========================================================\n\n//ONLOAD stuff\n\n//load DB if it exists, otherwise create a new one\nif(get_variable(\"nameDB\")) {\n\tcdb = get_variable(\"nameDB\");\n getCharacterServerList(\"full\");\n setTimeout(loadCSS, 2000);\n setTimeout(loadMutations, 20000);\n} else {\n cdb.city_colours = {\"cyrene\":\"#008080\",\"targossas\":\"#ffffff\",\"eleusis\":\"#00ff00\",\"mhaldor\":\"#ff0000\",\"hashan\":\"#808000\",\"ashtan\":\"#800080\",\"(none)\":\"#c0c0c0\",\"(hidden)\":\"#c0c0c0\"};\n cdb.inverted_city_colours = { \"#008080\": \"cyrene\", \"#ffffff\": \"targossas\", \"#00ff00\": \"eleusis\", \"#ff0000\": \"mhaldor\", \"#808000\": \"hashan\", \"#800080\": \"ashtan\", \"#c0c0c0\": \"(hidden)\" };\n cdb.city_list = [\"cyrene\",\"targossas\",\"eleusis\",\"mhaldor\",\"hashan\",\"ashtan\"];\n getCharacterServerList(\"full\");\n setTimeout(loadCSS, 2000);\n setTimeout(loadMutations, 20000);\n}"},{"type":"function","name":"onGMCP","enabled":true,"id":11,"code":"if (args.gmcp_method == \"Comm.Channel.Players\"){\n reset_online();\n for ( i = 0; i < args.gmcp_args.length; i++) {\n try {\n if(cdb.manualCharacterServerList[args.gmcp_args[i].name]) {\n cdb.manualCharacterServerList[args.gmcp_args[i].name].online = \"yes\";\n cdb.manualCharacterServerList[args.gmcp_args[i].name].lastSeen = new Date().toJSON().slice(0,10).replace(/-/g,'/');\n }else{\n cdb.manualCharacterServerList[args.gmcp_args[i].name] = {};\n cdb.manualCharacterServerList[args.gmcp_args[i].name].online = \"yes\";\n cdb.manualCharacterServerList[args.gmcp_args[i].name].lastSeen = new Date().toJSON().slice(0,10).replace(/-/g,'/');\n }\n } catch(err) {\n console.log(err.message);\n console.log(args.gmcp_args[i].name);\n }\n }\n setTimeout(saveDB, 800);\n}\n\nif (args.gmcp_method == \"Char.Status\"){\n if(args.gmcp_args.level) {\n\t\tcdb.mylevel = args.gmcp_args.level.split(\" \")[0];\n }\n if(args.gmcp_args.city) {\n \tcdb.mycity = args.gmcp_args.city.split(\" \")[0];;\n }\n}"},{"type":"alias","name":"","enabled":true,"id":12,"matching":"exact","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"ow_Write(\"#output_main\",\"
cdb ---------------------------- Print this list of commands
\");\now_Write(\"#output_main\",\"
cdb change [name] city [City] -- Change a players city. Use the CITYCHECK as its easier
\");\now_Write(\"#output_main\",\"
cdb change [name] notes [note] - Add a note for this player, this overwrites the last note
\");\now_Write(\"#output_main\",\"
cdb citizens [city] ------------ Show online and offline players in this city
\");\now_Write(\"#output_main\",\"
cdb citycheck [name] ----------- Update a player that is hiding thier city
\");\now_Write(\"#output_main\",\"
cdb citycheck list ------------- List all players where the city was overridden by the above
\");\now_Write(\"#output_main\",\"
cdb class [class] -------------- Show online and offline players of this class in the database
\");\now_Write(\"#output_main\",\"
cdb house [house] -------------- Show online and offline players in this house
\");\now_Write(\"#output_main\",\"
cdb houses --------------------- Show online players in each house
\");\now_Write(\"#output_main\",\"
cdb huntwith <range> ----------- List players from your city online that are within <range> of your level, default is 10 levels
\");\now_Write(\"#output_main\",\"
cdb reload --------------------- Reload cdb in case something goes wrong
\");\now_Write(\"#output_main\",\"
cdb sparwith <range> ----------- List players online that are within <range> of your level, default is 10 levels
\");\now_Write(\"#output_main\",\"
cdb stats ---------------------- Show all visible online players per city
\");\now_Write(\"#output_main\",\"
cdb update --------------------- Update data for everyone online
\");\now_Write(\"#output_main\",\"
cdb whois [character] ---------- Show cached info on this user
\");\now_Write(\"#output_main\",\"
cdb youth <range> -------------- List players online that are under level <range>, default is 50 levels
\");\now_Write(\"#output_main\",\"
\");"}],"text":"cdb"},{"type":"alias","name":"cdb change player","enabled":true,"id":14,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"//cdb change (name) (city|notes) (City)\n\nname = fixCaps(args[1]);\n\nif(cdb.characterServerList[fixCaps(args[1])]) {\n switch(args[2].toLowerCase()) { \n case \"city\":\n \t\t\tif(cdb.city_list.includes(args[3].toLowerCase())) {\n \tcdb.characterServerList[fixCaps(args[1])].city = args[3].toLowerCase();\n if(cdb.manualCharacterServerList[name]) {\n cdb.manualCharacterServerList[name].city = args[3].toLowerCase();\n }else{\n cdb.manualCharacterServerList[name] = {};\n cdb.manualCharacterServerList[name].city = args[3].toLowerCase();\n }\n loadCSS();\n //$('').appendTo('head');\n } else {\n display_notice(\"Invalid city. Use Cyrene, Targossas, Eleusis, Mhaldor, Hashan or Ashtan.\");\n }\n \tdisplay_notice(\"City updated for \" + name + \".\",\"yellow\");\n break;\n \tcase \"notes\":\n \tcdb.manualCharacterServerList[name].notes = args[3]\n \tdisplay_notice(\"Notes updated for \" + name + \".\",\"yellow\");\n \tbreak;\n }\n}"}],"text":"^cdb change (\\w+) (\\w+) (.*)$"},{"type":"alias","name":"cdb citizens","enabled":true,"id":6,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var findInCity = args[1].toLowerCase();\nvar inCityOnline = \"\";\nvar inCityOffline = \"\";\nvar i = 0;\n\nif(findInCity == \"none\")\n findInCity = \"(none)\";\nif(findInCity == \"hidden\")\n findInCity = \"(hidden)\";\n\nfor(var key in cdb.characterServerList) {\n if(cdb.characterServerList[key].city == findInCity) {\n if(cdb.manualCharacterServerList[key].online == \"yes\") {\n inCityOnline = inCityOnline + \", \" + cdb.characterServerList[key].name;\n }else{\n \tinCityOffline = inCityOffline + \", \" + cdb.characterServerList[key].name;\n }\n i++;\n }\n}\n\nif(inCityOnline.length + inCityOffline.length == 0) {\n display_notice(\"Noone found in \" + findInCity + \".\",\"yellow\");\n} else {\n ow_Write(\"#output_main\",\"

\" + Array(findInCity.length + i.toString().length + 4).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\"+fixCaps(findInCity)+\" - \" + i + \"
\");\n ow_Write(\"#output_main\",\"
\" + Array(findInCity.length + i.toString().length + 4).join(\"=\") + \"
\");\n if(inCityOnline.length > 0) {\n \tow_Write(\"#output_main\",\"
Online: \" + inCityOnline.substr(2) + \"

\");\n }\n if(inCityOffline.length > 0) {\n \tow_Write(\"#output_main\",\"
Offline: \" + inCityOffline.substr(2) + \"

\");\n }\n}"}],"text":"cdb citizens (.*)"},{"type":"alias","name":"cdb citycheck","enabled":true,"id":21,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"if(fixCaps(args[1]) == \"List\") {\n var cityList = \"\";\n for(var key in cdb.manualCharacterServerList) {\n if(cdb.manualCharacterServerList[key].city) {\n cityList = cityList + \", \" + key;\n }\n }\n display_notice(\"Manual entries for city: \" + cityList.substring(2),\"yellow\");\n}else{\n cdb.honourcheck = fixCaps(args[1]);\n if(cdb.characterServerList[cdb.honourcheck].city == \"(hidden)\" || cdb.manualCharacterServerList[cdb.honourcheck].city){\n reflex_enable(reflex_find_by_name(\"trigger\", \"honours checker\", true, false, \"Character db\"));\n send_command(\"honours \"+args[1], 1)\n }else{\n display_notice(cdb.honourcheck + \" is not hidden, no need to check this\",\"yellow\");\n }\n}"}],"text":"cdb citycheck (.*)"},{"type":"alias","name":"cdb class","enabled":true,"id":7,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var findInClass = args[1].toLowerCase();\n\nvar inClassOffline = \"\";\nvar inClassOnline = \"\";\nvar i = 0;\n\nfor(var key in cdb.characterServerList) {\n if(cdb.characterServerList[key].class == findInClass) {\n if(cdb.manualCharacterServerList[key].online == \"yes\") {\n \tinClassOnline = inClassOnline + \", \" + key + \"(\"+cdb.characterServerList[key].level+\")\";\n }else{\n \tinClassOffline = inClassOffline + \", \" + key + \"(\"+cdb.characterServerList[key].level+\")\";\n }\n i++;\n }\n}\n\nif (inClassOffline.length + inClassOnline.length == 0) {\n display_notice(\"Noone found in \" + findInClass + \" check your spelling.\",\"yellow\");\n} else {\n ow_Write(\"#output_main\",\"

\" + Array(findInClass.length + i.toString().length + 4).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\"+fixCaps(findInClass)+\" - \" + i + \"
\");\n ow_Write(\"#output_main\",\"
\" + Array(findInClass.length + i.toString().length + 4).join(\"=\") + \"
\");\n if(inClassOnline.length > 0) {\n\t\tow_Write(\"#output_main\",\"
Online: \" + inClassOnline.substr(2) + \"

\");\n }\n if(inClassOffline.length > 0) {\n\t\tow_Write(\"#output_main\",\"
Offline: \" + inClassOffline.substr(2) + \"

\");\n }\n}"}],"text":"cdb class (.*)"},{"type":"alias","name":"cdb house","enabled":true,"id":9,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var findInHouse = args[1].toLowerCase();\n\nvar inHouseOnline = \"\";\nvar inHouseOffline = \"\";\nvar i = 0;\n\nfor(var key in cdb.characterServerList) { \n if(cdb.characterServerList[key].house == findInHouse) {\n if(cdb.manualCharacterServerList[key].online == \"yes\") {\n \tinHouseOnline = inHouseOnline + \", \" + key + \"(\"+cdb.characterServerList[key].level+\")\";\n }else{\n inHouseOffline = inHouseOffline + \", \" + key + \"(\"+cdb.characterServerList[key].level+\")\";\n }\n i++;\n }\n}\n\nif (inHouseOnline.length + inHouseOffline.length == 0) {\n display_notice(\"Noone found in \" + findInHouse + \" check your spelling.\",\"yellow\");\n} else {\n ow_Write(\"#output_main\",\"

\" + Array(findInHouse.length + i.toString().length + 4).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\"+fixCaps(findInHouse)+\" - \" + i + \"
\");\n ow_Write(\"#output_main\",\"
\" + Array(findInHouse.length + i.toString().length + 4).join(\"=\") + \"
\");\n if(inHouseOnline.length > 0) {\n \tow_Write(\"#output_main\",\"
Online: \" + inHouseOnline.substr(2) + \"

\");\n }\n if(inHouseOffline.length > 0) {\n \tow_Write(\"#output_main\",\"
Offline: \" + inHouseOffline.substr(2) + \"

\");\n }\n}"}],"text":"cdb house (.*)"},{"type":"alias","name":"","enabled":true,"id":16,"matching":"begins","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var houses = [];\nvar i = 0;\n\nfor(var key in cdb.characterServerList) {\n if(cdb.characterServerList[key].house) {\n\t\thouses.push(cdb.characterServerList[key].house);\n \ti++;\n\t}\n}\nhouses = [...new Set(houses)];\n\nhouses.forEach(function(element) {\n \tvar inHouse = \"\";\n\tvar i = 0;\n $(\"tr#cdbhouserow\").last().append(\"\"+element+\"\");\n\n\tfor(var key in cdb.characterServerList) {\n \tif(cdb.characterServerList[key].house == element && cdb.manualCharacterServerList[key].online == \"yes\") {\n \tinHouse = inHouse + \", \" + key + \"(\"+cdb.characterServerList[key].level+\")\";\n i++;\n \t}\n\t}\n \n ow_Write(\"#output_main\",\"

\" + Array(element.length + i.toString().length + 4).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\"+fixCaps(element)+\" - \" + i + \"
\");\n ow_Write(\"#output_main\",\"
\" + Array(element.length + i.toString().length + 4).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\" + inHouse.substr(2) + \"
\");\n});"}],"text":"cdb houses"},{"type":"alias","name":"cdb huntwith","enabled":true,"id":18,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var findInCity = cdb.mycity.toLowerCase();\n\nif(args[2]) {\n var inRange = Number(args[2]);\n}else{\n var inRange = 10;\n}\n\nvar inCity = \"\";\nvar i = 0;\n\nfor(var key in cdb.characterServerList) {\n if(cdb.characterServerList[key].city == findInCity && cdb.manualCharacterServerList[key].online == \"yes\") {\n if(cdb.characterServerList[key].city == findInCity && Number(cdb.characterServerList[key].level) >= Number(cdb.mylevel) - inRange && Number(cdb.characterServerList[key].level) <= Number(cdb.mylevel) + inRange) {\n \tinCity = inCity + \", \" + key + \"(\"+cdb.characterServerList[key].level+\") \";\n i++;\n \t}\n }\n}\n\nif (inCity.length == 0) {\n display_notice(\"Noone found in \" + findInCity + \" check your spelling.\",\"yellow\");\n} else {\n ow_Write(\"#output_main\",\"

\" + Array(findInCity.length + i.toString().length + 4).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\"+fixCaps(findInCity)+\" - \" + i + \"
\");\n ow_Write(\"#output_main\",\"
\" + Array(findInCity.length + i.toString().length + 4).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\" + inCity.substring(2) + \"
\");\n}"}],"text":"^(cdb huntwith$|cdb huntwith (.*)$)"},{"type":"alias","name":"","enabled":true,"id":4,"matching":"begins","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"function","fn":"onLoad"}],"text":"cdb reload"},{"type":"alias","name":"cdb sparwith","enabled":true,"id":19,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var findInCity = cdb.mycity.toLowerCase();\n\nif(args[2]) {\n var inRange = Number(args[2]);\n}else{\n var inRange = 10;\n}\n\nvar inCity = \"\";\nvar i = 0;\n\nfor(var key in cdb.characterServerList) {\n if(cdb.manualCharacterServerList[key].online == \"yes\") {\n if(Number(cdb.characterServerList[key].level) >= Number(cdb.mylevel) - inRange && Number(cdb.characterServerList[key].level) <= Number(cdb.mylevel) + inRange) {\n \tinCity = inCity + \", \" + key + \"(\"+cdb.characterServerList[key].level+\")\";\n i++;\n \t}\n }\n}\n\nif (inCity.length == 0) {\n display_notice(\"Noone found within \"+inRange+\" levels of you.\",\"yellow\");\n} else {\n ow_Write(\"#output_main\",\"

\" + Array(14).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
Sparing - \" + i + \"
\");\n ow_Write(\"#output_main\",\"
\" + Array(14).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\" + inCity.substring(2) + \"
\");\n}"}],"text":"^(cdb sparwith$|cdb sparwith (.*)$)"},{"type":"alias","name":"cdb stats","enabled":true,"id":10,"matching":"begins","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var cities = [];\nvar i = 0;\n\nfor(var key in cdb.characterServerList) {\n if(cdb.characterServerList[key].city) {\n\t\tcities.push(cdb.characterServerList[key].city);\n \ti++;\n\t}\n}\ncities = [...new Set(cities)];\n\ncities.forEach(function(element) {\n \tvar inCity = \"\";\n\tvar i = 0;\n\n\tfor(var key in cdb.characterServerList) {\n \tif(cdb.characterServerList[key].city == element && cdb.manualCharacterServerList[key].online == \"yes\") {\n \tinCity = inCity + \", \" + cdb.characterServerList[key].name + \"(\"+cdb.characterServerList[key].level+\") \";;\n i++;\n \t}\n\t}\n \n if(inCity.length > 0) {\n ow_Write(\"#output_main\",\"

\" + Array(element.length + i.toString().length + 4).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\"+fixCaps(element)+\" - \" + i + \"
\");\n ow_Write(\"#output_main\",\"
\" + Array(element.length + i.toString().length + 4).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\" + inCity.substr(2) + \"
\");\n }\n});"}],"text":"cdb stats"},{"type":"alias","name":"cdb update","enabled":true,"id":3,"matching":"begins","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"//getCharacterServerList(\"full\");\ni = 0;\nfor(var key in cdb.characterServerList) {\n getCharacterByName(cdb.characterServerList[key].name);\n i++;\n}\ndisplay_notice(\"Updated \" + i + \" players.\",\"yellow\");"}],"text":"cdb update"},{"type":"alias","name":"cdb whois","enabled":true,"id":8,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"var name = \"\"+fixCaps(args[1]);\n\nif(cdb.characterServerList[name]) {\n\n var fullName = cdb.characterServerList[name].fullname;\n\tvar city = cdb.characterServerList[name].city;\n\tvar aclass = cdb.characterServerList[name].class;\n\tvar house = cdb.characterServerList[name].house;\n\tvar level = cdb.characterServerList[name].level;\n\tvar rank = cdb.characterServerList[name].xp_rank;\n\tvar player_kills = cdb.characterServerList[name].player_kills;\n\tvar is_online = cdb.manualCharacterServerList[name].online;\n\n ow_Write(\"#output_main\",\"

\" + Array(fullName.length + 1).join(\"=\") + \"
\");\n\tow_Write(\"#output_main\",\"
\"+fullName+\"
\");\n ow_Write(\"#output_main\",\"
\" + Array(fullName.length + 1).join(\"=\") + \"
\");\n\tow_Write(\"#output_main\",\"
City: \" + fixCaps(city) + \"Level: \" + Array(8).join(\" \") + level + \"
\");\n\tow_Write(\"#output_main\",\"
Class: \" + fixCaps(aclass) + \"Rank: \" + Array(9).join(\" \") + rank + \"
\");\n\tow_Write(\"#output_main\",\"
House: \" + fixCaps(house) + \"Player Kills: \" + player_kills + \"
\");\n if (cdb.manualCharacterServerList[name]) {\n ow_Write(\"#output_main\",\"
Last Seen: \" + cdb.manualCharacterServerList[name].lastSeen + \"Online: \" + Array(7).join(\" \") + is_online + \"
\");\n }\n if (cdb.manualCharacterServerList[name].notes) {\n ow_Write(\"#output_main\",\"
Notes: \" + cdb.manualCharacterServerList[name].notes + \"
\");\n }\n ow_Write(\"#output_main\",\"
\");\n}else{\n display_notice(\"No \" + name + \" in DB, fetching try again in 1 second\",\"yellow\")\n getCharacterByName(name);\n}"}],"text":"cdb whois (.*)"},{"type":"alias","name":"cdb youth","enabled":true,"id":22,"matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"script","script":"if(args[2]) {\n var inRange = Number(args[2]);\n}else{\n var inRange = 50;\n}\n\nvar inCity = \"\";\nvar i = 0;\n\nfor(var key in cdb.characterServerList) {\n if(cdb.manualCharacterServerList[key].online == \"yes\") {\n if(Number(cdb.characterServerList[key].level) <= inRange) {\n \tinCity = inCity + \"\" + key + \"(\"+cdb.characterServerList[key].level+\") \"+cdb.characterServerList[key].class+\" \"+cdb.characterServerList[key].city+\"\";\n i++;\n \t}\n }\n}\n\nif (inCity.length == 0) {\n display_notice(\"Noone found online under level \"+inRange+\".\",\"yellow\");\n} else {\n ow_Write(\"#output_main\",\"

\" + Array(12).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
Youths - \" + i + \"
\");\n ow_Write(\"#output_main\",\"
\" + Array(12).join(\"=\") + \"
\");\n ow_Write(\"#output_main\",\"
\" + inCity + \"
\");\n}"}],"text":"^(cdb youth$|cdb youth (.*)$)"},{"type":"trigger","name":"honours checker","enabled":false,"id":20,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"(^(?:H|Sh)e is ([0-9]*) years old,(.*)|(?:His|Her) date of birth is hidden by the sand of Aeon\\.|(?:He|She) was born before the fall of the Seleucarian Empire\\.)","actions":[{"action":"wait","seconds":"0","milliseconds":"200"},{"action":"script","script":"//Get div that the honours is all in\nvar whoisdiv = $(\"div.output div div:contains('\"+args[0]+\"')\").last().parent().children();\n\n//Get City from the Div\nvar city = \"none\"\nvar honoursLength = whoisdiv.length -2, i = 0;\nvar cityreg = /^(?:She|He) is an? (\\w+) in (\\w+)\\.$/gm\nfor (; i < honoursLength; i++) {\n var arr = cityreg.exec(whoisdiv[i].innerText);\n if (arr) {\n city = arr[2];\n } \n}\n\nif(city == \"none\")\n city = \"(none)\";\ndisplay_notice(\"Setting \" + cdb.honourcheck + \"'s city to \" + city,\"yellow\");\ncdb.manualCharacterServerList[cdb.honourcheck].city = city.toLowerCase();\ncdb.characterServerList[cdb.honourcheck].city = city.toLowerCase();\n\nreflex_disable(reflex_find_by_name(\"trigger\", \"honours checker\", true, false, \"Character db\"));\nloadCSS();\nsaveDB();"}]},{"type":"trigger","name":"angel presences","enabled":true,"id":15,"matching":"regexp","whole_words":true,"case_sensitive":true,"text":"(Your guardian angel senses (\\w+)) at (.*)\\.","actions":[{"action":"gag"},{"action":"script","script":"var output = $(\"div.line div:contains('\"+args[1]+\"')\").last();\nif(cdb.characterServerList[args[2]]) {\n\tvar acolour = cdb.city_colours[cdb.characterServerList[args[2]].city];\n} else {\n cdb_getByName(args[2]);\n var acolour = \"grey\";\n}\n\naline = \"Your guardian angel senses \"+args[2]+\" at \" + args[3];\now_Write(\"#output_main\",\"
\"+aline+\"
\");"}]}]}