63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/olahol/melody"
|
|
)
|
|
|
|
type WebsocketMessageType = int
|
|
|
|
const (
|
|
WebsocketMessageTypeViewers WebsocketMessageType = iota
|
|
WebsocketMessageTypeCurrentlyPlaying
|
|
)
|
|
|
|
type WebsocketMessage struct {
|
|
Type WebsocketMessageType `json:"type"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
func (w WebsocketMessage) Encode() []byte {
|
|
m, err := json.Marshal(w)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
return m
|
|
}
|
|
|
|
func (state *State) setupWebsocket() {
|
|
state.Websocket = melody.New()
|
|
|
|
state.Websocket.HandleConnect(func(s *melody.Session) {
|
|
viewers, err := state.ViewersAmount()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
state.Websocket.Broadcast(WebsocketMessage{
|
|
Type: WebsocketMessageTypeViewers,
|
|
Message: fmt.Sprint(viewers + 1),
|
|
}.Encode())
|
|
|
|
s.Write(WebsocketMessage{
|
|
Type: WebsocketMessageTypeCurrentlyPlaying,
|
|
Message: state.NowPlaying(),
|
|
}.Encode())
|
|
})
|
|
|
|
state.Websocket.HandleDisconnect(func(s *melody.Session) {
|
|
viewers, err := state.ViewersAmount()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
state.Websocket.BroadcastOthers(WebsocketMessage{
|
|
Type: WebsocketMessageTypeViewers,
|
|
Message: fmt.Sprint(viewers),
|
|
}.Encode(), s)
|
|
})
|
|
}
|