From 543804b23f984c08d4f4444845e740190b9b57e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Wysoki=C5=84ski?= Date: Mon, 14 Nov 2022 07:53:11 +0100 Subject: [PATCH] init --- .gitignore | 4 +++ go.mod | 3 ++ main.go | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 .gitignore create mode 100644 go.mod create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..65996e0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea +.env.local +bin/* +additional_envs.sh diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..9830ad7 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gitea.dwysokinski.me/Kichiyaki/wordo + +go 1.19 diff --git a/main.go b/main.go new file mode 100644 index 0000000..b93ce12 --- /dev/null +++ b/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "bufio" + "context" + "log" + "os" + "os/exec" + "os/signal" + "strings" + "sync" + "sync/atomic" + "syscall" + "time" +) + +func main() { + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer stop() + + cmd := exec.CommandContext(ctx, "dbus-monitor", "--session", "type='signal',interface='org.gnome.ScreenSaver'") + cmdReader, err := cmd.StdoutPipe() + if err != nil { + log.Fatalln("cmd.StdoutPipe:", err) + } + defer func() { + _ = cmdReader.Close() + }() + cmd.Stderr = os.Stderr + + var wg sync.WaitGroup + + wg.Add(1) + go func() { + defer wg.Done() + + _ = cmd.Run() + }() + + var isScreenSaverActive uint32 + wg.Add(1) + go func() { + defer wg.Done() + + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + scanner := bufio.NewScanner(cmdReader) + for scanner.Scan() { + select { + case <-ctx.Done(): + return + default: + if !strings.Contains(scanner.Text(), "member=ActiveChanged") { + continue + } + if !scanner.Scan() { + continue + } + if strings.Contains(scanner.Text(), "boolean true") { + atomic.StoreUint32(&isScreenSaverActive, 1) + } else { + atomic.StoreUint32(&isScreenSaverActive, 0) + } + } + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + if atomic.LoadUint32(&isScreenSaverActive) == 1 { + continue + } + _ = sendNotification(ctx) + } + } + }() + + wg.Wait() + + log.Println("DONE") +} + +func sendNotification(ctx context.Context) error { + return exec.CommandContext(ctx, "notify-send", "title", "description").Run() +}