93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/fsnotify/fsnotify"
|
|
)
|
|
|
|
// Watches the downloads directory for autohotkey files and makes sure that only the newest one downloaded exists at a time
|
|
func downloadsFileWatcher() {
|
|
downloadsWatcher, err := fsnotify.NewWatcher()
|
|
if err != nil {
|
|
log.Fatal("NewWatcher failed: ", err)
|
|
}
|
|
defer downloadsWatcher.Close()
|
|
|
|
done := make(chan bool)
|
|
go func() {
|
|
defer close(done)
|
|
defer log.Printf("file watcher go routine shutting down!") // could be from returns below?
|
|
|
|
for {
|
|
select {
|
|
|
|
case event, ok := <-downloadsWatcher.Events:
|
|
if !ok {
|
|
log.Printf("downloads watcher _event_ NOT OK TERMINATING ARRRGGHGHH: %v", err)
|
|
return
|
|
}
|
|
if event.Op == fsnotify.Create {
|
|
if strings.Contains(event.Name, ".ahk") {
|
|
err = cleanDownloadsAHK()
|
|
if err != nil {
|
|
log.Printf("failed to clean downloads: %v", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
case err, ok := <-downloadsWatcher.Errors:
|
|
if !ok {
|
|
log.Printf("downloads watcher _error_ NOT OK TERMINATING ARRRGGHGHH: %v", err)
|
|
return
|
|
}
|
|
log.Printf("downloads watcher error: %v", err)
|
|
}
|
|
}
|
|
|
|
}()
|
|
err = downloadsWatcher.Add(downloadsFolderPath)
|
|
if err != nil {
|
|
log.Fatal("downloads watcher add down failed:", err)
|
|
}
|
|
|
|
<-done
|
|
}
|
|
|
|
func cleanDownloadsAHK() error {
|
|
err := filepath.Walk(downloadsFolderPath, func(path string, info os.FileInfo, err error) error {
|
|
if err != nil {
|
|
return fmt.Errorf("failed to walk file: %v", err)
|
|
}
|
|
|
|
// ignore files that aren't AHK
|
|
if !strings.Contains(info.Name(), ".ahk") {
|
|
return nil
|
|
}
|
|
|
|
// ignore files downloaded in the past 5 minutes
|
|
if info.ModTime().After(time.Now().Add(time.Minute * -1)) {
|
|
return nil
|
|
}
|
|
|
|
log.Printf("removing old .ahk file - %s", info.Name())
|
|
err = os.Remove(fmt.Sprintf("%s/%s", downloadsFolderPath, info.Name()))
|
|
if err != nil {
|
|
return fmt.Errorf("failed to delete old .ahk '%s': %v", info.Name(), err)
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("failed to walk downloads directory: %v", err)
|
|
}
|
|
|
|
return nil
|
|
}
|