Warning: session_start(): open(/var/lib/php/sessions/sess_tv4rib5eb842sssj0l8b9989io, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
static class MouseMover {
Pt cur, last;
Robot robot;
java.util.Timer timer;
int interferenceMinDistance = 100;
int mouseCheckInterval = 50;
int blockTimeAfterInterference = 5000; // ms
bool endAfterInterference = true;
volatile bool interference;
bool forceActive;
long blockUntil;
// TODO: fix this logic...
synchronized bool enabled() { ret timer != null; }
synchronized bool hasInterference() { ret interference; }
bool active() { ret enabled() && (forceActive || !hasInterference()); }
synchronized MouseMover enable() ctex {
if (robot == null) robot = new Robot;
if (timer == null) {
interference = false;
cur = new Pt(mouseLocation());
timer = new java.util.Timer("MouseMover");
timer.scheduleAtFixedRate(new TimerTask {
public void run() {
checkMouse();
}
}, mouseCheckInterval, mouseCheckInterval);
print("Mouse automation started");
}
ret this;
}
bool farAway(Pt a, Pt b) {
ret pointDistance(a, b) >= interferenceMinDistance;
}
synchronized void checkMouse() {
if (!enabled()) ret;
Pt p = new Pt(mouseLocation());
if (farAway(p, cur) && neq(p, last)) {
interference = true;
if (endAfterInterference) {
print("Mouse interference detected, stopping automation");
disable();
} else {
bool blockedAlready = blocked();
blockUntil = now()+blockTimeAfterInterference;
if (!blockedAlready)
print("Mouse automation blocked for at least " + blockTimeAfterInterference + " ms");
cur = new Pt(mouseLocation());
}
}
}
synchronized void disable() {
if (timer != null) {
timer.cancel();
timer = null;
if (!interference)
print("Mouse automation ended without interference");
}
}
synchronized void moveMouseImmediate(Pt p) {
checkMouse();
if (!enabled() || blocked()) ret;
p = normalizePointToScreen(p);
if (neq(cur, p)) {
if (neq(new Pt(mouseLocation()), last))
last = cur;
cur = p;
robot.mouseMove(p.x, p.y);
}
}
synchronized bool blocked() {
if (!enabled() || blockUntil == 0) false;
if (now() < blockUntil) true;
blockUntil = 0;
cur = new Pt(mouseLocation());
print("Mouse automation resumes");
false;
}
void moveMouse(Pt pdest) {
Point p = getMouseLocation();
//int steps = 20, delay = 40; // slow
//int steps = 20, delay = 20; // fast
int steps = 20, delay = 30; // medium
for (int i = 1; i <= steps; i++) {
Point p2 = blendPoints(p, pdest.getPoint(), ((double) i) / steps);
moveMouseImmediate(new Pt(p2));
if (i != steps)
sleep(delay);
}
}
void click() {
if (active()) mouseClick();
}
void click(Pt p) {
moveMouse(p);
click();
}
void click(int x, int y) {
click(new Pt(x, y));
}
}