Merge pull request #46 from akhilrex/websockets
commit
0f802b3553
@ -0,0 +1,148 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
type EnqueuePayload struct {
|
||||
ItemId string `json:"itemId"`
|
||||
PodcastId string `json:"podcastId"`
|
||||
}
|
||||
|
||||
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)
|
||||
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)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
Loading…
Reference in new issue