maskGPT

change avatar of ChatGPT

Fra og med 30.04.2023. Se den nyeste version.

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         maskGPT
// @namespace    chatgpt.mask
// @version      1.0
// @description  change avatar of ChatGPT
// @author       realian
// @license      MIT
// @match        *://chat.openai.com/*
// @run-at       document-start
// ==/UserScript==

(function () {
    'use strict';

    // Your code here...
    let uploadedImage = null;
    let characterName = 'Maria';
    let imageHeight = '20vh';
    let imageWidth = '10vh';
    let border = "2px solid #0e0e0e";
    let borderRadius = '10rem';

    // Function to handle the uploaded image
    function handleUploadedImage(event) {
        const file = event.target.files[0];
        const reader = new FileReader();

        reader.onload = (e) => {
            uploadedImage = new Image();
            uploadedImage.src = e.target.result;
            uploadedImage.style.height = "100%";
            uploadedImage.style.width = "100%";
            uploadedImage.style.objectFit = "cover";
            uploadedImage.style.borderRadius = borderRadius;
            uploadedImage.style.border = border;
        };

        if (file) {
            reader.readAsDataURL(file);
        }
    }

    // Function to handle Avatar manipulation
    function manipulateSvgElements(svgElement) {
        // Check if image uploaded
        if (!uploadedImage) {
            console.log("Image not uploaded.");
            return;
        }
        // Check if the svg element has already been manipulated
        if (svgElement.classList.contains("manipulated")) {
            return;
        }
        svgElement.classList.add("manipulated");
        const grandparentElement = svgElement.parentNode.parentNode;

        // Hide all children of the grandparent element
        grandparentElement.querySelectorAll("*").forEach(child => {
            child.style.display = "none";
        });

        // Add a new child element to the grandparent element
        const newChildElement = document.createElement("div");
        newChildElement.style.height = imageHeight;
        newChildElement.style.width = imageWidth;
        grandparentElement.appendChild(newChildElement);

        newChildElement.appendChild(uploadedImage.cloneNode(true));

    }
    // Function to handle Name append
    function manipulateMarkdownElements(markdownElement) {
        // Check if image uploaded
        if (!uploadedImage) {
            console.log("Image not uploaded.");
            return;
        }
        // Check if the svg element has already been manipulated
        if (markdownElement.classList.contains("manipulated")) {
            return;
        }
        markdownElement.classList.add("manipulated");
        const grandgrandparentElement = markdownElement.parentNode.parentNode.parentNode;


        // Add a new child element to the grandparent element
        const newChildElement = document.createElement("p");
        newChildElement.innerText = characterName;
        newChildElement.style.fontSize = "large";
        newChildElement.style.fontWeight = "bold";
        grandgrandparentElement.insertBefore(newChildElement, grandgrandparentElement.firstChild);

    }

    // Observe DOM changes
    const observer = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
            if (mutation.type === "childList") {
                mutation.addedNodes.forEach((node) => {
                    if (node.nodeType === Node.ELEMENT_NODE) {
                        const svgElement = node.querySelector("svg.h-6.w-6");
                        if (svgElement) {
                            console.log("Changing avatar...");
                            const markdownElement = node.querySelector("div.markdown");
                            manipulateSvgElements(svgElement);
                            manipulateMarkdownElements(markdownElement);
                        }
                    }
                });
            }
        });
    });

    observer.observe(document.body, { childList: true, subtree: true });

    // Inject the input element for uploading an avatar
    const inputElement = document.createElement("input");
    inputElement.type = "file";
    inputElement.style.color = "black";
    inputElement.accept = "image/*";
    inputElement.addEventListener("change", handleUploadedImage);
    //document.body.appendChild(inputElement);
    // Create input elements for user-defined values
    const characterNameInput = document.createElement("input");
    characterNameInput.type = "text";
    characterNameInput.placeholder = "Character Name";
    characterNameInput.value = "Maria";
    characterNameInput.style.color = 'black';
    const imageHeightInput = document.createElement("input");
    imageHeightInput.type = "text";
    imageHeightInput.placeholder = "Image Height";
    imageHeightInput.value = "20vh";
    imageHeightInput.style.color = 'black';
    const imageWidthInput = document.createElement("input");
    imageWidthInput.type = "text";
    imageWidthInput.placeholder = "Image Width";
    imageWidthInput.value = "10vh";
    imageWidthInput.style.color = 'black';
    const borderRadiusInput = document.createElement("input");
    borderRadiusInput.type = "text";
    borderRadiusInput.placeholder = "Border Radius";
    borderRadiusInput.value = "10rem";
    borderRadiusInput.style.color = 'black';
    const borderInput = document.createElement("input");
    borderInput.type = "text";
    borderInput.placeholder = "Border [e.g. 1px solid black]";
    borderInput.value = "2px solid #0e0e0e";
    borderInput.style.color = 'black';
    // Update the input elements' event listeners
    characterNameInput.addEventListener("input", (event) => {
        characterName = event.target.value;
    });

    imageHeightInput.addEventListener("input", (event) => {
        imageHeight = event.target.value;
    });

    imageWidthInput.addEventListener("input", (event) => {
        imageWidth = event.target.value;
    });

    borderRadiusInput.addEventListener("input", (event) => {
        borderRadius = event.target.value;
    });
    borderInput.addEventListener("input", (event) => {
        border = event.target.value;
    });


    // Deal with initialization
    // Function to manipulate all available svg.h-6.w-6 elements
    function manipulateAllSvgElements() {
        if (!uploadedImage) {
            return;
        }

        const svgElements = document.querySelectorAll("svg.h-6.w-6");
        svgElements.forEach((svgElement) => {
            manipulateSvgElements(svgElement);
        });
    }
    // Function to manipulate all available div.markdown elements
    function manipulateAllMarkdownElements() {
        if (!uploadedImage) {
            return;
        }

        const markdownElements = document.querySelectorAll("div.markdown");
        markdownElements.forEach((markdownElement) => {
            manipulateMarkdownElements(markdownElement);
        });
    }
    function manipulateAll() {
        manipulateAllMarkdownElements();
        manipulateAllSvgElements();
    }
// Function to create a label and input pair
function createLabeledInput(labelText, inputElement) {
    const label = document.createElement("label");
    label.textContent = labelText;
    label.style.display = "block";
    label.style.marginTop = "10px";
    label.style.color = "black";

    const container = document.createElement("div");
    container.appendChild(label);
    container.appendChild(inputElement);

    return container;
  }

    // Inject the button for manipulating all available svg.h-6.w-6 elements
    const manipulateAllButton = document.createElement("button");
    manipulateAllButton.innerText = "Render All";
    manipulateAllButton.style.backgroundColor = "green";
    manipulateAllButton.addEventListener("click", manipulateAll);
    //document.body.appendChild(manipulateAllButton);
    // Create the config button
    const configButton = document.createElement("button");
    configButton.innerText = "Config";
    configButton.style.position = "fixed";
    configButton.style.top = "10px";
    configButton.style.right = "10px";
    configButton.style.zIndex = "10000";
    document.body.appendChild(configButton);

    // Create the popup div
    const popupDiv = document.createElement("div");
    popupDiv.style.display = "none";
    popupDiv.style.position = "fixed";
    popupDiv.style.top = "50%";
    popupDiv.style.left = "50%";
    popupDiv.style.transform = "translate(-50%, -50%)";
    popupDiv.style.backgroundColor = "white";
    popupDiv.style.padding = "20px";
    popupDiv.style.border = "1px solid #ccc";
    popupDiv.style.zIndex = "10001";
    document.body.appendChild(popupDiv);

    // Move the existing buttons and input element into the popup div
    popupDiv.appendChild(inputElement);
    popupDiv.appendChild(document.createElement("br"));
// Add labeled input elements to the popup div
popupDiv.appendChild(createLabeledInput("File:", inputElement));
popupDiv.appendChild(document.createElement("br"));
popupDiv.appendChild(createLabeledInput("Character Name:", characterNameInput));
popupDiv.appendChild(document.createElement("br"));
popupDiv.appendChild(createLabeledInput("Image Height:", imageHeightInput));
popupDiv.appendChild(document.createElement("br"));
popupDiv.appendChild(createLabeledInput("Image Width:", imageWidthInput));
popupDiv.appendChild(document.createElement("br"));
popupDiv.appendChild(createLabeledInput("Border: [format: size style color]", borderInput));
popupDiv.appendChild(document.createElement("br"));
popupDiv.appendChild(createLabeledInput("Border Radius:", borderRadiusInput));
popupDiv.appendChild(document.createElement("br"));
popupDiv.appendChild(manipulateAllButton);
popupDiv.appendChild(document.createElement("br"));

    // Create the close button
    const closeButton = document.createElement("button");
    closeButton.innerText = "Close";
    closeButton.style.backgroundColor = "red";
    closeButton.addEventListener("click", () => {
        popupDiv.style.display = "none";
    });
    popupDiv.appendChild(closeButton);

    // Show the popup div when the config button is clicked
    configButton.addEventListener("click", () => {
        popupDiv.style.display = "block";
    });

})();