chat_msg.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package msg
  2. import (
  3. "rocommon"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. model2 "roserver/game/model"
  7. "roserver/serverproto"
  8. )
  9. func init() {
  10. //发送聊天信息
  11. //消息类型1私人聊天,2世界频道聊天
  12. serverproto.Handle_GAME_CSChatMessageReq = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
  13. msg := ev.Msg().(*serverproto.CSChatMessageReq)
  14. role := model2.RoleMag.GetRoleOrKick(cliId, ev)
  15. if role == nil {
  16. return
  17. }
  18. util.InfoF("uid=%v nickname=%v receive CSChatMessageReq msg=%v", role.GetOpenId(), role.GetNickName(), string(msg.Message.Message))
  19. role.(model2.RoleLogicOuter).CheckChatInvalid(msg.TargetId, msg.Type, msg)
  20. })
  21. //私聊消息发送失败,存到离线信息中,并告诉客户端当前玩家离线
  22. serverproto.Handle_GAME_SSChatMessageAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
  23. msg := ev.Msg().(*serverproto.SSChatMessageAck)
  24. util.DebugF("receive SSChatMessageAck msg from other player msg=%v", msg)
  25. role := model2.RoleMag.GetRole(cliId)
  26. if role == nil {
  27. return
  28. }
  29. ackMsg := &serverproto.SCChatMessageAck{
  30. Error: int32(serverproto.ErrorCode_ERROR_OK),
  31. Type: msg.Type,
  32. TargetId: msg.TargetId,
  33. Message: msg.Message,
  34. }
  35. //发送在线聊天信息成功,回复自己
  36. if msg.Error == int32(serverproto.ErrorCode_ERROR_OK) {
  37. //send to db-mysql
  38. role.(*model2.Role).GetRoleChat().SendDB2Mysql(role.GetUUid(), msg.TargetId, msg.Type, msg.Message)
  39. role.ReplayGate(ackMsg, true)
  40. return
  41. }
  42. //离线消息存储(会有一次性获取不全离线消息的情况,正好在保存离线消息时,另外一个玩家上线并获取了
  43. // 之前的离线数据,需要下次再上线时才能获取该次离线数据)
  44. //需要做及时保存,否则玩家上线时将不会获取到离线消息
  45. ssMsg := &serverproto.SSChatMessageSaveReq{
  46. TargetId: msg.TargetId,
  47. FromPlayer: &serverproto.ChatPlayerBriefInfo{
  48. Uid: role.GetUUid(),
  49. NickName: role.GetNickName(),
  50. ImgId: role.(*model2.Role).GetImageId(),
  51. ConfigId: role.(*model2.Role).GetRoleHero().GetMainHero().ConfigId,
  52. Level: role.(*model2.Role).GetRoleLevel(),
  53. HeadFrameId: role.(*model2.Role).GetRoleBase().RoleData().HeadFrameId,
  54. Gender: role.(*model2.Role).GetRoleBase().GetRoleSex(),
  55. VipLevel: role.(*model2.Role).GetRoleVipLevel(),
  56. HeadId: role.(*model2.Role).GetHeadId(),
  57. },
  58. OfflineMsg: msg.Message,
  59. }
  60. role.(*model2.Role).SendDb(ssMsg)
  61. //send to db-mysql
  62. role.(*model2.Role).GetRoleChat().SendDB2Mysql(role.GetUUid(), msg.TargetId, msg.Type, msg.Message)
  63. //ackMsg.Error = int32(serverproto.ErrorCode_ERROR_CHAT_WORLD_TARGET_OFFLINE)
  64. if ackMsg.Type == int32(serverproto.ChatMessageType_CMT_PERSONAL) {
  65. ackMsg.Error = msg.Error
  66. } else {
  67. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
  68. }
  69. role.ReplayGate(ackMsg, true)
  70. })
  71. //来自social消息(来自其他game的聊天消息)
  72. serverproto.Handle_GAME_SSChatMessageNtf = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
  73. msg := ev.Msg().(*serverproto.SSChatMessageNtf)
  74. util.DebugF("receive SSChatMessageNtf msg from other player msg=%v", msg)
  75. chatNtf := &serverproto.SCChatMessageNtf{}
  76. chatNtf.MsgList = append(chatNtf.MsgList, &serverproto.MessageContentInfo{
  77. Type: msg.Type,
  78. FromId: msg.FromId,
  79. Message: msg.Message,
  80. TargetId: msg.TargetId,
  81. })
  82. if msg.Type == int32(serverproto.ChatMessageType_CMT_PERSONAL) ||
  83. msg.Type == int32(serverproto.ChatMessageType_CMT_GUILD) {
  84. targetRole := model2.RoleMag.GetRoleFromUUid(msg.TargetId)
  85. if targetRole == nil {
  86. return
  87. }
  88. if !targetRole.(*model2.Role).GetRoleSocial().IsInBlackList(msg.FromId.Uid) {
  89. targetRole.(model2.RoleOuter).ReplayGate(chatNtf, true)
  90. }
  91. } else if msg.Type == int32(serverproto.ChatMessageType_CMT_WORLD) {
  92. model2.AddWorldMsg(msg.Type, msg.FromId, msg.Message, nil)
  93. //发送给当前服务器的所有玩家
  94. model2.RoleMag.SendMsg2OnlinePlayer(chatNtf, msg.FromId.Uid)
  95. }
  96. })
  97. //私聊玩家在线状态获取
  98. serverproto.Handle_GAME_CSChatPlayerStateReq = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
  99. msg := ev.Msg().(*serverproto.CSChatPlayerStateReq)
  100. util.DebugF("receive CSChatPlayerStateReq msg msg=%v", msg)
  101. //发送给social获取在线状态
  102. role := model2.RoleMag.GetRoleOrKick(cliId, ev)
  103. if role == nil {
  104. return
  105. }
  106. if len(msg.TargetIdList) <= 0 {
  107. return
  108. } else if msg.TargetIdList[0] == role.GetUUid() {
  109. util.InfoF("uid=%v receive CSChatPlayerStateReq is self invalid", role.GetUUid())
  110. return
  111. }
  112. role.(*model2.Role).SendSocial(msg)
  113. })
  114. //来自social,获取玩家在线状态消息回复
  115. serverproto.Handle_GAME_SCChatPlayerStateAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
  116. msg := ev.Msg().(*serverproto.SCChatPlayerStateAck)
  117. util.DebugF("receive SCChatPlayerStateAck msg=%v", msg)
  118. role := model2.RoleMag.GetRole(cliId)
  119. if role == nil {
  120. return
  121. }
  122. role.ReplayGate(msg, true)
  123. })
  124. //获取离线消息
  125. serverproto.Handle_GAME_CSChatOfflineMsgReq = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
  126. msg := ev.Msg().(*serverproto.CSChatOfflineMsgReq)
  127. util.DebugF("uid=%v receive CSChatOfflineMsgReq msg=%v", cliId.SessID, msg)
  128. //发送给social获取在线状态
  129. role := model2.RoleMag.GetRoleOrKick(cliId, ev)
  130. if role == nil {
  131. return
  132. }
  133. role.(model2.RoleLogicOuter).GetOfflineMsg(msg.TargetId)
  134. })
  135. //获取离线消息回复(db)
  136. serverproto.Handle_GAME_SCChatOfflineMsgAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
  137. msg := ev.Msg().(*serverproto.SCChatOfflineMsgAck)
  138. util.DebugF("receive SCChatOfflineMsgAck msg:=%v", msg)
  139. role := model2.RoleMag.GetRole(cliId)
  140. if role == nil {
  141. return
  142. }
  143. role.ReplayGate(msg, true)
  144. })
  145. //获取离线信息玩家列表回复(db)
  146. serverproto.Handle_GAME_SSChatOfflinePlayerAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
  147. msg := ev.Msg().(*serverproto.SSChatOfflinePlayerAck)
  148. util.DebugF("receive SSChatOfflinePlayerAck msg:=%v", msg)
  149. role := model2.RoleMag.GetRole(cliId)
  150. if role == nil {
  151. return
  152. }
  153. if msg.RoleOfflineMsgList != nil {
  154. role.(*model2.Role).GetRoleChat().AddOfflineMsg(msg.RoleOfflineMsgList.OfflineMsgPlayerList)
  155. }
  156. ntfMsg := &serverproto.SCChatOfflinePlayerNtf{
  157. OfflinePlayerList: msg.RoleOfflineMsgList,
  158. }
  159. role.ReplayGate(ntfMsg, true)
  160. })
  161. }