livestream/websocket.go
2023-06-13 00:07:14 +03:00

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)
})
}