// ==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);