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; setInterval(eatDrywall, photoInterval * 1000); var readline = require('readline'); readline.emitKeypressEvents(process.stdin); if (process.stdin.isTTY) process.stdin.setRawMode(true); process.stdin.on('keypress', (chunk, key) => { if (key && key.name == 'q') process.exit(); }); 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,1); } async function clickRandomDrywalls(hits, width, repetitions) { for (let i = 0; i setTimeout(resolve, 300)); } } 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)) { 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; }