From 71b204db5e089b5d0e36ad87334b4f665b9d55a1 Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Mon, 28 Oct 2019 23:09:37 -0400 Subject: [PATCH] option to desub part of a thread. somewhat suspect implementation... --- database.go | 4 ++-- go.mod | 2 +- go.sum | 2 ++ hfcs.go | 43 +++++++++++++++++++++++++++++++++++++++++-- views/honk.html | 1 + web.go | 18 +++++++++++------- 6 files changed, 58 insertions(+), 12 deletions(-) diff --git a/database.go b/database.go index 4b22156..20b69de 100644 --- a/database.go +++ b/database.go @@ -680,7 +680,7 @@ var stmtHonksBySearch, stmtHonksByHonker, stmtSaveHonk, stmtUserByName, stmtUser var stmtEventHonks, stmtOneBonk, stmtFindZonk, stmtFindXonk, stmtSaveDonk *sql.Stmt var stmtFindFile, stmtGetFileData, stmtSaveFileData, stmtSaveFile *sql.Stmt var stmtAddDoover, stmtGetDoovers, stmtLoadDoover, stmtZapDoover, stmtOneHonker *sql.Stmt -var stmtThumbBiters, stmtDeleteHonk, stmtDeleteDonks, stmtDeleteOnts, stmtSaveZonker *sql.Stmt +var stmtDesubbed, stmtDeleteHonk, stmtDeleteDonks, stmtDeleteOnts, stmtSaveZonker *sql.Stmt var stmtGetZonkers, stmtRecentHonkers, stmtGetXonker, stmtSaveXonker, stmtDeleteXonker *sql.Stmt var stmtAllOnts, stmtSaveOnt, stmtUpdateFlags, stmtClearFlags *sql.Stmt var stmtHonksForUserFirstClass, stmtSaveMeta, stmtDeleteMeta, stmtUpdateHonk *sql.Stmt @@ -746,7 +746,7 @@ func prepareStatements(db *sql.DB) { stmtGetDoovers = preparetodie(db, "select dooverid, dt from doovers") stmtLoadDoover = preparetodie(db, "select tries, userid, rcpt, msg from doovers where dooverid = ?") stmtZapDoover = preparetodie(db, "delete from doovers where dooverid = ?") - stmtThumbBiters = preparetodie(db, "select userid, name, wherefore from zonkers") + stmtDesubbed = preparetodie(db, "select name from zonkers where userid = ? and wherefore = 'desub'") stmtFindZonk = preparetodie(db, "select zonkerid from zonkers where userid = ? and name = ? and wherefore = 'zonk'") stmtGetZonkers = preparetodie(db, "select zonkerid, name, wherefore from zonkers where userid = ? and wherefore <> 'zonk'") stmtSaveZonker = preparetodie(db, "insert into zonkers (userid, name, wherefore) values (?, ?, ?)") diff --git a/go.mod b/go.mod index 8a0c705..481f4f0 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4 golang.org/x/net v0.0.0-20190620200207-3b0461eec859 humungus.tedunangst.com/r/go-sqlite3 v1.1.3 - humungus.tedunangst.com/r/webs v0.6.19 + humungus.tedunangst.com/r/webs v0.6.20 ) go 1.11 diff --git a/go.sum b/go.sum index 7d5152c..5472890 100644 --- a/go.sum +++ b/go.sum @@ -36,3 +36,5 @@ humungus.tedunangst.com/r/go-sqlite3 v1.1.3 h1:G2N4wzDS0NbuvrZtQJhh4F+3X+s7BF8b9 humungus.tedunangst.com/r/go-sqlite3 v1.1.3/go.mod h1:FtEEmQM7U2Ey1TuEEOyY1BmphTZnmiEjPsNLEAkpf/M= humungus.tedunangst.com/r/webs v0.6.19 h1:0cxR4JmHDMQmMwboRlycRO+67OPtgtCwLX8fuDu9IRo= humungus.tedunangst.com/r/webs v0.6.19/go.mod h1:S9sXpVSbgAIa24yYhnMN0C94LKHG+2rioS+NsiDimps= +humungus.tedunangst.com/r/webs v0.6.20 h1:fKTjJ+EQUlxj8vWBtFMhX7aYbMwAnUWbDhY7hotkXq0= +humungus.tedunangst.com/r/webs v0.6.20/go.mod h1:S9sXpVSbgAIa24yYhnMN0C94LKHG+2rioS+NsiDimps= diff --git a/hfcs.go b/hfcs.go index e21233d..5ae74e8 100644 --- a/hfcs.go +++ b/hfcs.go @@ -302,9 +302,48 @@ func unsee(userid int64, h *Honk) { } } -func osmosis(honks []*Honk, userid int64) []*Honk { - filts := getfilters(userid, filtHide) +var desubbed = cache.New(cache.Options{Filler: func(userid int64) (map[string]bool, bool) { + rows, err := stmtDesubbed.Query(userid) + if err != nil { + log.Printf("error query desubbed: %s", err) + return nil, false + } + defer rows.Close() + m := make(map[string]bool) + for rows.Next() { + var xid string + err = rows.Scan(&xid) + if err != nil { + log.Printf("error scanning desub: %s", err) + continue + } + log.Printf("bad parent: %s", xid) + m[xid] = true + } + return m, true +}}) + +func osmosis(honks []*Honk, userid int64, withfilt bool) []*Honk { + var badparents map[string]bool + desubbed.GetAndLock(userid, &badparents) j := 0 + reversehonks(honks) + for _, h := range honks { + if badparents[h.RID] { + badparents[h.XID] = true + continue + } + honks[j] = h + j++ + } + desubbed.Unlock() + honks = honks[0:j] + reversehonks(honks) + if !withfilt { + return honks + } + filts := getfilters(userid, filtHide) + j = 0 outer: for _, h := range honks { for _, f := range filts { diff --git a/views/honk.html b/views/honk.html index 838f3f9..01bf354 100644 --- a/views/honk.html +++ b/views/honk.html @@ -112,6 +112,7 @@ in reply to: {{ .RID }} {{ else }} {{ end }} + diff --git a/web.go b/web.go index 6b0563c..ba289b3 100644 --- a/web.go +++ b/web.go @@ -101,15 +101,16 @@ func homepage(w http.ResponseWriter, r *http.Request) { templinfo["ServerMessage"] = "at me!" templinfo["PageName"] = "atme" honks = gethonksforme(userid, 0) + honks = osmosis(honks, userid, false) case "/events": templinfo["ServerMessage"] = "some recent and upcoming events" templinfo["PageName"] = "events" honks = geteventhonks(userid) - honks = osmosis(honks, userid) + honks = osmosis(honks, userid, true) case "/first": templinfo["PageName"] = "first" honks = gethonksforuser(userid, 0) - honks = osmosis(honks, userid) + honks = osmosis(honks, userid, true) case "/saved": templinfo["ServerMessage"] = "saved honks" templinfo["PageName"] = "saved" @@ -117,7 +118,7 @@ func homepage(w http.ResponseWriter, r *http.Request) { default: templinfo["PageName"] = "home" honks = gethonksforuser(userid, 0) - honks = osmosis(honks, userid) + honks = osmosis(honks, userid, true) } templinfo["HonkCSRF"] = login.GetCSRF("honkhonk", r) } @@ -723,7 +724,7 @@ func showcombo(w http.ResponseWriter, r *http.Request) { name := mux.Vars(r)["name"] u := login.GetUserInfo(r) honks := gethonksbycombo(u.UserID, name, 0) - honks = osmosis(honks, u.UserID) + honks = osmosis(honks, u.UserID, true) templinfo := getInfo(r) templinfo["PageName"] = "combo" templinfo["PageArg"] = name @@ -739,6 +740,7 @@ func showconvoy(w http.ResponseWriter, r *http.Request) { if len(honks) > 0 { templinfo["TopHID"] = honks[0].ID } + honks = osmosis(honks, u.UserID, false) reversehonks(honks) templinfo["PageName"] = "convoy" templinfo["PageArg"] = c @@ -1822,14 +1824,15 @@ func webhydra(w http.ResponseWriter, r *http.Request) { switch page { case "atme": honks = gethonksforme(userid, wanted) + honks = osmosis(honks, userid, false) templinfo["ServerMessage"] = "at me!" case "home": honks = gethonksforuser(userid, wanted) - honks = osmosis(honks, userid) + honks = osmosis(honks, userid, true) templinfo["ServerMessage"] = serverMsg case "first": honks = gethonksforuserfirstclass(userid, wanted) - honks = osmosis(honks, userid) + honks = osmosis(honks, userid, true) templinfo["ServerMessage"] = "first class only" case "saved": honks = getsavedhonks(userid, wanted) @@ -1838,11 +1841,12 @@ func webhydra(w http.ResponseWriter, r *http.Request) { case "combo": c := r.FormValue("c") honks = gethonksbycombo(userid, c, wanted) - honks = osmosis(honks, userid) + honks = osmosis(honks, userid, false) templinfo["ServerMessage"] = "honks by combo: " + c case "convoy": c := r.FormValue("c") honks = gethonksbyconvoy(userid, c, wanted) + honks = osmosis(honks, userid, false) templinfo["ServerMessage"] = "honks in convoy: " + c case "honker": xid := r.FormValue("xid")