Google Meet Formatting

Adds needed formatting codes to google meet

// ==UserScript==
// @name         Google Meet Formatting
// @namespace    https://github.com/ugackMiner53/Google-Meet-Formatting/
// @version      0.0.2
// @description  Adds needed formatting codes to google meet
// @author       ugackMiner
// @match        https://meet.google.com/*
// @grant        none
// ==/UserScript==

var chatbox;
var yourName;

function startingStuff()
{
    var isLoaded = false;
    var checkExist = setInterval(function() {
        if (document.getElementsByClassName("z38b6 CnDs7d hPqowe").length != 0 && !isLoaded) {
            isLoaded = true;
            console.log("Exists!, calling startup");
            clearInterval(checkExist);
            // Inserts some css for spoiler tags
            var styles = `.spoiler { color: black; background-color:black; display:inline-block; transition: background-color 0.3s; } .spoiler:hover { background-color: white; } blockquote { margin: 0; padding: 15px; background: #eee; border-radius: 5px; }`;
            var styleSheet = document.createElement("style");
            styleSheet.type = "text/css";
            styleSheet.innerText = styles;
            document.head.appendChild(styleSheet)
            startup();
        }
    }, 100);
    
    var startup = function() {
        // Applies an ID to the messagebox where the messages are shown
        chatbox = document.getElementsByClassName("z38b6 CnDs7d hPqowe")[0];
        chatbox.id = "chatbox";
        // Adds a mutation event to the messagebox to check for messages
        mutationObserver.observe(chatbox, {
            // Looks for new messages
            childList: true,
            // Looks for edits to existing messages (i.e a new message right after an old one)
            subtree: true
        });
        yourName = document.getElementsByClassName("ZjFb7c")[0].innerText;
        console.log("Loaded!");
        // If there are already messages, then loop through them and apply formatting
        if (document.getElementsByClassName("oIy2qc")[0])
        {
            for (let i = 0; i < document.getElementsByClassName("oIy2qc").length; i++) {
                oldMessageId = 0;
                onMessageEvent(document.getElementsByClassName("oIy2qc")[i]);
            }
        }
        // Go in a .5 sec loop to check if the chat window still exists
        var stillExists = setInterval(function () {
            if (!document.getElementsByClassName('z38b6 CnDs7d hPqowe').length) {
              clearInterval(stillExists);
              console.log("Lost connection!");
              startingStuff();
            }
        }, 500);
    };

}

var mutationObserver = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        onMessageEvent();
    });
});


var oldMessageId;
var mutedPeople = [];
function onMessageEvent(messageElement = null)
{
    if (document.getElementsByClassName("gYckH").length != 0 || oldMessageId === document.getElementsByClassName("oIy2qc").length - 1)
    {
        return;
    }
    if (messageElement === null)
        messageElement = document.getElementsByClassName("oIy2qc")[document.getElementsByClassName("oIy2qc").length - 1];
    var message = messageElement.innerHTML;
    var author = document.getElementsByClassName("YTbUzc")[document.getElementsByClassName("YTbUzc").length - 1].textContent;
    oldMessageId = document.getElementsByClassName("oIy2qc").length - 1;
        
    console.log(author + ": " + message + " - " + oldMessageId);

    // If the author is muted, hide their message
    mutedPeople.forEach(mutedPerson => {
        if (author.includes(mutedPerson))
        {
            messageElement.innerHTML = "";
            message = "";
            return;
        }
    });


    // Replace $$link$$ with an image
    if (/\$\$(.+?)\$\$/g.test(messageElement.innerHTML))
    {
        messageElement.innerHTML = messageElement.innerHTML.replace(/\$\$(.*?)\$\$/g, "$1");
        messageElement.innerHTML = messageElement.innerHTML.replace(/\<a(.*?)\>(.*?)\<\/a\>/g, "<img style=\"max-width: 200px; max-height: 200px\" src=\"$2\"></img>");
    }

    // If the message contains a link, skip formatting the message in fear of formatting the link on accident
    if(new RegExp(/https?:\/\/(www.)?./).test(message)) {
        return;
    }


    // Replace ** with bold
    messageElement.innerHTML = messageElement.innerHTML.replace(/\*\*(.+?)\*\*/g, "<b>$1</b>");
    // Replace * with italics
    messageElement.innerHTML = messageElement.innerHTML.replace(/\*(.+?)\*/g, "<i>$1</i>");
    // Replace _ with underline
    messageElement.innerHTML = messageElement.innerHTML.replace(/\_(.+?)\_/g, "<u>$1</u>");
    // Replace ~~ with strikethrough
    messageElement.innerHTML = messageElement.innerHTML.replace(/\~\~(.+?)\~\~/g, "<s>$1</s>");
    // Replace ^ with superscript (range of characters)
    messageElement.innerHTML = messageElement.innerHTML.replace(/\^(.+?)\^/g, "<sup>$1</sup>");
    // Replace ^ with superscript (single character)
    messageElement.innerHTML = messageElement.innerHTML.replace(/\^(\d)/g, "<sup>$1</sup>");
    // Replace || with custom spoiler spans
    messageElement.innerHTML = messageElement.innerHTML.replace(/\|\|(.+?)\|\|/g, "<p class='spoiler'>$1</p>");
    // Replace ``` with code blocks
    messageElement.innerHTML = messageElement.innerHTML.replace(/\`\`\`(.+?)\`\`\`/g, "<pre><code>$1</code></pre>");
    // Replace ` with inline code
    messageElement.innerHTML = messageElement.innerHTML.replace(/\`(.+?)\`/g, "<code>$1</code>");
    // Replace "" with a block quote
    messageElement.innerHTML = messageElement.innerHTML.replace(/\"\"(.+?)\"\"/g, "<blockquote><p>$1</p></blockquote>");
    // Replace # with highlighting
    messageElement.innerHTML = messageElement.innerHTML.replace(/\#(.+?)\#/g, "<mark>$1</mark>");

    
    if (message.includes("/tableflip"))
        messageElement.innerHTML = "(╯°□°)╯︵ ┻━┻";
    else if (message.includes("/shrug"))
        messageElement.innerHTML = "¯\\_(ツ)_/¯";
    else if (message.includes("/unflip"))
        messageElement.innerHTML = "┬─┬ ノ( ゜-゜ノ)";
    else if (message.includes("/mute") && message.match(/@([^\s]+)/) && author === "You")
    {
        var pmName = message.match(/@([^\s]+)/)[1];
        pmName = pmName.replace(/\@(.+?)/g, "");
        console.log(pmName);
        mutedPeople.push(pmName);
    }
    else if (message.includes("/unmute") && message.match(/@([^\s]+)/) && author === "You")
    {
        var pmName = message.match(/@([^\s]+)/)[1];
        pmName = pmName.replace(/\@(.+?)/g, "");
        mutedPeople = mutedPeople.filter(e => e !== pmName);
    }

    // Check if message includes @
    if (message.match(/@([^\s]+)/))
    {
        var pmName = message.match(/@([^\s]+)/)[1];
        pmName = pmName.replace(/\@(.+?)/g, "");
        // Check if your name includes what they selected
        if (yourName.includes(pmName))
        {
            messageElement.innerHTML = "<mark>" + message + "</mark>";
        }
        else if (author !== "You")
        {
            console.log(yourName + " - " + pmName);
            messageElement.innerHTML = "<sub><i>Private message sent</i></sub>";
        }
    }





}

startingStuff();