mirror of
				https://github.com/taigrr/wtf
				synced 2025-01-18 04:03:14 -08:00 
			
		
		
		
	Merge branch 'master' of github.com:lawrencecraft/wtf into lawrencecraft-master
This commit is contained in:
		
						commit
						36607f43ad
					
				@ -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)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										51
									
								
								modules/subreddit/api.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								modules/subreddit/api.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
			
		||||
package subreddit
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"github.com/wtfutil/wtf/utils"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var rootPage = "https://reddit.com/r/"
 | 
			
		||||
 | 
			
		||||
func GetLinks(subreddit string, sortMode string, topTimePeriod string) ([]Link, error) {
 | 
			
		||||
	url := rootPage + subreddit + "/" + sortMode + ".json"
 | 
			
		||||
	if sortMode == "top" {
 | 
			
		||||
		url = url + "?sort=top&t=" + topTimePeriod
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	request, err := http.NewRequest("GET", url, 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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(m.Data.Children) == 0 {
 | 
			
		||||
		return nil, fmt.Errorf("No links")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var links []Link
 | 
			
		||||
	for _, l := range m.Data.Children {
 | 
			
		||||
		links = append(links, l.Data)
 | 
			
		||||
	}
 | 
			
		||||
	return links, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								modules/subreddit/keyboard.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								modules/subreddit/keyboard.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										20
									
								
								modules/subreddit/link.go
									
									
									
									
									
										Normal 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"`
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								modules/subreddit/settings.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								modules/subreddit/settings.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
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"`
 | 
			
		||||
	topTimePeriod string `help:"If top sort is selected, the time period to show posts from (hour, week, day, month, year, all, default all)"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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"),
 | 
			
		||||
		topTimePeriod: ymlConfig.UString("topTimePeriod", "all"),
 | 
			
		||||
		subreddit:     subreddit,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &settings
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								modules/subreddit/widget.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								modules/subreddit/widget.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -------------------- Exported Functions -------------------- */
 | 
			
		||||
 | 
			
		||||
func (widget *Widget) Refresh() {
 | 
			
		||||
	links, err := GetLinks(widget.settings.subreddit, widget.settings.sortOrder, widget.settings.topTimePeriod)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		widget.err = err
 | 
			
		||||
		widget.links = nil
 | 
			
		||||
		widget.SetItemCount(0)
 | 
			
		||||
	} else {
 | 
			
		||||
		widget.links = links[:widget.settings.numberOfPosts]
 | 
			
		||||
		widget.SetItemCount(len(widget.links))
 | 
			
		||||
		widget.err = nil
 | 
			
		||||
	}
 | 
			
		||||
	widget.Render()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (widget *Widget) Render() {
 | 
			
		||||
	widget.Redraw(widget.content)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -------------------- Unexported Functions -------------------- */
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user