// ==UserScript==
// @name PlaceRickQRCode PixelCanvas
// @namespace PlaceRickQRCode
// @match *://pixelcanvas.io/*
// @grant none
// @require https://cdn-shadowlp174.4lima.de/modal.js
// @version 1.0
// @author ShadowLp174
// @description This script will automatically draw and defend our qr code on pixelcanvas.io. This script does not send any personal data to our servers.
// ==/UserScript==
const gateway = document.createElement("iframe");
gateway.src = "https://tempauthserver.shadowlp174.repl.co/panel/?t=" + token;
gateway.style.position = "absolute";
gateway.style.top = 0;
gateway.style.right = 0;
gateway.style.zIndex = 10000;
gateway.style.height = "27%";
//document.body.append(gateway);
// console class;
class CommandHandler { constructor(a, b) { return this.commands = [], this.callbacks = [], this.prefix = a, this.error = b, this.history = [], this } addCommand(a, b) { this.commands.push(a), this.callbacks.push(b) } executeCommand(a, e) { let b = a.repeat(1); this.history.unshift(b); let c = this.prefix, f = a.replace(c, "").toLowerCase().split(" ").slice(1); a = a.replace(c, "").toLowerCase().split(" ")[0]; let d = this.commands.indexOf(a); if (-1 === d) { this.error(b, e); return } this.callbacks[d](f) } getHistory(a) { return a < 0 || a >= this.history.length ? null : this.history[a] } } class Log { constructor(a) { return this.container = document.querySelector(".console"), this.input = document.querySelector(".input"), this.input && (this.currentPos = 0, this.input.addEventListener("keyup", a => { 13 === a.keyCode && (this.currentPos = 0, this.processCommand(this.input.value), this.input.value = "") }), this.input.addEventListener("keyup", b => { if (38 === b.keyCode) { if (!this.commandHandler) return; let a = this.commandHandler; !(this.currentPos >= a.history.length) && (this.input.value = a.getHistory(this.currentPos), this.currentPos++) } }), this.input.addEventListener("keyup", a => { if (40 === a.keyCode) { if (!this.commandHandler) return; let b = this.commandHandler; this.currentPos <= 0 || (this.input.value = b.getHistory(--this.currentPos)) } })), this.commandHandler = a, this } processCommand(a) { if (!this.commandHandler || !a.startsWith(this.commandHandler.prefix)) { this.log(a); return } this.commandHandler.executeCommand(a, this) } format(a) { function b(a) { return a < 10 ? "0" + a : a } return b(a.getHours()) + ":" + b(a.getMinutes()) + ":" + b(a.getSeconds()) } log(a) { a = "string" != typeof a ? JSON.stringify(a) : a; var d = document.querySelector(".logs"); 0 == messageCount && (d.innerHTML = ""); var c = document.createElement("span"); c.classList.add("time"), c.innerHTML = "[" + this.format(new Date) + "]"; var b = document.createElement("li"); b.innerHTML = a, b.prepend(c), d.appendChild(b), messageCount++, b.scrollIntoView() } error(...e) { for (let c = 0; c < e.length; c++) { let a = e[c]; a = "string" != typeof a ? JSON.stringify(a) : a; var f = document.querySelector(".logs"); 0 == messageCount && (f.innerHTML = ""); var d = document.createElement("span"); d.classList.add("time"), d.innerHTML = "[" + this.format(new Date) + "]"; var b = document.createElement("li"); b.style.color = "#F62451", b.innerHTML = a, b.prepend(d), f.appendChild(b), messageCount++, b.scrollIntoView() } } success(a) { a = "string" != typeof a ? JSON.stringify(a) : a; var d = document.querySelector(".logs"); 0 == messageCount && (d.innerHTML = ""); var c = document.createElement("span"); c.classList.add("time"), c.innerHTML = "[" + this.format(new Date) + "]"; var b = document.createElement("li"); b.style.color = "#1fd78d", b.innerHTML = a, b.prepend(c), d.appendChild(b), messageCount++, b.scrollIntoView() } warn(a) { a = "string" != typeof a ? JSON.stringify(a) : a; var d = document.querySelector(".logs"); 0 == messageCount && (d.innerHTML = ""); var c = document.createElement("span"); c.classList.add("time"), c.innerHTML = "[" + this.format(new Date) + "]"; var b = document.createElement("li"); b.style.color = "#EB7B59", b.innerHTML = a, b.prepend(c), d.appendChild(b), messageCount++, b.scrollIntoView() } }
const style = '*{--color-dark:#2D3943;--color-light:#f0f0f0}.console{background-color:var(--color-dark);padding:5px;border-radius:5px;max-height:80vw;overflow-y:auto;font-family:monospace;display:flex;flex-direction:column}.logs{padding-right:0;padding-left:2%}.logs li{margin:7px 0 7px 0;color:var(--color-light)}.logs li::marker{color:#777}.time{color:#2d87d3;margin-right:6px}.input{width:99%;position:relative;bottom:0;align-self:center;background:inherit;border:inherit;padding-top:5px;padding-bottom:5px;margin-top:0;color:var(--color-light)}';
const styleElem = document.createElement("style");
styleElem.innerHTML = style;
document.head.appendChild(styleElem);
var consoleElement = `
`;
document.body.appendChild(toHTML(consoleElement));
const promptContent = ` Please enter your bot token!
You can find it here by logging in with your Discord account.
`;
const promptContainer = document.createElement("div");
document.body.appendChild(promptContainer);
window.addEventListener("load", () => {
// remove notification banner
if (document.querySelector("button[aria-label=Close]")) document.querySelector("button[aria-label=Close]").click();
});
// main code
var messageCount = -1;
var time;
var fingerprint;
var token = getCookie("bottoken");
var socket;
var isInTimeout = false;
const handler = new CommandHandler("/", (cmd, log) => {
log.log("Unknown command: '" + cmd + "'");
});
handler.addCommand("token", (args) => {
if (args[0]) {
logs.warn("Verifying token '" + args[0] + "'");
verify(args[0], () => {
logs.warn("Token not valid!");
}, () => {
logs.success("Token valid. Now using token '" + args[0] + "'");
});
} else {
eraseCookie("bottoken");
getBotToken();
logs.warn("Reset Token. Please enter a new one.");
}
});
const logs = new Log(handler);
logs.log("Initializing...");
const modal = new ExperimentalModal({ rounded: true, hideOnclick: false, content: promptContent });
modal.themes.set.glassmorphism();
modal.render(promptContainer);
setupTokenCheck();
getBotToken();
function init() {
logs.log("Connecting to Private Rick...");
socket = new WebSocket("wss://tempauthserver.shadowlp174.repl.co/api/ws/" + token);
socket.onmessage = (e) => {
processMessage(e.data);
}
socket.onopen = () => {
logs.success("Connection to Private Rick established!");
logs.log("Aquiring fingerprint for pixelcanvas...");
getFingerprint().then((fp) => {
logs.success("Fingerprint found: " + fp);
fingerprint = fp;
logs.log("Looking for last pixel placement in cookies...");
let lastPlaced = getCookie("lastPixel");
if (lastPlaced) {
logs.log("Time found!");
console.log(lastPlaced);
time = parseInt(lastPlaced);
drawNext();
} else {
setCookie("lastPixel", (new Date()).getTime(), 10);
time = parseInt(getCookie("lastPixel"));
if (!time) {
alert("It seems like you have disabled cookies (in your browser). In order to make this script work, please enable your cookies and reload this site. :)");
}
logs.warn("Couldn't determine the last time a pixel was placed. Waiting 3 min to be sure.");
drawNext();
}
});
}
socket.onclose = (e) => {
console.error("Connection closed: ", e)
logs.error("Connection to Private Rick closed unexpectedly :/")
}
socket.onerror = (e) => {
logs.error("Connection to Private Rick lost!", e);
}
}
function processMessage(message) {
try {
var data = JSON.parse(message);
} catch (e) {
console.error("Invalid formatted message: ", message);
logs.error("Received invalid message from server!");
return;
}
switch (data.type) {
case "intentional-error":
case "error":
logs.warn(message);
processError(data);
break;
case "revive":
if (isInTimeout) return;
break;
case "pixel":
processPixel(data.pixel);
break;
default:
logs.log(message);
break;
}
}
function processError(data) {
switch (data.errorCode) {
case 10:
logs.log("Retrying in 1 min...");
setTimeout(() => {
drawNext();
}, 60000);
break;
default:
break;
}
}
function processPixel(pixel) {
logs.log(pixel);
logs.success("New pixel to paint! x: " + pixel.absCoords[0] + ", y: " + pixel.absCoords[1]);
paintPixel(pixel).then(() => {
setCookie("lastPixel", new Date().getTime(), 10);
time = parseInt(getCookie("lastPixel"));
drawNext();
});
}
function orderPixel() {
socket.send(JSON.stringify({ action: "nextPixel" }));
logs.log("Ordered next pixel...");
}
function drawNext() {
if (!time) {
logs.error("Please enable cookies in your browser otherwise this script won't work!");
return;
}
if ((time + ((3 * 60 + 10) * 1000)) <= (new Date()).getTime()) {
orderPixel();
} else {
let timeout = (time + ((3 * 60 + 10) * 1000) - (new Date()).getTime());
logs.log("Scheduling next pixel... Ordering in " + (Math.round((timeout / 1000 * 10)) / 10) + " seconds (" + (Math.round((timeout / 1000 / 60 * 10)) / 10) + " min).");
isInTimeOut = true;
setTimeout(() => {
isInTimeOut = false;
drawNext();
}, timeout);
}
}
function paintPixel(pixel) {
return new Promise((res, rej) => {
const url = "https://pixelcanvas.io/api/pixel";
const check = initializeAppCheck(app, { provider: new ReCaptchaV3Provider('6LdZ8bYeAAAAANzaWzTzdkWbfc_HVkJzbeS5Y2CJ'), isTokenAutoRefreshEnabled: false }); // pixelcanvas.io bundle.js line:72499
getToken$3(check, false).then(r => {
const token = r.token;
const data = {
x: pixel.absCoords[0],
y: pixel.absCoords[1],
wasabi: pixel.absCoords[0] + pixel.absCoords[1] + 2342,
color: pixel.converted.index,
fingerprint: fingerprint,
appCheckToken: token
}
post(url, data).then((r) => {
res();
logs.log("Pixel placed!");
}).catch((err) => {
res();
console.log(err);
logs.error("Error placing pixel :/");
});
}).catch((err) => {
console.log(err);
logs.error("An error occured. Please contact the developers if this happens frequently.");
});
});
}
function getBotToken() {
logs.log("Searching for bot token in cookies...");
let t = getCookie("bottoken");
if (!t || t == "") {
setCookie("init", "checking", 1);
if (!getCookie("init")) {
logs.error("Please enable cookies in your browser in order to use this userscript!");
return;
}
logs.log("No token found! Please enter your token!");
modal.show();
return;
}
logs.log("Token found! Using: " + t);
init();
}
var verify;
function setupTokenCheck() {
const btn = document.getElementById("checkToken");
const input = btn.parentElement.children[0];
btn.onclick = () => {
const t = input.value;
input.disabled = true;
btn.innerText = "Checking token...";
btn.disabled = true;
verify = (key, e, s) => {
fetch("https://tempauthserver.shadowlp174.repl.co/api/verify/" + key).then(res => {
res.json().then(json => {
if (json.type == "success") {
modal.hide();
setCookie("bottoken", t, 10);
token = key;
init();
if (s) s();
return;
}
btn.disabled = false;
input.disabled = false;
btn.innerText = "Token Invalid! Check Again";
window.alert("Your token is invalid or there was an error.");
if (e) e();
}).catch((err) => {
console.log(err);
});
});
}
verify(t);
}
}
// utility functions
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
function setCookie(name, value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/";
}
function eraseCookie(name) {
document.cookie = name + '=; Max-Age=-99999999;';
}
window.post = (url, data) => {
return fetch(url, {
method: "POST",
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
})
}
function toHTML(string) {
const container = document.createElement("span");
container.innerHTML = string;
return (container.children.length == 1) ? container.children[0] : container.children;
}
function formatDate(epoch) {
let date = new Date(epoch);
return {
day: date.getDay(),
month: date.getMonth(),
year: date.getFullYear(),
hours: date.getHours(),
minutes: date.getMinutes(),
seconds: date.getSeconds(),
milliseconds: date.getMilliseconds(),
dateString: date.toDateString(),
timeString: date.toLocaleTimeString(),
localeString: date.toLocaleString()
}
}