Cat Errors

Replace error messages with cat images.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name         Cat Errors
// @namespace caterrors
// @description Replace error messages with cat images. 
// @version      0.1
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
  "use strict";

  const lang = navigator.language || navigator.userLanguage;
  const langStrings = [
    {
      lang: "en",
      tempDisableBtn: "View Original Page",
      permDisableBtn: "Disable cat errors",
      enableButton: "Enable cat errors",
    },
    {
      lang: "pt",
      tempDisableBtn: "Ver página original", 
      permDisableBtn: "Desativar",
      enableButton: "Ativar", 
    },
  ];

  const text = langStrings.find(l => l.lang === lang.substring(0, 2)) || langStrings[0];

  const errors = [
    {
      code: 400,
      message: "bad request",
    },
    {
      code: 401,
      message: "unauthorized",
    },
    {
      code: 403,
      message: "forbidden",
    },
    {
      code: 404,
      message: "not found",
    },
    {
      code: 500,
      message: "internal server error",
    },
    {
      code: 502,
      message: "bad gateway",
    },
    {
      code: 503,
      message: "service unavailable",
    },
    {
      code: 504,
      message: "gateway timeout",
    }
  ];

  const cats = [
    "😺",
    "😹",
    "😻",
    "😼",
    "😽",
    "🙀",
    "😿",
  ]

  const catEmoji = cats[Math.floor(Math.random() * cats.length)];

  const toggleButton = document.createElement("button");
  toggleButton.innerText = catEmoji;
  toggleButton.style.position = "fixed";
  toggleButton.style.bottom = "0px";
  toggleButton.style.right = "0px";
  toggleButton.style.zIndex = "9999";
  toggleButton.style.padding = "10px";
  toggleButton.style.borderTop = "1px solid #1a1a1a75";
  toggleButton.style.borderLeft = "1px solid #1a1a1a75";
  toggleButton.style.borderRadius = "20px 0 0 0";
  toggleButton.style.backgroundColor = "#1a1a1a50";
  toggleButton.style.backdropFilter = "blur(10px)";
  toggleButton.style.fontSize = "20px";
  toggleButton.style.cursor = "pointer";
  toggleButton.title = "Abrir popup";

  const isEnabled = localStorage.getItem("catErrorsDisabled") !== "true";

  // Cria o painel de popup
  const popup = document.createElement("div");
  popup.innerHTML = `
    <h2 style="margin: 0; font-size: 32px; font: bold;">${catEmoji}${catEmoji}${catEmoji}</h2>
    <div style="margin-top: 10px; font-size: 14px; line-height: 1.5;">
        <button id="toggle" style="margin-top: 10px; padding: 5px 10px; font-size: 14px; border-radius: 100px; background-color: #1a1a1a; border: 1px #2a2a2a solid; color: white; cursor: pointer;">${isEnabled ? text.permDisableBtn : text.enableButton}</button>
    </div>
  `;
  popup.style.position = "fixed";
  popup.style.bottom = "70px";
  popup.style.right = "0";
  popup.style.width = "250px";
  popup.style.display = "none"
  popup.style.padding = "15px";
  popup.style.backgroundColor = "#1a1a1a50";
  popup.style.backdropFilter = "blur(10px)";
  popup.style.color = "#fff";
  popup.style.border = "1px solid #1a1a1a75";
  popup.style.borderStartStartRadius = "8px";
  popup.style.borderEndStartRadius = "8px";

  toggleButton.addEventListener("click", () => {
    popup.style.display = popup.style.display === "none" ? "block" : "none";
  });

  document.addEventListener("click", (event) => {
    if (!popup.contains(event.target) && event.target !== toggleButton) {
      popup.style.display = "none";
    }
  });

  document.body.appendChild(toggleButton);
  document.body.appendChild(popup);

  function toggleCatErrors() {
    const isDisabled = localStorage.getItem("catErrorsDisabled") === "true";
    if (isDisabled) {
      localStorage.removeItem("catErrorsDisabled");
      popup.querySelector("button").innerText = text.permDisableBtn;
    } else {
      localStorage.setItem("catErrorsDisabled", "true");
      popup.querySelector("button").innerText = text.enableButton;
    }
  }
  
  popup.querySelector("#toggle").addEventListener("click", toggleCatErrors);

  const disabled = localStorage.getItem("catErrorsDisabled");
  if (disabled === "temp") {
    localStorage.removeItem("catErrorsDisabled");
    return;
  }
  if (disabled) return;


  function restorePage(){
    localStorage.setItem("catErrorsDisabled", "temp");
    location.reload();
  }

  function disableCatErrors() {
    localStorage.setItem("catErrorsDisabled", "true");
    location.reload();
  }


  errors.forEach(error => {
    console.log(`Cat Error: ${error.code} - ${error.message}`);
    if (document.title.toLowerCase().includes(error.code) || document.body.innerText.toLowerCase().includes(error.message)) {
      document.body.innerHTML = `
        <div style="display:flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; font-family: Arial, sans-serif;">
          <img src="https://http.cat/${error.code}" alt="Gato" style="max-width: 100%; height: auto; border-radius: 32px;">
          <div style="margin-top: 20px;">
            <button style="padding: 10px 20px; font-size: 16px; border-radius: 8px; background-color: #4CAF50; color: white; border: none; cursor: pointer;" id="restore">${text.tempDisableBtn}</button>
            <button style="padding: 10px 20px; font-size: 16px; border-radius: 8px; background-color: #f44336; color: white; border: none; cursor: pointer; margin-left: 10px;" id="disable">${text.permDisableBtn}</button>
          </div>
        </div>
      `;
      document.body.style.height = "100vh";
      
    }

    document.getElementById("restore")?.addEventListener("click", restorePage);
    document.getElementById("disable")?.addEventListener("click", disableCatErrors);
  });
})();