ismyinternetworking.com (EVA Edition)

ismyinternetworking.com but with cool Evangelion GUI or smth

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==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;
      }
    }
  }
})();