Feature: chat

This commit is contained in:
2020-04-27 20:51:01 +08:00
parent 2ba86bb532
commit 30624da7ff
5 changed files with 32 additions and 7 deletions
+2 -2
View File
@@ -29,7 +29,7 @@ const (
TableOrderMsgType
GameResultMsgType
GetReadyMsgType
UserOrderMsgType
RoomControl
ChatMsgType
UserJoinMsgType
RoomControl
)
+16 -3
View File
@@ -17,6 +17,7 @@ type ConnManager struct {
tableOrderCh chan int
gameResultCh chan message.GameResultMsg
getReadyCh chan message.GetReadyMsg
chatCh chan message.ChatMsg
}
func NewConnManager(playersCount int,
@@ -24,7 +25,8 @@ func NewConnManager(playersCount int,
gameSendCh chan message.GameMsgSend,
tableOrderCh chan int,
gameResultCh chan message.GameResultMsg,
getReadyCh chan message.GetReadyMsg) *ConnManager {
getReadyCh chan message.GetReadyMsg,
chatCh chan message.ChatMsg) *ConnManager {
connManager := ConnManager{playersCount: playersCount,
conns: make([]*websocket.Conn, 0),
gameRecvCh: gameRecvCh,
@@ -32,6 +34,7 @@ func NewConnManager(playersCount int,
tableOrderCh: tableOrderCh,
gameResultCh: gameResultCh,
getReadyCh: getReadyCh,
chatCh: chatCh,
}
go connManager.Broadcaster()
return &connManager
@@ -39,7 +42,7 @@ func NewConnManager(playersCount int,
func (m *ConnManager) AddConn(conn *websocket.Conn) {
m.conns = append(m.conns, conn)
go m.connListener(conn, m.gameRecvCh, m.gameSendCh)
go m.connListener(conn, m.gameRecvCh, m.chatCh)
}
func (m *ConnManager) Broadcaster() {
@@ -88,7 +91,7 @@ func (m *ConnManager) checkConn(c *websocket.Conn) {
}
}
func (m *ConnManager) connListener(conn *websocket.Conn, gameRecvCh chan message.GameMsgRecv, gameSendCh chan message.GameMsgSend) {
func (m *ConnManager) connListener(conn *websocket.Conn, gameRecvCh chan message.GameMsgRecv, chatCh chan message.ChatMsg) {
for {
commonMsg := message.CommonMsg{}
_, msg, err := conn.ReadMessage()
@@ -112,6 +115,16 @@ func (m *ConnManager) connListener(conn *websocket.Conn, gameRecvCh chan message
panic("fail to decode game msg")
}
gameRecvCh <- gameMsg
case config.ChatMsgType:
log.Println("got a chat msg")
var chatMsg message.ChatMsg
err = json.Unmarshal(msg, &chatMsg)
if err != nil {
panic("fail to decode chat msg")
}
for _, conn := range m.conns {
conn.WriteJSON(chatMsg)
}
}
}
}
+5 -2
View File
@@ -16,6 +16,7 @@ type Room struct {
tableOrderCh chan int
gameResultCh chan message.GameResultMsg
getReadyCh chan message.GetReadyMsg
chatCh chan message.ChatMsg
password string
playerCount int
@@ -27,14 +28,16 @@ func NewRoom(rule rule.MahjongRule) *Room {
tableOrderChannel := make(chan int)
gameResultChannel := make(chan message.GameResultMsg)
getReadyChannel := make(chan message.GetReadyMsg)
chatChannel := make(chan message.ChatMsg)
return &Room{
gameRecvCh: gameRecvChannel,
gameSendCh: gameSendChannel,
tableOrderCh: tableOrderChannel,
gameResultCh: gameResultChannel,
getReadyCh: getReadyChannel,
connManager: NewConnManager(4, gameRecvChannel, gameSendChannel, tableOrderChannel, gameResultChannel, getReadyChannel),
mahjongManager: game.NewMahjongManager(gameRecvChannel, gameSendChannel, tableOrderChannel, gameResultChannel, getReadyChannel, rule),
chatCh: chatChannel,
connManager: NewConnManager(4, gameRecvChannel, gameSendChannel, tableOrderChannel, gameResultChannel, getReadyChannel, chatChannel),
mahjongManager: game.NewMahjongManager(gameRecvChannel, gameSendChannel, tableOrderChannel, gameResultChannel, getReadyChannel, chatChannel, rule),
}
}
+3
View File
@@ -19,6 +19,7 @@ type MahjongManager struct {
tableOrderCh chan int
gameResultCh chan message.GameResultMsg
getReadyCh chan message.GetReadyMsg
chatCh chan message.ChatMsg
lastTableOrder int
currentTableOrder int
@@ -36,6 +37,7 @@ func NewMahjongManager(gameRecvCh chan message.GameMsgRecv,
tableOrderCh chan int,
gameResultCh chan message.GameResultMsg,
getReadyCh chan message.GetReadyMsg,
chatCh chan message.ChatMsg,
r rule.MahjongRule) *MahjongManager {
mahjong := MahjongManager{}
mahjong.rules = r
@@ -47,6 +49,7 @@ func NewMahjongManager(gameRecvCh chan message.GameMsgRecv,
mahjong.tableOrderCh = tableOrderCh
mahjong.gameResultCh = gameResultCh
mahjong.getReadyCh = getReadyCh
mahjong.chatCh = chatCh
return &mahjong
}
+6
View File
@@ -26,3 +26,9 @@ type GetReadyMsg struct {
MsgType int `json:"msg_type"`
ReadyList [4]bool `json:"ready_list"`
}
type ChatMsg struct {
MsgType int `json:"msg_type"`
From int `json:"from"`
Content string `json:"content"`
}