// ==UserScript== // @name TW Ranking+ // @namespace Johnny // @version 1.3 // @description Extended Ranking for The West Classic // @author Johnny // @match http://classic.the-west.net/game.php* // @match https://classic.the-west.net/game.php* // @connect 107.170.27.137 // @run-at document-idle // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant unsafeWindow // @downloadURL none // ==/UserScript== (function() { var towns = []; var lastModified = 0; var windowName = 'RankingPlus'; var style = '\ #menu_ranking_plus a { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAZCAMAAADOidZyAAAB3VBMVEUyIBsxHxo0IRt0YUY9KyIwHhj///8zIBo2Ix0tGxUvHRcuHRhfTjo8KSAqGBJJNyr29fVpWT9jUzuiimVsXENbSzZALSM4Jh+VgV6cg15cTjlTQTGFcVTXwEvn5eV9gYVnVz/XsDw+Kx7Ih2aAbE97ZknXuUZfUTuCh42EeXZoWleKdFTXtELXqDhENDA9LST7+vrTpoOOhYKnj2rCg2Kgh2CWe1iOd1bXylJfUExXSDJaRCqigiUYDwaIjZLPzo13en5tYl42NzlKQThQRjJPPy1HKx02IxbFv77CvLujmpiUi4jUmHducXXRj2/Af16tdViFb1B9akx3UjutmDZvSTA/LiqGaSlYOSeRchtCLQg0JAMuIAHu7Ozj4N/Y1NOvqKaro6GNkpa1qHyZhWS8fl5dX160dlagjVVkXlXIrFR2ZEqRYkqtmkZlWUVERUXLqjhmSzi9mTWghjNIOyu2iiomHA7z8vLy8PDr6enb2NfPy8m+uLbX162ZnaKSl5zMimleY2m3gmSqgWKna05vYU1RUE2Wi0y1pUiFXEaTez6IdD6IVj1RRDtuXzTKmzFrUyhANCeadx1pThbSzszGlXStjm56b2t3a2hbW1WFZU14bD5kVjFVPh5XRRZzYAbaAAAGI0lEQVRIx72X91sTMRjHk9zlrnctpYNaKKtoqywRUJYgoIAM2YhM99577733nn+r3zdpT+qjj7/5St68b3q5fPLmvSQy8++SZ5rLoJRephqoZc0a2DmO9nI75LiMcSklY0L4SDHGpBPMOub69avCBUrC4YJwJAInuSqxyjT+i5gAiBwtgUykzs6EU6l0qqSmZNJIJkwjPxbIN4p9Pl+cMwFUm5Qyfb4cB6K0ttHu19pzHWZzlws8zSXnTEoueLGRH4jlE8CqozWFkJqnrWcTJc2w9hW2lBiIQIDFY8UqTBxDMel3HBf9pSuZnePYjMGViKwNMIZWrT2XQGF41FT5imNxFjDizEymC6OQJ62tZ2M1TdGmtWujRS2pMAD8gXy8FOQQW9gMw/k5GrjjLHUgTGAwOBBGAp3ros6ZAtHmB3jAWMbM8P3D92uKmp6+eLR1PVBo/MKWiQIsQXE8gGlABADATRhc9c11yCU+hkJDSqm156oJSOZRU7NkgXhxPgEkuvfc/GwURVsAgAhEi5qLmltKAGBgeG47Dldh4yB3XB0+xnIdzMzBi3n2GUdrz81M4Bc1waIOqCSMdW8audnbvDZ6fGvfRFG0qQjSTAD5PurBXYm+KhIW5OJAHUcgOYB0ZjJBP9hgdSyLtFowZWjupeTolGOoJIyciGzcc24iuvb41m/7CguLaprvRtIpAAhXZY/tE2odbYFxxEfrmuCuKxFyL6QAUKmKCppT5ilDc2seTS0d7hnAEMspCSPGiRsHEiVNh450POzq6trb0NDwfrYgaRoMgZWChHMML13Lkm7cChGTT82B2SpGAFCoTGsmNXkmEUMh4tHUIPEMDbAMAJHy7p7kkyNHZt4e6up6+OpuX6LhcR8+Q8EyO5jDnaATVCF2fNYlIXoGLoZ2VtPA1WVlG23Uosoawu8s0yTYtsGyRjzPHQAQjKaWjs8zWBYgebjz5OFDp06d6Xhz5viPxcULm780nO7FRiQza+VQF9pxME68yrrmE+8++dqsMoaYb6m2dnDUbfW7iIML3WTz3VbVLssKYhKhUDAY1JHEWgjPoAAuN/LwFTy4PTLytbS0tLW1dG5hYWHDVMMdM0YRCOodjAEbghwgGaiD1TZ0xaoXGHEbGhmmvv2KTTzMRpMEKCuzttVZlg9RIGkUKqEZEtMzIDoHDmyCvFi5khA65ufnv7enhx+fA4AtdaZzQXljq1zbWH81j7Eqa7ANDkcBAC0FYkC/CwCoWtRbzEcgFAGaMqgFXohKG1SYu5y+gvLy8u7b4dqVhNAxv9g+enrf8Hiy0DT82S3Moc0WPWmALdYQ8srKM+FQzKUGqarf6UcgHD8KR3HKrDWIgIs8DoUcnZG2TcUz6NUKoLKy80Zl76naWhB0LG64MH5nfPjY3uv4CqROdKY/eFfihTK+vf65s8Nqa9QzFzxTD1mNqFg2AkznALojAjYlk0pnFM9gQMhEoHJPZc/Litra2tKOhf7+/qljzz5c32sa3uZH1CgAANMWa4BtvHx5tw6/ZHpEnlcWqtNNfnJZ3dWyKoCA23FpIvj8kYso2lCFlmCNWoLOyp4zFZCVc9P77z2bnp1tifZnd0LJHQxO3KrAhFAl9S4AR+itMqs917qkjxDVk9GzKJ6hd0IAjJRXdnaePL969eqK2rmp4dHRW+v239u8IXsWCOH61bjCpjzAm2FQg825bVMrZ9lmrZW7vdGstgYxMv151OjiGd5Z8LznwYHuk+criGBuenQFyRgAsqehoGddbF+u2nldtY5M/xPeiyUOLam1cqt3hkKDdWSypdRSegadhvosCCcjid72mfMvV1e8mb61Yh3kIAHo+4BUL0Q6SwwAQRSQlzmOt+cHHRI8r7Xnqgnwpfjc1fcBAkiEjfSkkU6H21/NvG3fv2LFurGxcQLQN6LspQIkLlcp7EfocxzG6MCGp561YWvtuWoCrvxFDWx9I6KtOBYxUqnJ9ORRXEgT60+3Tx07OHbQvJC9E5r/lrw/udCem52BRw2yX3fCWCyRLAhDkhGczLHevr7X52b7X/+/W/HfRB9ASgSVpf5vTtZD8WSpKyXdWdWnqf7UVSHz/4KfxCXJXWE9lzEAAAAASUVORK5CYII="); } \ #window_' + windowName + '_content { overflow-y: scroll; } \ #window_' + windowName + '_content #ranking_table th { cursor: pointer; font-size: 9px; } \ #window_' + windowName + '_content #ranking_table td { padding: 0; text-align: center; vertical-align: middle; } \ #window_' + windowName + '_content #ranking_table .green { font-weight: bold; background: green !important; color: white; } \ #window_' + windowName + '_content #ranking_table .red { font-weight: bold; background: darkred !important; color: white; } \ '; GM_addStyle(style); GM_xmlhttpRequest({ method: 'GET', url: 'http://107.170.27.137/data.json?' + new Date().getTime(), onload: function(resp) { towns = JSON.parse(resp.responseText); var start = resp.responseHeaders.indexOf('Last-Modified:') + 14; lastModified = resp.responseHeaders.substring(start, resp.responseHeaders.indexOf('\n', start)) || 0; } }); var button = document.createElement('li'); button.id = 'menu_ranking_plus'; var buttonLink = document.createElement('a'); buttonLink.onclick = openWindow; buttonLink.innerHTML = 'Ranking+'; button.appendChild(buttonLink); var rankingMenu = document.getElementById('menu_ranking'); rankingMenu.parentNode.insertBefore(button, rankingMenu.nextSibling); function openWindow() { if (!unsafeWindow.AjaxWindow.windows[windowName]) { var win = document.createElement('div'); win.id = 'window_' + windowName; win.className = 'window'; unsafeWindow.AjaxWindow.windows[windowName] = win; var html = '\
\

Ranking+

\ \
\
\ '; win.innerHTML = html; win.style.zIndex = ++unsafeWindow.lastIndex; win.style.left = window.innerWidth / 2 - 365.5 + 'px'; document.getElementById('windows').appendChild(win); unsafeWindow.AjaxWindow.windows[windowName].makeDraggable(); win.addEventListener('mousedown', function() { win.style.zIndex = ++unsafeWindow.lastIndex; }.bind(win), false); printSortedTowns('allDuels'); } else { unsafeWindow.AjaxWindow.windows[windowName] = 'block'; unsafeWindow.AjaxWindow.windows[windowName] = ++unsafeWindow.lastIndex; } } function printSortedTowns(method) { towns.sort(function(a, b) { if (method === 'name') { return (a[method] > b[method]) ? 1 : ((b[method] > a[method]) ? -1 : 0); } return b[method] - a[method]; }); var win_content = document.getElementById('window_' + windowName + '_content'); clear(win_content); win_content.appendChild(renderWindowContent()); } function renderWindowContent() { var wrapper = document.createElement('div'); var updateTime = document.createElement('div'); updateTime.style.marginBottom = '5px'; var date = new Date(lastModified); updateTime.innerHTML = 'Last update: ' + date.toLocaleString(); var table = document.createElement('table'); table.id = 'ranking_table'; var trH = document.createElement('tr'); var headers = ['Town', 'All duels', 'Duels won', 'Duels lost', 'Diff', 'KO opponents', 'KO members', 'Highest counting hit in a duel', 'Best dueller of the town', 'Best duelling opponent']; var headersObj = ['name', 'allDuels', 'duelsWon', 'duelsLost', 'diff', 'koOpponents', 'koMembers', 'bestDmg', 'bestTownDmg', 'bestOpponentDmg']; for (var i = 0; i < headers.length; i++) { var th = document.createElement('th'); th.innerHTML = headers[i]; th.dataset.obj = headersObj[i]; th.addEventListener('click', function() { printSortedTowns(this.dataset.obj); }, false); trH.appendChild(th); } table.appendChild(trH); for (var j = 0; j < towns.length; j++) { var town = towns[j]; var tr = document.createElement('tr'); var td1 = document.createElement('td'); td1.innerHTML = town.town; tr.appendChild(td1); var td2 = document.createElement('td'); td2.className = 'bold'; td2.innerHTML = town.allDuels; tr.appendChild(td2); var td3 = document.createElement('td'); if (town.duelsWon > town.duelsLost) td3.className = 'green'; td3.innerHTML = town.duelsWon; tr.appendChild(td3); var td4 = document.createElement('td'); if (town.duelsLost > town.duelsWon) td4.className = 'red'; td4.innerHTML = town.duelsLost; tr.appendChild(td4); var td5 = document.createElement('td'); td5.innerHTML = town.diff; tr.appendChild(td5); var td6 = document.createElement('td'); if (town.koOpponents > town.koMembers) td6.className = 'green'; td6.innerHTML = town.koOpponents; tr.appendChild(td6); var td7 = document.createElement('td'); if (town.koMembers > town.koOpponents) td7.className = 'red'; td7.innerHTML = town.koMembers; tr.appendChild(td7); var td8 = document.createElement('td'); td8.innerHTML = (town.bestDmg > 0 ? town.bestDmg + ' dmg
' + town.bestPlayer : '-'); tr.appendChild(td8); var td9 = document.createElement('td'); td9.innerHTML = (town.bestTownDmg > 0 ? town.bestTownDmg + ' dmg
' + town.bestTownPlayer : '-'); tr.appendChild(td9); var td10 = document.createElement('td'); td10.innerHTML = (town.bestOpponentDmg > 0 ? town.bestOpponentDmg + ' dmg
' + town.bestOpponentPlayer : '-'); tr.appendChild(td10); table.appendChild(tr); } wrapper.appendChild(updateTime); wrapper.appendChild(table); return wrapper; } function clear(el) { while (el.firstChild) el.removeChild(el.firstChild); } })();