/
room.go
84 lines (80 loc) · 2.09 KB
/
room.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
package ayame
import "context"
var (
// register/unregister は待たせる
registerChannel = make(chan *register)
unregisterChannel = make(chan *unregister)
// ブロックされたくないので 100 に設定
forwardChannel = make(chan forward, 100)
)
// roomId がキーになる
type room struct {
connections map[string]*connection
}
func (s *Server) StartMatchServer(ctx context.Context) error {
// room を管理するマップはここに用意する
var m = make(map[string]room)
// ここはシングルなのでロックは不要
for {
select {
case <-ctx.Done():
return ctx.Err()
case register := <-registerChannel:
c := register.connection
rch := register.resultChannel
r, ok := m[c.roomID]
if ok {
// room があった
if len(r.connections) == 1 {
r.connections[c.ID] = c
m[c.roomID] = r
rch <- two
} else {
// room あったけど満杯
rch <- full
}
} else {
// room がなかった
var connections = make(map[string]*connection)
connections[c.ID] = c
// room を追加
m[c.roomID] = room{
connections: connections,
}
c.debugLog().Msg("CREATED-ROOM")
rch <- one
}
case unregister := <-unregisterChannel:
c := unregister.connection
// room を探す
r, ok := m[c.roomID]
// room がない場合は何もしない
if ok {
_, ok := r.connections[c.ID]
if ok {
for _, connection := range r.connections {
// 両方の forwardChannel を閉じる
close(connection.forwardChannel)
connection.debugLog().Msg("CLOSED-FORWARD-CHANNEL")
connection.debugLog().Msg("REMOVED-CLIENT")
}
// room を削除
delete(m, c.roomID)
c.debugLog().Msg("DELETED-ROOM")
}
}
case forward := <-forwardChannel:
r, ok := m[forward.connection.roomID]
// room がない場合は何もしない
if ok {
// room があった
for connectionID, client := range r.connections {
// 自分ではない方に投げつける
if connectionID != forward.connection.ID {
client.forwardChannel <- forward
}
}
}
}
}
}