Ranked User Search for Webcamdarts

Long overdue search functionality for the Equalizer, EQXL and Ladder Ranking.

// ==UserScript==
// @name         Ranked User Search for Webcamdarts
// @version      0.3.1
// @license      MIT
// @description  Long overdue search functionality for the Equalizer, EQXL and Ladder Ranking.
// @author       AlexisDot
// @match        https://www.webcamdarts.com/wda-games/equalizer-(ranked)
// @match        https://www.webcamdarts.com/wda-games/eqxl-(ranked)
// @match        https://www.webcamdarts.com/wda-games/ladder-(ranked)
// @namespace    https://greasyfork.org/en/users/913506-alexisdot

// ==/UserScript==
/*jshint esversion: 6 */

/* --------Add search to Rank Pages --------- */
(function () {
  "use strict";

  let curDate = new Date();
  let lastMonthDate = new Date();
  lastMonthDate.setMonth(lastMonthDate.getMonth() - 1);
  let lastMonth = lastMonthDate.getMonth() + 1;
  let curDateMonth = curDate.getMonth() + 1;
  let curDateYear = curDate.getFullYear();
  let lastMonthYear = lastMonthDate.getFullYear();
  const rankings = {};

  let curPathParts = window.location.pathname.split("/");
  let wdaGamesIndex = curPathParts.indexOf("wda-games");
  let rankTypes = ["equalizer-(ranked)", "eqxl-(ranked)", "ladder-(ranked)"];
  let curRankList = rankTypes.indexOf(curPathParts[wdaGamesIndex + 1]);
  let fetchUrlInfoCurMonth = null;
  let fetchUrlAllCurMonth = null;
  let fetchUrlInfoLastMonth = null;
  let fetchUrlAllLastMonth = null;
  switch (curRankList) {
    case 0:
      fetchUrlInfoCurMonth = `https://www.webcamdarts.com/EqualizerRanking_Read?month=${curDateMonth}&year=${curDateYear}&take=1&skip=0&page=2&pageSize=1`;
      fetchUrlAllCurMonth = `https://www.webcamdarts.com/EqualizerRanking_Read?month=${curDateMonth}&year=${curDateYear}`;
      fetchUrlInfoLastMonth = `https://www.webcamdarts.com/EqualizerRanking_Read?month=${lastMonth}&year=${lastMonthYear}&take=1&skip=0&page=2&pageSize=1`;
      fetchUrlAllLastMonth = `https://www.webcamdarts.com/EqualizerRanking_Read?month=${lastMonth}&year=${lastMonthYear}`;
      break;
    case 1:
      fetchUrlInfoCurMonth = `https://www.webcamdarts.com/EqXLRanking_Read?month=${curDateMonth}&year=${curDateYear}`;
      fetchUrlAllCurMonth = fetchUrlInfoCurMonth;
      fetchUrlInfoLastMonth = `https://www.webcamdarts.com/EqXLRanking_Read?month=${lastMonth}&year=${lastMonthYear}`;
      fetchUrlAllLastMonth = fetchUrlInfoLastMonth;
      break;
    case 2:
      fetchUrlInfoCurMonth = `https://www.webcamdarts.com/GameOn/Game/LadderRanking_Read?sort%5B0%5D%5Bfield%5D=Rank&sort%5B0%5D%5Bdir%5D=asc&take=1&skip=0&page=2&pageSize=1`;
      fetchUrlAllCurMonth = `https://www.webcamdarts.com/GameOn/Game/LadderRanking_Read?sort%5B0%5D%5Bfield%5D=Rank&sort%5B0%5D%5Bdir%5D=asc`;
      break;
  }

  function fetchCurMonth(errorCorrect = 60) {
    fetch(fetchUrlInfoCurMonth)
      .then((response) => response.json())
      .then((data) => {
        let errorCorrect = 60;
        if (curRankList === 0 || curRankList === 2) {
          fetchUrlAllCurMonth = `${fetchUrlAllCurMonth}&take=${data.Total - errorCorrect
            }&skip=0&page=0&pageSize=${data.Total - errorCorrect}`;
        }
        fetch(fetchUrlAllCurMonth)
          .then((response2) => {
            if (response2.ok) {
              return response2.json();
            }

            throw new Error("Something went wrong.");
          })
          .then((data2) => {
            if (curRankList === 1) {
              rankings.curMonth = data2;
            } else {
              rankings.curMonth = data2.Data;
            }
            let searchField = document.querySelector('#user-search');
            searchField.disabled = false;
            searchField.placeholder = "Init complete. Enter NickName here."
            document.querySelector('#search-trigger').disabled = false;

          })
          .catch((error) => {
            errorCorrect += 10;
            console.log(
              `Error correction for current month is set to: ${errorCorrect}`
            );
            setTimeout(fetchCurMonth(errorCorrect), 200);
          });
      });
  }

  function fetchLastMonth(errorCorrect = 60) {
    if (fetchUrlInfoLastMonth) {
      fetch(fetchUrlInfoLastMonth)
        .then((response) => response.json())
        .then((data) => {
          if (curRankList === 0 || curRankList === 2) {
            fetchUrlAllLastMonth = `${fetchUrlAllLastMonth}&take=${data.Total - errorCorrect
              }&skip=0&page=0&pageSize=${data.Total - errorCorrect}`;
          }
          fetch(fetchUrlAllLastMonth)
            .then((response2) => {
              if (response2.ok) {
                return response2.json();
              }

              throw new Error("Something went wrong.");
            })
            .then((data2) => {
              if (curRankList === 1) {
                rankings.lastMonth = data2;
              } else {
                rankings.lastMonth = data2.Data;
              }
              let searchField = document.querySelector('#user-search');
              searchField.disabled = false;
              searchField.placeholder = "Init complete. Enter NickName here."
              document.querySelector('#search-trigger').disabled = false;
            })
            .catch((error) => {
              errorCorrect += 10;
              console.log(
                `Error correction for last month is set to: ${errorCorrect}`
              );
              setTimeout(fetchLastMonth(errorCorrect), 200);
            });
        });
    }
  }

  fetchCurMonth();
  fetchLastMonth();

  const htmlEQ = /*html*/ `
<div style="height: 250px; padding: 15px; margin-top: 20px" class="liteAccordion rounded dark">
  <h2><strong>Search User</strong></h2>
  <label for="user-search">NickName:</label
  ><input
    type="text"
    id="user-search"
    placeholder="Initializing search script, please wait..."
    style="padding: 5px;
    border-radius: 5px;
    width: calc(100% - 83px);
    margin-right: 5px; display: inline-block"
    disabled
  />
  <button type="button" style="padding: 5px; border-radius: 5px; border: 1px solid; width: 49px; display: inline-block;" id="search-trigger" disabled>Search</button>
  <br />
  <br />
  <div class="k-grid">
    <table cellspacing="0" id="search-results">
      <thead>
        <tr>
          <th class="k-header">Month</th>
          <th class="k-header">Nickname</th>
          <th class="k-header">Rank</th>
          <th class="k-header">Battle Points</th>
          <th class="k-header">Avg Leg Value</th>
          <th class="k-header">Average</th>
          <th class="k-header">Best Leg</th>
          <th class="k-header">High Out</th>
          <th class="k-header">180's</th>
          <th class="k-header"># Pld</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
  </div>
</div>

`;

  const htmlEQXL = /*html*/ `
<div style="height: 250px; padding: 15px; margin-top: 20px" class="liteAccordion rounded dark">
  <h2><strong>Search User</strong></h2>
  <label for="user-search">NickName:</label
  ><input
    type="text"
    id="user-search"
    placeholder="Initializing search script, please wait..."
    style="padding: 5px;
    border-radius: 5px;
    width: calc(100% - 83px);
    margin-right: 5px; display: inline-block"
    disabled
  />
  <button type="button" style="padding: 5px; border-radius: 5px; border: 1px solid; width: 49px; display: inline-block;" id="search-trigger" disabled>Search</button>
  <br />
  <br />
  <div class="k-grid">
  <table cellspacing="0" id="search-results">
      <thead>
        <tr>
          <th class="k-header">Month</th>
          <th class="k-header">Nickname</th>
          <th class="k-header">Rank</th>
          <th class="k-header">Battle Points</th>
          <th class="k-header">Set Value</th>
          <th class="k-header">Avg Leg Value</th>
          <th class="k-header">Average</th>
          <th class="k-header">Best Leg</th>
          <th class="k-header">High Out</th>
          <th class="k-header">180's</th>
          <th class="k-header"># Pld</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
  </div>
</div>

`;

  const htmlLadder = /*html*/ `
<div style="height: 250px; padding: 15px; margin-top: 20px" class="liteAccordion rounded dark">
  <h2><strong>Search User</strong></h2>
  <label for="user-search">NickName:</label
  ><input
    type="text"
    id="user-search"
    placeholder="Initializing search script, please wait..."
    style="padding: 5px;
    border-radius: 5px;
    width: calc(100% - 83px);
    margin-right: 5px; display: inline-block"
    disabled
  />
  <button type="button" style="padding: 5px; border-radius: 5px; border: 1px solid; width: 49px; display: inline-block;" id="search-trigger" disabled>Search</button>
  <br />
  <br />
  <div class="k-grid">
    <table cellspacing="0" id="search-results">
      <thead>
        <tr>
          <th class="k-header">Nickname</th>
          <th class="k-header">Rank</th>
          <th class="k-header">Score</th>
          <th class="k-header">Average</th>
          <th class="k-header">Best Leg</th>
          <th class="k-header">High Out</th>
          <th class="k-header">180's</th>
          <th class="k-header"># Played</th>
          <th class="k-header"># Won</th>
          <th class="k-header">Win %</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
  </div>
</div>

`;

  let html = null;
  switch (curRankList) {
    case 0:
      html = htmlEQ;
      break;
    case 1:
      html = htmlEQXL;
      break;
    case 2:
      html = htmlLadder;
      break;
  }

  // const element = document.createRange().createContextualFragment(html);
  let lastLiteAccordion = document.querySelectorAll(".liteAccordion");
  lastLiteAccordion = lastLiteAccordion[lastLiteAccordion.length - 1];
  lastLiteAccordion.insertAdjacentHTML("beforebegin", html);
  // document.querySelector('.load').parentElement.append(element);

  document.querySelector(".load")?.classList.remove("load");

  const searchField = document.querySelector("#user-search");
  const searchButton = document.querySelector("#search-trigger");
  const searchResultsTableBody = document.querySelector(
    "#search-results tbody"
  );

  const months = Array.from(
    {
      length: 12,
    },
    (e, i) => {
      return new Date(null, i + 1, null).toLocaleDateString("en", {
        month: "long",
      });
    }
  );

  searchButton.addEventListener("click", getRankings);
  searchField.addEventListener("keypress", function (e) {
    if (e.key === "Enter") {
      getRankings();
    }
  });

  function getRankings() {
    let curMonthRank = rankings.curMonth.find(
      (user) => user.NickName == searchField.value
    );

    let lastMonthRank = null;

    if (rankings.lastMonth) {
      lastMonthRank = rankings.lastMonth.find(
        (user) => user.NickName == searchField.value
      );
    }

    searchResultsTableBody.innerHTML = "";
    let curMonthHtml = '';
    let lastMonthHtml = '';

    if (curMonthRank) {
      switch (curRankList) {
        case 0: curMonthHtml = /*html*/ `
            <tr>
              <td>${months[curDateMonth - 1]}</td>
              <td>${curMonthRank.NickName}</td>
              <td>${curMonthRank.Rank}</td>
              <td>${curMonthRank.Score}</td>
              <td>${curMonthRank.AverageLegValue}</td>
              <td>${curMonthRank.Average.toFixed(2)}</td>
              <td>${curMonthRank.BestLeg}</td>
              <td>${curMonthRank.HighestOut}</td>
              <td>${curMonthRank.OneEighties}</td>
              <td>${curMonthRank.GamesPlayed}</td>
            </tr>
          `;
          break;
        case 1: curMonthHtml = /*html*/ `
            <tr>
              <td>${months[curDateMonth - 1]}</td>
              <td>${curMonthRank.NickName}</td>
              <td>${curMonthRank.Rank}</td>
              <td>${curMonthRank.Score}</td>
              <td>${curMonthRank.CurrentLegValue}</td>
              <td>${curMonthRank.AverageLegValue}</td>
              <td>${curMonthRank.Average.toFixed(2)}</td>
              <td>${curMonthRank.BestLeg}</td>
              <td>${curMonthRank.HighestOut}</td>
              <td>${curMonthRank.OneEighties}</td>
              <td>${curMonthRank.GamesPlayed}</td>
            </tr>
          `;
          break;
        case 2: curMonthHtml = /*html*/ `
            <tr>
            <td>${curMonthRank.NickName}</td>
            <td>${curMonthRank.Rank}</td>
            <td>${curMonthRank.Score}</td>
            <td>${curMonthRank.Average.toFixed(2)}</td>
            <td>${curMonthRank.BestLeg}</td>
            <td>${curMonthRank.HighestOut}</td>
            <td>${curMonthRank.OneEighties}</td>
            <td>${curMonthRank.GamesPlayed}</td>
            <td>${curMonthRank.GamesWon}</td>
            <td>${curMonthRank.WinPercentage.toFixed(2)}</td>
            </tr>
          `;
          break;
      }
      searchResultsTableBody.innerHTML += curMonthHtml;
    } else {
      let curMonthHtml = '';
      switch (curRankList) {
        case 0:
          curMonthHtml = /*html*/ `
            <tr>
              <td>${months[curDateMonth - 1]}</td>
              <td colspan="9" style="align: center">no results found</td>
            </tr>
          `;
          break;
        case 1:
          curMonthHtml = /*html*/ `
            <tr>
              <td>${months[curDateMonth - 1]}</td>
              <td colspan="10" style="align: center">no results found</td>
            </tr>
          `;
          break;
        case 2:
          curMonthHtml = /*html*/ `
            <tr>
              <td colspan="10" style="align: center">no results found</td>
            </tr>
          `;
          break;
      }


      searchResultsTableBody.innerHTML += curMonthHtml;
    }
    if (rankings.lastMonth) {
      if (lastMonthRank) {
        switch (curRankList) {
          case 0: lastMonthHtml = /*html*/ `
            <tr>
              <td>${months[lastMonth - 1]}</td>
              <td>${lastMonthRank.NickName}</td>
              <td>${lastMonthRank.Rank}</td>
              <td>${lastMonthRank.Score}</td>
              <td>${lastMonthRank.AverageLegValue}</td>
              <td>${lastMonthRank.Average.toFixed(2)}</td>
              <td>${lastMonthRank.BestLeg}</td>
              <td>${lastMonthRank.HighestOut}</td>
              <td>${lastMonthRank.OneEighties}</td>
              <td>${lastMonthRank.GamesPlayed}</td>
            </tr>
          `;
            break;
          case 1: lastMonthHtml = /*html*/ `
            <tr>
              <td>${months[lastMonth - 1]}</td>
              <td>${lastMonthRank.NickName}</td>
              <td>${lastMonthRank.Rank}</td>
              <td>${lastMonthRank.Score}</td>
              <td>${lastMonthRank.CurrentLegValue}</td>
              <td>${lastMonthRank.AverageLegValue}</td>
              <td>${lastMonthRank.Average.toFixed(2)}</td>
              <td>${lastMonthRank.BestLeg}</td>
              <td>${lastMonthRank.HighestOut}</td>
              <td>${lastMonthRank.OneEighties}</td>
              <td>${lastMonthRank.GamesPlayed}</td>
            </tr>
          `;
            break;
        }
        searchResultsTableBody.innerHTML += lastMonthHtml;
      } else {
        let lastMonthHtml = '';
        switch (curRankList) {
          case 0:
            lastMonthHtml = /*html*/ `
              <tr>
                <td>${months[lastMonth - 1]}</td>
                <td colspan="9" style="align: center">no results found</td>
              </tr>
            `;
            break;
          case 1:
            lastMonthHtml = /*html*/ `
              <tr>
                <td>${months[lastMonth - 1]}</td>
                <td colspan="10" style="align: center">no results found</td>
              </tr>
            `;
            break;
        }

        searchResultsTableBody.innerHTML += lastMonthHtml;
      }
    }
  }
})();