diff options
Diffstat (limited to 'service/service.go')
-rw-r--r-- | service/service.go | 129 |
1 files changed, 114 insertions, 15 deletions
diff --git a/service/service.go b/service/service.go index a846322..8bccd45 100644 --- a/service/service.go +++ b/service/service.go @@ -114,7 +114,8 @@ func (s *service) ErrorPage(c *client, err error, retry bool) error { var sessionErr bool if err != nil { errStr = err.Error() - if err == errInvalidSession || err == errInvalidCSRFToken { + if me, ok := err.(mastodon.Error); ok && me.IsAuthError() || + err == errInvalidSession || err == errInvalidCSRFToken { sessionErr = true } } @@ -162,8 +163,8 @@ func (s *service) NavPage(c *client) (err error) { return s.renderer.Render(c.rctx, c.w, renderer.NavPage, data) } -func (s *service) TimelinePage(c *client, tType string, instance string, - maxID string, minID string) (err error) { +func (s *service) TimelinePage(c *client, tType, instance, listId, maxID, + minID string) (err error) { var nextLink, prevLink, title string var statuses []*mastodon.Status @@ -178,24 +179,46 @@ func (s *service) TimelinePage(c *client, tType string, instance string, return errInvalidArgument case "home": statuses, err = c.GetTimelineHome(c.ctx, &pg) + if err != nil { + return err + } title = "Timeline" case "direct": statuses, err = c.GetTimelineDirect(c.ctx, &pg) + if err != nil { + return err + } title = "Direct Timeline" case "local": statuses, err = c.GetTimelinePublic(c.ctx, true, "", &pg) + if err != nil { + return err + } title = "Local Timeline" case "remote": if len(instance) > 0 { statuses, err = c.GetTimelinePublic(c.ctx, false, instance, &pg) + if err != nil { + return err + } } title = "Remote Timeline" case "twkn": statuses, err = c.GetTimelinePublic(c.ctx, false, "", &pg) + if err != nil { + return err + } title = "The Whole Known Network" - } - if err != nil { - return err + case "list": + statuses, err = c.GetTimelineList(c.ctx, listId, &pg) + if err != nil { + return err + } + list, err := c.GetList(c.ctx, listId) + if err != nil { + return err + } + title = "List Timeline - " + list.Title } for i := range statuses { @@ -210,6 +233,9 @@ func (s *service) TimelinePage(c *client, tType string, instance string, if len(instance) > 0 { v.Set("instance", instance) } + if len(listId) > 0 { + v.Set("list", listId) + } prevLink = "/timeline/" + tType + "?" + v.Encode() } @@ -219,6 +245,9 @@ func (s *service) TimelinePage(c *client, tType string, instance string, if len(instance) > 0 { v.Set("instance", instance) } + if len(listId) > 0 { + v.Set("list", listId) + } nextLink = "/timeline/" + tType + "?" + v.Encode() } @@ -251,6 +280,70 @@ func addToReplyMap(m map[string][]mastodon.ReplyInfo, key interface{}, m[keyStr] = append(m[keyStr], mastodon.ReplyInfo{val, number}) } +func (s *service) ListsPage(c *client) (err error) { + lists, err := c.GetLists(c.ctx) + if err != nil { + return + } + + cdata := s.cdata(c, "Lists", 0, 0, "") + data := renderer.ListsData{ + Lists: lists, + CommonData: cdata, + } + return s.renderer.Render(c.rctx, c.w, renderer.ListsPage, data) +} + +func (s *service) AddList(c *client, title string) (err error) { + _, err = c.CreateList(c.ctx, title) + return err +} + +func (s *service) RemoveList(c *client, id string) (err error) { + return c.DeleteList(c.ctx, id) +} + +func (s *service) RenameList(c *client, id, title string) (err error) { + _, err = c.RenameList(c.ctx, id, title) + return err +} + +func (s *service) ListPage(c *client, id string, q string) (err error) { + list, err := c.GetList(c.ctx, id) + if err != nil { + return + } + accounts, err := c.GetListAccounts(c.ctx, id) + if err != nil { + return + } + var searchAccounts []*mastodon.Account + if len(q) > 0 { + result, err := c.Search(c.ctx, q, "accounts", 20, true, 0, id, true) + if err != nil { + return err + } + searchAccounts = result.Accounts + } + cdata := s.cdata(c, "List "+list.Title, 0, 0, "") + data := renderer.ListData{ + List: list, + Accounts: accounts, + Q: q, + SearchAccounts: searchAccounts, + CommonData: cdata, + } + return s.renderer.Render(c.rctx, c.w, renderer.ListPage, data) +} + +func (s *service) ListAddUser(c *client, id string, uid string) (err error) { + return c.AddToList(c.ctx, id, uid) +} + +func (s *service) ListRemoveUser(c *client, id string, uid string) (err error) { + return c.RemoveFromList(c.ctx, id, uid) +} + func (s *service) ThreadPage(c *client, id string, reply bool) (err error) { var pctx model.PostContext @@ -417,18 +510,24 @@ func (s *service) NotificationPage(c *client, maxID string, var nextLink string var unreadCount int var readID string - var excludes []string + var includes, excludes []string var pg = mastodon.Pagination{ MaxID: maxID, MinID: minID, Limit: 20, } + if c.s.Settings.HideUnsupportedNotifs { + // Explicitly include the supported types. + // For now, only Pleroma supports this option, Mastadon + // will simply ignore the unknown params. + includes = []string{"follow", "follow_request", "mention", "reblog", "favourite"} + } if c.s.Settings.AntiDopamineMode { - excludes = []string{"follow", "favourite", "reblog"} + excludes = append(excludes, "follow", "favourite", "reblog") } - notifications, err := c.GetNotifications(c.ctx, &pg, excludes) + notifications, err := c.GetNotifications(c.ctx, &pg, includes, excludes) if err != nil { return } @@ -609,7 +708,7 @@ func (s *service) UserSearchPage(c *client, var results *mastodon.Results if len(q) > 0 { - results, err = c.Search(c.ctx, q, "statuses", 20, true, offset, id) + results, err = c.Search(c.ctx, q, "statuses", 20, true, offset, id, false) if err != nil { return err } @@ -620,7 +719,7 @@ func (s *service) UserSearchPage(c *client, if len(results.Statuses) == 20 { offset += 20 nextLink = fmt.Sprintf("/usersearch/%s?q=%s&offset=%d", id, - url.QueryEscape(q), offset) + q, offset) } if len(q) > 0 { @@ -667,7 +766,7 @@ func (s *service) SearchPage(c *client, var results *mastodon.Results if len(q) > 0 { - results, err = c.Search(c.ctx, q, qType, 20, true, offset, "") + results, err = c.Search(c.ctx, q, qType, 20, true, offset, "", false) if err != nil { return err } @@ -679,7 +778,7 @@ func (s *service) SearchPage(c *client, (qType == "statuses" && len(results.Statuses) == 20) { offset += 20 nextLink = fmt.Sprintf("/search?q=%s&type=%s&offset=%d", - url.QueryEscape(q), qType, offset) + q, qType, offset) } if len(q) > 0 { @@ -914,8 +1013,8 @@ func (s *service) Reject(c *client, id string) (err error) { return c.FollowRequestReject(c.ctx, id) } -func (s *service) Mute(c *client, id string) (err error) { - _, err = c.AccountMute(c.ctx, id) +func (s *service) Mute(c *client, id string, notifications *bool) (err error) { + _, err = c.AccountMute(c.ctx, id, notifications) return } |