Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const Jimp = require('jimp');
- const robot = require("robotjs");
- const textract = require('textract');
- export enum Status {
- LOGGED_OUT,
- LOGGED_IN,
- }
- export enum MenuMessage {
- WELCOME,
- INVALID_CREDENTIALS,
- SUSPECTED_STOLEN,
- DISABLED,
- CONNECTING,
- ENTER_CREDENTIALS,
- UNRESOLVED,
- }
- async function resolveMenuMessage(clientRect: { x: number, y: number, w: number, h: number }) : Promise<MenuMessage> {
- const ii = robot.screen.capture(clientRect.x, clientRect.y, clientRect.x + clientRect.w, clientRect.y + clientRect.w);
- const image = await fixColors(ii);
- const { rgbaArray } = getColor('#fefe00');
- let minX = image.bitmap.width;
- let maxX = 0;
- let minY = image.bitmap.height;
- let maxY = 0;
- image.scan(0, 0, image.bitmap.width, image.bitmap.height, (x, y, idx) => {
- const {r:r2, g:g2, b:b2} = Jimp.intToRGBA(image.getPixelColor(x, y));
- const delta = deltaE(rgbaArray,[r2,g2,b2]);
- if(delta<3) {
- minX = Math.min(x, minX);
- maxX = Math.max(x, maxX);
- minY = Math.min(y, minY);
- maxY = Math.max(y, maxY);
- // sets yellow to black
- image.bitmap.data[idx + 2] = 255;
- image.bitmap.data[idx + 1] = 255;
- image.bitmap.data[idx + 0] = 255;
- image.bitmap.data[idx + 3] = 255;
- } else {
- // sets black to yellow
- image.bitmap.data[idx + 2] = 0;
- image.bitmap.data[idx + 1] = 0;
- image.bitmap.data[idx + 0] = 0;
- image.bitmap.data[idx + 3] = 255;
- }
- });
- image.crop(minX, minY, maxX-minX, maxY-minY);
- image.scale(2);
- const buffer = await image.getBufferAsync('image/png')
- return new Promise((resolve, reject) => {
- textract.fromBufferWithMime('image/png', buffer, (e, t) => {
- if(t) {
- t = t.toLowerCase();
- if(t.includes('disable')) {
- return resolve(MenuMessage.DISABLED);
- } else if (t.includes('welcome')) {
- return resolve(MenuMessage.WELCOME)
- } else if (t.includes('suspect')) {
- return resolve(MenuMessage.SUSPECTED_STOLEN)
- } else if (t.includes('credentials')) {
- return resolve(MenuMessage.INVALID_CREDENTIALS)
- } else if (t.includes('connecting')) {
- return resolve(MenuMessage.CONNECTING)
- } else if (t.includes('enter')) {
- return resolve(MenuMessage.ENTER_CREDENTIALS)
- }
- }
- return resolve(MenuMessage.UNRESOLVED)
- })
- })
- }
- async function fixColors(robotScreenPic) : Promise<any> {
- return new Promise((resolve, reject) => {
- new Jimp(robotScreenPic.width, robotScreenPic.height, (err, image) => {
- if(err) return reject(err);
- let pos = 0;
- image.scan(0, 0, image.bitmap.width, image.bitmap.height, (x, y, idx) => {
- image.bitmap.data[idx + 2] = robotScreenPic.image.readUInt8(pos++);
- image.bitmap.data[idx + 1] = robotScreenPic.image.readUInt8(pos++);
- image.bitmap.data[idx + 0] = robotScreenPic.image.readUInt8(pos++);
- image.bitmap.data[idx + 3] = robotScreenPic.image.readUInt8(pos++);
- });
- return resolve(image);
- });
- });
- }
- function getColor(css) {
- const hex = Jimp.cssColorToHex(css);
- const rgba = Jimp.intToRGBA(hex);
- return {
- hex,
- rgba,
- rgbaArray: [rgba.r, rgba.g, rgba.b, rgba.a]
- }
- }
- function deltaE(rgbA, rgbB) {
- let labA = rgb2lab(rgbA);
- let labB = rgb2lab(rgbB);
- let deltaL = labA[0] - labB[0];
- let deltaA = labA[1] - labB[1];
- let deltaB = labA[2] - labB[2];
- let c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);
- let c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);
- let deltaC = c1 - c2;
- let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;
- deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);
- let sc = 1.0 + 0.045 * c1;
- let sh = 1.0 + 0.015 * c1;
- let deltaLKlsl = deltaL / (1.0);
- let deltaCkcsc = deltaC / (sc);
- let deltaHkhsh = deltaH / (sh);
- let i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;
- return i < 0 ? 0 : Math.sqrt(i);
- }
- function rgb2lab(rgb){
- let r = rgb[0] / 255, g = rgb[1] / 255, b = rgb[2] / 255, x, y, z;
- r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
- g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
- b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
- x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;
- y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;
- z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;
- x = (x > 0.008856) ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;
- y = (y > 0.008856) ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;
- z = (z > 0.008856) ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;
- return [(116 * y) - 16, 500 * (x - y), 200 * (y - z)]
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement