BetterTriangulet

once...

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         BetterTriangulet
// @version      Beta 1.4.3
// @description  once...
// @icon         https://coplic.com/media/misc/favicon.png
// @author       C00LESTKIDDEVER
// @match        *://tri.pengpowers.xyz/*
// @match        https://coplic.com/*
// @grant        none
// @namespace https://greasyfork.org/users/1479014
// ==/UserScript==

(function () {
  "use strict";

  const themeColors = {
    Purple: "#4d136b",
    Green: "#265b09",
    Blue: "#132a6b",
    Red: "#6b1313",
    Orange: "#6b3b13",
    Yellow: "#6b6a13",
    Pink: "#6b134a",
    White: "#e6e6e6",
    Black: "#000000",
  };

  function getThemeColor() {
    const theme = localStorage.getItem("theme");
    return themeColors[theme] || "var(--container)";
  }

  function replaceBackgrounds(enable) {
    const allElements = document.querySelectorAll("*");
    allElements.forEach((el) => {
      if (el.style.backgroundImage && el.style.backgroundImage.includes("/media/misc/background.png")) {
        if (enable) {
          el.style.backgroundImage = el.style.backgroundImage.replace(/\/media\/misc\/background\.png/g, "/media/misc/aprilbackground.png");
        } else {
          el.style.backgroundImage = el.style.backgroundImage.replace(/\/media\/misc\/aprilbackground\.png/g, "/media/misc/background.png");
        }
      }
      if (el.style.background && el.style.background.includes("/media/misc/background.png")) {
        if (enable) {
          el.style.background = el.style.background.replace(/\/media\/misc\/background\.png/g, "/media/misc/aprilbackground.png");
        } else {
          el.style.background = el.style.background.replace(/\/media\/misc\/aprilbackground\.png/g, "/media/misc/background.png");
        }
      }
    });
    if (enable) {
      document.body.style.backgroundImage = "url('/media/misc/aprilbackground.png')";
      const fullContainer = document.querySelector(".styles__fullContainer___3Wl6C-camelCase");
      if (fullContainer) {
        fullContainer.style.backgroundImage = "url('/media/misc/aprilbackground.png')";
      }
    } else {
      document.body.style.backgroundImage = "url('/media/misc/background.png')";
      const fullContainer = document.querySelector(".styles__fullContainer___3Wl6C-camelCase");
      if (fullContainer) {
        fullContainer.style.backgroundImage = "url('/media/misc/background.png')";
      }
    }
  }

  function toggleFlip(enabled) {
    const prefixes = [
      "arts__profileBody___",
      "styles__sidebar___",
      "arts__header___",
      "arts__footer___",
    ];
    prefixes.forEach((prefix) => {
      const elements = [...document.querySelectorAll(`[class^='${prefix}']`)];
      elements.forEach((el) => {
        if (enabled) {
          el.style.transform = "rotate(180deg)";
          el.style.transformOrigin = "center center";
          el.style.transformStyle = "preserve-3d";
          el.style.backfaceVisibility = "hidden";
          el.style.transition = "transform 0.3s ease";
          el.style.overflow = "hidden";
        } else {
          el.style.transform = "";
          el.style.transformOrigin = "";
          el.style.transformStyle = "";
          el.style.backfaceVisibility = "";
          el.style.transition = "none";
          el.style.overflow = "";
        }
      });
    });

    replaceBackgrounds(enabled);
  }

  function applyQuickCSS(css) {
    let styleTag = document.getElementById("betterTrianguletQuickCSS");
    if (!styleTag) {
      styleTag = document.createElement("style");
      styleTag.id = "betterTrianguletQuickCSS";
      document.head.appendChild(styleTag);
    }
    styleTag.textContent = css || "";
  }

  function injectQuickCSSPanel() {
    if (document.getElementById("betterTrianguletQuickCSSPanel")) return;
    const mainContainer = document.querySelector(".styles__mainContainer___4TLvi-camelCase");
    if (!mainContainer) return;

    const panel = document.createElement("div");
    panel.id = "betterTrianguletQuickCSSPanel";
    panel.className = "styles__infoContainer___2uI-S-camelCase";
    panel.style.backgroundColor = getThemeColor();

    const headerRow = document.createElement("div");
    headerRow.className = "styles__headerRow___1tdPa-camelCase";

    const icon = document.createElement("i");
    icon.className = "fas fa-palette styles__headerIcon___1ykdN-camelCase";
    icon.setAttribute("aria-hidden", "true");

    const headerText = document.createElement("div");
    headerText.className = "styles__infoHeader___1lsZY-camelCase";
    headerText.textContent = "Quick CSS";

    headerRow.appendChild(icon);
    headerRow.appendChild(headerText);

    const textarea = document.createElement("textarea");
    textarea.id = "betterTrianguletQuickCSSTextarea";
    textarea.placeholder = "Enter your custom CSS here...";
    Object.assign(textarea.style, {
      width: "100%",
      minHeight: "120px",
      marginTop: "1vw",
      backgroundColor: "rgba(255, 255, 255, 0.05)",
      color: "inherit",
      border: "1px solid var(--accent)",
      borderRadius: "0.3vw",
      padding: "0.5vw",
      fontFamily: "monospace",
      fontSize: "1vw",
      resize: "vertical",
    });

    textarea.value = localStorage.getItem("betterTriangulet_quickCSS") || "";
    textarea.addEventListener("input", () => {
      const css = textarea.value;
      applyQuickCSS(css);
      localStorage.setItem("betterTriangulet_quickCSS", css);
    });

    panel.appendChild(headerRow);
    panel.appendChild(textarea);
    mainContainer.appendChild(panel);

    applyQuickCSS(textarea.value);
  }

  function removeQuickCSSPanel() {
    const panel = document.getElementById("betterTrianguletQuickCSSPanel");
    if (panel) panel.remove();
    const styleTag = document.getElementById("betterTrianguletQuickCSS");
    if (styleTag) styleTag.remove();
  }

  function injectQuickJSPanel() {
    if (document.getElementById("betterTrianguletQuickJSPanel")) return;
    const mainContainer = document.querySelector(".styles__mainContainer___4TLvi-camelCase");
    if (!mainContainer) return;

    const panel = document.createElement("div");
    panel.id = "betterTrianguletQuickJSPanel";
    panel.className = "styles__infoContainer___2uI-S-camelCase";
    panel.style.backgroundColor = getThemeColor();

    const headerRow = document.createElement("div");
    headerRow.className = "styles__headerRow___1tdPa-camelCase";

    const icon = document.createElement("i");
    icon.className = "fas fa-terminal styles__headerIcon___1ykdN-camelCase";
    icon.setAttribute("aria-hidden", "true");

    const headerText = document.createElement("div");
    headerText.className = "styles__infoHeader___1lsZY-camelCase";
    headerText.textContent = "Quick JS";

    headerRow.appendChild(icon);
    headerRow.appendChild(headerText);

    const textarea = document.createElement("textarea");
    textarea.id = "betterTrianguletQuickJSTextarea";
    textarea.placeholder = "Enter your JavaScript here...";
    Object.assign(textarea.style, {
      width: "100%",
      minHeight: "120px",
      marginTop: "1vw",
      backgroundColor: "rgba(255, 255, 255, 0.05)",
      color: "inherit",
      border: "1px solid var(--accent)",
      borderRadius: "0.3vw",
      padding: "0.5vw",
      fontFamily: "monospace",
      fontSize: "1vw",
      resize: "vertical",
    });

    textarea.value = localStorage.getItem("betterTriangulet_quickJS") || "";
    textarea.addEventListener("input", () => {
      const code = textarea.value;
      try {
        if (code.trim()) {
          // eslint-disable-next-line no-eval
          eval(code);
        }
      } catch (e) {
        console.error("Quick JS eval error:", e);
      }
      localStorage.setItem("betterTriangulet_quickJS", code);
    });

    panel.appendChild(headerRow);
    panel.appendChild(textarea);
    mainContainer.appendChild(panel);

    // Run the saved code immediately on load
    if (textarea.value.trim()) {
      try {
        // eslint-disable-next-line no-eval
        eval(textarea.value);
      } catch (e) {
        console.error("Quick JS eval error:", e);
      }
    }
  }

  function removeQuickJSPanel() {
    const panel = document.getElementById("betterTrianguletQuickJSPanel");
    if (panel) panel.remove();
  }

  function createModal() {
    const profileBody = document.querySelector(".arts__profileBody___eNPbH-camelCase");
    if (!profileBody) return;

    const modal = document.createElement("div");
    modal.id = "betterTrianguletModalOverlay";
    Object.assign(modal.style, {
      position: "absolute",
      top: profileBody.offsetTop + "px",
      left: profileBody.offsetLeft + "px",
      width: profileBody.offsetWidth + "px",
      height: profileBody.offsetHeight + "px",
      zIndex: "9999",
      backgroundColor: getThemeColor(),
      color: "inherit",
      borderRadius: "0.5vw",
      overflowY: "auto",
      padding: "2vw",
      fontFamily: "Nunito, sans-serif",
      display: "flex",
      flexDirection: "column",
      boxSizing: "border-box",
    });

    const closeBtn = document.createElement("div");
    closeBtn.textContent = "X";
    Object.assign(closeBtn.style, {
      position: "absolute",
      top: "1vw",
      right: "1.2vw",
      fontFamily: "'Titan One', sans-serif",
      fontSize: "2.5vw",
      color: "#ff4d4d",
      cursor: "pointer",
      userSelect: "none",
      zIndex: "10000",
      transition: "transform 0.15s ease-in-out",
    });
    closeBtn.onmouseenter = () => (closeBtn.style.transform = "scale(1.2)");
    closeBtn.onmouseleave = () => (closeBtn.style.transform = "scale(1)");
    closeBtn.onclick = () => modal.remove();

    const title = document.createElement("div");
    title.textContent = "Plugin Manager";
    Object.assign(title.style, {
      fontSize: "2vw",
      fontWeight: "800",
      marginBottom: "1vw",
      color: "var(--accent)",
      userSelect: "none",
    });

    const content = document.createElement("div");
    Object.assign(content.style, {
      fontSize: "1.2vw",
      flexGrow: "1",
      marginBottom: "2vw",
      whiteSpace: "pre-wrap",
    });

    const pluginOptions = [
      {
        name: "Quick CSS",
        storage: "quickCSS_enabled",
        onEnable: injectQuickCSSPanel,
        onDisable: removeQuickCSSPanel,
      },
      {
        name: "Quick JS",
        storage: "quickJS_enabled",
        onEnable: injectQuickJSPanel,
        onDisable: removeQuickJSPanel,
      },
      {
        name: "April Fools",
        storage: "aprilFools_enabled",
        onEnable: () => toggleFlip(true),
        onDisable: () => toggleFlip(false),
      },
    ];

    pluginOptions.forEach((opt) => {
      const toggle = document.createElement("label");
      toggle.textContent = opt.name;
      Object.assign(toggle.style, {
        display: "flex",
        alignItems: "center",
        justifyContent: "space-between",
        marginTop: "1vw",
        marginBottom: "1vw",
        fontWeight: "bold",
        fontSize: "1.2vw",
        cursor: "default",
        userSelect: "none",
      });

      const checkbox = document.createElement("input");
      checkbox.type = "checkbox";
      checkbox.checked = localStorage.getItem(opt.storage) === "true";
      checkbox.onchange = () => {
        const enabled = checkbox.checked;
        localStorage.setItem(opt.storage, enabled);
        if (enabled) opt.onEnable();
        else opt.onDisable();
        location.reload();
      };

      toggle.appendChild(checkbox);
      content.appendChild(toggle);
    });

    const resetText = document.createElement("text");
    resetText.className = "styles__link___5UR6_-camelCase";
    resetText.textContent = "Reset Data";
    resetText.style.cursor = "pointer";
    resetText.style.textDecoration = "underline";
    resetText.style.display = "block";
    resetText.onclick = () => {
      if (confirm("Clear all localStorage data?")) {
        localStorage.clear();
        location.reload();
      }
    };

    content.appendChild(resetText);

    modal.appendChild(closeBtn);
    modal.appendChild(title);
    modal.appendChild(content);
    profileBody.parentElement.appendChild(modal);
  }

function injectPanel() {
  const mainContainer = document.querySelector(".styles__mainContainer___4TLvi-camelCase");
  if (!mainContainer || document.getElementById("betterTrianguletBox")) return;

  const container = document.createElement("div");
  container.className = "styles__infoContainer___2uI-S-camelCase";
  container.id = "betterTrianguletBox";
  container.style.backgroundColor = getThemeColor();

  const headerRow = document.createElement("div");
  headerRow.className = "styles__headerRow___1tdPa-camelCase";

  const icon = document.createElement("i");
  icon.className = "fas fa-code styles__headerIcon___1ykdN-camelCase";
  icon.setAttribute("aria-hidden", "true");

  const headerText = document.createElement("div");
  headerText.className = "styles__infoHeader___1lsZY-camelCase";
  headerText.textContent = "BetterTriangulet";

  const pluginDiv = document.createElement("div");

  // Manage Plugins link
  const pluginText = document.createElement("text");
  pluginText.className = "styles__link___5UR6_-camelCase";
  pluginText.id = "managePlugins";
  pluginText.textContent = "Manage Plugins";
  pluginText.style.cursor = "pointer";
  pluginText.style.textDecoration = "underline";
  pluginText.style.display = "block";
  pluginText.onclick = () => {
    if (!document.getElementById("betterTrianguletModalOverlay")) {
      createModal();
    }
  };

  // Reset Data link - placed under Manage Plugins
  const resetText = document.createElement("text");
  resetText.className = "styles__link___5UR6_-camelCase";
  resetText.textContent = "Reset Data";
  resetText.style.cursor = "pointer";
  resetText.style.textDecoration = "underline";
  resetText.style.display = "block";
  resetText.style.marginTop = "0.5vw";
  resetText.onclick = () => {
    if (confirm("Clear all localStorage data?")) {
      localStorage.clear();
      location.reload();
    }
  };

  pluginDiv.appendChild(pluginText);
  pluginDiv.appendChild(resetText);

  headerRow.appendChild(icon);
  headerRow.appendChild(headerText);
  container.appendChild(headerRow);
  container.appendChild(pluginDiv);
  mainContainer.appendChild(container);

  if (localStorage.getItem("quickCSS_enabled") === "true") injectQuickCSSPanel();
  if (localStorage.getItem("quickJS_enabled") === "true") injectQuickJSPanel();
}


  function centerProfileBody() {
    const profileBody = document.querySelector(".arts__profileBody___eNPbH-camelCase");
    if (!profileBody) return;
    if (location.pathname === "/stats") {
      profileBody.style.left = "50%";
      profileBody.style.transform = "translateX(calc(-50% + 100px))";
    }
  }

  window.addEventListener("load", () => {
    if (localStorage.getItem("aprilFools_enabled") === "true") toggleFlip(true);
    centerProfileBody();
    injectPanel();
  });

  applyQuickCSS(localStorage.getItem("betterTriangulet_quickCSS") || "");
  if (localStorage.getItem("quickJS_enabled") === "true") {
    try {
      // eslint-disable-next-line no-eval
      eval(localStorage.getItem("betterTriangulet_quickJS") || "");
    } catch (e) {
      console.error("Quick JS eval error:", e);
    }
  }
})();