aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorr <r@freesoftwareextremist.com>2022-12-17 08:26:51 +0000
committerr <r@freesoftwareextremist.com>2022-12-17 08:26:51 +0000
commit5147897c6c8ba3428ea6998f77241182ee8caa24 (patch)
treee0177960dfda43c901f5feb458186077f96e4abd
parent9816045c21957bfda6760ca058eaae97901e3b63 (diff)
downloadbloat-5147897c6c8ba3428ea6998f77241182ee8caa24.tar.gz
bloat-5147897c6c8ba3428ea6998f77241182ee8caa24.zip
Add support for expiring mutes
-rw-r--r--mastodon/accounts.go7
-rw-r--r--renderer/model.go5
-rw-r--r--renderer/renderer.go1
-rw-r--r--service/service.go17
-rw-r--r--service/transport.go18
-rw-r--r--templates/mute.tmpl29
-rw-r--r--templates/user.tmpl12
7 files changed, 64 insertions, 25 deletions
diff --git a/mastodon/accounts.go b/mastodon/accounts.go
index 540adb2..f4e9002 100644
--- a/mastodon/accounts.go
+++ b/mastodon/accounts.go
@@ -246,11 +246,10 @@ func (c *Client) AccountUnblock(ctx context.Context, id string) (*Relationship,
}
// AccountMute mute the account.
-func (c *Client) AccountMute(ctx context.Context, id string, notifications *bool) (*Relationship, error) {
+func (c *Client) AccountMute(ctx context.Context, id string, notifications bool, duration int) (*Relationship, error) {
params := url.Values{}
- if notifications != nil {
- params.Set("notifications", strconv.FormatBool(*notifications))
- }
+ params.Set("notifications", strconv.FormatBool(notifications))
+ params.Set("duration", strconv.Itoa(duration))
var relationship Relationship
err := c.doAPI(ctx, http.MethodPost, fmt.Sprintf("/api/v1/accounts/%s/mute", url.PathEscape(string(id))), params, &relationship, nil)
if err != nil {
diff --git a/renderer/model.go b/renderer/model.go
index e7cfbfb..8311f58 100644
--- a/renderer/model.go
+++ b/renderer/model.go
@@ -155,3 +155,8 @@ type FiltersData struct {
*CommonData
Filters []*mastodon.Filter
}
+
+type MuteData struct {
+ *CommonData
+ User *mastodon.Account
+}
diff --git a/renderer/renderer.go b/renderer/renderer.go
index 7afeb14..7732554 100644
--- a/renderer/renderer.go
+++ b/renderer/renderer.go
@@ -33,6 +33,7 @@ const (
SearchPage = "search.tmpl"
SettingsPage = "settings.tmpl"
FiltersPage = "filters.tmpl"
+ MutePage = "mute.tmpl"
)
type TemplateData struct {
diff --git a/service/service.go b/service/service.go
index 432f938..0d2e196 100644
--- a/service/service.go
+++ b/service/service.go
@@ -678,6 +678,19 @@ func (s *service) UserSearchPage(c *client,
return s.renderer.Render(c.rctx, c.w, renderer.UserSearchPage, data)
}
+func (s *service) MutePage(c *client, id string) (err error) {
+ user, err := c.GetAccount(c.ctx, id)
+ if err != nil {
+ return
+ }
+ cdata := s.cdata(c, "Mute"+user.DisplayName+" @"+user.Acct, 0, 0, "")
+ data := &renderer.UserData{
+ User: user,
+ CommonData: cdata,
+ }
+ return s.renderer.Render(c.rctx, c.w, renderer.MutePage, data)
+}
+
func (s *service) AboutPage(c *client) (err error) {
cdata := s.cdata(c, "about", 0, 0, "")
data := &renderer.AboutData{
@@ -930,8 +943,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, notifications *bool) (err error) {
- _, err = c.AccountMute(c.ctx, id, notifications)
+func (s *service) Mute(c *client, id string, notifications bool, duration int) (err error) {
+ _, err = c.AccountMute(c.ctx, id, notifications, duration)
return
}
diff --git a/service/transport.go b/service/transport.go
index 471a7d4..5c6472c 100644
--- a/service/transport.go
+++ b/service/transport.go
@@ -171,6 +171,11 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
return s.UserSearchPage(c, id, sq, offset)
}, SESSION, HTML)
+ mutePage := handle(func(c *client) error {
+ id, _ := mux.Vars(c.r)["id"]
+ return s.MutePage(c, id)
+ }, SESSION, HTML)
+
aboutPage := handle(func(c *client) error {
return s.AboutPage(c)
}, SESSION, HTML)
@@ -361,17 +366,13 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
mute := handle(func(c *client) error {
id, _ := mux.Vars(c.r)["id"]
- q := c.r.URL.Query()
- var notifications *bool
- if r, ok := q["notifications"]; ok && len(r) > 0 {
- notifications = new(bool)
- *notifications = r[0] == "true"
- }
- err := s.Mute(c, id, notifications)
+ notifications, _ := strconv.ParseBool(c.r.FormValue("notifications"))
+ duration, _ := strconv.Atoi(c.r.FormValue("duration"))
+ err := s.Mute(c, id, notifications, duration)
if err != nil {
return err
}
- c.redirect(c.r.FormValue("referrer"))
+ c.redirect("/user/" + id)
return nil
}, CSRF, HTML)
@@ -673,6 +674,7 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
r.HandleFunc("/user/{id}", userPage).Methods(http.MethodGet)
r.HandleFunc("/user/{id}/{type}", userPage).Methods(http.MethodGet)
r.HandleFunc("/usersearch/{id}", userSearchPage).Methods(http.MethodGet)
+ r.HandleFunc("/mute/{id}", mutePage).Methods(http.MethodGet)
r.HandleFunc("/about", aboutPage).Methods(http.MethodGet)
r.HandleFunc("/emojis", emojisPage).Methods(http.MethodGet)
r.HandleFunc("/search", searchPage).Methods(http.MethodGet)
diff --git a/templates/mute.tmpl b/templates/mute.tmpl
new file mode 100644
index 0000000..47d0533
--- /dev/null
+++ b/templates/mute.tmpl
@@ -0,0 +1,29 @@
+{{with .Data}}
+{{template "header.tmpl" (WithContext .CommonData $.Ctx)}}
+<div class="page-title"> Mute {{.User.Acct}} </div>
+
+<form action="/mute/{{.User.ID}}" method="POST">
+ <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
+ <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
+ <div class="settings-form-field">
+ <input id="notifications" name="notifications" type="checkbox" value="true" checked>
+ <label for="notifications"> Mute notifications </label>
+ </div>
+ <div class="settings-form-field">
+ <label for="duration"> Auto unmute </label>
+ <select id="duration" name="duration">
+ <option value="0" selected>Disabled</option>
+ <option value="300">After 5m</option>
+ <option value="1800">After 30m</option>
+ <option value="3600">After 1h</option>
+ <option value="21600">After 6h</option>
+ <option value="86400">After 1d</option>
+ <option value="259200">After 3d</option>
+ <option value="604800">After 7d</option>
+ </select>
+ </div>
+ <button type="submit"> Mute </button>
+</form>
+
+{{template "footer.tmpl"}}
+{{end}}
diff --git a/templates/user.tmpl b/templates/user.tmpl
index e30088b..5ea52d9 100644
--- a/templates/user.tmpl
+++ b/templates/user.tmpl
@@ -79,17 +79,7 @@
<input type="submit" value="unmute" class="btn-link">
</form>
{{else}}
- <form class="d-inline" action="/mute/{{.User.ID}}" method="post">
- <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
- <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
- <input type="submit" value="mute" class="btn-link">
- </form>
- -
- <form class="d-inline" action="/mute/{{.User.ID}}?notifications=false" method="post">
- <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
- <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
- <input type="submit" value="mute (keep notifications)" class="btn-link">
- </form>
+ <a href="/mute/{{.User.ID}}"> mute </a>
{{end}}
{{if .User.Pleroma.Relationship.Following}}
-