-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsocket.go
88 lines (78 loc) · 1.83 KB
/
socket.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main
import (
"log"
"net/http"
"strconv"
"github.com/gorilla/websocket"
)
// handleConnection : handle connections to the websocket
func (socket *WebSocket) handleConnection() func(w http.ResponseWriter, r *http.Request) {
counter := make([]int, 0, 2)
id := 0
return func(w http.ResponseWriter, r *http.Request) {
// Manage player ids
if len(counter) == 0 {
counter = append(counter, 1)
id = 1
} else if len(counter) == 1 {
player := counter[0]
if player == 1 {
counter = append(counter, 2)
id = 2
} else {
counter = append(counter, 1)
id = 1
}
} else {
log.Println("Too many clients")
return
}
// Start websocket
ws, err := socket.Upgrader.Upgrade(w, r, nil)
if err != nil {
log.Fatal(err)
}
// Make sure we close the connection when the function returns
defer ws.Close()
// Send its player id to the client
socket.Clients[ws] = id
msg := []byte(strconv.Itoa(id))
ws.WriteMessage(websocket.TextMessage, msg)
for {
var msg Event
err := ws.ReadJSON(&msg)
if err != nil {
// Delete session
id = socket.Clients[ws]
delete(socket.Clients, ws)
if len(counter) == 1 {
counter = make([]int, 0, 2)
} else {
counter = make([]int, 0, 2)
counter = append(counter, 3-id)
}
log.Println("Connection closed")
log.Println(err)
break
}
socket.Event <- msg
}
}
}
// handleMessages : handle messages sent to the websocket
func (socket *WebSocket) handleMessages() {
for {
// Grab the next message from the broadcast channel
msg := <-socket.Broadcast
log.Println(msg)
// Send it out to every client that is currently connected
for client := range socket.Clients {
err := client.WriteJSON(msg)
if err != nil {
log.Printf("error: %v", err)
client.Close()
delete(socket.Clients, client)
}
}
}
}