tkrclient

try out extension on https://github.com/tkrclient/tkrclient ---------------------------- this script only works on the website "iogames.fun", allows for color picking, name copy to your username, and reduction of spam messages by disallowing long string of text, and disallowing certain unicodes (not emojis)

// ==UserScript==
// @name         tkrclient
// @version      1.46
// @author       TKR MrGames
// @match        http*://*.iogames.fun/*
// @locale       en
// @description  try out extension on https://github.com/tkrclient/tkrclient ---------------------------- this script only works on the website "iogames.fun", allows for color picking, name copy to your username, and reduction of spam messages by disallowing long string of text, and disallowing certain unicodes (not emojis)
// @license      MIT
// @namespace    script727288273783
// ==/UserScript==


(function() {


    /*---- Delete all script tags ----*/
    var scriptTags = document.querySelectorAll('script');
    scriptTags.forEach(function(scriptTag) {
      if (scriptTag.parentNode) {
        scriptTag.parentNode.removeChild(scriptTag);
      }
    });


    /*---- Html editing for lightweight page ----*/
    // Remove ALL CSS
    /*const header = document.querySelector('head'); {
      header?.remove()
    }*/
    // Remove the games on main page
    const mainpage = document.querySelector('main'); {
      mainpage?.remove()
    }
    // Remove the bottom text on main page
    const mainpage2 = document.querySelector('.main'); {
      mainpage2?.remove()
    }
    // Remove the side bar
    const asidepage = document.querySelector('aside'); {
      asidepage?.remove()
    }
    // Remove the navigation bar (navbar)
    /*const navpage = document.querySelector('nav'); {
      navpage?.remove()
    }*/
    // Remove sign-in
    const logon = document.getElementById('signin-widget'); {
      logon?.remove()
    }
    // Remove website Logo
    const logo = document.querySelector(".logo"); {
      logo?.remove()
    }
    // Remove languages on navbar
    const lang = document.querySelector(".lang"); {
      lang?.remove()
    }
    // Remove search bar on navbar
    const search = document.querySelector(".margin"); {
      search?.remove()
    }
    // Remove chat messages
    /*const chats = document.getElementById('messages'); {
      chats?.remove()
    }*/


    /*---- Move chat box upwards ----*/
    var bodycon = document.querySelector('body');
    var append = document.querySelector('.chat-send');
    var prepend = document.querySelector('#messages');


    /*---- Higher char limits ----*/
    // Higher character limit for chat box
    const messageInput = document.getElementById('message'); {
      messageInput.setAttribute('maxlength', '1000'); // 400 character limit
    }
    // Higher character limit for name box
    const nameInput = document.getElementById('name'); {
      nameInput.setAttribute('maxlength', '1000'); // 400 character limit
    }


    /*---- CSS customizations ----*/
    // Create a new style element
    var styleElement = document.createElement('style');
    // Define the CSS rules you want to apply
    var cssRules = `
       .sendUp {
            grid-template-areas: "nav     nav  nav     " "sidebar main name    " "sidebar main messages    " "sidebar main send    "
       }


       body .styleMessage {
            grid-area: messages;
            background-color: rgba(255,255,255,0.05);
            box-sizing: border-box;
            display: flex;
            flex-direction: column-reverse;
            padding: 0.5rem;
            overflow-wrap: normal;
            border-left: 1px solid rgba(0,0,0,0.25);
            overflow-y: scroll;
            scrollbar-color: transparent rgba(255,255,255,0.05);
            scrollbar-width: none
        }
        body .styleMessage .entry {
            margin-top:1rem
        }
        body .styleMessage .entry a,
        body .styleMessage .entry a:visited {
            display:inline-block;
            vertical-align:middle
        }
        body .styleMessage .entry a:hover img,
        body .styleMessage .entry a:visited:hover img {
            opacity:1
        }
        body .styleMessage .entry a img,
        body .styleMessage .entry a:visited img {
            opacity:0.5;
            margin-left:0.5rem
        }
        body .styleMessage .entry .time,
        body .styleMessage .entry .name {
            font-size:0.9rem
        }
        body .styleMessage .entry .time {
            opacity:0.5
        }
        body .styleMessage .entry .system {
            color:#3f0;
            font-weight:bold;
            text-shadow:0 0 0.5rem #3f0
        }
    `;
    // Set the CSS rules as the content of the style element
    styleElement.innerHTML = cssRules;
    // Append the style element to the document head
    document.head.appendChild(styleElement);
    // Add the new class to the element
    bodycon.classList.add('sendUp');
    // Add class styleMessage to Message element
    prepend.classList.remove('chat-messages');
    prepend.classList.add('styleMessage');


    /*---- Name color changes ----*/
    var namecolor = document.getElementById('colorpicker');
    // Function (for some reason only loads after few seconds)
    function func() {
      namecolor.style.removeProperty('all');
      namecolor.style.color = 'rgb(255, 0, 0)'; // CHANGE COLOR HERE! <---------------------------
    }
    setTimeout(func, 3000);


    /*---- Click colors and names ----*/
    // Function (for some reason only loads after few seconds)
    function mess() {
      // Get the elements whose color and text you want to copy
      const sourceElements = document.querySelectorAll('#messages .entry .name');
      // Get the elements where you want to copy the color and text
      const targetColorElement = document.getElementById('colorpicker');
      const targetTextElement = document.getElementById('name');
      addClickListeners(sourceElements, targetColorElement, targetTextElement);
      // Set up a mutation observer to watch for new elements
      const observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
          if (mutation.type === 'childList') {
            const newSourceElements = document.querySelectorAll('#messages .entry .name');
            addClickListeners(newSourceElements, targetColorElement, targetTextElement);
          }
        });
      });
      // Start observing the #messages element for changes
      observer.observe(document.getElementById('messages'), { childList: true });
      function addClickListeners(elements, targetColorElement, targetTextElement) {
        elements.forEach(element => {
          element.addEventListener('click', () => {
            // Get the computed color of the source element
            const computedColor = window.getComputedStyle(element).color;
            // Convert the color to an RGB object
            const rgbColor = convertColorToRGB(computedColor);
            // Apply the color to the target element
            targetColorElement.style.color = `rgb(${rgbColor.red}, ${rgbColor.green}, ${rgbColor.blue})`;

            // Copy the text content of the clicked element, removing the last character
            const innerText = element.textContent;
            if (innerText.length > 1) {
              targetTextElement.value = innerText.slice(0, -1);
            } else {
              targetTextElement.value = innerText;
            }
          });
        });
      }
      function convertColorToRGB(colorString) {
        // Remove the "rgb(" and ")" from the string
        const colorValues = colorString.slice(4, -1).split(', ');
        return {
          red: parseInt(colorValues[0]),
          green: parseInt(colorValues[1]),
          blue: parseInt(colorValues[2])
        };
      }
    }
    setTimeout(mess, 6000);


    /*---- Debloating html ----*/
    // Function (for some reason only loads after few seconds)
    function debloat() {
      const fbroot = document.getElementById('fb-root'); {
        fbroot?.remove()
      }
      const iframetag = document.querySelector('iframe'); {
        iframetag?.remove()
      }
    }
    setTimeout(debloat, 3000);


    /*---- Removing Unicode ----*/
    // Function (for some reason only loads after few seconds)
    function removeUnicodeFromElements() {
      console.log('Removing Unicode from elements...');
      // Get all the ".message" elements nested under the ".entry" class and "#messages" parent
      const messageElements = document.querySelectorAll('#messages .entry .message');
      messageElements.forEach(element => {
        // use /[^\u0000-\u007F]/g for ALL unicode characters (including emojies)!
        element.textContent = element.textContent.replace(/[^\u0000-\u007F\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{1F900}-\u{1F9FF}\u{1F500}-\u{1F5FF}\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/gu, '');
      });
      // Get all the ".name" elements nested under the ".entry" class and "#messages" parent
      const nameElements = document.querySelectorAll('#messages .entry .name');
      nameElements.forEach(element => {
        // use /[^\u0000-\u007F]/g for ALL unicode characters (including emojies)!
        element.textContent = element.textContent.replace(/[^\u0000-\u007F\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{1F900}-\u{1F9FF}\u{1F500}-\u{1F5FF}\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/gu, '');
      });
    }
    // Run the function to remove Unicode characters after a 3-second delay
    setTimeout(removeUnicodeFromElements, 3000);
    // Set up a mutation observer to watch for new elements
    const observer = new MutationObserver(function(mutations) {
      mutations.forEach(function(mutation) {
        if (mutation.type === 'childList') {
          console.log('New elements added, running Unicode removal...');
          removeUnicodeFromElements();
        }
      });
    });
    // Start observing the "#messages" element for changes after a 3-second delay
    setTimeout(function() {
      observer.observe(document.getElementById('messages'), { childList: true });
    }, 3000);


    /* Keybindings for [ ] and \ to change colors */
    // Listen for the 'keypress' event on the document
    document.addEventListener('keypress', function(event) {
      // Check if the pressed key is the 'Enter' key
      function red() {
        namecolor.style.removeProperty('all');
        namecolor.style.color = 'rgb(255, 0, 0)'; // red
      }
      function green() {
        namecolor.style.removeProperty('all');
        namecolor.style.color = 'rgb(0, 255, 0)'; // green
      }
      function blue() {
        namecolor.style.removeProperty('all');
        namecolor.style.color = 'rgb(0, 0, 255)'; // blue
      }
      if (event.key === '[') { // [
        // Call the function you want to activate
        red();
      }
      if (event.key === ']') { // ]
        // Call the function you want to activate
        green();
      }
      if (event.key === '\\') { // \
        // Call the function you want to activate
        blue();
      }
    });


})();