115 lines
3.7 KiB
Go
115 lines
3.7 KiB
Go
package widgets
|
|
|
|
import (
|
|
news "ArinDash/apis/newsapi"
|
|
"ArinDash/util"
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/mum4k/termdash/cell"
|
|
"github.com/mum4k/termdash/keyboard"
|
|
"github.com/mum4k/termdash/terminal/terminalapi"
|
|
"github.com/mum4k/termdash/widgetapi"
|
|
"github.com/mum4k/termdash/widgets/text"
|
|
)
|
|
|
|
type NewsOptions struct {
|
|
}
|
|
|
|
func News() NewsOptions {
|
|
widgetOptions["NewsOptions"] = createNewsOptions
|
|
return NewsOptions{}
|
|
}
|
|
|
|
func createNewsOptions(ctx context.Context, _ terminalapi.Terminal, _ interface{}) widgetapi.Widget {
|
|
widget := util.PanicOnErrorWithResult(NewNewsText(text.WrapAtWords()))
|
|
go util.Periodic(ctx, 1*time.Hour, func() error {
|
|
widget.newsArticles = news.FetchNews()
|
|
if widget.newsArticles.Status != "ok" {
|
|
if err := widget.Write(widget.newsArticles.Status, text.WriteCellOpts(cell.FgColor(cell.ColorRed))); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
go util.Periodic(ctx, 30*time.Second, func() error {
|
|
err := widget.drawNews()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(widget.newsArticles.Articles) > 0 {
|
|
widget.Selected = (widget.Selected + 1) % len(widget.newsArticles.Articles)
|
|
}
|
|
return nil
|
|
})
|
|
|
|
return widget
|
|
}
|
|
|
|
func (widget *NewsText) drawNews() error {
|
|
selected := widget.Selected
|
|
widget.Reset()
|
|
if len(widget.newsArticles.Articles) == 0 {
|
|
return nil
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%d/%d\n", selected+1, len(widget.newsArticles.Articles)), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
widget.Write(fmt.Sprintf("Error: %s", err.Error()), text.WriteCellOpts(cell.FgColor(cell.ColorRed)))
|
|
return err
|
|
}
|
|
article := widget.newsArticles.Articles[selected]
|
|
if err := widget.Write(fmt.Sprintf("%s\n", article.Author), text.WriteCellOpts(cell.FgColor(cell.ColorGray))); err != nil {
|
|
widget.Write(fmt.Sprintf("Error: %s", err.Error()), text.WriteCellOpts(cell.FgColor(cell.ColorRed)))
|
|
return err
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%s\n\n", article.Title), text.WriteCellOpts(cell.FgColor(cell.ColorWhite), cell.Bold())); err != nil {
|
|
widget.Write(fmt.Sprintf("Error: %s", err.Error()), text.WriteCellOpts(cell.FgColor(cell.ColorRed)))
|
|
return err
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%s\n\n", article.Description), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
widget.Write(fmt.Sprintf("Error: %s", err.Error()), text.WriteCellOpts(cell.FgColor(cell.ColorRed)))
|
|
return err
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%s\n", strings.ReplaceAll(article.Content, "\r", "")), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
widget.Write(fmt.Sprintf("Error: %s", err.Error()), text.WriteCellOpts(cell.FgColor(cell.ColorRed)))
|
|
return err
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%s\n\n", article.PublishedAt), text.WriteCellOpts(cell.FgColor(cell.ColorGray))); err != nil {
|
|
widget.Write(fmt.Sprintf("Error: %s", err.Error()), text.WriteCellOpts(cell.FgColor(cell.ColorRed)))
|
|
return err
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%s\n", article.URL)); err != nil {
|
|
widget.Write(fmt.Sprintf("Error: %s", err.Error()), text.WriteCellOpts(cell.FgColor(cell.ColorRed)))
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type NewsText struct {
|
|
*text.Text
|
|
Selected int
|
|
newsArticles news.News
|
|
}
|
|
|
|
func NewNewsText(opts ...text.Option) (*NewsText, error) {
|
|
t, err := text.New(opts...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &NewsText{Text: t}, nil
|
|
}
|
|
|
|
func (widget *NewsText) Keyboard(k *terminalapi.Keyboard, _ *widgetapi.EventMeta) error {
|
|
if k.Key == keyboard.KeyArrowLeft {
|
|
if widget.Selected == 0 {
|
|
widget.Selected = len(widget.newsArticles.Articles) - 1
|
|
} else {
|
|
widget.Selected = widget.Selected - 1
|
|
}
|
|
} else if k.Key == keyboard.KeyArrowRight {
|
|
widget.Selected = (widget.Selected + 1) % len(widget.newsArticles.Articles)
|
|
}
|
|
return widget.drawNews()
|
|
}
|