we're starting to get there with hashtags

This commit is contained in:
Ted Unangst 2019-08-24 23:03:05 -04:00
parent 568244591f
commit f74b91e15b
7 changed files with 97 additions and 6 deletions

View File

@ -817,7 +817,7 @@ func jonkjonk(user *WhatAbout, h *Honk) (junk.Junk, junk.Junk) {
jo["directMessage"] = true jo["directMessage"] = true
} }
jo["summary"] = h.Precis jo["summary"] = h.Precis
jo["content"] = mentionize(h.Noise) jo["content"] = ontologize(mentionize(h.Noise))
if strings.HasPrefix(h.Precis, "DZ:") { if strings.HasPrefix(h.Precis, "DZ:") {
jo["sensitive"] = true jo["sensitive"] = true
} }
@ -847,6 +847,8 @@ func jonkjonk(user *WhatAbout, h *Honk) (junk.Junk, junk.Junk) {
for _, o := range ooo { for _, o := range ooo {
t := junk.New() t := junk.New()
t["type"] = "Hashtag" t["type"] = "Hashtag"
o = strings.ToLower(o)
t["href"] = fmt.Sprintf("https://%s/o/%s", serverName, o[1:])
t["name"] = o t["name"] = o
tags = append(tags, t) tags = append(tags, t)
} }

View File

@ -2,6 +2,8 @@ changelog
-- next -- next
++ Hashtags that work?
+ Dynamic refresh. + Dynamic refresh.
++ Reply control. Ack replies to show them on the site. ++ Reply control. Ack replies to show them on the site.

18
fun.go
View File

@ -48,6 +48,7 @@ func reverbolate(userid int64, honks []*Honk) {
h.URL = h.XID h.URL = h.XID
if h.What != "bonked" { if h.What != "bonked" {
h.Noise = mentionize(h.Noise) h.Noise = mentionize(h.Noise)
h.Noise = ontologize(h.Noise)
} }
h.Username, h.Handle = handles(h.Honker) h.Username, h.Handle = handles(h.Honker)
} else { } else {
@ -360,6 +361,23 @@ func mentionize(s string) string {
return s return s
} }
func ontologize(s string) string {
s = re_hashes.ReplaceAllStringFunc(s, func(o string) string {
if o[0] == '&' {
return o
}
p := ""
h := o
if h[0] != '#' {
p = h[:1]
h = h[1:]
}
log.Printf("fixing: %s", o)
return fmt.Sprintf(`%s<a href="https://%s/o/%s">%s</a>`, p, serverName, h[1:], h)
})
return s
}
var re_unurl = regexp.MustCompile("https://([^/]+).*/([^/]+)") var re_unurl = regexp.MustCompile("https://([^/]+).*/([^/]+)")
var re_urlhost = regexp.MustCompile("https://([^/]+)") var re_urlhost = regexp.MustCompile("https://([^/]+)")

19
honk.go
View File

@ -629,6 +629,12 @@ func showconvoy(w http.ResponseWriter, r *http.Request) {
honks := gethonksbyconvoy(u.UserID, c) honks := gethonksbyconvoy(u.UserID, c)
honkpage(w, r, u, nil, honks, template.HTML(html.EscapeString("honks in convoy: "+c))) honkpage(w, r, u, nil, honks, template.HTML(html.EscapeString("honks in convoy: "+c)))
} }
func showontology(w http.ResponseWriter, r *http.Request) {
name := mux.Vars(r)["name"]
u := login.GetUserInfo(r)
honks := gethonksbyontology("#" + name)
honkpage(w, r, u, nil, honks, template.HTML(html.EscapeString("honks by ontology: "+name)))
}
func showhonk(w http.ResponseWriter, r *http.Request) { func showhonk(w http.ResponseWriter, r *http.Request) {
name := mux.Vars(r)["name"] name := mux.Vars(r)["name"]
@ -845,6 +851,11 @@ func gethonksbyconvoy(userid int64, convoy string) []*Honk {
} }
return honks return honks
} }
func gethonksbyontology(name string) []*Honk {
rows, err := stmtHonksByOntology.Query(name)
honks := getsomehonks(rows, err)
return honks
}
func getsomehonks(rows *sql.Rows, err error) []*Honk { func getsomehonks(rows *sql.Rows, err error) []*Honk {
if err != nil { if err != nil {
@ -1600,6 +1611,7 @@ func serve() {
getters.HandleFunc("/"+userSep+"/{name:[[:alnum:]]+}/followers", emptiness) getters.HandleFunc("/"+userSep+"/{name:[[:alnum:]]+}/followers", emptiness)
getters.HandleFunc("/"+userSep+"/{name:[[:alnum:]]+}/following", emptiness) getters.HandleFunc("/"+userSep+"/{name:[[:alnum:]]+}/following", emptiness)
getters.HandleFunc("/a", avatate) getters.HandleFunc("/a", avatate)
getters.HandleFunc("/o/{name:[a-z0-9-]+}", showontology)
getters.HandleFunc("/d/{xid:[[:alnum:].]+}", servefile) getters.HandleFunc("/d/{xid:[[:alnum:].]+}", servefile)
getters.HandleFunc("/emu/{xid:[[:alnum:]_.-]+}", serveemu) getters.HandleFunc("/emu/{xid:[[:alnum:]_.-]+}", serveemu)
getters.HandleFunc("/meme/{xid:[[:alnum:]_.-]+}", servememe) getters.HandleFunc("/meme/{xid:[[:alnum:]_.-]+}", servememe)
@ -1661,7 +1673,7 @@ func cleanupdb(arg string) {
var stmtHonkers, stmtDubbers, stmtSaveHonker, stmtUpdateFlavor, stmtUpdateCombos *sql.Stmt var stmtHonkers, stmtDubbers, stmtSaveHonker, stmtUpdateFlavor, stmtUpdateCombos *sql.Stmt
var stmtOneXonk, stmtPublicHonks, stmtUserHonks, stmtHonksByCombo, stmtHonksByConvoy *sql.Stmt var stmtOneXonk, stmtPublicHonks, stmtUserHonks, stmtHonksByCombo, stmtHonksByConvoy *sql.Stmt
var stmtHonksForUser, stmtHonksForMe, stmtSaveDub, stmtHonksByXonker *sql.Stmt var stmtHonksByOntology, stmtHonksForUser, stmtHonksForMe, stmtSaveDub, stmtHonksByXonker *sql.Stmt
var stmtHonksByHonker, stmtSaveHonk, stmtFileData, stmtWhatAbout *sql.Stmt var stmtHonksByHonker, stmtSaveHonk, stmtFileData, stmtWhatAbout *sql.Stmt
var stmtFindZonk, stmtFindXonk, stmtSaveDonk, stmtFindFile, stmtSaveFile *sql.Stmt var stmtFindZonk, stmtFindXonk, stmtSaveDonk, stmtFindFile, stmtSaveFile *sql.Stmt
var stmtAddDoover, stmtGetDoovers, stmtLoadDoover, stmtZapDoover *sql.Stmt var stmtAddDoover, stmtGetDoovers, stmtLoadDoover, stmtZapDoover *sql.Stmt
@ -1685,8 +1697,8 @@ func prepareStatements(db *sql.DB) {
stmtHasHonker = preparetodie(db, "select honkerid from honkers where xid = ? 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'") 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, whofore, flags from honks join users on honks.userid = users.userid " selecthonks := "select honks.honkid, honks.userid, username, what, honker, oonker, honks.xid, rid, dt, url, audience, noise, precis, convoy, whofore, flags from honks join users on honks.userid = users.userid "
limit := " order by honkid desc limit 250" limit := " order by honks.honkid desc limit 250"
butnotthose := " and convoy not in (select name from zonkers where userid = ? and wherefore = 'zonvoy' order by zonkerid desc limit 100)" 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 = ?") stmtOneXonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ?")
stmtPublicHonks = preparetodie(db, selecthonks+"where whofore = 2 and dt > ?"+limit) stmtPublicHonks = preparetodie(db, selecthonks+"where whofore = 2 and dt > ?"+limit)
@ -1697,6 +1709,7 @@ func prepareStatements(db *sql.DB) {
stmtHonksByXonker = preparetodie(db, selecthonks+" where honks.userid = ? and (honker = ? or oonker = ?)"+butnotthose+limit) stmtHonksByXonker = preparetodie(db, selecthonks+" where honks.userid = ? and (honker = ? or oonker = ?)"+butnotthose+limit)
stmtHonksByCombo = preparetodie(db, selecthonks+"join honkers on honkers.xid = honks.honker where honks.userid = ? and honkers.combos like ?"+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 (? = -1 and whofore = 2)) and convoy = ?"+limit) stmtHonksByConvoy = preparetodie(db, selecthonks+"where (honks.userid = ? or (? = -1 and whofore = 2)) and convoy = ?"+limit)
stmtHonksByOntology = preparetodie(db, selecthonks+"join onts on honks.honkid = onts.honkid where onts.ontology = ? and honks.whofore = 2"+limit)
stmtSaveHonk = preparetodie(db, "insert into honks (userid, what, honker, xid, rid, dt, url, audience, noise, convoy, whofore, format, precis, oonker, flags) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") stmtSaveHonk = preparetodie(db, "insert into honks (userid, what, honker, xid, rid, dt, url, audience, noise, convoy, whofore, format, precis, oonker, flags) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
stmtFileData = preparetodie(db, "select media, content from files where xid = ?") stmtFileData = preparetodie(db, "select media, content from files where xid = ?")

View File

@ -1,11 +1,12 @@
create table honks (honkid integer primary key, userid integer, what text, honker text, xid text, rid text, dt text, url text, audience text, noise text, convoy text, whofore integer, format text, precis text, oonker text, flags integer); create table honks (honkid integer primary key, userid integer, what text, honker text, xid text, rid text, dt text, url text, audience text, noise text, convoy text, whofore integer, format text, precis text, oonker text, flags integer, onts text);
create table donks (honkid integer, fileid integer); create table donks (honkid integer, fileid integer);
create table files(fileid integer primary key, xid text, name text, url text, media text, local integer, content blob); create table files(fileid integer primary key, xid text, name text, url text, media text, local integer, content blob);
create table honkers (honkerid integer primary key, userid integer, name text, xid text, flavor text, combos text); create table honkers (honkerid integer primary key, userid integer, name text, xid text, flavor text, combos text);
create table xonkers (xonkerid integer primary key, name text, info text, flavor text); create table xonkers (xonkerid integer primary key, name text, info text, flavor text);
create table zonkers (zonkerid integer primary key, userid integer, name text, wherefore text); create table zonkers (zonkerid integer primary key, userid integer, name text, wherefore text);
create table doovers(dooverid integer primary key, dt text, tries integer, username text, rcpt text, msg blob); create table doovers(dooverid integer primary key, dt text, tries integer, username text, rcpt text, msg blob);
create table onts (ontology text, honkid integer);
create index idx_honksxid on honks(xid); create index idx_honksxid on honks(xid);
create index idx_honksconvoy on honks(convoy); create index idx_honksconvoy on honks(convoy);
@ -16,6 +17,7 @@ create index idx_xonkername on xonkers(name);
create index idx_zonkersname on zonkers(name); create index idx_zonkersname on zonkers(name);
create index idx_filesxid on files(xid); create index idx_filesxid on files(xid);
create index idx_filesurl on files(url); create index idx_filesurl on files(url);
create index idx_ontology on onts(ontology);
create table config (key text, value text); create table config (key text, value text);

View File

@ -20,6 +20,7 @@ import (
"fmt" "fmt"
"log" "log"
"os" "os"
"strings"
) )
func doordie(db *sql.DB, s string, args ...interface{}) { func doordie(db *sql.DB, s string, args ...interface{}) {
@ -120,6 +121,59 @@ func upgradedb() {
doordie(db, "update config set value = 14 where key = 'dbversion'") doordie(db, "update config set value = 14 where key = 'dbversion'")
fallthrough fallthrough
case 14: case 14:
doordie(db, "alter table honks add column onts text")
doordie(db, "update honks set onts = ''")
doordie(db, "create table onts (ontology text, honkid integer)")
doordie(db, "create index idx_ontology on onts(ontology)")
ontmap := make(map[int64][]string)
rows, err := db.Query("select honkid, noise from honks")
if err != nil {
log.Fatalf("can't query honks: %s", err)
}
for rows.Next() {
var honkid int64
var noise string
err := rows.Scan(&honkid, &noise)
if err != nil {
log.Fatalf("can't scan honks: %s", err)
}
o := ontologies(noise)
if len(o) > 0 {
ontmap[honkid] = o
}
}
rows.Close()
tx, err := db.Begin()
if err != nil {
log.Fatalf("can't begin: %s", err)
}
stmtHonk, err := tx.Prepare("update honks set onts = ? where honkid = ?")
if err != nil {
log.Fatal(err)
}
stmtOnts, err := tx.Prepare("insert into onts (ontology, honkid) values (?, ?)")
if err != nil {
log.Fatal(err)
}
for honkid, onts := range ontmap {
_, err = stmtHonk.Exec(strings.Join(onts, " "), honkid)
if err != nil {
log.Fatal(err)
}
for _, o := range onts {
_, err = stmtOnts.Exec(strings.ToLower(o), honkid)
if err != nil {
log.Fatal(err)
}
}
}
err = tx.Commit()
if err != nil {
log.Fatalf("can't commit: %s", err)
}
doordie(db, "update config set value = 15 where key = 'dbversion'")
fallthrough
case 15:
default: default:
log.Fatalf("can't upgrade unknown version %d", dbversion) log.Fatalf("can't upgrade unknown version %d", dbversion)
} }

View File

@ -72,7 +72,7 @@ var dbtimeformat = "2006-01-02 15:04:05"
var alreadyopendb *sql.DB var alreadyopendb *sql.DB
var dbname = "honk.db" var dbname = "honk.db"
var stmtConfig *sql.Stmt var stmtConfig *sql.Stmt
var myVersion = 14 var myVersion = 15
func initdb() { func initdb() {
schema, err := ioutil.ReadFile("schema.sql") schema, err := ioutil.ReadFile("schema.sql")