rework honk to make local and remote about the same. indicate the difference with a flag, not magic values in various columns.
@@ -693,7 +693,7 @@ func jonkjonk(user *WhatAbout, h *Honk) (map[string]interface{}, map[string]interface{}) {
dt := h.Date.Format(time.RFC3339) var jo map[string]interface{} j := NewJunk() - j["id"] = user.URL + "/" + h.What + "/" + h.XID + j["id"] = user.URL + "/" + h.What + "/" + shortxid(h.XID) j["actor"] = user.URL j["published"] = dt j["to"] = h.Audience[0]@@ -708,10 +708,10 @@ case "honk":
j["type"] = "Create" jo = NewJunk() - jo["id"] = user.URL + "/h/" + h.XID + jo["id"] = h.XID jo["type"] = "Note" jo["published"] = dt - jo["url"] = user.URL + "/h/" + h.XID + jo["url"] = h.XID jo["attributedTo"] = user.URL if h.RID != "" { jo["inReplyTo"] = h.RID@@ -775,7 +775,7 @@ j["type"] = "Announce"
j["object"] = h.XID case "zonk": j["type"] = "Delete" - j["object"] = user.URL + "/h/" + h.XID + j["object"] = h.XID } return j, jo
@@ -47,14 +47,9 @@
The main table is honks. This stores both locally created honks and incoming ActivityPub notes converted to honks. It is important to differentiate the two cases so that we don't accidentally publish external honks in the public web -view. (Previously this was accomplished via separate tables. That made some -queries more difficult, but I think it's possible to workaround this. It would -be considerably safer.) The honker column will be empty for local honks. +view. The whofore column value of 2 indiciates a public honk. -The what column further refines the type of honk. If a reply, tonk. -If shared, bonk. In particular for the case of bonk, there -aren't enough columns to store original honker and bonker. -This seems to work out okay though. +The what column further refines the type of honk. Attachments are physically saved as files, and logically joined to honks via the donks table. Emus are saved as donks as well.@@ -69,8 +64,7 @@
The zonkers table stores things we do not wish to see, per the wherefore column. zonkers are bad people, zurls are bad hosts, zonvoys are bad threads. -The xid column generally corresponds to ActivityPub id. For local honks, it -will be a short string, not a complete URL. +The xid column generally corresponds to ActivityPub id. Note that some logical seeming joins won't work. The honker column of honks may not have a corresponding entry in the honkers table, since we frequently
@@ -34,13 +34,8 @@ func reverbolate(honks []*Honk) {
filt := htfilter.New() for _, h := range honks { h.What += "ed" - if h.Honker == "" { - h.Honker = "https://" + serverName + "/u/" + h.Username - if strings.IndexByte(h.XID, '/') == -1 { - h.URL = h.Honker + "/h/" + h.XID - } else { - h.URL = h.XID - } + if h.Whofore == 2 { + h.URL = h.XID h.Noise = mentionize(h.Noise) } else { idx := strings.LastIndexByte(h.Honker, '/')@@ -79,6 +74,14 @@ }
} h.Donks = h.Donks[:j] } +} + +func shortxid(xid string) string { + idx := strings.LastIndexByte(xid, '/') + if idx == -1 { + return xid + } + return xid[idx+1:] } func xfiltrate() string {
@@ -66,6 +66,7 @@ Precis string
Convoy string Audience []string Privacy string + Whofore int64 HTML template.HTML Donks []*Donk }@@ -567,12 +568,24 @@ }
return honkers } +func allusers() []login.UserInfo { + var users []login.UserInfo + rows, _ := opendatabase().Query("select userid, username from users") + defer rows.Close() + for rows.Next() { + var u login.UserInfo + rows.Scan(&u.UserID, &u.Username) + users = append(users, u) + } + return users +} + func getxonk(userid int64, xid string) *Honk { h := new(Honk) var dt, aud string row := stmtOneXonk.QueryRow(userid, xid) err := row.Scan(&h.ID, &h.UserID, &h.Username, &h.What, &h.Honker, &h.Oonker, &h.XID, &h.RID, - &dt, &h.URL, &aud, &h.Noise, &h.Precis, &h.Convoy) + &dt, &h.URL, &aud, &h.Noise, &h.Precis, &h.Convoy, &h.Whofore) if err != nil { if err != sql.ErrNoRows { log.Printf("error scanning xonk: %s", err)@@ -633,7 +646,7 @@ for rows.Next() {
var h Honk var dt, aud string err = rows.Scan(&h.ID, &h.UserID, &h.Username, &h.What, &h.Honker, &h.Oonker, - &h.XID, &h.RID, &dt, &h.URL, &aud, &h.Noise, &h.Precis, &h.Convoy) + &h.XID, &h.RID, &dt, &h.URL, &aud, &h.Noise, &h.Precis, &h.Convoy, &h.Whofore) if err != nil { log.Printf("error scanning honks: %s", err) return nil@@ -685,6 +698,7 @@
func savebonk(w http.ResponseWriter, r *http.Request) { xid := r.FormValue("xid") userinfo := login.GetUserInfo(r) + user, _ := butwhatabout(userinfo.Username) log.Printf("bonking %s", xid)@@ -693,30 +707,24 @@ if xonk == nil {
return } donksforhonks([]*Honk{xonk}) - if xonk.Honker == "" { - xonk.XID = fmt.Sprintf("https://%s/u/%s/h/%s", serverName, xonk.Username, xonk.XID) - } dt := time.Now().UTC() bonk := Honk{ UserID: userinfo.UserID, Username: userinfo.Username, What: "bonk", + Honker: user.URL, XID: xonk.XID, Date: dt, Donks: xonk.Donks, Audience: []string{thewholeworld}, } - user, _ := butwhatabout(userinfo.Username) - aud := strings.Join(bonk.Audience, " ") - whofore := 0 - if strings.Contains(aud, user.URL) { - whofore = 1 - } - res, err := stmtSaveHonk.Exec(userinfo.UserID, "bonk", "", xid, "", - dt.Format(dbtimeformat), "", aud, xonk.Noise, xonk.Convoy, whofore, "html", xonk.Precis, xonk.Honker) + whofore := 2 + res, err := stmtSaveHonk.Exec(userinfo.UserID, "bonk", bonk.Honker, xid, "", + dt.Format(dbtimeformat), "", aud, xonk.Noise, xonk.Convoy, whofore, "html", + xonk.Precis, xonk.Honker) if err != nil { log.Printf("error saving bonk: %s", err) return@@ -758,7 +766,7 @@ xonk := getxonk(userinfo.UserID, what)
if xonk != nil { stmtZonkDonks.Exec(xonk.ID) stmtZonkIt.Exec(userinfo.UserID, what) - if xonk.Honker == "" { + if xonk.Whofore == 2 { zonk := Honk{ What: "zonk", XID: xonk.XID,@@ -785,9 +793,10 @@ rid := r.FormValue("rid")
noise := r.FormValue("noise") userinfo := login.GetUserInfo(r) + user, _ := butwhatabout(userinfo.Username) dt := time.Now().UTC() - xid := xfiltrate() + xid := fmt.Sprintf("https://%s/u/%s/%s", serverName, userinfo.Username, xfiltrate()) what := "honk" if rid != "" { what = "tonk"@@ -796,6 +805,7 @@ honk := Honk{
UserID: userinfo.UserID, Username: userinfo.Username, What: "honk", + Honker: user.URL, XID: xid, Date: dt, }@@ -905,14 +915,9 @@ honk.Donks = append(honk.Donks, donk)
} } - user, _ := butwhatabout(userinfo.Username) - aud := strings.Join(honk.Audience, " ") - whofore := 0 - if strings.Contains(aud, user.URL) { - whofore = 1 - } - res, err := stmtSaveHonk.Exec(userinfo.UserID, what, "", xid, rid, + whofore := 2 + res, err := stmtSaveHonk.Exec(userinfo.UserID, what, honk.Honker, xid, rid, dt.Format(dbtimeformat), "", aud, noise, convoy, whofore, "html", honk.Precis, honk.Oonker) if err != nil { log.Printf("error saving honk: %s", err)@@ -1321,17 +1326,17 @@ stmtUpdateCombos = preparetodie(db, "update honkers set combos = ? where honkerid = ? and userid = ?")
stmtHasHonker = preparetodie(db, "select honkerid from honkers where xid = ? and userid = ?") stmtDubbers = preparetodie(db, "select honkerid, userid, name, xid, flavor from honkers where userid = ? and flavor = 'dub'") - selecthonks := "select honkid, honks.userid, username, what, honker, oonker, honks.xid, rid, dt, url, audience, noise, precis, convoy from honks join users on honks.userid = users.userid " + selecthonks := "select honkid, honks.userid, username, what, honker, oonker, honks.xid, rid, dt, url, audience, noise, precis, convoy, whofore from honks join users on honks.userid = users.userid " limit := " order by honkid desc limit 250" butnotthose := " and convoy not in (select name from zonkers where userid = ? and wherefore = 'zonvoy' order by zonkerid desc limit 100)" stmtOneXonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ?") - stmtPublicHonks = preparetodie(db, selecthonks+"where honker = '' and dt > ?"+limit) - stmtUserHonks = preparetodie(db, selecthonks+"where honker = '' and username = ? and dt > ?"+limit) + stmtPublicHonks = preparetodie(db, selecthonks+"where whofore = 2 and dt > ?"+limit) + stmtUserHonks = preparetodie(db, selecthonks+"where whofore = 2 and username = ? and dt > ?"+limit) stmtHonksForUser = preparetodie(db, selecthonks+"where honks.userid = ? and dt > ? and honker in (select xid from honkers where userid = ? and flavor = 'sub' and combos not like '% - %')"+butnotthose+limit) stmtHonksForMe = preparetodie(db, selecthonks+"where honks.userid = ? and dt > ? and whofore = 1"+butnotthose+limit) stmtHonksByHonker = preparetodie(db, selecthonks+"join honkers on honkers.xid = honks.honker where honks.userid = ? and honkers.name = ?"+butnotthose+limit) stmtHonksByCombo = preparetodie(db, selecthonks+"join honkers on honkers.xid = honks.honker where honks.userid = ? and honkers.combos like ?"+butnotthose+limit) - stmtHonksByConvoy = preparetodie(db, selecthonks+"where (honks.userid = ? or honker = '') and convoy = ?"+limit) + stmtHonksByConvoy = preparetodie(db, selecthonks+"where (honks.userid = ? or whofore = 2) and convoy = ?"+limit) stmtSaveHonk = preparetodie(db, "insert into honks (userid, what, honker, xid, rid, dt, url, audience, noise, convoy, whofore, format, precis, oonker) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") stmtFileData = preparetodie(db, "select media, content from files where xid = ?")
@@ -17,12 +17,13 @@ package main
import ( "database/sql" + "fmt" "log" "os" ) -func doordie(db *sql.DB, s string) { - _, err := db.Exec(s) +func doordie(db *sql.DB, s string, args ...interface{}) { + _, err := db.Exec(s, args...) if err != nil { log.Fatal(err) }@@ -32,6 +33,7 @@ func upgradedb() {
db := opendatabase() dbversion := 0 getconfig("dbversion", &dbversion) + getconfig("servername", &serverName) switch dbversion { case 0:@@ -79,6 +81,14 @@ doordie(db, "update honks set oonker = ''")
doordie(db, "update config set value = 7 where key = 'dbversion'") fallthrough case 7: + users := allusers() + for _, u := range users { + h := fmt.Sprintf("https://%s/u/%s", serverName, u.Username) + doordie(db, fmt.Sprintf("update honks set xid = '%s/h/' || xid, honker = ?, whofore = 2 where userid = ? and honker = '' and (what = 'honk' or what = 'bonk')", h), h, u.UserID) + doordie(db, "update honks set honker = ?, whofore = 2 where userid = ? and honker = '' and what = 'bonk'", h, u.UserID) + } + doordie(db, "update config set value = 8 where key = 'dbversion'") + case 8: default: log.Fatalf("can't upgrade unknown version %d", dbversion) }