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) } }