huble-mouse-tracker
Version:
Mouse and keyboard event tracker using Python
86 lines (77 loc) • 2.78 kB
JavaScript
const { PythonShell } = require('python-shell');
const { app } = require('electron');
const path = require('path');
const fs = require('fs');
const logFilePath = path.join('/Users/app/trakr-electron', 'index.txt');
const fileStream = fs.createWriteStream(logFilePath, { flags: 'a' });
function logMessage(message) {
console.log(message);
fileStream.write(message + '\n');
}
class MouseTracker {
constructor() {
this.pyshell = null;
}
start(options = {}) {
const {
mouseOnly = false,
keyboardOnly = false,
onMove,
onClick,
onScroll,
onKeyPress
} = options;
logMessage('start')
const scriptPath = app.isPackaged
? path.join('/Users/app/trakr-electron/node_modules/huble-mouse-tracker/tracker', 'mouse_tracker.py')
: path.join(__dirname, 'tracker', 'mouse_tracker.py');
logMessage('start done')
logMessage(scriptPath)
const pyOptions = {
mode: 'text',
pythonPath: app.isPackaged ? path.join(process.resourcesPath, 'python', 'pythonw.exe') : 'python',
args: [
mouseOnly ? '--mouse-only' : '',
keyboardOnly ? '--keyboard-only' : ''
].filter(Boolean)
};
logMessage(pyOptions)
this.pyshell = new PythonShell(scriptPath, pyOptions);
logMessage(this.pyshell)
this.pyshell.on('message', (message) => {
try {
const event = JSON.parse(message);
logMessage(event)
switch(event.type) {
case 'move':
logMessage('mouse move')
onMove && onMove(event.x, event.y);
break;
case 'click':
logMessage('mouse click')
onClick && onClick(event.x, event.y, event.button, event.pressed);
break;
case 'scroll':
logMessage('mouse scroll')
onScroll && onScroll(event.x, event.y, event.dx, event.dy);
break;
case 'keypress':
logMessage('keypress');
onKeyPress && onKeyPress(event.key);
break;
}
} catch (error) {
console.error('Error parsing message:', error);
logMessage('Error parsing message:', error);
}
});
return this;
}
stop() {
if (this.pyshell) {
this.pyshell.kill();
this.pyshell = null;
}
}
}
module.exports = MouseTracker;