changed mouse moving logic

previously it would see if user is active each 10 seconds, and once in 5
minutes, it would move mouse if user wasn't active.
It caused issues because if user wasn't active before 5 minute ticker,
then mouse would still move.
Now gover counts for how long user has been idle, and moves mouse only
when time exceeds preset value in seconds
This commit is contained in:
Leons Aleksandrovs
2025-10-09 22:29:17 +03:00
parent aab26ef4de
commit 9d560ce526
2 changed files with 39 additions and 24 deletions

BIN
gover

Binary file not shown.

75
main.go
View File

@@ -7,53 +7,68 @@ import (
"github.com/go-vgo/robotgo"
)
func checkActive(x *int, y *int, active *bool) {
// Current x, and Current Y
cX, cY := robotgo.Location()
const (
CHECKING_INTERVAL_SECONDS = 10
MOVE_AFTER_SECONDS = 300
)
if cX == *x && cY == *y {
*active = false
} else {
*active = true
}
*x = cX
*y = cY
}
func moveMouse(active *bool) {
// If inactive, move mouse to 100px right, and back
if !*active {
fmt.Println("Moving mouse")
func moveMouse() {
// Move mouse around 100px
robotgo.MoveSmoothRelative(100, 0)
time.Sleep(1 * time.Second)
robotgo.MoveSmoothRelative(-100, 0)
}
func displayStatus(lastMove *int) {
// Clear display, and write last move
fmt.Print("\033[H\033[2J")
fmt.Printf("Last move %d seconds ago\n", *lastMove)
}
func checkActive(x *int, y *int, lastMove *int) {
// Current x, and Current Y
cX, cY := robotgo.Location()
if cX == *x && cY == *y {
// Hasn't moved
*lastMove += CHECKING_INTERVAL_SECONDS
} else {
// Has moved
*lastMove = 0
}
// Set current x and y
*x = cX
*y = cY
// Check if we should move
if *lastMove >= MOVE_AFTER_SECONDS {
moveMouse()
*lastMove = 0
}
displayStatus(lastMove)
}
func main() {
// reactive variables haha (useState, or reactive(), but just pointers)
x := 0
y := 0
active := true
// Meant to represent seconds ago
lastMove := 0
// Create tickers
ticker1 := time.NewTicker(10 * time.Second)
ticker2 := time.NewTicker(5 * time.Minute)
ticker := time.NewTicker(CHECKING_INTERVAL_SECONDS * time.Second)
fmt.Printf("Checking active every %d seconds", CHECKING_INTERVAL_SECONDS)
time.Sleep(5 * time.Second)
defer ticker1.Stop()
defer ticker2.Stop()
defer ticker.Stop()
// Run initial calls (optional)
checkActive(&x, &y, &active)
checkActive(&x, &y, &lastMove)
// Goroutine to handle ticks
for {
select {
case <-ticker1.C:
checkActive(&x, &y, &active)
case <-ticker2.C:
moveMouse(&active)
}
for range ticker.C {
checkActive(&x, &y, &lastMove)
}
}