package www import ( "log" "strconv" "html/template" "net/http" "github.com/gorilla/websocket" "../playlist" ) // todo: hub - https://stackoverflow.com/questions/31532652/go-websocket-send-all-clients-a-message var wsc *websocket.Conn var p *playlist.Playlist var pp *playlist.PrettyPlaylist var mp *playlist.MinimalPlaylist var pln = log.Println type op_t struct { OP string `json:"op"` ID string `json:"id"` INDEX int `json:"index"` } var upgrader = websocket.Upgrader{ ReadBufferSize: 512, WriteBufferSize: 512, } func Init(playlist *playlist.Playlist) { p = playlist p.CALLB = pop_callback pp = p.Pretty() mp = p.Minimal() http.HandleFunc("/pp", pp_handler) http.HandleFunc("/ppop", pp_operations) } func pp_handler(w http.ResponseWriter, r *http.Request) { t, err := template.ParseFiles("./www/tmpl/playlist.html") if err != nil { pln(err) return } pp.Print() t.Execute(w, pp) } func pp_operations(w http.ResponseWriter, r *http.Request) { pln("x") c, err := upgrader.Upgrade(w, r, nil) if err != nil { pln(err) return } wsc = c // this should be hub go readop(c) } func readop(c *websocket.Conn) { for { opdata := &op_t{} if err := c.ReadJSON(&opdata); err != nil { pln(err) return //connection lost? } if opdata.OP == "move" { if id, err := strconv.ParseUint(opdata.ID, 10, 32); err == nil { p.Move(uint32(id), opdata.INDEX) pp = p.Pretty() mp = p.Minimal() // pp.Print() } } if err := c.WriteJSON(mp); err != nil { pln(err) return //connection lost? } } } func pop_callback(list *playlist.Playlist) { if list == p { pp = p.Pretty() mp = p.Minimal() if wsc != nil { wsc.WriteJSON(mp) // this should be hub broadcasted } } }