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
|
package main
import (
"code.google.com/p/go.net/websocket"
"github.com/gorilla/mux"
"github.com/kch42/simplechat/chat"
"net/http"
)
type JoinResponse struct {
OK bool `json:"ok"`
Error string `json:"error,omitempty"`
Buddies []string `json:"buddies,omitempty"`
}
func AcceptWebSock(rw http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
roomname := vars["chatroom"]
websocket.Handler(func(ws *websocket.Conn) {
send := func(v interface{}) error { return websocket.JSON.Send(ws, v) }
defer ws.Close()
var nick string
if websocket.Message.Receive(ws, &nick) != nil {
return
}
buddy, room, err := chat.Join(roomname, nick)
if err != nil {
send(JoinResponse{
OK: false,
Error: err.Error(),
})
return
}
defer buddy.Leave()
if send(JoinResponse{
OK: true,
Buddies: room.ListBuddies(),
}) != nil {
return
}
exit := make(chan struct{})
go func() {
var s string
for {
if websocket.Message.Receive(ws, &s) != nil {
break
}
if s == "" {
continue
}
buddy.Say(s)
}
exit <- struct{}{}
}()
for {
select {
case <-exit:
return
case m := <-buddy.Receive:
if send(m) != nil {
return
}
}
}
}).ServeHTTP(rw, req)
}
|