98 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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
 | 
						|
}
 |