diff --git a/.gitignore b/.gitignore index ec041ba..ade3b91 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ vendor/ -bin/ \ No newline at end of file +bin/ +log/ \ No newline at end of file diff --git a/pkg/mousemover/mouseMover.go b/pkg/mousemover/mouseMover.go index debcdb4..89389f3 100644 --- a/pkg/mousemover/mouseMover.go +++ b/pkg/mousemover/mouseMover.go @@ -1,12 +1,16 @@ package mousemover import ( + "fmt" + "os" "sync" "time" + "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" "github.com/go-vgo/robotgo" + "github.com/prashantgupta24/activity-tracker/pkg/activity" "github.com/prashantgupta24/activity-tracker/pkg/tracker" ) @@ -17,10 +21,13 @@ type MouseMover struct { quit chan struct{} mutex sync.RWMutex runningStatus bool + logFile *os.File } const ( - timeout = 100 //ms + timeout = 100 //ms + logDir = "log" + logFileName = "logFile-amm-1" ) //Start the main app @@ -31,7 +38,7 @@ func (m *MouseMover) Start() { m.quit = make(chan struct{}) heartbeatInterval := 60 //value always in seconds - workerInterval := 15 + workerInterval := 10 activityTracker := &tracker.Instance{ HeartbeatInterval: heartbeatInterval, @@ -42,40 +49,59 @@ func (m *MouseMover) Start() { heartbeatCh := activityTracker.Start() go func(m *MouseMover) { + logger := getLogger(m, false) //set writeToFile=true only for debugging m.updateRunningStatus(true) movePixel := 10 + var lastMoved time.Time + isSystemSleeping := false + didNotMoveTimes := 0 for { select { case heartbeat := <-heartbeatCh: if !heartbeat.WasAnyActivity { + if isSystemSleeping { + logger.Infof("system sleeping") + continue + } mouseMoveSuccessCh := make(chan bool) go moveAndCheck(movePixel, mouseMoveSuccessCh) select { case wasMouseMoveSuccess := <-mouseMoveSuccessCh: if wasMouseMoveSuccess { - log.Infof("moved mouse at : %v\n\n", time.Now()) + lastMoved = time.Now() + logger.Infof("moved mouse at : %v\n\n", lastMoved) movePixel *= -1 + didNotMoveTimes = 0 } else { - msg := "Mouse pointer cannot be moved. See README for details." - log.Errorf(msg) - robotgo.ShowAlert("Error with Automatic Mouse Mover", msg) + didNotMoveTimes++ + msg := fmt.Sprintf("Mouse pointer cannot be moved at %v. Last moved at %v. Happened %v times. See README for details.", + time.Now(), lastMoved, didNotMoveTimes) + logger.Errorf(msg) + if didNotMoveTimes >= 3 { + go func() { + robotgo.ShowAlert("Error with Automatic Mouse Mover", msg) + }() + } } case <-time.After(timeout * time.Millisecond): //timeout, do nothing - log.Errorf("timeout happened after %vms while trying to move mouse", timeout) + logger.Errorf("timeout happened after %vms while trying to move mouse", timeout) } - } else { - //uncomment just for reference - // log.Printf("activity detected in the last %v seconds.", int(heartbeatInterval)) - // log.Printf("Activity type:\n") - // for activityType, times := range heartbeat.ActivityMap { - // log.Printf("activityType : %v times: %v\n", activityType, len(times)) - // } - // log.Printf("\n\n\n") + logger.Infof("activity detected in the last %v seconds.", int(heartbeatInterval)) + logger.Infof("Activity type:\n") + for activityType, times := range heartbeat.ActivityMap { + logger.Infof("activityType : %v times: %v\n", activityType, len(times)) + if activityType == activity.MachineSleep { + isSystemSleeping = true + } else if activityType == activity.MachineWake { + isSystemSleeping = false + } + } + logger.Infof("\n\n\n") } case <-m.quit: - log.Infof("stopping mouse mover") + logger.Infof("stopping mouse mover") m.updateRunningStatus(false) activityTracker.Quit() return @@ -117,6 +143,9 @@ func (m *MouseMover) Quit() { if m != nil && m.isRunning() { m.quit <- struct{}{} } + if m.logFile != nil { + m.logFile.Close() + } } //GetInstance gets the singleton instance for mouse mover app @@ -126,3 +155,31 @@ func GetInstance() *MouseMover { } return instance } + +func getLogger(m *MouseMover, doWriteToFile bool) *log.Logger { + logger := log.New() + logger.Formatter = &logrus.TextFormatter{ + FullTimestamp: true, + } + + if doWriteToFile { + _, err := os.Stat(logDir) + if err != nil { + if os.IsNotExist(err) { + err = os.Mkdir(logDir, os.ModePerm) + if err != nil { + log.Fatalf("error creating dir: %v", err) + } + } + } + + logFile, err := os.OpenFile(logDir+"/"+logFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Fatalf("error opening file: %v", err) + } + logger.SetOutput(logFile) + m.logFile = logFile + } + + return logger +}