dndmusicbot/routes.go

123 lines
2.6 KiB
Go
Raw Normal View History

2022-11-18 21:18:12 +00:00
package main
import (
"log"
"net/http"
"os"
"path"
"path/filepath"
2022-11-18 21:18:12 +00:00
"text/template"
"github.com/google/uuid"
2022-11-18 22:44:10 +00:00
"github.com/gorilla/websocket"
2022-11-18 21:18:12 +00:00
"github.com/julienschmidt/httprouter"
)
2022-11-18 22:44:10 +00:00
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
2022-12-22 11:43:40 +00:00
var router *httprouter.Router
2022-11-18 21:18:12 +00:00
func init() {
2022-12-22 11:43:40 +00:00
router = httprouter.New()
2022-11-18 22:44:10 +00:00
2022-12-22 11:43:40 +00:00
router.GET("/", Index)
router.GET("/play/:playlist", Play)
router.GET("/reset", Reset)
router.GET("/public/*js", ServeFiles)
router.GET("/css/*css", ServeFiles)
2022-11-18 21:18:12 +00:00
2022-12-22 11:43:40 +00:00
router.HandlerFunc("GET", "/ws", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
2022-11-18 22:44:10 +00:00
log.Printf("WS connection from %v\n", r.RemoteAddr)
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
err = handleWS(conn)
if err != nil {
log.Printf("WS connection closed, %v\n", r.RemoteAddr)
}
}))
2022-11-18 21:18:12 +00:00
go func() {
2022-12-22 11:43:40 +00:00
log.Fatal(http.ListenAndServe(":8824", router))
2022-11-18 21:18:12 +00:00
}()
}
type IndexData struct {
Playlists []Playlist
2022-11-25 13:06:26 +00:00
Ambiance []Ambiance
2022-11-18 21:18:12 +00:00
}
2022-12-22 11:43:40 +00:00
func ServeFiles(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
filePath := filepath.Join(".", r.URL.Path)
file, err := os.Open(filePath)
if err != nil {
log.Println(err)
http.Error(w, "no such file", http.StatusNotFound)
return
}
defer file.Close()
fileStat, err := os.Stat(filePath)
if err != nil {
log.Println(err)
http.Error(w, "unable to get file stat", http.StatusInternalServerError)
}
_, filename := path.Split(filePath)
t := fileStat.ModTime()
http.ServeContent(w, r, filename, t, file)
}
2022-12-22 11:43:40 +00:00
func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
playlists, err := GetPlaylists()
2022-11-18 21:18:12 +00:00
if err != nil {
http.Error(w, "Unable to get playlists. "+err.Error(), http.StatusInternalServerError)
}
2022-11-25 13:06:26 +00:00
amblist, err := GetAmbiances()
2022-11-18 21:18:12 +00:00
if err != nil {
log.Println(err)
return
}
data := IndexData{playlists, amblist}
t := template.Must(template.New("index.tmpl").ParseFiles("tmpl/index.tmpl"))
err = t.Execute(w, data)
if err != nil {
http.Error(w, "Unable to load template. "+err.Error(), http.StatusInternalServerError)
}
}
2022-12-22 11:43:40 +00:00
func Play(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
2022-11-18 21:18:12 +00:00
plname := p.ByName("playlist")
if plname == "reset" {
2022-12-22 11:43:40 +00:00
ev.Emit("stop", nil)
2022-11-18 21:18:12 +00:00
return
}
plid, err := uuid.ParseBytes([]byte(plname))
if err != nil {
http.Error(w, "Unable to parse uuid. "+err.Error(), http.StatusInternalServerError)
}
2022-12-22 11:43:40 +00:00
ev.Emit("new_playlist", plid)
2022-11-18 21:18:12 +00:00
}
2022-12-22 11:43:40 +00:00
func Add(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
2022-11-18 21:18:12 +00:00
r.ParseForm()
}
2022-12-22 11:43:40 +00:00
func Reset(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
ev.Emit("stop", nil)
2022-11-18 21:18:12 +00:00
}