package main import ( "fmt" "io" "log" "os" "sync" "time" ) type RssFeed struct { Url string Id string LastSeen time.Time fileMutex sync.Mutex } func (f *RssFeed) UpdateLastSeen() error { log.Printf("[%s]: Updating last seen time", f.Id) lastSeen, err := f.ReadLastSeen() if err != nil { return fmt.Errorf("failed to read lastseen file for feed %s: %w", f.Id, err) } f.LastSeen = lastSeen log.Printf("[%s]: Last seen time updated to: %s", f.Id, f.LastSeen) return nil } func (f *RssFeed) ReadLastSeen() (time.Time, error) { f.fileMutex.Lock() defer f.fileMutex.Unlock() lastSeen := time.Now() log.Printf("[%s]: Attempting to open lastseen file...", f.Id) lastSeenFile, err := os.Open("lastseen" + f.Id) if err != nil { if os.IsNotExist(err) { log.Printf("[%s]: lastseen file does not exist, creating a new one...", f.Id) lastSeenFile, err = os.Create("lastseen" + f.Id) if err != nil { return lastSeen, fmt.Errorf("failed to create lastseen file: %w", err) } log.Printf("[%s]: Writing current time to lastseen file...", f.Id) lastSeenFile.Write([]byte(lastSeen.Format(time.RFC3339))) lastSeenFile.Sync() log.Printf("[%s]: Successfully created lastseen file with current time.", f.Id) return lastSeen, nil } else { log.Printf("[%s]: Error opening lastseen file: %v", f.Id, err) return lastSeen, fmt.Errorf("failed to read lastseen file: %w", err) } } log.Printf("[%s]: Reading contents of lastseen file...", f.Id) lastSeenBytes, err := io.ReadAll(lastSeenFile) if err != nil { log.Printf("[%s]: Error reading lastseen file: %v", f.Id, err) return lastSeen, fmt.Errorf("failed to read lastseen file: %w", err) } log.Printf("[%s]: Parsing lastseen time...", f.Id) lastSeen, err = time.Parse(time.RFC3339, string(lastSeenBytes)) if err != nil { log.Printf("[%s]: Error parsing lastseen file: %v", f.Id, err) return lastSeen, fmt.Errorf("failed to parse lastseen file: %w", err) } lastSeenFile.Close() log.Printf("[%s]: Last seen time read: %s", f.Id, lastSeen) return lastSeen, nil } func (f *RssFeed) WriteLastSeen(when time.Time) error { f.fileMutex.Lock() defer f.fileMutex.Unlock() log.Printf("[%s]: Attempting to create lastseen file...", f.Id) lastSeenFile, err := os.Create("lastseen" + f.Id) if err != nil { log.Printf("[%s]: Error creating lastseen file: %v", f.Id, err) return fmt.Errorf("failed to create lastseen file: %w", err) } log.Printf("[%s]: Successfully created lastseen file: lastseen%s", f.Id, f.Id) log.Printf("[%s]: Writing last seen time to file: %s", f.Id, when.Format(time.RFC3339)) _, err = lastSeenFile.Write([]byte(when.Format(time.RFC3339))) if err != nil { log.Printf("[%s]: Error writing to lastseen file: %v", f.Id, err) return fmt.Errorf("failed to write to lastseen file: %w", err) } log.Printf("[%s]: Successfully wrote last seen time to file.", f.Id) err = lastSeenFile.Close() if err != nil { log.Printf("[%s]: Error closing lastseen file: %v", f.Id, err) return fmt.Errorf("failed to close lastseen file: %w", err) } log.Printf("[%s]: Lastseen file closed successfully.", f.Id) return nil }