133 lines
2.9 KiB
Go
133 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"embed"
|
|
"fmt"
|
|
"github.com/pitr/gig"
|
|
"io"
|
|
"log"
|
|
_ "os"
|
|
"text/template"
|
|
"tildegit.org/what/stream/db"
|
|
"tildegit.org/what/stream/upload"
|
|
)
|
|
|
|
var tmpls embed.FS
|
|
var names []string
|
|
|
|
type Template struct {
|
|
t *template.Template
|
|
}
|
|
|
|
func (t *Template) Render(w io.Writer, name string, data interface{}, _ gig.Context) error {
|
|
return t.t.ExecuteTemplate(w, fmt.Sprintf("%s.gmi", name), data)
|
|
}
|
|
|
|
func main() {
|
|
var err error
|
|
|
|
names = upload.GetNames()
|
|
|
|
// crack open the db
|
|
err = db.OpenDB("./piss.db")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
g := gig.Default()
|
|
|
|
g.Renderer = &Template{template.Must(template.ParseGlob("./templates/*.gmi"))}
|
|
|
|
go g.Handle("/", handleIndex)
|
|
go g.Handle("/upload/", handleUpload)
|
|
go g.Handle("/upload/receive", handleReceive)
|
|
|
|
g.Handle("/user", func(c gig.Context) error { // add a trailing slash automatically
|
|
return c.NoContent(gig.StatusRedirectPermanent, "/user/")
|
|
}) // TODO: there's got to be a tidier way to do this
|
|
|
|
g.Handle("/user/", func(c gig.Context) error {
|
|
cert := c.Certificate()
|
|
if cert == nil {
|
|
// fail if no cert
|
|
return c.NoContent(gig.StatusClientCertificateRequired, "A certificate is required")
|
|
}
|
|
// return content
|
|
return c.Gemini("# %s's channel", cert.Subject.CommonName)
|
|
})
|
|
|
|
// start server
|
|
err = g.Run("cert.crt", "cert.key")
|
|
// handle errors
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func handleIndex(c gig.Context) error {
|
|
items, err := db.Latest()
|
|
|
|
if err != nil {
|
|
return c.NoContent(gig.StatusServerUnavailable, "index broke.")
|
|
}
|
|
|
|
var identified bool
|
|
cert := c.Certificate()
|
|
|
|
if cert != nil {
|
|
identified = true
|
|
} else {
|
|
identified = false
|
|
}
|
|
|
|
return c.Render("index", struct {
|
|
Items []db.Item
|
|
Identified bool
|
|
}{
|
|
Items: items,
|
|
Identified: identified,
|
|
})
|
|
}
|
|
|
|
func handleUpload(c gig.Context) error {
|
|
// id, err := db.NewItem("Piss",
|
|
// "Video",
|
|
// "🎞️",
|
|
// "Piss",
|
|
// db.User{
|
|
// ID: 12,
|
|
// Username: "piss"},
|
|
// "./files/small.mp4",
|
|
// )
|
|
//if err != nil {
|
|
// log.Printf("upload failed, error message follows: %s", err)
|
|
// return c.NoContent(gig.StatusTemporaryFailure, "sorry, something went wrong there. please get in contact if this keeps happening")
|
|
//}
|
|
// i := rand.Intn(len(names)-0) + 0
|
|
// name := names[i]
|
|
// upload.CreateSession(name, "fuck")
|
|
|
|
return c.Render("upload", nil)
|
|
}
|
|
|
|
func handleView(id int, c gig.Context) error {
|
|
item, err := db.GetItem(id)
|
|
if err != nil {
|
|
log.Printf("view faled, error message follows: %s", err)
|
|
return c.NoContent(gig.StatusTemporaryFailure, "sorry, something went wrong on our end. try again, and if this keeps happening please get in contact")
|
|
}
|
|
|
|
return c.Render("view", item)
|
|
}
|
|
|
|
func debugNewRow(c gig.Context) error {
|
|
return nil
|
|
}
|
|
|
|
func handleReceive(c gig.Context) error {
|
|
q := c.URL().RawQuery
|
|
if len(q) == 0 {
|
|
return c.NoContent(gig.StatusInput, "slap your wormhole code here please")
|
|
}
|
|
// todo: get sleep, finish this
|
|
} |