You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
podgrab/controllers/websockets.go

150 lines
3.4 KiB

package controllers
import (
"encoding/json"
"fmt"
"net/http"
"github.com/gorilla/websocket"
)
type EnqueuePayload struct {
ItemId string `json:"itemId"`
PodcastId string `json:"podcastId"`
TagIds []string `json:"tagIds"`
}
var wsupgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
var activePlayers = make(map[*websocket.Conn]string)
var allConnections = make(map[*websocket.Conn]string)
var broadcast = make(chan Message) // broadcast channel
type Message struct {
Identifier string `json:"identifier"`
MessageType string `json:"messageType"`
Payload string `json:"payload"`
Connection *websocket.Conn `json:"-"`
}
func Wshandler(w http.ResponseWriter, r *http.Request) {
conn, err := wsupgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println("Failed to set websocket upgrade: %+v", err)
return
}
defer conn.Close()
for {
var mess Message
err := conn.ReadJSON(&mess)
if err != nil {
// fmt.Println("Socket Error")
//fmt.Println(err.Error())
isPlayer := activePlayers[conn] != ""
if isPlayer {
delete(activePlayers, conn)
broadcast <- Message{
MessageType: "PlayerRemoved",
Identifier: mess.Identifier,
}
}
delete(allConnections, conn)
break
}
mess.Connection = conn
allConnections[conn] = mess.Identifier
broadcast <- mess
// conn.WriteJSON(mess)
}
}
func HandleWebsocketMessages() {
for {
// Grab the next message from the broadcast channel
msg := <-broadcast
//fmt.Println(msg)
switch msg.MessageType {
case "RegisterPlayer":
activePlayers[msg.Connection] = msg.Identifier
for connection, _ := range allConnections {
connection.WriteJSON(Message{
Identifier: msg.Identifier,
MessageType: "PlayerExists",
})
}
fmt.Println("Player Registered")
case "PlayerRemoved":
for connection, _ := range allConnections {
connection.WriteJSON(Message{
Identifier: msg.Identifier,
MessageType: "NoPlayer",
})
}
fmt.Println("Player Registered")
case "Enqueue":
var payload EnqueuePayload
fmt.Println(msg.Payload)
err := json.Unmarshal([]byte(msg.Payload), &payload)
if err == nil {
items := getItemsToPlay(payload.ItemId, payload.PodcastId, payload.TagIds)
var player *websocket.Conn
for connection, id := range activePlayers {
if msg.Identifier == id {
player = connection
break
}
}
if player != nil {
payloadStr, err := json.Marshal(items)
if err == nil {
player.WriteJSON(Message{
Identifier: msg.Identifier,
MessageType: "Enqueue",
Payload: string(payloadStr),
})
}
}
} else {
fmt.Println(err.Error())
}
case "Register":
var player *websocket.Conn
for connection, id := range activePlayers {
if msg.Identifier == id {
player = connection
break
}
}
if player == nil {
fmt.Println("Player Not Exists")
msg.Connection.WriteJSON(Message{
Identifier: msg.Identifier,
MessageType: "NoPlayer",
})
} else {
msg.Connection.WriteJSON(Message{
Identifier: msg.Identifier,
MessageType: "PlayerExists",
})
}
}
// Send it out to every client that is currently connected
// for client := range clients {
// err := client.WriteJSON(msg)
// if err != nil {
// log.Printf("error: %v", err)
// client.Close()
// delete(clients, client)
// }
// }
}
}