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 }