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.
150 lines
3.4 KiB
150 lines
3.4 KiB
package controllers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type EnqueuePayload struct {
|
|
ItemIds []string `json:"itemIds"`
|
|
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.ItemIds, 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)
|
|
// }
|
|
// }
|
|
}
|
|
}
|