allow zonking of anything, but be clear that disavow is not delete

This commit is contained in:
Ted Unangst 2019-04-15 16:18:38 -04:00
parent 026a260722
commit 3a03baf1de
6 changed files with 62 additions and 13 deletions

View File

@ -521,13 +521,22 @@ func jonkjonk(user *WhatAbout, h *Honk) (map[string]interface{}, map[string]inte
} }
switch h.What { switch h.What {
case "zonk":
fallthrough
case "tonk": case "tonk":
fallthrough fallthrough
case "honk": case "honk":
j["type"] = "Create" j["type"] = "Create"
if h.What == "zonk" {
j["type"] = "Delete"
}
jo = NewJunk() jo = NewJunk()
jo["id"] = user.URL + "/h/" + h.XID jo["id"] = user.URL + "/h/" + h.XID
jo["type"] = "Note" jo["type"] = "Note"
if h.What == "zonk" {
jo["type"] = "Tombstone"
}
jo["published"] = dt jo["published"] = dt
jo["url"] = user.URL + "/h/" + h.XID jo["url"] = user.URL + "/h/" + h.XID
jo["attributedTo"] = user.URL jo["attributedTo"] = user.URL

View File

@ -14,6 +14,13 @@ like https://example.com/users/name. Note that the commonly seen URL with
Selecting just peeping won't actually follow them. (Incomplete feature.) Selecting just peeping won't actually follow them. (Incomplete feature.)
-- zonking
You can zonk anything you like (or dislike), either your own honk or
those of others that you're tired of seeing. This reduces its visibility, but
doesn't attempt to delete it, which is infeasible.
It's more like disavow.
-- css -- css
Custom CSS may be provided by creating a views/local.css file. Custom CSS may be provided by creating a views/local.css file.

14
honk.go
View File

@ -611,6 +611,9 @@ func donksforhonks(honks []*Honk) {
var ids []string var ids []string
hmap := make(map[int64]*Honk) hmap := make(map[int64]*Honk)
for _, h := range honks { for _, h := range honks {
if h.What == "zonk" {
continue
}
ids = append(ids, fmt.Sprintf("%d", h.ID)) ids = append(ids, fmt.Sprintf("%d", h.ID))
hmap[h.ID] = h hmap[h.ID] = h
} }
@ -684,6 +687,14 @@ func savebonk(w http.ResponseWriter, r *http.Request) {
} }
func zonkit(w http.ResponseWriter, r *http.Request) {
xid := r.FormValue("xid")
log.Printf("zonking %s", xid)
userinfo := GetUserInfo(r)
stmtZonkIt.Exec(userinfo.UserID, xid)
}
func savehonk(w http.ResponseWriter, r *http.Request) { func savehonk(w http.ResponseWriter, r *http.Request) {
rid := r.FormValue("rid") rid := r.FormValue("rid")
noise := r.FormValue("noise") noise := r.FormValue("noise")
@ -991,6 +1002,7 @@ func serve() {
loggedin.Use(LoginRequired) loggedin.Use(LoginRequired)
loggedin.Handle("/honk", CSRFWrap("honkhonk", http.HandlerFunc(savehonk))) loggedin.Handle("/honk", CSRFWrap("honkhonk", http.HandlerFunc(savehonk)))
loggedin.Handle("/bonk", CSRFWrap("honkhonk", http.HandlerFunc(savebonk))) loggedin.Handle("/bonk", CSRFWrap("honkhonk", http.HandlerFunc(savebonk)))
loggedin.Handle("/zonkit", CSRFWrap("honkhonk", http.HandlerFunc(zonkit)))
loggedin.Handle("/saveuser", CSRFWrap("saveuser", http.HandlerFunc(saveuser))) loggedin.Handle("/saveuser", CSRFWrap("saveuser", http.HandlerFunc(saveuser)))
loggedin.HandleFunc("/honkers", showhonkers) loggedin.HandleFunc("/honkers", showhonkers)
loggedin.Handle("/savehonker", CSRFWrap("savehonker", http.HandlerFunc(savehonker))) loggedin.Handle("/savehonker", CSRFWrap("savehonker", http.HandlerFunc(savehonker)))
@ -1006,6 +1018,7 @@ var stmtHonksForUser, stmtDeleteHonk, stmtSaveDub *sql.Stmt
var stmtHonksByHonker, stmtSaveHonk, stmtFileData, stmtWhatAbout *sql.Stmt var stmtHonksByHonker, stmtSaveHonk, stmtFileData, stmtWhatAbout *sql.Stmt
var stmtFindXonk, stmtSaveDonk, stmtFindFile, stmtSaveFile *sql.Stmt var stmtFindXonk, stmtSaveDonk, stmtFindFile, stmtSaveFile *sql.Stmt
var stmtAddDoover, stmtGetDoovers, stmtLoadDoover, stmtZapDoover *sql.Stmt var stmtAddDoover, stmtGetDoovers, stmtLoadDoover, stmtZapDoover *sql.Stmt
var stmtZonkIt *sql.Stmt
func preparetodie(db *sql.DB, s string) *sql.Stmt { func preparetodie(db *sql.DB, s string) *sql.Stmt {
stmt, err := db.Prepare(s) stmt, err := db.Prepare(s)
@ -1036,6 +1049,7 @@ func prepareStatements(db *sql.DB) {
stmtGetDoovers = preparetodie(db, "select dooverid, dt from doovers") stmtGetDoovers = preparetodie(db, "select dooverid, dt from doovers")
stmtLoadDoover = preparetodie(db, "select tries, username, rcpt, msg from doovers where dooverid = ?") stmtLoadDoover = preparetodie(db, "select tries, username, rcpt, msg from doovers where dooverid = ?")
stmtZapDoover = preparetodie(db, "delete from doovers where dooverid = ?") stmtZapDoover = preparetodie(db, "delete from doovers where dooverid = ?")
stmtZonkIt = preparetodie(db, "update honks set what = 'zonk' where userid = ? and xid = ?")
} }
func ElaborateUnitTests() { func ElaborateUnitTests() {

View File

@ -23,5 +23,8 @@ function post(url, data) {
function bonk(xid) { function bonk(xid) {
post("/bonk", "CSRF={{ $BonkCSRF }}&xid=" + xid) post("/bonk", "CSRF={{ $BonkCSRF }}&xid=" + xid)
} }
function zonkit(xid) {
post("/zonkit", "CSRF={{ $BonkCSRF }}&xid=" + xid)
}
</script> </script>
{{ end }} {{ end }}

View File

@ -1,7 +1,8 @@
<div class="honk {{ if eq .Honk.What "tonked" }} tonk {{ end }}"> <div class="honk {{ .Honk.What }}">
{{ with .Honk }} {{ with .Honk }}
<div class="title"><img alt="avatar" src="/a?a={{ .Honker}}"><p><a href="{{ .Honker }}" rel=noreferrer>{{ .Username }}</a> <span class="clip">{{ .What }} {{ .Date.Format "02 Jan 2006 15:04" }} <a href="{{ .URL }}" rel=noreferrer>{{ .URL }}</a></span></div> <div class="title"><img alt="avatar" src="/a?a={{ .Honker}}"><p><a href="{{ .Honker }}" rel=noreferrer>{{ .Username }}</a> <span class="clip">{{ .What }} {{ .Date.Format "02 Jan 2006 15:04" }} <a href="{{ .URL }}" rel=noreferrer>{{ .URL }}</a></span></div>
<div class="noise"><p>{{ .HTML }}</div> <div class="noise">
<p>{{ .HTML }}
{{ range .Donks }} {{ range .Donks }}
{{ if eq .Media "text/plain" }} {{ if eq .Media "text/plain" }}
<p><a href="/d/{{ .XID }}">Attachment: {{ .Name }}</a> <p><a href="/d/{{ .XID }}">Attachment: {{ .Name }}</a>
@ -9,10 +10,12 @@
<p><a href="/d/{{ .XID }}"><img src="/d/{{ .XID }}" title="{{ .URL }}"></a> <p><a href="/d/{{ .XID }}"><img src="/d/{{ .XID }}" title="{{ .URL }}"></a>
{{ end }} {{ end }}
{{ end }} {{ end }}
</div>
{{ end }} {{ end }}
{{ if .Bonk }} {{ if and .Bonk (not (eq .Honk.What "zonked")) }}
<p> <p>
<button onclick="bonk('{{ .Honk.XID }}'); return false;"><a href="/bonk">bonk</a></button> <button onclick="bonk('{{ .Honk.XID }}'); return false;"><a href="/bonk">bonk</a></button>
<button style="margin-left: 4em;" onclick="showhonkform('{{ .Honk.XID }}', '{{ .Honk.Username }}'); return false;"><a href="/newhonk">tonk</a></button> <button onclick="showhonkform('{{ .Honk.XID }}', '{{ .Honk.Username }}'); return false;"><a href="/newhonk">tonk</a></button>
<button onclick="zonkit('{{ .Honk.XID }}'); return false;"><a href="/zonkit">zonk</a></button>
{{ end }} {{ end }}
</div> </div>

View File

@ -110,15 +110,6 @@ button a {
padding-right: 1em; padding-right: 1em;
padding-top: 0; padding-top: 0;
} }
.tonk {
}
.tonk .noise {
color: #aab;
font-size: 0.8em;
}
.tonk .noise a {
color: #aab;
}
.honk a { .honk a {
color: #dde; color: #dde;
} }
@ -141,6 +132,28 @@ button a {
.honk .title p { .honk .title p {
margin-top: 0px; margin-top: 0px;
} }
.honk button {
margin-right: 6em;
}
.tonked {
}
.tonked .noise {
color: #aab;
font-size: 0.8em;
}
.tonked .noise a {
color: #aab;
}
.zonked {
}
.zonked .noise {
color: #a79;
font-size: 0.8em;
text-decoration: line-through;
}
.zonked .noise a {
color: #a79;
}
img { img {
max-width: 100% max-width: 100%
} }