!7 module UserActivityDetector > DynBigNumber { static long lastActivity; static transient persistedLastActivity; start { dm_startKeyLogger(); persistedLastActivity = lastActivity; dm_vmBus_onMessage('keyDown, r 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); } }