接下來,我們再來開發一個功能,這個功能相對簡單,就是聊天。在游戲里,我們會收到一個聊天請求,我們只需要做一個聊天推送即可。具體來說,就是誰發的消息,就推送給所有人,包括消息內容等信息。
為了實現這個功能,我們需要在合適的位置進行消息搜索。首先,我們要把消息搜出來。在搜索時,我們會參考筆記里的一些信息,比如 id
、type
(消息類型,不同發消息的情況會有不同的類型)、message
(消息內容)以及收件人 ID(如果要發送給指定用戶)。不過,我們這種消息一般是廣播,發送給所有用戶,所以通常都會成功。
有了這些信息后,我們對其進行解析,并返回結果。如果 type
等于聊天通知,我們就進入聊天相關流程,把用戶 ID 等信息傳遞過去。之后,我們把消息原模原樣地進行數據發送,即 send data
。在發送過程中,我們會涉及聊天形式的編寫等操作,最終實現消息發送。
具體代碼如下:
func (g *GameFrame) onGameChat(user *proto.RoomUser, session *remote.Session, data MessageData) {g.sendDataAll(GameChatPushData(user.ChairID, data.Type, data.Msg, data.RecipientID), session)
}func (r *Room) SendDataAll(msg *stream.Msg, data any) {users := make([]stream.PushUser, 0)for _, v := range r.users {users = append(users, stream.PushUser{Uid: v.UserInfo.Uid,ConnectorId: v.UserInfo.FrontendId,})}r.ServerMessagePush(msg, users, data)
}func (r *Room) ServerMessagePush(msg *stream.Msg, users []stream.PushUser, data any) {pusher.GetPusher().Push(msg, users, data, "ServerMessagePush")
}func (p *Pusher) Push(m *stream.Msg, users []stream.PushUser, data any, router string) {msgData, _ := json.Marshal(data)pm := stream.PushData{Data: msgData,Router: router,}upm := &stream.PushMessage{Users: users,PushData: pm,Msg: m,}p.pushChan <- upm
}
在實現后,我們重新啟動程序,在相應位置創建房間并加入房間(如 411126),然后發送消息,比如“快點吧”。可以看到,消息成功發出且其他人也能收到,相當于所有人都能看到這條消息。這就是一個簡單的聊天功能實現。