125 lines
2.7 KiB
Go
125 lines
2.7 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"embed"
|
||
|
"fmt"
|
||
|
"github.com/pitr/gig"
|
||
|
"io"
|
||
|
"log"
|
||
|
"math/rand"
|
||
|
_ "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)
|
||
|
|
||
|
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
|
||
|
}
|