// ==UserScript==
// @name Skribbl.io's first add-on
// @namespace http://tampermonkey.net/
// @version 0.4
// @description Adds a handy color wheel on holding down right-click, the option to mute and remove all messages issued by a specific player, a screenshot button with a toggle hotkey (~), as well as a checkbox to automatically save (download) and rename every drawing of a session.
// @author AllStorm
// @match https://skribbl.io/*
// @grant none
// ==/UserScript==
//AllStorm's attempt at a color wheel palette and a save image button.
var canvas = document.createElement('canvas');
var mousePosition = {
x: 0,
y: 0
};
var piePosition = {
x: 0,
y: 0
};
var pie = false;
var selectedColor = 0;
var lastColor = 0;
var selectedAngle = 0;
var colorCount = document.getElementsByClassName("colorItem").length;
var colorTable = [0, 1, 12, 11, 21, 13, 10, 14, 2, 3, 15, 4, 5, 16, 18, 17, 7, 6, 19, 8, 20, 9];
canvas.id = "PieMenu";
document.body.appendChild(canvas);
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
canvas.style.position = "absolute";
canvas.style.backgroundColor = "transparent";
canvas.style.zIndex = 8;
canvas.style.left = 0;
canvas.style.top = 0;
canvas.style.pointerEvents = "none";
pieAngle = 360 / (colorCount);
PieMenu = document.getElementById("PieMenu");
var ctx = canvas.getContext("2d");
var textBox;
var checkbox = document.createElement('input');
var muteArray = {};
function setupImageButton() {
let getImageBtn = document.createElement('a');
let buttonText = document.createTextNode("Save image");
getImageBtn.appendChild(buttonText);
getImageBtn.style.fontSize = "12px";
getImageBtn.style.cursor = "pointer";
getImageBtn.style.display = "block";
getImageBtn.style.padding = "10px";
getImageBtn.style.borderRadius = "2px";
getImageBtn.style.fontWeight = "bold";
getImageBtn.style.background = "#5cb85c";
getImageBtn.style.color = "white";
getImageBtn.style.textAlign = "center";
getImageBtn.style.textDecoration = "none";
getImageBtn.style.marginTop = "5px";
document.getElementsByClassName("tooltip-wrapper")[0].appendChild(getImageBtn);
textBox = document.createElement("textarea");
textBox.style.resize = "none";
textBox.style.height = "30px";
textBox.style.width = "159px";
textBox.style.fontWeight = "bold";
textBox.style.marginTop = "5px";
textBox.style.marginRight = "9px";
textBox.style.padding = "5px";
textBox.placeholder = "skribbl-Drawing";
textBox.style.textAlign = "center";
textBox.style.fontSize = "11px";
document.getElementsByClassName("tooltip-wrapper")[0].appendChild(textBox);
document.getElementsByClassName("tooltip-wrapper")[0].appendChild(checkbox);
checkbox.type = "checkbox";
getImageBtn.addEventListener('click', function () {
getImageFunction(getImageBtn);
}, false);
return getImageBtn;
};
var text = document.getElementById("overlay").getElementsByClassName("content")[0].getElementsByClassName("text")[0];
text.addEventListener('DOMSubtreeModified', function () {
if (checkbox.checked && text.textContent.includes("The word was: ")){
textBox.value = "skribbl-" + text.textContent.substring(text.textContent.indexOf(":") + 2);
getImageButton.click();
};
}, false);
PlayerList = document.getElementById("containerGamePlayers");
Messages = document.getElementById("boxMessages");
PlayerList.addEventListener('DOMSubtreeModified', function () {
muteArray = {};
for (let i = 0; i < PlayerList.childNodes.length; i++){
if (PlayerList.childNodes[i].getElementsByClassName("mute")[0]){
if (PlayerList.childNodes[i].getElementsByClassName("mute")[0].checked){
muteArray[i] = PlayerList.childNodes[i].getElementsByClassName("info")[0].getElementsByClassName("name")[0].textContent;
};
} else{
let checkbox = document.createElement('input');
checkbox.className = "mute";
checkbox.type = "checkbox";
checkbox.style.width = "30px";
checkbox.style.height = "30px";
checkbox.addEventListener('change', function() {
let name = this.parentElement.getElementsByClassName("info")[0].getElementsByClassName("name")[0];
flagMessage = this.parentElement.getElementsByClassName("message")[0]
if(this.checked) {
for (i = 0; i< Messages.childNodes.length; i++){
message = Messages.childNodes[i]
if(message.getElementsByTagName("b")[0]){
if(message.getElementsByTagName("b")[0].textContent.indexOf(name.textContent) !== -1) {
message.parentElement.removeChild(message);
};
};
};
name.style.visibility = "hidden";
flagMessage.style.visibility = "hidden";
} else {
name.style.visibility = "visible";
flagMessage.style.visibility = "visible";
};
});
PlayerList.childNodes[i].insertBefore(checkbox, PlayerList.childNodes[i].getElementsByClassName("message")[0]);
};
};
}, false);
Messages.addEventListener('DOMSubtreeModified', function () {
let message = Messages.childNodes[Messages.childNodes.length-1]
for (name in muteArray){
if(message.getElementsByTagName("b")[0]){
console.log(message.getElementsByTagName("b")[0].textContent + " " + name);
if(message.getElementsByTagName("b")[0].textContent.indexOf(muteArray[name]) !== -1) {
message.parentElement.removeChild(message);
};
};
};
});
function getImageFunction(button) {
var gameCanvas = document.getElementById("canvasGame")
button.href = gameCanvas.toDataURL();
console.log(textBox.value);
if (textBox.value){
button.download = textBox.value + '.png';
} else {
button.download = 'skribbl-Drawing.png';
};
};
function drawPie() {
selectedAngle = 360 - Math.atan2(piePosition.x - mousePosition.x, piePosition.y - mousePosition.y) * 180 / Math.PI;
if (selectedAngle >= 360) {
selectedAngle -= 360
};
selectedAngle += 90;
if (selectedAngle >= 360) {
selectedAngle -= 360
};
lastColor = selectedColor;
selectedColor = Math.floor(selectedAngle / pieAngle);
if (selectedColor != lastColor) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.shadowBlur = 50;
ctx.shadowColor = "black";
ctx.beginPath();
ctx.fillStyle = document.getElementsByClassName("colorItem")[colorTable[selectedColor]].style.backgroundColor;
ctx.arc(mousePosition.x, mousePosition.y, 180, 0, Math.PI * 2);
ctx.lineTo(mousePosition.x, mousePosition.y);
ctx.closePath;
ctx.fill();
for (var colorNr = 0; colorNr < colorCount; colorNr++) {
ctx.shadowBlur = 5;
ctx.shadowColor = "black";
ctx.beginPath();
ctx.moveTo(mousePosition.x, mousePosition.y);
ctx.fillStyle = document.getElementsByClassName("colorItem")[colorTable[colorNr]].style.backgroundColor;
ctx.arc(mousePosition.x, mousePosition.y, 160, Math.PI / 180 * colorNr * pieAngle, Math.PI / 180 * colorNr * pieAngle + (Math.PI / 180 * pieAngle));
ctx.lineTo(mousePosition.x, mousePosition.y);
ctx.closePath;
ctx.fill();
ctx.stroke();
}
ctx.shadowBlur = 40;
ctx.shadowColor = "white";
ctx.beginPath();
ctx.moveTo(mousePosition.x, mousePosition.y);
try {
ctx.fillStyle = document.getElementsByClassName("colorItem")[colorTable[selectedColor]].style.backgroundColor;
} catch (err) {
console.log(selectedColor);
};
ctx.arc(mousePosition.x, mousePosition.y, 200, Math.PI / 180 * selectedColor * pieAngle, Math.PI / 180 * selectedColor * pieAngle + (Math.PI / 180 * pieAngle));
ctx.lineTo(mousePosition.x, mousePosition.y);
ctx.closePath;
ctx.fill();
ctx.stroke();
}
}
document.addEventListener('mousedown', function (mouseDownEvent) {
if (mouseDownEvent.button === 2){
pie = true;
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
drawPie();
}
}, false);
document.addEventListener('mouseup', function () {
if (pie) {
pie = false;
ctx.clearRect(0, 0, canvas.width, canvas.height);
document.getElementsByClassName("colorItem")[colorTable[selectedColor]].click();
}
}, false);
document.addEventListener('keydown', function (e) {
switch(e.keyCode || e.which) {
case 49:
document.getElementsByClassName("brushSize")[0].click();
break;
case 50:
document.getElementsByClassName("brushSize")[1].click();
break;
case 51:
document.getElementsByClassName("brushSize")[2].click();
break;
case 52:
document.getElementsByClassName("brushSize")[3].click();
break;
case 221:
case 192:
getImageButton.click();
break;
case 86 && 18:
document.getElementById("votekickCurrentplayer").click();
document.getElementById("inputChat").focus();
break;
case 71 && 18:
document.getElementsByClassName("thumbsUp")[0].click();
document.getElementById("inputChat").focus();
break;
case 18 && 78:
document.getElementsByClassName("thumbsDown")[0].click();
document.getElementById("inputChat").focus();
break;
case 13:
document.getElementById("inputChat").focus();
break;
default:
break;
}
}, false);
document.addEventListener('mousemove', function (mouseMoveEvent) {
var rect = mouseMoveEvent.target.getBoundingClientRect();
if (!pie) {
mousePosition.x = mouseMoveEvent.pageX;
mousePosition.y = mouseMoveEvent.pageY;
} else {
piePosition.x = mouseMoveEvent.pageX;
piePosition.y = mouseMoveEvent.pageY;
drawPie();
}
}, false);
document.addEventListener('contextmenu', function (contextMenuEvent) {
contextMenuEvent.preventDefault();
return false;
}, false);
getImageButton = setupImageButton();