🏠 

maskGPT

change avatar of ChatGPT


Install this script?
// ==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";
});
})();