TW Ranking+

Extended Ranking for The West Classic

目前為 2017-07-11 提交的版本,檢視 最新版本

// ==UserScript==
// @name         TW Ranking+
// @namespace    Johnny
// @version      1.4
// @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
// ==/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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"); 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; 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 = '<span>Ranking+</span>';
  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 = '\
        <div class="window_borders"> \
        <h2 id="window_' + windowName + '_title" class="window_title"><span>Ranking+</span></h2> \
        <a href="javascript:AjaxWindow.closeAll();" class="window_closeall"></a><a href="javascript:AjaxWindow.toggleSize(\'' + windowName + '\');" class="window_minimize"></a><a href="javascript:AjaxWindow.close(\'' + windowName + '\');" class="window_close"></a> \
        <div id="window_' + windowName + '_content" class="window_content"></div> \
        </div> \
      ';
      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<br>' + town.bestPlayer : '-');
      tr.appendChild(td8);

      var td9 = document.createElement('td');
      td9.innerHTML = (town.bestTownDmg > 0 ? town.bestTownDmg + ' dmg<br>' + town.bestTownPlayer : '-');
      tr.appendChild(td9);

      var td10 = document.createElement('td');
      td10.innerHTML = (town.bestOpponentDmg > 0 ? town.bestOpponentDmg + ' dmg<br>' + 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);
  }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址