ismyinternetworking.com (EVA Edition)

ismyinternetworking.com but with cool Evangelion GUI or smth

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         ismyinternetworking.com (EVA Edition)
// @namespace    https://dsc.bio/jamsandwich47
// @version      0.3.3
// @description  ismyinternetworking.com but with cool Evangelion GUI or smth
// @author       Kur0
// @match        https://ismyinternetworking.com/
// @icon         https://www.google.com/s2/favicons?domain=ismyinternetworking.com
// @grant        none
// @require     https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js
// ==/UserScript==
(function () {
  "use strict";

  const head = document.querySelector("head");

  // Function to load a script and return a Promise that resolves when the script has loaded
  function loadScript(scriptSrc) {
    return new Promise((resolve, reject) => {
      const script = document.createElement("script");
      script.src = scriptSrc;
      script.onload = resolve;
      script.onerror = reject;
      head.appendChild(script);
    });
  }

  async function loadScripts() {
    await loadScript("https://cdn.jsdelivr.net/npm/chart.js@^3");
    await loadScript("https://cdn.jsdelivr.net/npm/moment@^2");
    await loadScript("https://cdn.jsdelivr.net/npm/chartjs-adapter-moment@^1");
    console.log("All scripts have loaded");
  }
  loadScripts();

  const canvasWrapper = document.createElement("div");
  const canvas = document.createElement("canvas");
  canvas.id = "liveGraph";
  canvasWrapper.appendChild(canvas);
  document.body.appendChild(canvasWrapper);

  canvasWrapper.style.height = "33vh";
  canvasWrapper.style.width = "26vw";
  canvasWrapper.style.position = "fixed";
  canvasWrapper.style.zIndex = "99999999";
  canvasWrapper.style.top = "0";
  canvasWrapper.style.resize = "both";
  canvasWrapper.style.overflow = "hidden";

  const liveGraph = document.querySelector("#liveGraph");
  liveGraph.style.display = "block";
  liveGraph.style.boxSizing = "border-box";

  liveGraph.style.position = "fixed";
  liveGraph.style.zIndex = "99999999";

  // Draggability stuff
  canvasWrapper.addEventListener("mousedown", dragStart);
  canvasWrapper.addEventListener("mouseup", dragEnd);
  canvasWrapper.addEventListener("mouseout", dragEnd);

  let dragEl;
  const lastPosition = {};

  function dragStart(event) {
    dragEl = canvasWrapper;
    lastPosition.left = event.target.clientX;
    lastPosition.top = event.target.clientY;
    canvasWrapper.addEventListener("mousemove", dragMove);
  }

  function dragMove(event) {
    const dragElRect = dragEl.getBoundingClientRect();
    const newLeft = dragElRect.left + event.clientX - lastPosition.left;
    const newTop = dragElRect.top + event.clientY - lastPosition.top;
    dragEl.style.setProperty("left", `${newLeft}px`);
    dragEl.style.setProperty("top", `${newTop}px`);
    lastPosition.left = event.clientX;
    lastPosition.top = event.clientY;
    window.getSelection().removeAllRanges();
  }

  function dragEnd() {
    canvasWrapper.classList.remove("dragging");
    canvasWrapper.removeEventListener("mousemove", dragMove);
    dragEl = null;
  }

  function ClickConnect() {
    console.log("Clicked on thing");
    document.querySelector("#yeslink").click();

    document.body.style.backgroundColor = "#000000";
  }
  document.body.style.overflow = "hidden";

  var normaldiv = document
    .querySelector("body")
    .appendChild(document.createElement("div"));
  normaldiv.style.position = "fixed";
  normaldiv.style.aspectRatio = "180/133";
  normaldiv.style.height = "100vh";
  normaldiv.style.marginLeft = "auto";
  normaldiv.style.marginRight = "auto";
  normaldiv.style.top = "0";
  normaldiv.style.left = "0";
  normaldiv.style.right = "0";
  normaldiv.style.margin = "auto";
  normaldiv.style.width = "fit-content";
  normaldiv.style.zIndex = "999";

  var ping = normaldiv.appendChild(document.createElement("p"));
  ping.innerHTML = "Loading...";
  ping.style.position = "absolute";
  ping.style.left = "11%";
  ping.style.bottom = "0";
  ping.style.zIndex = "9999";
  ping.style.mixBlendMode = "screen";
  ping.style.color = "#ffde64";
  ping.style.fontSize = "12vh";
  ping.style.margin = "0";

  var normal = normaldiv.appendChild(document.createElement("img"));
  normal.src =
    "https://quiet-sun-6d6e.cantilfrederick.workers.dev/?https://i.imgur.com/kAWK7Jd.gif";
  normal.style.display = "block";
  normal.style.position = "fixed";
  normal.style.top = "0";
  normal.style.height = "100vh";
  normal.style.left = "0";
  normal.style.zIndex = "999";
  normal.style.right = "0";
  normal.style.margin = "auto";

  var warning = document
    .querySelector("body")
    .appendChild(document.createElement("img"));
  warning.src =
    "https://quiet-sun-6d6e.cantilfrederick.workers.dev/?https://i.gifer.com/embedded/download/1uYd.gif";
  warning.style.display = "none";
  //warning.style.opacity='0'
  warning.style.position = "fixed";
  warning.style.top = "0";
  warning.style.width = "100vw";
  warning.style.left = "0";
  warning.style.zIndex = "1000";
  warning.id = "warning";

  var elementToObserve = document.querySelector(
    "#center > div.test-info-wrapper > div:nth-child(4) > div.infobox-panel.infobox-ping.infobox-left > div > div.infobox-content.infobox-content-ping"
  );

  // create a new instance of 'MutationObserver' named 'observer',
  // passing it a callback function
  let chart;

  const plugin = {
    id: "blackBg",
    beforeDraw: (chart, args, options) => {
      const { ctx } = chart;
      ctx.save();
      ctx.globalCompositeOperation = "destination-over";
      ctx.fillStyle = "#000000";
      ctx.fillRect(0, 0, chart.width, chart.height);
      ctx.restore();
    },
  };

  window.chart = false;

  var observer = new MutationObserver(function (mutationsList, observer) {
    if (mutationsList[0].addedNodes[0].nodeValue == "N/A") {
      console.log("dead");

      $("#warning").fadeIn();
    } else if (mutationsList[0].removedNodes[0].nodeValue == "N/A") {
      console.log("back");
      console.log(mutationsList[0]);

      $("#warning").fadeOut();
      //   warning.style.opacity='0'
      ping.style.display = "block";
    }

    const pingCount = mutationsList[0].addedNodes[0].nodeValue;
    ping.innerHTML = pingCount;

    if (!window.chart) {
      console.log("Initializing Chart");
      console.log(`window.chart is ${window.chart}`);
      try {
        window.chart = new Chart(canvas, {
          type: "line",
          data: {
            labels: [],
            datasets: [
              {
                label: "Live Data",
                data: [],
                backgroundColor: "rgba(255, 171, 0, 0.2)",
                borderColor: "rgba(255, 171, 0, 1)",
                borderWidth: 1,
                pointRadius: 0,
                stepped: "true",
              },
            ],
          },
          plugins: [plugin],
          options: {
            responsive: true,
            maintainAspectRatio: false,
          },
        });
        console.log("New chart success");
      } catch (error) {
        if (error.message == "Chart is not defined") {
          console.log("Chart.js not loaded");
        } else {
          console.log(`Chart init error: ${error.message}`);
          const charts = Object.values(Chart.instances);
          charts.forEach((chart) => chart.destroy());
        }
      }
    }

    console.log(`Sending ${window.chart}`);
    updateGraph(pingCount, window.chart);
  });

  // call 'observe' on that MutationObserver instance,
  // passing it the element to observe, and the options object

  observer.observe(elementToObserve, {
    characterData: false,
    childList: true,
    attributes: false,
  });

  setInterval(ClickConnect, 250);

  // Graph stuff -------------------------------------------------------------------------------

  const dataPoints = [];

  // Create a function to update the graph with new data
  function updateGraph(ping, chart) {
    // Add a new data point to the array
    if (ping == "N/A") {
      ping = 0;
    } else {
      ping = parseInt(ping.slice(0, -2));
    }
    console.log(`Graphing ${ping}`);
    console.log(chart);
    let newDataPoint = {};
    try {
      newDataPoint = {
        x: moment(),
        y: ping,
      };
    } catch (error) {
      if (error.message == "moment is not defined") {
        console.log("moment not loaded.");
        return;
      } else {
        throw error;
      }
    }
    console.log(`newDataPoint is...`);
    console.log(newDataPoint);
    dataPoints.push(newDataPoint);
    // Update the chart with new data
    chart.data.labels = Array.from({ length: dataPoints.length }, (_, i) =>
      i.toString()
    );

    chart.data.datasets[0].data = dataPoints;

    function getGradient(chart, ctx, chartArea) {
      let width, height, gradient;
      const chartWidth = chartArea.right - chartArea.left;
      const chartHeight = chartArea.bottom - chartArea.top;
      if (!gradient || width !== chartWidth || height !== chartHeight) {
        // Create the gradient because this is either the first render
        // or the size of the chart has changed
        width = chartWidth;
        height = chartHeight;
        gradient = ctx.createLinearGradient(
          0,
          chartArea.bottom,
          0,
          chartArea.top
        );
        const yScale = chart.scales["y"];
        const yPos = yScale.getPixelForValue(0);
        gradient.addColorStop(0, "rgba(255, 0, 0, 1)");
        gradient.addColorStop(0.01, "rgba(255, 0, 0, 1)");
        gradient.addColorStop(0.01, "rgba(255, 171, 0, 1)");
        gradient.addColorStop(1, "rgba(255, 171, 0, 1)");
      }

      return gradient;
    }

    if (ping == 0) {
      chart.data.datasets[0].borderColor = "rgba(255, 0, 0, 1)";
    } else {
      chart.data.datasets[0].borderColor = function (context) {
        const chart = context.chart;
        const { ctx, chartArea } = chart;

        if (!chartArea) {
          // This case happens on initial chart load
          return;
        }
        return getGradient(chart, ctx, chartArea);
      };
    }

    chart.options = {
      responsive: true,
      maintainAspectRatio: false,
      scales: {
        x: {
          type: "time",
          time: {
            unit: "second",
            displayFormats: {
              second: "h:mm:ss a",
            },
          },
          // min: newDataPoint.x.clone().subtract(5, "seconds"),
          min: newDataPoint.x.clone().subtract(1, "minutes"),
          max: newDataPoint.x.clone(),
        },
        y: {
          beginAtZero: true,
          grid: {
            color: "rgba(245, 255, 255, 0.25)",
          },
          min: 0,
        },
      },
      plugins: {
        blackBg: {},
      },
    };
    console.log("Datapoints are:");
    console.log(dataPoints);
    try {
      chart.update();
    } catch (error) {
      if (
        error.message ==
        "This method is not implemented: Check that a complete date adapter is provided."
      ) {
        console.log("moment adapter not loaded yet");
      } else {
        throw error;
      }
    }
  }
})();