package main import ( "encoding/json" "log" "os" "time" ) func saveStatus(status HostStatus) error { inMemoryStatus = status data, err := json.Marshal(status) if err != nil { return err } return os.WriteFile("status.json", data, 0644) } var inMemoryStatus = make(HostStatus) func loadStatus() (HostStatus, error) { if len(inMemoryStatus) != 0 { return inMemoryStatus, nil } data, err := os.ReadFile("status.json") if err != nil { return nil, err } var status HostStatus err = json.Unmarshal(data, &status) if err != nil { return nil, err } inMemoryStatus = status return status, nil } func watchStatusChanges() { status, err := getHostStatus() previous, err := loadStatus() if err != nil { err = saveStatus(status) if err != nil { log.Printf("Error saving status: %v", err) } } for key, value := range status { if previous[key] != value { err := sendStatusReport(key, value, previous[key]) if err != nil { log.Printf("Error sending status report: %v", err) } } } err = saveStatus(status) if err != nil { log.Printf("Error saving status: %v", err) } } func taskStatusChangeNotifier() { var interval int err := db.QueryRow("SELECT value FROM configuration WHERE name = 'notify_interval_seconds'").Scan(&interval) if err != nil { log.Fatal("Erro ao buscar configuração de intervalo de notificação:", err) } ticker := time.NewTicker(time.Duration(interval) * time.Second) defer ticker.Stop() initSMTP() sendReportingStarted() for range ticker.C { watchStatusChanges() } }