stream/main.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
}