!7 module UserActivityDetector > DynBigNumber { long lastActivity; transient long persistedLastActivity; transient Pt lastMousePosition; start { dm_startKeyLogger(); persistedLastActivity = lastActivity; dm_vmBus_onMessage('keyDown, r activity); doEvery(1.0, r { Pt mouse = Pt(mousePosition()); if (neq(lastMousePosition, mouse)) { lastMousePosition = mouse; activity(); } }); doEvery(5*60.0, r saveIfChanged); } void saveIfChanged enter { if (lastActivity != persistedLastActivity) { persistedLastActivity = lastActivity; change(); } } // API void activity enter { lastActivity = now(); } double secondsSinceLastActivity() { ret lastActivity == 0 ? infinity() : toSeconds(now()-lastActivity); } }