Add account {hide,show}retweets
authorr <r@freesoftwareextremist.com>
Sun, 19 Apr 2020 05:57:40 +0000 (05:57 +0000)
committerr <r@freesoftwareextremist.com>
Sun, 19 Apr 2020 05:57:40 +0000 (05:57 +0000)
mastodon/accounts.go
service/auth.go
service/logging.go
service/service.go
service/transport.go
templates/user.tmpl

index 995741cfb2b0b6f69235840cfb02e8029ed518f4..7a44e2b0e51bc891d2172353eaf54109ffb7e0ca 100644 (file)
@@ -199,9 +199,13 @@ type Relationship struct {
 }
 
 // AccountFollow follow the account.
-func (c *Client) AccountFollow(ctx context.Context, id string) (*Relationship, error) {
+func (c *Client) AccountFollow(ctx context.Context, id string, reblogs *bool) (*Relationship, error) {
        var relationship Relationship
-       err := c.doAPI(ctx, http.MethodPost, fmt.Sprintf("/api/v1/accounts/%s/follow", url.PathEscape(string(id))), nil, &relationship, nil)
+       params := url.Values{}
+       if reblogs != nil {
+               params.Set("reblogs", strconv.FormatBool(*reblogs))
+       }
+       err := c.doAPI(ctx, http.MethodPost, fmt.Sprintf("/api/v1/accounts/%s/follow", url.PathEscape(id)), params, &relationship, nil)
        if err != nil {
                return nil, err
        }
index dd114b4e965ffa7c1e1232393b82d6ef364178a6..a7c4c15fc3a82434e2e9dd2fca9b13e27c1f0039 100644 (file)
@@ -292,7 +292,7 @@ func (s *as) Vote(ctx context.Context, c *model.Client, id string,
        return s.Service.Vote(ctx, c, id, choices)
 }
 
-func (s *as) Follow(ctx context.Context, c *model.Client, id string) (err error) {
+func (s *as) Follow(ctx context.Context, c *model.Client, id string, reblogs *bool) (err error) {
        err = s.authenticateClient(ctx, c)
        if err != nil {
                return
@@ -301,7 +301,7 @@ func (s *as) Follow(ctx context.Context, c *model.Client, id string) (err error)
        if err != nil {
                return
        }
-       return s.Service.Follow(ctx, c, id)
+       return s.Service.Follow(ctx, c, id, reblogs)
 }
 
 func (s *as) UnFollow(ctx context.Context, c *model.Client, id string) (err error) {
index c16cdb337885c6ffb2f2d9288941feacef9ad70a..16279cc410f9756fdb69f1cac54485e41694d111 100644 (file)
@@ -221,12 +221,12 @@ func (s *ls) Vote(ctx context.Context, c *model.Client, id string, choices []str
        return s.Service.Vote(ctx, c, id, choices)
 }
 
-func (s *ls) Follow(ctx context.Context, c *model.Client, id string) (err error) {
+func (s *ls) Follow(ctx context.Context, c *model.Client, id string, reblogs *bool) (err error) {
        defer func(begin time.Time) {
                s.logger.Printf("method=%v, id=%v, took=%v, err=%v\n",
                        "Follow", id, time.Since(begin), err)
        }(time.Now())
-       return s.Service.Follow(ctx, c, id)
+       return s.Service.Follow(ctx, c, id, reblogs)
 }
 
 func (s *ls) UnFollow(ctx context.Context, c *model.Client, id string) (err error) {
index 3a48e77d34a5cfdd8bc2b0ef4289f6ade449bd92..be83bd02f51c51852f53ed7da2ab8bc9373e9eee 100644 (file)
@@ -46,7 +46,7 @@ type Service interface {
        Retweet(ctx context.Context, c *model.Client, id string) (count int64, err error)
        UnRetweet(ctx context.Context, c *model.Client, id string) (count int64, err error)
        Vote(ctx context.Context, c *model.Client, id string, choices []string) (err error)
-       Follow(ctx context.Context, c *model.Client, id string) (err error)
+       Follow(ctx context.Context, c *model.Client, id string, reblogs *bool) (err error)
        UnFollow(ctx context.Context, c *model.Client, id string) (err error)
        Mute(ctx context.Context, c *model.Client, id string) (err error)
        UnMute(ctx context.Context, c *model.Client, id string) (err error)
@@ -811,8 +811,8 @@ func (svc *service) Vote(ctx context.Context, c *model.Client, id string,
        return
 }
 
-func (svc *service) Follow(ctx context.Context, c *model.Client, id string) (err error) {
-       _, err = c.AccountFollow(ctx, id)
+func (svc *service) Follow(ctx context.Context, c *model.Client, id string, reblogs *bool) (err error) {
+       _, err = c.AccountFollow(ctx, id, reblogs)
        return
 }
 
index 108cc18b5367ee8985bac3605bd18077aebfedbf..69b28ec087c656005b4ba61d382cddb360f855fe 100644 (file)
@@ -458,7 +458,14 @@ func NewHandler(s Service, staticDir string) http.Handler {
                ctx := newCtxWithSesionCSRF(req, req.FormValue("csrf_token"))
                id, _ := mux.Vars(req)["id"]
 
-               err := s.Follow(ctx, c, id)
+               var reblogs *bool
+               r, ok := req.URL.Query()["reblogs"]
+               if ok && len(r) > 0 {
+                       reblogs = new(bool)
+                       *reblogs = r[0] == "true"
+               }
+
+               err := s.Follow(ctx, c, id, reblogs)
                if err != nil {
                        w.WriteHeader(http.StatusInternalServerError)
                        s.ServeErrorPage(ctx, c, err)
index 848ca0a9d4a93e3c64b5710dd81d3d41bea5d2e0..b8b3754deef0d4e0960a3ed447fe07b4712d48a5 100644 (file)
                                <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
                                <input type="submit" value="mute" class="btn-link">
                        </form>
-                       {{end}} 
+                       {{end}}
+                       -
+                       {{if .User.Pleroma.Relationship.ShowingReblogs}}
+                       <form class="d-inline" action="/follow/{{.User.ID}}?reblogs=false" method="post">
+                               <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
+                               <input type="submit" value="hide retweets" class="btn-link">
+                       </form>
+                       {{else}}
+                       <form class="d-inline" action="/follow/{{.User.ID}}" method="post">
+                               <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
+                               <input type="submit" value="show retweets" class="btn-link">
+                       </form>
+                       {{end}}
                </div>
                {{end}}
                <div>