1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00

Adding subreddit module

This commit is contained in:
Lawrence Craft 2019-09-23 03:26:45 +01:00
parent 555a1c6def
commit b0d6790abe
6 changed files with 207 additions and 0 deletions

View File

@ -45,6 +45,7 @@ import (
"github.com/wtfutil/wtf/modules/spotify"
"github.com/wtfutil/wtf/modules/spotifyweb"
"github.com/wtfutil/wtf/modules/status"
"github.com/wtfutil/wtf/modules/subreddit"
"github.com/wtfutil/wtf/modules/textfile"
"github.com/wtfutil/wtf/modules/todo"
"github.com/wtfutil/wtf/modules/todoist"
@ -210,6 +211,9 @@ func MakeWidget(
case "status":
settings := status.NewSettingsFromYAML(moduleName, moduleConfig, config)
widget = status.NewWidget(app, settings)
case "subreddit":
settings := subreddit.NewSettingsFromYAML(moduleName, moduleConfig, config)
widget = subreddit.NewWidget(app, pages, settings)
case "textfile":
settings := textfile.NewSettingsFromYAML(moduleName, moduleConfig, config)
widget = textfile.NewWidget(app, pages, settings)

42
modules/subreddit/api.go Normal file
View File

@ -0,0 +1,42 @@
package subreddit
import (
"fmt"
"net/http"
"github.com/wtfutil/wtf/utils"
)
var rootPage = "https://reddit.com/r/"
func GetLinks(subreddit string, sortMode string) ([]Link, error) {
request, err := http.NewRequest("GET", rootPage+subreddit+"/"+sortMode+".json", nil)
if err != nil {
return nil, err
}
request.Header.Add("User-Agent", "WTF Utility")
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
return nil, err
}
if resp.StatusCode > 299 {
return nil, fmt.Errorf(resp.Status)
}
var m RedditDocument
err = utils.ParseJson(&m, resp.Body)
if err != nil {
return nil, err
}
var links []Link
for _, l := range m.Data.Children {
links = append(links, l.Data)
}
return links, nil
}

View File

@ -0,0 +1,17 @@
package subreddit
import "github.com/gdamore/tcell"
func (widget *Widget) initializeKeyboardControls() {
widget.InitializeCommonControls(widget.Refresh)
widget.SetKeyboardChar("j", widget.Next, "Select next item")
widget.SetKeyboardChar("k", widget.Prev, "Select previous item")
widget.SetKeyboardChar("o", widget.openLink, "Open target URL in browser")
widget.SetKeyboardChar("c", widget.openReddit, "Open Reddit comments in browser")
widget.SetKeyboardKey(tcell.KeyDown, widget.Next, "Select next item")
widget.SetKeyboardKey(tcell.KeyUp, widget.Prev, "Select previous item")
widget.SetKeyboardKey(tcell.KeyEnter, widget.openReddit, "Open story in browser")
widget.SetKeyboardKey(tcell.KeyEsc, widget.Unselect, "Clear selection")
}

20
modules/subreddit/link.go Normal file
View File

@ -0,0 +1,20 @@
package subreddit
type Link struct {
Score int `json:"ups"`
Title string `json:"title"`
ItemURL string `json:"url"`
Permalink string `json:"permalink"`
}
type RedditDocument struct {
Data Subreddit `json:"data"`
}
type RedditLinkDocument struct {
Data Link `json:"data"`
}
type Subreddit struct {
Children []RedditLinkDocument `json:"Children"`
}

View File

@ -0,0 +1,33 @@
package subreddit
import (
"github.com/olebedev/config"
"github.com/wtfutil/wtf/cfg"
)
const (
defaultFocusable = true
)
// Settings contains the settings for the subreddit view
type Settings struct {
common *cfg.Common
subreddit string `help:"Subreddit to look at" optional:"false"`
numberOfPosts int `help:"Number of posts to show. Default is 10." optional:"true"`
sortOrder string `help:"Sort order for the posts (hot, new, rising, top), default hot" optional:"true"`
}
// NewSettingsFromYAML creates the settings for this module from a yaml file
func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *config.Config) *Settings {
subreddit := ymlConfig.UString("subreddit")
settings := Settings{
common: cfg.NewCommonSettingsFromModule(name, subreddit, defaultFocusable, ymlConfig, globalConfig),
numberOfPosts: ymlConfig.UInt("numberOfPosts", 10),
sortOrder: ymlConfig.UString("sortOrder", "hot"),
subreddit: subreddit,
}
return &settings
}

View File

@ -0,0 +1,91 @@
package subreddit
import (
"fmt"
"github.com/rivo/tview"
"github.com/wtfutil/wtf/utils"
"github.com/wtfutil/wtf/view"
)
type Widget struct {
view.KeyboardWidget
view.ScrollableWidget
settings *Settings
err error
links []Link
}
func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget {
widget := &Widget{
KeyboardWidget: view.NewKeyboardWidget(app, pages, settings.common),
ScrollableWidget: view.NewScrollableWidget(app, settings.common),
settings: settings,
}
widget.SetRenderFunction(widget.Render)
widget.initializeKeyboardControls()
widget.View.SetInputCapture(widget.InputCapture)
widget.KeyboardWidget.SetView(widget.View)
return widget
}
func (widget *Widget) Refresh() {
links, err := GetLinks(widget.settings.subreddit, widget.settings.sortOrder)
if err != nil {
widget.err = err
widget.links = nil
widget.SetItemCount(0)
} else {
widget.links = links
widget.SetItemCount(len(links))
widget.err = nil
}
widget.Render()
}
func (widget *Widget) Render() {
widget.Redraw(widget.content)
}
func (widget *Widget) content() (string, string, bool) {
title := "/r/" + widget.settings.subreddit + " - " + widget.settings.sortOrder
if widget.err != nil {
return title, widget.err.Error(), true
}
var content string
for idx, link := range widget.links {
row := fmt.Sprintf(
`[%s]%2d. %s`,
widget.RowColor(idx),
idx+1,
tview.Escape(link.Title),
)
content += utils.HighlightableHelper(widget.View, row, idx, len(link.Title))
}
return title, content, false
}
func (widget *Widget) openLink() {
sel := widget.GetSelected()
if sel >= 0 && widget.links != nil && sel < len(widget.links) {
story := &widget.links[sel]
utils.OpenFile(story.ItemURL)
}
}
func (widget *Widget) openReddit() {
sel := widget.GetSelected()
if sel >= 0 && widget.links != nil && sel < len(widget.links) {
story := &widget.links[sel]
fullLink := "http://reddit.com" + story.Permalink
utils.OpenFile(fullLink)
}
}