const jimp = require("jimp"); const ss = require("node-screenshots"); const proc = require("child_process"); const fs = require("fs"); let config = JSON.parse(fs.readFileSync("./config.jsonc")); const photoInterval = config.photoInterval; const targetColor = config.targetColor; const tolerance = config.tolerance; const iterationsPerPhoto = config.iterationsPerPhoto; setInterval(eatDrywall, photoInterval * 1000); async function eatDrywall() { let monitors = ss.Monitor.all(); monitors.forEach((i) => { var im = i; if (im.isPrimary) { let image = im.captureImageSync(); let img = image.toRawSync(); clickRandomPixelOfColor(im.width, im.height, img); } }); } function clickRandomPixelOfColor(width, height, image) { var hits = []; for (let i = 0; i < width * height; i++) { if (compareColors(targetColor, getPixel(i, image))) { hits.push(i); } } console.log(hits.length); clickRandomDrywalls(hits, width, iterationsPerPhoto); } async function clickRandomDrywalls(hits, width, repetitions) { for (let i = 0; i < repetitions; i++) { let click = Math.floor(Math.random() * hits.length); //get index of random viable pixel let target = deRasterize(hits[click], width);//get coordinates of random pixel console.log("Clicking: " + JSON.stringify(target)); console.log(proc.exec("python click.py " + target.x + " " + target.y).toString()); await new Promise(resolve => setTimeout(resolve, 200)); } } function rasterize(x, y, width) { //scale to image return (x + y * width); } function deRasterize(i, width) { return ({ y: Math.floor(i / width), x: i % width }); } function compareColors(c1, c2) { //compare two rgba color structs //general basic distance nothing too special let sum1 = c1.r + c1.g + c1.b + c1.a; let sum2 = c2.r + c2.g + c2.b + c2.a; if (Math.abs(sum1 - sum2) < (tolerance * 4)) { //console.log(Math.abs(sum1 - sum2)); return true; } else return false; } //gets color of a pixel at given coordinate function getPixel(pos, img) { //pixel origin let o = pos * 4; let p = { r: img[o], g: img[o + 1], b: img[o + 2], a: img[o + 3] }; return p; }