| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- package chat
- import (
- actorRemote "f1-game/internal/actor_remote"
- cherryApp "f1-game/internal/cherry_app"
- "f1-game/internal/component/redis"
- "f1-game/internal/enum"
- facade "f1-game/internal/facade"
- nameRoute "f1-game/internal/name/route"
- "f1-game/internal/pb"
- "f1-game/internal/sessions"
- "f1-game/nodes/game/internal/db"
- dbChat "f1-game/nodes/game/internal/db/data/chat"
- csnowflake "github.com/cherry-game/cherry/extend/snowflake"
- cstring "github.com/cherry-game/cherry/extend/string"
- ctime "github.com/cherry-game/cherry/extend/time"
- clog "github.com/cherry-game/cherry/logger"
- cproto "github.com/cherry-game/cherry/net/proto"
- )
- var srv = &service{}
- func Service() *service {
- return srv
- }
- type service struct {
- facade.PlayerServiceBase[*db.PlayerTable]
- }
- func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) {
- // 新用户加入game节点聊天室
- if session.Contains(sessions.IsNewPlayer) {
- chatID := cstring.ToInt64D(cherryApp.NodeID())
- p.CreateChatRoom(playerTable.PlayerID, enum.ChatType_Game, chatID)
- }
- // 删除私聊超过3天没有更新的记录
- chatTable := db.GetChatTable(playerTable.PlayerID)
- chatTable.PrivateListClean()
- chatTable.Save2Queue()
- }
- func (p *service) OnLogined(playerTable *db.PlayerTable, session *cproto.Session) {
- // 登录后setSession再给对应的chat push 历史20条最新消息
- p.sendMsgListReq(playerTable.PlayerID)
- }
- // func (p *service) OnLogout(playerTable *db.PlayerTable) {
- // }
- func (p *service) OnReset(playerTable *db.PlayerTable, _ *ctime.CherryTime, _ bool) {
- chatTable := db.GetChatTable(playerTable.PlayerID)
- chatTable.CleanSendCount()
- chatTable.Save2Queue()
- }
- func (p *service) Push(playerTable *db.PlayerTable, session *cproto.Session) {
- p.push(playerTable.PlayerID, session)
- }
- // 注: 创建玩家关联的聊天室,不包含群组和私聊
- //
- // game 的聊天室ID为节点ID
- //
- // map 的聊天室ID为分配时node配置表的mapNodeID映射ID
- //
- // league 的聊天室ID为leagueID
- func (p *service) CreateChatRoom(playerID int64, chatType enum.ChatType, chatID int64) {
- chatTable := db.GetChatTable(playerID)
- if chatTable.IsChatRoomExist(chatType, chatID) {
- clog.Warnf("CreateChatRoom is exist. playerID: %d chatType: %d chatID: %d", playerID, chatType, chatID)
- return
- }
- newChatRoom := dbChat.NewChatRoom(chatType, chatID, "", 0)
- chatTable.AddChatRoom(newChatRoom)
- chatTable.Save2Queue()
- }
- // 删除玩家关联的聊天室
- func (p *service) RemoveChatRoom(playerID int64, chatType enum.ChatType, chatID int64) {
- chatTable := db.GetChatTable(playerID)
- chatTable.RemoveChatRoom(chatType, chatID)
- chatTable.Save2Queue()
- }
- func (p *service) push(playerID int64, session *cproto.Session) {
- var (
- chatTable = db.GetChatTable(playerID)
- allPlayerIDList = chatTable.GetAllPlayerIDList()
- )
- chatPlayerMap := map[int64]*pb.ChatPlayer{}
- if len(allPlayerIDList) > 0 {
- chatPlayerMap = redis.Game.GetChatPlayerMap(allPlayerIDList...)
- if chatPlayerMap == nil {
- clog.Warnf("push GetPlayerDataBaseMap is nil. playerID: %d allPlayerIDList len: %d", playerID, len(allPlayerIDList))
- return
- }
- }
- rsp := &pb.ChatData{
- ChatRoomList: chatTable.ToChatRoomListProto(),
- GroupInviteList: chatTable.ToGroupInviteListProto(chatPlayerMap),
- FriendList: chatTable.ToFriendListProto(chatPlayerMap),
- FriendInviteList: chatTable.ToFriendInviteListProto(chatPlayerMap),
- BlackPlayerList: chatTable.ToBlackListProto(chatPlayerMap),
- LastChatPrivateList: chatTable.ToPrivateChatList(chatPlayerMap),
- SystemMsgList: chatTable.ToSystemMsgListProto(),
- ChatSetting: chatTable.ToChatSettingProto(),
- }
- sessions.PushWithSession(session, nameRoute.PushGamePlayer_ChatData, rsp)
- }
- func (p *service) BuildMsgListProto(chatPlayer *pb.ChatPlayer, req *pb.ChatSend, sendTime int64) *pb.ChatMsgList {
- msgList := &pb.ChatMsgList{
- ChatType: req.ChatType,
- ChatID: req.ChatID,
- IsNew: true,
- }
- chatMsg := p.BuildMsgProto(chatPlayer, enum.ChatMsgType_Text, req.Text, sendTime, nil)
- msgList.List = append(msgList.List, chatMsg)
- return msgList
- }
- func (p *service) BuildMsgProto(chatPlayer *pb.ChatPlayer, textType enum.ChatMsgType, text string, sendTime int64, params *pb.ParamsTemplate) *pb.ChatMsg {
- chatMsg := &pb.ChatMsg{
- MsgID: csnowflake.NextID(),
- Sender: chatPlayer,
- SendTime: sendTime,
- Type: int32(textType),
- Text: text,
- }
- if params != nil {
- chatMsg.Params = params
- }
- return chatMsg
- }
- func (p *service) BuildSysMsgProto(params *pb.ParamsTemplate) *pb.ChatMsg {
- return &pb.ChatMsg{
- MsgID: csnowflake.NextID(),
- SendTime: ctime.Now().ToSecond(),
- Type: params.Type,
- Params: params,
- }
- }
- // 发起到chat节点推送聊天消息列表请求
- func (p *service) sendMsgListReq(playerID int64) {
- chatTable := db.GetChatTable(playerID)
- for _, chatRoom := range chatTable.ChatRoomList {
- actorRemote.Chat.Push(chatRoom.ChatType, playerID, chatRoom.ChatID)
- }
- }
|