MPP Custom Tags

MPP Custom Tags (MPPCT)

// ==UserScript==
// @name         MPP Custom Tags
// @namespace    http://tampermonkey.net/
// @version      1.9.3
// @description  MPP Custom Tags (MPPCT)
// @author       НУУЕ (discord - hyye.xyz)
// @match        *://multiplayerpiano.net/*
// @match        *://multiplayerpiano.org/*
// @match        *://www.multiplayerpiano.org/*
// @license      MIT
// @icon         https://www.google.com/s2/favicons?sz=64&domain=multiplayerpiano.net
// ==/UserScript==

/* globals MPP */

console.log('%cLoaded MPPCT! uwu','color:orange; font-size:15px;');
if (!localStorage.tag) localStorage.tag = JSON.stringify({ text: 'None', color: '#000000' });
if (!localStorage.knownTags) localStorage.knownTags = JSON.stringify({});

const ver = '1.9.3';
const knownTags = JSON.parse(localStorage.knownTags)

let tag = JSON.parse(localStorage.tag);

MPP.client.on('hi', () => {
    MPP.client.sendArray([{m: '+custom'}]);
});

function gradientTest(gradient) {
    if (!gradient) return false;

    const gradients = ['linear-gradient', 'radial-gradient', 'repeating-radial-gradient', 'conic-gradient', 'repeating-conic-gradient'];

    let gradientAllowed = false;

    if (!gradient.includes('"') && !gradient.includes(';') && !gradient.includes(':')) {
        gradients.forEach((Gradient) => {
            if (gradient.startsWith(Gradient)) {
                if (gradientAllowed) return;
                else gradientAllowed = true;
            }
        });
    }

    return gradientAllowed;
}

function updtag(text, color, _id, gradient) {
    if (text.length > 50) return;
    if (!MPP.client.ppl[_id]) return;
    if (document.getElementById(`nametag-${_id}`) != null) {
        document.getElementById(`nametag-${_id}`).remove();
    }
    knownTags[_id] = { text: text, color: color };
    let tagDiv = document.createElement('div')
    tagDiv.className = 'nametag';
    tagDiv.id = `nametag-${_id}`;
    tagDiv.style['background-color'] = color;
    if (gradientTest(gradient)) {
        tagDiv.style.background = gradient;
        knownTags[_id].gradient = gradient;
    }
    localStorage.knownTags = JSON.stringify(knownTags);
    tagDiv.innerText = text;
    document.getElementById(`namediv-${_id}`).prepend(tagDiv);
    document.getElementById(`namediv-${_id}`).title = 'This is an MPPCT user.';
}


function sendTag(id) {
    if (id) MPP.client.sendArray([{ m: 'custom', data: { m: 'mppct', text: tag.text, color: tag.color, gradient: tag.gradient }, target: { mode: 'id', id: id } }]);
    else MPP.client.sendArray([{m: 'custom', data: {m: 'mppct', text: tag.text, color: tag.color, gradient: tag.gradient}, target: { mode: 'subscribed' } }]);
}
function askForTags() {
    MPP.client.sendArray([{ m: 'custom', data: { m: 'mppctreq' }, target: { mode: 'subscribed' } }]);
}

MPP.client.on('custom', (c) => {
    const tag = c.data;
    if (tag.m == 'mppct') {
        if (typeof tag.text == 'string' &&
            (typeof tag.color == 'string' ||
             tag.gradient == 'string')
           ) {
            if (MPP.client.ppl[c.p]) {
                updtag(tag.text || 'None', tag.color || '#000000', c.p, tag.gradient);
            }
        }
    }
    if (tag.m == 'mppctreq') {
        if (MPP.client.ppl[c.p]) sendTag(c.p);
    }
});
MPP.client.on('p', (p) => {
    if (p._id == MPP.client.getOwnParticipant()._id) {
        updtag(tag.text, tag.color, MPP.client.getOwnParticipant()._id, tag.gradient);
        sendTag();
    }
});
MPP.client.on('c', () => {
    askForTags();
    sendTag();
    updtag(tag.text, tag.color, MPP.client.getOwnParticipant()._id, tag.gradient);
});

// Tags in chat
function addChatTag(msg) {
    if (msg.m == 'dm') return;
    if (!knownTags[msg.p._id]) return;
    let aTag;
    if (msg.p._id == MPP.client.getOwnParticipant()._id) aTag = tag;
    else aTag = knownTags[msg.p._id];

    let chatMessage = document.getElementById('msg-' + msg.id);
    let Span = document.createElement('span'); // <span style="background-color: ${aTag.color};color:#ffffff;" class="nametag">${aTag.text}</span>
    Span.style['background-color'] = aTag.color;
    if (knownTags[msg.p._id]) Span.style.background = aTag.gradient;
    Span.style.color = '#ffffff';
    Span.className = 'nametag';
    Span.innerText = aTag.text;
    chatMessage.appendChild(Span);
}

MPP.client.on('a', (msg) => {
    addChatTag(msg);
});

MPP.client.on('c', (msg) => {
    if (!Array.isArray(msg.c)) return;
    msg.c.forEach((msg) => {
        addChatTag(msg);
    });
});


// Buttons
const container = document.body.getElementsByClassName('dialog').rename;

const a = document.createElement('input');
a.id = 'tagtext';
a.name = 'tagtext';
a.type = 'text';
a.placeholder = 'Tag';
a.maxLength = '50';
a.className = 'text';
a.style = 'width: 100px; height: 20px;';
container.appendChild(a);

const q = document.createElement('input');
q.id = 'tagcolor';
q.name = 'tagcolor';
q.type = 'color';
q.placeholder = '';
q.maxlength = '7';
q.className = 'color';
container.appendChild(q);

const e = document.createElement('button');
e.addEventListener('click', () => {
    let tagtext = document.getElementById('tagtext');
    let tagcolor = document.getElementById('tagcolor');
    if (tagtext.value == '') return;
    let newTag = JSON.parse(localStorage.tag);
    newTag.text = tagtext.value || 'None';
    newTag.color = tagcolor.value || '#000000';
    localStorage.tag = JSON.stringify(newTag);
    tag = newTag;
    updtag(newTag.text, newTag.color, MPP.client.getOwnParticipant()._id, newTag.gradient);
    sendTag();
});
e.innerText = 'SET TAG';
e.className = 'top-button';
e.style.position = 'fixed';
e.style.height = '30px';
container.appendChild(e);

document.getElementById('tagtext').value = tag.text;
document.getElementById('tagcolor').value = tag.color;


//Version checker
function checkVersion() {
    fetch('https://raw.githubusercontent.com/Hyye123/MPPCT/main/version.json').then(r => r.json().then(json => {
        if (ver != json.latest) {
            setInterval(function() {
                MPP.chat.receive({
                    "m": "a",
                    "t": Date.now(),
                    "a": "Please update MPPCT https://greasyfork.org/ru/scripts/455137-mpp-custom-tags",
                    "p": {
                        "_id": "MPPCT",
                        "name": "MPPCT (eng)",
                        "color": "#ffffff",
                        "id": "MPPCT"
                    }
                });
                MPP.chat.receive({
                    "m": "a",
                    "t": Date.now(),
                    "a": "Пожалуйста обновите MPPCT https://greasyfork.org/ru/scripts/455137-mpp-custom-tags",
                    "p": {
                        "_id": "MPPCT",
                        "name": "MPPCT (rus)",
                        "color": "#ffffff",
                        "id": "MPPCT"
                    }
                });
            }, 30000);
        }
    }));
}
setInterval(checkVersion, 300000);
setTimeout(checkVersion, 10000);