// ==UserScript== // @name TW Village Alias // @version 04122009-3 // @author Lekensteyn // @namespace http://home.deds.nl/~lekensteyn/p/ // @description Adds an alternative name for a village // @include http://*.tribalwars.*/game.php* // @include http://*.die-staemme.de/game.php* // ==/UserScript== /** * TEST VERSION ONLY * Tested by: Spartacus II * This version is not intended for production systems. * Project start: 02102009 * Release: 17/10/2009 * Public release date: 31/10/2009 * Use at own risk, this is a BETA version * Using Opera with GM_* simulating with cookie is NOT recommended * Created by Lekensteyn. Original code by Lekensteyn. * Currently I'm not looking for testers. */ var panelPos = { TOPLEFT: ['top', 'left'], TOPRIGHT: ['top', 'right'], BOTTOMRIGHT: ['bottom', 'right'], BOTTOMLEFT: ['bottom', 'left'] }; var mainCssText = [ '.lkn_alias_main{', ' z-index: 10;', ' position: fixed;', //' top: 0px;', //' left: 0px;', ' background-color: #FBF4DD;', ' border: 1px solid #804000;', '}', '.lkn_aliasbtn{', ' background-color: inherit;', ' border: 1px solid brown;', ' min-height: 10px;', ' cursor: pointer;', '}', '.lkn_alias_cpco{', ' width: 300px;', ' clear: both;', '}', '#lkn_alias_mapVillageName{', ' border: 1px solid #997733', '}' ]; var defaults = { villagesThreshold: 100 }; var server = location.host.match(/([a-z]{2})(s?)(\d+)/); if(!server) server = ['', 'nl', '', '6']; var lang = server[1]; var speed = server[2] == 's'; var world = server[3]; server = server[0]; var gameScreen = location.href.match(/[&?]screen=(.+?)(&|$)/i); gameScreen = gameScreen ? gameScreen[1] : ''; var mode = location.href.match(/[&?]mode=(.+?)(&|$)/i); mode = mode ? mode[1] : ''; var lp = {}; lp.en = { ALIAS: 'Alias', DEFAULTALIAS: 'Untitled', CHANGEALIAS: 'Enter an alias for the village.', ALIASCHANGER: 'Change alias', CURRENTVILLAGE: 'Current village', LOOKUPVILLAGE: 'Lookup village', PROMPTVILLAGE: 'Village ID (village=xxx) or coords (XXX|YYY)', VILLAGE: 'Village', VILLAGEID: 'Village ID', INVALIDVID: 'Invalid village.', NOALIASVID: 'No alias available.', SETTINGS: 'Settings', SETTHRESHOLD: 'Set limit', SETTHRESHOLDQ: 'If this number is exceeded, aliases won\'t be added automatically.\nEnter 0 to avoid auto adding aliases.', NEWTHRESHOLD: 'Do you want to change the limit from %1 to %2?', INVALIDTHRESHOLD: 'Invalid limit!', SHOWALIAS: 'Show aliases', QUICKHIDE: 'Quick remove of aliases', VILLAGENOTFOUND: 'Village does not exist.', CONTINENT: 'K', PANELPOS: 'Panel position', TOPLEFT: 'Top left', TOPRIGHT: 'Top right', BOTTOMRIGHT: 'Bottom right', BOTTOMLEFT: 'Bottom left' }; lp.nl = { ALIAS: 'Alias', DEFAULTALIAS: 'Naamloos', CHANGEALIAS: 'Voer een alias in voor het dorp.', ALIASCHANGER: 'Wijzig alias', CURRENTVILLAGE: 'Huidig dorp', LOOKUPVILLAGE: 'Dorp opzoeken', PROMPTVILLAGE: 'DorpsID (village=xxx) of co\xf6rdinaten (XXX|YYY)', VILLAGE: 'Dorp', VILLAGEID: 'DorpsID', INVALIDVID: 'Ongeldig dorp', NOALIASVID: 'Geen alias bekend.', SETTINGS: 'Instellingen', SETTHRESHOLD: 'Stel limiet in', SETTHRESHOLDQ: 'Indien dit aantal wordt overschreden zullen aliassen niet automatisch toegevoegd worden.\nGeef 0 op als je het automatisch toevoegen van aliassen wilt uitschakelen.', NEWTHRESHOLD: 'Wil je het limiet van %1 naar %2 veranderen?', INVALIDTHRESHOLD: 'Ongeldige waarde!', SHOWALIAS: 'Weergeef aliases', QUICKHIDE: 'Snelle verwijdering van aliassen', VILLAGENOTFOUND: 'Dorp bestaat niet.', CONTINENT: 'C', PANELPOS: 'Paneel positie', TOPLEFT: 'Linksboven', TOPRIGHT: 'Rechtsboven', BOTTOMRIGHT: 'Rechtsonder', BOTTOMLEFT: 'Linksonder' }; var lg = lp[lang] ? lp[lang] : lp.en; function save(name, value){ GM_setValue(name, value); } function load(name, defaultV){ return GM_getValue(name, defaultV); } main: { var currentVillage = document.links; if(!(currentVillage=currentVillage[0]) || (currentVillage=currentVillage.href).indexOf('logout') == -1) break main; var css = document.createElement('style'); css.type = 'text/css'; css.textContent = mainCssText.join('\n'); document.body.appendChild(css); var quickHide = document.createElement('style'); quickHide.type = 'text/css'; quickHide.textContent = '.lkn_alias{'+ ' display: none !important;'+ '}'; document.body.appendChild(quickHide); quickHide.disabled = true; var villageRE = /^\s*(.+?)\s+\((\d{1,3}\|\d{1,3})\) .\d{1,2}\s*$/; var villageIdRE = /village=(\d+)/; var nextUId = 0; currentVillage = currentVillage.match(/village=(\d+)/)[1]; var vi = document.getElementById('menu_row2').getElementsByTagName('a'); var villageName = ''; var villageXY = document.getElementById('menu_row2').getElementsByTagName('b')[0].textContent.match(/\d{1,3}\|\d{1,3}/)[0]; var cacheVillage = {}; var cacheID = {}; function cacheV(vid, xy, vn){ cacheVillage[xy] = [vid, vn]; cacheID[vid] = [xy, vn]; } for(var i=0; i[^<]+<\/td>(\d{1,3}\|\d{1,3})<\/td><\/tr>/); xy = xy ? xy[1] : ''; vn = X.responseText.match(/([^<]+)<\/th>/); if(xy != '' && vn){ cacheV(vid, xy, vn[1]); } else xy = ''; } catch(e){ xy = ''; } return xy; } function findVillage(q){ switch(typeof q){ case 'string': break; case 'number': q = ''+q; break; default: return ''; } var f, vid, vn, xy, al; if((f=q.match(/(\d{1,3})\|(\d{1,3})/)) != null){ f = findVByXY(f[1], f[2]); } else if((f=q.match(/village=(\d+)/)) != null || (f=q.match(/^(\d+)$/)) != null){ f = findXYByV(f[1]); } else return lg.INVALIDVID; if(f == '') return lg.VILLAGENOTFOUND; if(f.indexOf('|') == -1){ vid = f; f = cacheID[vid]; xy = f[0]; } else{ xy = f; f = cacheVillage[xy]; vid = f[0]; } vn = f[1]; al = getAlias(vid, ''); return [vid, xy, vn, al]; } function xy2c(c){ c = c.split('|'); return 10*Math.floor(c[1]/100) + Math.floor(c[0]/100); } function getAlias(vid, vn){ return load(server+'_'+vid, typeof vn=='string'?vn:lg.DEFAULTALIAS); } function setAlias(vid, vn){ if(vn == ''){ return GM_deleteValue(server+'_'+vid); } return save(server+'_'+vid, vn); } function changeAlias(vid, vn){ return function(){ var cv = getAlias(vid, vn); var ex = findVillage(vid); ex = ex ? '\n'+lg.VILLAGE+': '+ex[2]+' ('+ex[1]+') '+lg.CONTINENT+xy2c(ex[1]) : ''; var va = prompt(lg.CHANGEALIAS+ex, cv); if(va != null){ setAlias(vid, cv=va); if(va == '') cv = lg.DEFAULTALIAS; var vs = document.getElementsByName('lkn_alias-v'+vid); for(var i=0; i 1){ for(var i=1; i 0){ var th = document.createElement('th'); th.className = 'lkn_alias'; th.innerHTML = lg.ALIAS; var sb = document.createElement('button'); var arrUp = '\u2191'; var arrDown = '\u2193'; var arrUns = '\u2022'; sb.textContent = arrUns; sb.addEventListener('click', function(){ var desc = this.textContent == arrUp || this.textContent == arrUns; sortTable(tbl, function(x, y){ var x1 = x.getElementsByClassName('lkn_aliasbtn')[0].textContent; var y1 = y.getElementsByClassName('lkn_aliasbtn')[0].textContent; return x1.localeCompare(y1); }, function(r){ return r.getElementsByClassName('lkn_aliasbtn')[0].textContent == lg.DEFAULTALIAS; }, !desc); this.textContent = desc ? arrDown : arrUp; }, false); th.appendChild(sb); rows[0].insertBefore(th, rows[0].cells[cn+1]); } for(var i=si; i=0; i--){ a[i].parentNode.removeChild(a[i]); } } try{ document.getElementById('lkn_alias_toggler').checked = t; }catch(e){} } var panel; function expandPanel(ex){ var x = document.getElementById('lkn_alias_expander'); if(typeof ex != 'boolean') ex = x.textContent == '\xab'; else ex = !ex; document.getElementById('lkn_alias_paco').style.display = ex ? 'none' : 'block'; x.textContent = ex ? '\xbb' : '\xab'; } function getPanel(){ if(panel) return panel; panel = document.createElement('div'); panel.className = 'lkn_alias_main'; var br = document.createElement('br'); var btnLarge = document.createElement('button'); btnLarge.id = 'lkn_alias_expander'; btnLarge.textContent = '\xbb'; btnLarge.style.cssFloat = 'left'; btnLarge.addEventListener('click', expandPanel, false); panel.appendChild(btnLarge); var ab = aliasButton(currentVillage); ab.style.cssFloat = 'left'; panel.appendChild(ab); var mp = document.createElement('div'); mp.id = 'lkn_alias_paco'; mp.className = 'lkn_alias_cpco'; mp.style.display = 'none'; mp.appendChild(document.createTextNode(lg.CURRENTVILLAGE+': '+villageName+' ('+villageXY+') '+lg.CONTINENT+xy2c(villageXY))); mp.appendChild(br.cloneNode(false)); var lu = document.createElement('button'); lu.textContent = lg.LOOKUPVILLAGE; lu.addEventListener('click', function(){ var r = prompt(lg.PROMPTVILLAGE, ''); if(r != null && (r=findVillage(r))){ if(typeof r == 'string') alert(r); else{ alert(lg.VILLAGE+': '+r[2]+' ('+r[1]+') '+lg.CONTINENT+xy2c(r[1])+'\n'+ lg.VILLAGEID+': '+r[0]+'\n'+ (r[3]?lg.ALIAS+': '+r[3]:lg.NOALIASVID)); } } }, false); mp.appendChild(lu); var cfd = document.createElement('div'); cfd.id = 'lkn_alias_mapVillageName'; var cf = document.createElement('input'); cf.type = 'text'; cf.id = 'lkn_alias_coordfield'; cf.size = 8; cf.addEventListener('keydown', function(e){ if(e.keyCode == 13) this.nextSibling.click(); }, false); cfd.appendChild(cf); var ca = document.createElement('button'); ca.textContent = lg.ALIASCHANGER; ca.addEventListener('click', function(){ var r = findVillage(document.getElementById('lkn_alias_coordfield').value); if(r){ if(typeof r == 'string') alert(r); else{ changeAlias(r[0], r[2])(); } } }, false); cfd.appendChild(ca); mp.appendChild(cfd); var sh = document.createElement('h5'); sh.appendChild(document.createTextNode(lg.SETTINGS+' >')); sh.style.margin = '1px 2px'; sh.addEventListener('click', function(){ var so = this.nextSibling.style; so.display = so.display == 'block' ? 'none' : 'block'; }, false); mp.appendChild(sh); var se = document.createElement('div'); se.style.cssText = 'border-left: 2px solid black; margin-left: 3px; display: none;'; mp.appendChild(se); var tb = document.createElement('button'); tb.appendChild(document.createTextNode(lg.SETTHRESHOLD)); tb.addEventListener('click', function(){ var ot = load('pref_limitvillages', defaults.villagesThreshold); var th = prompt(lg.SETTHRESHOLDQ, ot); if(th != null){ var nt = parseInt(th, 10); if(isNaN(nt)) alert(lg.INVALIDTHRESHOLD); else if(th == nt || confirm(lg.NEWTHRESHOLD.replace(/%1/g, ot).replace(/%2/g, nt))){ save('pref_limitvillages', nt); if(!document.getElementsByClassName('lkn_alias').length) adder(); } } }, false); se.appendChild(tb); var lb = document.createElement('label'); lb.style.display = 'block'; var cb = document.createElement('input'); cb.type = 'checkbox'; cb.addEventListener('click', function(){ toggleAVis(this.checked); }, false); cb.id = 'lkn_alias_toggler'; cb.checked = document.getElementsByClassName('lkn_alias').length > 0; lb.appendChild(cb); lb.appendChild(document.createTextNode(lg.SHOWALIAS)); se.appendChild(lb); var qr = document.createElement('label'); qr.style.display = 'block'; var qh = document.createElement('input'); qh.type = 'checkbox'; qh.addEventListener('click', function(){ save('pref_quickhide', this.checked); }, false); qh.id = 'lkn_alias_quickhider'; qh.checked = load('pref_quickhide', true); qr.appendChild(qh); qr.appendChild(document.createTextNode(lg.QUICKHIDE)); se.appendChild(qr); se.appendChild(br.cloneNode(false)); se.appendChild(document.createTextNode(lg.PANELPOS+': ')); var po = document.createElement('select'); var df = load('pref_panelpos'); for(var i in panelPos){ var op = new Option(lg[i], i, false, i==df); po.add(op, null); } se.appendChild(po); po.addEventListener('change', function(){ save('pref_panelpos', this.value); panelPosition(); }, false); mp.appendChild(document.createTextNode('Beta version, use at own risk')); panel.appendChild(mp); return panel; } document.body.appendChild(getPanel()); function panelPosition(){ if(!panel) return; var pos = load('pref_panelpos', 'TOPLEFT'); pos = panelPos[pos]; if(!pos) pos = panelPos.TOPLEFT; panel.style.top = 'auto'; panel.style.right = 'auto'; panel.style.bottom = 'auto'; panel.style.left = 'auto'; panel.style[pos[0]] = '0'; panel.style[pos[1]] = '0'; return; } panelPosition(); switch(gameScreen){ case 'overview_villages': var mt = document.getElementsByTagName('th')[0].offsetParent; if(!mt || mt.rows.length <= 1) break main; var cn = null; var mo = mode != 'incomings' && mode != 'commands'; for(var i=0; i