service.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package chat
  2. import (
  3. actorRemote "f1-game/internal/actor_remote"
  4. cherryApp "f1-game/internal/cherry_app"
  5. "f1-game/internal/component/redis"
  6. "f1-game/internal/enum"
  7. facade "f1-game/internal/facade"
  8. nameRoute "f1-game/internal/name/route"
  9. "f1-game/internal/pb"
  10. "f1-game/internal/sessions"
  11. "f1-game/nodes/game/internal/db"
  12. dbChat "f1-game/nodes/game/internal/db/data/chat"
  13. csnowflake "github.com/cherry-game/cherry/extend/snowflake"
  14. cstring "github.com/cherry-game/cherry/extend/string"
  15. ctime "github.com/cherry-game/cherry/extend/time"
  16. clog "github.com/cherry-game/cherry/logger"
  17. cproto "github.com/cherry-game/cherry/net/proto"
  18. )
  19. var srv = &service{}
  20. func Service() *service {
  21. return srv
  22. }
  23. type service struct {
  24. facade.PlayerServiceBase[*db.PlayerTable]
  25. }
  26. func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) {
  27. // 新用户加入game节点聊天室
  28. if session.Contains(sessions.IsNewPlayer) {
  29. chatID := cstring.ToInt64D(cherryApp.NodeID())
  30. p.CreateChatRoom(playerTable.PlayerID, enum.ChatType_Game, chatID)
  31. }
  32. // 删除私聊超过3天没有更新的记录
  33. chatTable := db.GetChatTable(playerTable.PlayerID)
  34. chatTable.PrivateListClean()
  35. chatTable.Save2Queue()
  36. }
  37. func (p *service) OnLogined(playerTable *db.PlayerTable, session *cproto.Session) {
  38. // 登录后setSession再给对应的chat push 历史20条最新消息
  39. p.sendMsgListReq(playerTable.PlayerID)
  40. }
  41. // func (p *service) OnLogout(playerTable *db.PlayerTable) {
  42. // }
  43. func (p *service) OnReset(playerTable *db.PlayerTable, _ *ctime.CherryTime, _ bool) {
  44. chatTable := db.GetChatTable(playerTable.PlayerID)
  45. chatTable.CleanSendCount()
  46. chatTable.Save2Queue()
  47. }
  48. func (p *service) Push(playerTable *db.PlayerTable, session *cproto.Session) {
  49. p.push(playerTable.PlayerID, session)
  50. }
  51. // 注: 创建玩家关联的聊天室,不包含群组和私聊
  52. //
  53. // game 的聊天室ID为节点ID
  54. //
  55. // map 的聊天室ID为分配时node配置表的mapNodeID映射ID
  56. //
  57. // league 的聊天室ID为leagueID
  58. func (p *service) CreateChatRoom(playerID int64, chatType enum.ChatType, chatID int64) {
  59. chatTable := db.GetChatTable(playerID)
  60. if chatTable.IsChatRoomExist(chatType, chatID) {
  61. clog.Warnf("CreateChatRoom is exist. playerID: %d chatType: %d chatID: %d", playerID, chatType, chatID)
  62. return
  63. }
  64. newChatRoom := dbChat.NewChatRoom(chatType, chatID, "", 0)
  65. chatTable.AddChatRoom(newChatRoom)
  66. chatTable.Save2Queue()
  67. }
  68. // 删除玩家关联的聊天室
  69. func (p *service) RemoveChatRoom(playerID int64, chatType enum.ChatType, chatID int64) {
  70. chatTable := db.GetChatTable(playerID)
  71. chatTable.RemoveChatRoom(chatType, chatID)
  72. chatTable.Save2Queue()
  73. }
  74. func (p *service) push(playerID int64, session *cproto.Session) {
  75. var (
  76. chatTable = db.GetChatTable(playerID)
  77. allPlayerIDList = chatTable.GetAllPlayerIDList()
  78. )
  79. chatPlayerMap := map[int64]*pb.ChatPlayer{}
  80. if len(allPlayerIDList) > 0 {
  81. chatPlayerMap = redis.Game.GetChatPlayerMap(allPlayerIDList...)
  82. if chatPlayerMap == nil {
  83. clog.Warnf("push GetPlayerDataBaseMap is nil. playerID: %d allPlayerIDList len: %d", playerID, len(allPlayerIDList))
  84. return
  85. }
  86. }
  87. rsp := &pb.ChatData{
  88. ChatRoomList: chatTable.ToChatRoomListProto(),
  89. GroupInviteList: chatTable.ToGroupInviteListProto(chatPlayerMap),
  90. FriendList: chatTable.ToFriendListProto(chatPlayerMap),
  91. FriendInviteList: chatTable.ToFriendInviteListProto(chatPlayerMap),
  92. BlackPlayerList: chatTable.ToBlackListProto(chatPlayerMap),
  93. LastChatPrivateList: chatTable.ToPrivateChatList(chatPlayerMap),
  94. SystemMsgList: chatTable.ToSystemMsgListProto(),
  95. ChatSetting: chatTable.ToChatSettingProto(),
  96. }
  97. sessions.PushWithSession(session, nameRoute.PushGamePlayer_ChatData, rsp)
  98. }
  99. func (p *service) BuildMsgListProto(chatPlayer *pb.ChatPlayer, req *pb.ChatSend, sendTime int64) *pb.ChatMsgList {
  100. msgList := &pb.ChatMsgList{
  101. ChatType: req.ChatType,
  102. ChatID: req.ChatID,
  103. IsNew: true,
  104. }
  105. chatMsg := p.BuildMsgProto(chatPlayer, enum.ChatMsgType_Text, req.Text, sendTime, nil)
  106. msgList.List = append(msgList.List, chatMsg)
  107. return msgList
  108. }
  109. func (p *service) BuildMsgProto(chatPlayer *pb.ChatPlayer, textType enum.ChatMsgType, text string, sendTime int64, params *pb.ParamsTemplate) *pb.ChatMsg {
  110. chatMsg := &pb.ChatMsg{
  111. MsgID: csnowflake.NextID(),
  112. Sender: chatPlayer,
  113. SendTime: sendTime,
  114. Type: int32(textType),
  115. Text: text,
  116. }
  117. if params != nil {
  118. chatMsg.Params = params
  119. }
  120. return chatMsg
  121. }
  122. func (p *service) BuildSysMsgProto(params *pb.ParamsTemplate) *pb.ChatMsg {
  123. return &pb.ChatMsg{
  124. MsgID: csnowflake.NextID(),
  125. SendTime: ctime.Now().ToSecond(),
  126. Type: params.Type,
  127. Params: params,
  128. }
  129. }
  130. // 发起到chat节点推送聊天消息列表请求
  131. func (p *service) sendMsgListReq(playerID int64) {
  132. chatTable := db.GetChatTable(playerID)
  133. for _, chatRoom := range chatTable.ChatRoomList {
  134. actorRemote.Chat.Push(chatRoom.ChatType, playerID, chatRoom.ChatID)
  135. }
  136. }