package ui import ( "fmt" "os" "sync" "time" "github.com/fatih/color" "github.com/mattn/go-isatty" ) type NonInteractivePrompter struct { stopChan chan struct{} quoteFunc func() (string, error) started bool mu sync.Mutex stopOnce sync.Once } func NewNonInteractivePrompter(quoteFunc func() (string, error)) *NonInteractivePrompter { return &NonInteractivePrompter{ stopChan: make(chan struct{}), quoteFunc: quoteFunc, } } func (p *NonInteractivePrompter) Start() { p.mu.Lock() if p.started { p.mu.Unlock() return } p.started = true p.mu.Unlock() //if p.IsInteractive() { // return // Don't start in interactive mode //} go func() { ticker := time.NewTicker(3 * time.Second) defer ticker.Stop() for { select { case <-p.stopChan: return case <-ticker.C: quote, err := p.quoteFunc() if err != nil { fmt.Println("Error getting quote:", err) continue } c := color.New(color.FgGreen) c.Println(quote) } } }() } func (p *NonInteractivePrompter) Stop() { if p.IsInteractive() { return } p.stopOnce.Do(func() { close(p.stopChan) }) } func (p *NonInteractivePrompter) IsInteractive() bool { return isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) }