aboutsummaryrefslogtreecommitdiff
path: root/service/service.go
diff options
context:
space:
mode:
Diffstat (limited to 'service/service.go')
-rw-r--r--service/service.go129
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
}