2025-04-08 22:00:07 -04:00

97 lines
2.3 KiB
JavaScript

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;
}