// ==UserScript== // @name TW Ranking+ // @namespace Johnny // @version 1.0 // @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,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") 128px -150px; cursor: pointer; } \ #window_' + windowName + '_title { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ0AAAAZCAMAAAAc2dwqAAAAyVBMVEUAAAAsFA4rEg8uFRHt6uEwFw4vFxM8KiRALii8tq+akoxQNzPk4NgxGRNUOzZYPzpPNjE+LCVJMSxNNC/QzMReRT9ELylDKiWBd3I0GxZSOjQ9JB/GwblaQT1WPTmmn5hjS0ZtVE9kWFNIMCra1s2Rg3xpUUpFMy04IBtURkFAKyY1HhiBd3F6YlxhSEJALSZAKCPWzsOAbGXGvLKyq6OgkYlzaGOsoJaMe3NkV1NKOjKuoZinmZCaiYGJd2+Nb1llWFRjWFPJv7bBkC4lAAAAAXRSTlMAQObYZgAABItJREFUSMeVVgl7ojAQDQmySIAoKCiIhXrU1tVW2+59//8ftTMhcjX47T5bDZNh3sscKHl8sG377ottR/D55c4GPI7HaLuzoyiyHx4fHuxH2x6/KzHGzXcKsL4bAx7H8s7Whrpo2f43MAmeqGEY9AKjQn0Fn7QJo+OrM/f61c5dGqOjY/ewI7nPqA7tWIqy/mfwqsA05q6htiG64TXw0iAm+TT1UPN1gEdDChsMKk6tWe9Xrem/EKZxEJCRP4rnzJD8zVRpclkbkYGxgQJjb806P2XS5KpDjn9efMwD8nPqc8yehIxXhaiMLdSu9JIJjVnrp49UHbz0Vkj54fCTkNOnJEr3HmNVAdSyWz+0OKbE4h635G7lRGfmpIw9NB1m6MC01VVsTQEG24nt9xNBvE5FlHryDK1I3frBLqpDrJvJVQtQZ1zUKXO7Y6lrftZUV3E1Us28XbD9RhQ+Cr7aSR9WT+fbzIHFMYewunfND40sqFF8D+raqOZRrV3zVobR5hAXSoOVBtlHUuHjkqeWlMQougwMpskcGEAdxpmYM3q/gBwOIxDlOlhrmbtb15zJ3N2Yw6Epj7JxzYVjTjCga/5iSqkuh1DkgZS7j/lX0sDrMtxZ5X2q9G86Wq5KdaDhAyhEvLCZakXsu/s1CKOlOgkHxANcEA5i5bJv1mr23cp/JS1slmEK8hhV6e2trNJStviLOUR6B1S7kLs1ijNU7txbuoCzLEC3PWmo05UUwTAFSLn3p99JB+djAq2HLwS66yuLmDgUMLsBQlCHhB+kOkCtbigzbUCpqbExJ3g/ToV2LAzFiq85Lzaki9Mhf7IMVj3lWW9lP69lPy3Mm983F3W3pbqJuaZSHYUdSi/qKKijUt2trqQDyaao98HxfCJv8Lz190b9xXil72BkHcyWbU/a6tbQcjeq78ARvRlU1oiwskyq080q2irmNN8+Ew1e82APp0CXQV/jIR9qNH/dl92+GMxMlyl1E3jWuFFVWZm7mZoKKqEvrGJkwO7F4hvRYX2eRh6Vqpj2YVzNrLEAIRuYjd9SlEvpRR2qavcdtuqLg1uU9s0qsCERbu7885po8XycrixVTKovrUqoXCiTOnkT9QY2IWQThpf1fpPhhaKwUv/4THrwqcifqvupRp1KaFdE5dLUp8gd9eDTVrbWp0YiKT6RXmwOxZ6Wh+y+s4HSCKiqbvSjGn/Hhb5zwL86rOxtDQudj7Yb0o8/h+2KdUrU/YXcukLozP1+7YC0dZ70WDyTK9hAbTu/UmQ/eBZjFmvA8jzPsuZzdNKYNX6tPlNxFY+CFxc/yDW8FJmw1IHKBpF3Q3gLWFCkpYCs3nyOVdKZdX6NlFFr7uGJkaWiS/38K7mG0/mwDXnCl8epP+J+IjIe+jzCpZ+Eo4T7mVhmS87DIPTDOI1Xq+hJZ9b6BQH3l8ssEwmfbosin+b5kidLwYMROCfFoTiRq/ixzYIkCbnIhMh8XwgecsAo4Hz1FMdxOAo5sIz4yBegX0wBOrPOj4dRnIgkDIIoEBmYhIC9EA49igJfcJGfSRt/AdMtYsYMrQ/3AAAAAElFTkSuQmCC"); } \ #window_' + windowName + '_content { overflow-y: scroll; } \ #window_' + windowName + '_content #ranking_table th { cursor: pointer; } \ #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); document.getElementById('right_menu').appendChild(button); 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); } })();