1
0
Fork 0

Implemented forum listing/filtering

This commit is contained in:
マリウス 2023-01-05 11:43:52 -05:00
parent 2858e68615
commit 6983f90225
No known key found for this signature in database
GPG Key ID: 272ED814BF63261F
12 changed files with 251 additions and 16 deletions

View File

@ -4,7 +4,9 @@ import (
"encoding/json"
"os"
"sort"
"strings"
"github.com/mrusme/gobbs/models/forum"
"github.com/mrusme/gobbs/models/post"
"github.com/mrusme/gobbs/models/reply"
"github.com/mrusme/gobbs/ui/ctx"
@ -21,6 +23,33 @@ func New(c *ctx.Ctx) (*Aggregator, error) {
return a, nil
}
func (a *Aggregator) ListForums() ([]forum.Forum, []error) {
var errs []error = make([]error, len(a.ctx.Systems))
var forums []forum.Forum
for idx, sys := range a.ctx.Systems {
if curSysIDX := a.ctx.GetCurrentSystem(); curSysIDX != -1 {
if idx != curSysIDX {
continue
}
}
sysForums, err := (*sys).ListForums()
if err != nil {
errs[idx] = err
continue
}
forums = append(forums, sysForums...)
}
sort.SliceStable(forums, func(i, j int) bool {
return strings.Compare(forums[i].Name, forums[j].Name) == 1
})
return forums, errs
}
func (a *Aggregator) ListPosts() ([]post.Post, []error) {
var errs []error = make([]error, len(a.ctx.Systems))
var posts []post.Post
@ -37,7 +66,13 @@ func (a *Aggregator) ListPosts() ([]post.Post, []error) {
}
for idx, sys := range a.ctx.Systems {
sysPosts, err := (*sys).ListPosts()
if curSysIDX := a.ctx.GetCurrentSystem(); curSysIDX != -1 {
if idx != curSysIDX {
continue
}
}
sysPosts, err := (*sys).ListPosts(a.ctx.GetCurrentForum().ID)
if err != nil {
errs[idx] = err
continue

View File

@ -92,6 +92,7 @@ func loadSystems(c *ctx.Ctx) []error {
}
c.AddSystem(&sys)
c.Logger.Debugf("setting system ID to %d", c.NumSystems()-1)
sys.SetID(c.NumSystems() - 1)
}

View File

@ -3,4 +3,18 @@ package forum
type Forum struct {
ID string
Name string
SysIDX int
}
func (forum Forum) FilterValue() string {
return forum.Name
}
func (forum Forum) Title() string {
return forum.Name
}
func (forum Forum) Description() string {
return forum.ID
}

View File

@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"github.com/mrusme/gobbs/models/forum"
"github.com/mrusme/gobbs/models/post"
"github.com/mrusme/gobbs/models/reply"
"github.com/mrusme/gobbs/system/adapter"
@ -65,7 +66,11 @@ func (sys *System) Connect(sysURL string) error {
return errors.New("This system can't be connected to")
}
func (sys *System) ListPosts() ([]post.Post, error) {
func (sys *System) ListForums() ([]forum.Forum, error) {
return []forum.Forum{}, nil
}
func (sys *System) ListPosts(forumID string) ([]post.Post, error) {
return []post.Post{}, nil
}

View File

@ -2,6 +2,7 @@ package api
import (
"context"
"fmt"
"net/http"
)
@ -82,6 +83,8 @@ type TopicsService interface {
) (*SingleTopicResponse, error)
ListLatest(
ctx context.Context,
categorySlug string,
categoryID int,
) (*LatestTopicsResponse, error)
}
@ -112,8 +115,15 @@ func (a *TopicServiceHandler) Show(
// List
func (a *TopicServiceHandler) ListLatest(
ctx context.Context,
categorySlug string,
categoryID int,
) (*LatestTopicsResponse, error) {
uri := "/latest.json"
var uri string
if categoryID == -1 {
uri = "/latest.json"
} else {
uri = fmt.Sprintf("/c/%s/%d.json", categorySlug, categoryID)
}
req, err := a.client.NewRequest(ctx, http.MethodGet, uri, nil)
if err != nil {

View File

@ -115,13 +115,51 @@ func (sys *System) Load() error {
return nil
}
func (sys *System) ListPosts() ([]post.Post, error) {
func (sys *System) ListForums() ([]forum.Forum, error) {
var models []forum.Forum
cats, err := sys.client.Categories.List(context.Background())
if err != nil {
return []forum.Forum{}, err
}
for _, cat := range cats.CategoryList.Categories {
models = append(models, forum.Forum{
ID: strconv.Itoa(cat.ID),
Name: cat.Name,
SysIDX: sys.ID,
})
}
return models, nil
}
func (sys *System) ListPosts(forumID string) ([]post.Post, error) {
var catSlug string = ""
var catID int = -1
var err error
cats, err := sys.client.Categories.List(context.Background())
if err != nil {
return []post.Post{}, err
}
items, err := sys.client.Topics.ListLatest(context.Background())
if forumID != "" {
catID, err = strconv.Atoi(forumID)
if err != nil {
return []post.Post{}, err
}
for _, cat := range cats.CategoryList.Categories {
if cat.ID == catID {
catSlug = cat.Slug
break
}
}
}
items, err := sys.client.Topics.ListLatest(context.Background(), catSlug, catID)
if err != nil {
return []post.Post{}, err
}
@ -181,6 +219,8 @@ func (sys *System) ListPosts() ([]post.Post, error) {
Forum: forum.Forum{
ID: strconv.Itoa(i.CategoryID),
Name: forumName,
SysIDX: sys.ID,
},
SysIDX: sys.ID,

View File

@ -82,8 +82,59 @@ func (sys *System) Load() error {
return nil
}
func (sys *System) ListPosts() ([]post.Post, error) {
stories, err := sys.client.TopStories(context.Background())
func (sys *System) ListForums() ([]forum.Forum, error) {
return []forum.Forum{
{
ID: "top",
Name: "Top HN Stories",
SysIDX: sys.ID,
},
{
ID: "best",
Name: "Best HN Stories",
SysIDX: sys.ID,
},
{
ID: "new",
Name: "New HN Stories",
SysIDX: sys.ID,
},
{
ID: "ask",
Name: "Ask HN",
SysIDX: sys.ID,
},
{
ID: "show",
Name: "Show HN",
SysIDX: sys.ID,
},
{
ID: "jobs",
Name: "Jobs HN",
SysIDX: sys.ID,
},
}, nil
}
func (sys *System) ListPosts(forumID string) ([]post.Post, error) {
var stories []int
var err error
switch forumID {
case "top":
stories, err = sys.client.TopStories(context.Background())
case "best":
stories, err = sys.client.BestStories(context.Background())
case "ask":
stories, err = sys.client.AskStories(context.Background())
case "show":
stories, err = sys.client.ShowStories(context.Background())
case "jobs":
stories, err = sys.client.JobStories(context.Background())
default:
stories, err = sys.client.NewStories(context.Background())
}
if err != nil {
return []post.Post{}, err
}
@ -142,6 +193,8 @@ func (sys *System) ListPosts() ([]post.Post, error) {
Forum: forum.Forum{
ID: "new",
Name: "New",
SysIDX: sys.ID,
},
Replies: replies,

View File

@ -2,6 +2,7 @@ package lemmy
import (
"context"
"encoding/json"
"fmt"
"net/url"
"strconv"
@ -113,7 +114,31 @@ func (sys *System) Load() error {
return nil
}
func (sys *System) ListPosts() ([]post.Post, error) {
func (sys *System) ListForums() ([]forum.Forum, error) {
resp, err := sys.client.Communities(context.Background(), types.ListCommunities{
Type: types.NewOptional(types.ListingSubscribed),
})
if err != nil {
return []forum.Forum{}, err
}
var models []forum.Forum
for _, i := range resp.Communities {
sys.logger.Debugf("FORUM:")
b, _ := json.Marshal(i)
sys.logger.Debug(string(b))
models = append(models, forum.Forum{
ID: strconv.Itoa(i.CommunitySafe.ID),
Name: i.CommunitySafe.Name,
SysIDX: sys.ID,
})
}
return models, nil
}
func (sys *System) ListPosts(forumID string) ([]post.Post, error) {
resp, err := sys.client.Posts(context.Background(), types.GetPosts{
Type: types.NewOptional(types.ListingSubscribed),
Sort: types.NewOptional(types.New),
@ -163,6 +188,8 @@ func (sys *System) ListPosts() ([]post.Post, error) {
Forum: forum.Forum{
ID: strconv.Itoa(i.Post.CommunityID),
Name: i.Community.Name,
SysIDX: sys.ID,
},
SysIDX: sys.ID,

View File

@ -3,6 +3,7 @@ package system
import (
"errors"
"github.com/mrusme/gobbs/models/forum"
"github.com/mrusme/gobbs/models/post"
"github.com/mrusme/gobbs/models/reply"
"github.com/mrusme/gobbs/system/adapter"
@ -28,7 +29,8 @@ type System interface {
Connect(sysURL string) error
Load() error
ListPosts() ([]post.Post, error)
ListForums() ([]forum.Forum, error)
ListPosts(forumID string) ([]post.Post, error)
LoadPost(p *post.Post) error
CreatePost(p *post.Post) error
CreateReply(r *reply.Reply) error

View File

@ -2,6 +2,7 @@ package ctx
import (
"github.com/mrusme/gobbs/config"
"github.com/mrusme/gobbs/models/forum"
"github.com/mrusme/gobbs/system"
"github.com/mrusme/gobbs/ui/theme"
"go.uber.org/zap"
@ -17,7 +18,7 @@ type Ctx struct {
Theme *theme.Theme
currentSystem int
currentForum string
currentForum forum.Forum
}
func New(
@ -33,7 +34,7 @@ func New(
Theme: theme.New(cfg),
currentSystem: -1,
currentForum: "",
currentForum: forum.Forum{},
}
}
@ -54,10 +55,10 @@ func (c *Ctx) GetCurrentSystem() int {
return c.currentSystem
}
func (c *Ctx) SetCurrentForum(id string) {
c.currentForum = id
func (c *Ctx) SetCurrentForum(f forum.Forum) {
c.currentForum = f
}
func (c *Ctx) GetCurrentForum() string {
func (c *Ctx) GetCurrentForum() forum.Forum {
return c.currentForum
}

View File

@ -77,8 +77,14 @@ func (m Model) View() string {
currentSystem = (*m.ctx.Systems[curSysIdx]).Title()
}
curForum := m.ctx.GetCurrentForum()
var currentForum string = "All"
if curForum.ID != "" {
currentForum = curForum.Title()
}
systemSelector := selector.Render(fmt.Sprintf("⏷ %s", currentSystem))
forumSelector := selector.Render("⏷ All")
forumSelector := selector.Render(fmt.Sprintf("⏷ %s", currentForum))
selectorColumn := lipgloss.JoinVertical(lipgloss.Center,
lipgloss.JoinHorizontal(lipgloss.Bottom, "System: \n "+

View File

@ -5,6 +5,7 @@ import (
"strings"
"github.com/mrusme/gobbs/aggregator"
"github.com/mrusme/gobbs/models/forum"
"github.com/mrusme/gobbs/system"
"github.com/mrusme/gobbs/ui/cmd"
@ -54,6 +55,8 @@ type Model struct {
wm *windowmanager.WM
ctx *ctx.Ctx
a *aggregator.Aggregator
viewcache string
viewcacheID string
renderOnlyFocused bool
@ -73,6 +76,8 @@ func NewModel(c *ctx.Ctx) Model {
m.header = header.NewModel(m.ctx)
m.views = append(m.views, posts.NewModel(m.ctx))
m.a, _ = aggregator.New(m.ctx)
return m
}
@ -130,6 +135,39 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
)
return m, tea.Batch(ccmds...)
case key.Matches(msg, m.keymap.ForumSelect):
var listItems []list.Item
all := forum.Forum{ID: "", Name: "All", SysIDX: -1}
listItems = append(listItems, all)
forums, errs := m.a.ListForums()
if len(errs) > 0 {
// TODO: Handle errors
}
for _, f := range forums {
m.ctx.Logger.Debugf("Adding forum to list: %s ID %d\n", f.Title(), f.SysIDX)
listItems = append(listItems, f)
}
ccmds := m.wm.Open(
popuplist.WIN_ID,
popuplist.NewModel(m.ctx),
[4]int{
int(m.ctx.Content[1] / 2),
int(m.ctx.Content[1] / 4),
int(m.ctx.Content[1] / 2),
int(m.ctx.Content[1] / 4),
},
cmd.New(
cmd.WinOpen,
popuplist.WIN_ID,
cmd.Arg{Name: "selectionID", Value: "forum"},
cmd.Arg{Name: "items", Value: listItems},
),
)
return m, tea.Batch(ccmds...)
default:
if m.wm.GetNumberOpen() > 0 {
cmd := m.wm.Update(m.wm.Focused(), msg)
@ -198,9 +236,12 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case "system":
selected := msg.GetArg("selected").(system.System)
m.ctx.SetCurrentSystem(selected.GetID())
m.ctx.SetCurrentForum(forum.Forum{})
case "forum":
selected := msg.GetArg("selected").(forum.Forum)
m.ctx.SetCurrentForum(selected.ID)
m.ctx.Logger.Debugf("selecting system ID %d\n", selected.SysIDX)
m.ctx.SetCurrentSystem(selected.SysIDX)
m.ctx.SetCurrentForum(selected)
}
}