Skribbl.io's first add-on

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.

目前為 2018-06-20 提交的版本,檢視 最新版本

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

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址