| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- package msg
- import (
- "rocommon"
- "rocommon/util"
- "roserver/baseserver/model"
- model2 "roserver/game/model"
- "roserver/serverproto"
- )
- func init() {
- //发送聊天信息
- //消息类型1私人聊天,2世界频道聊天
- serverproto.Handle_GAME_CSChatMessageReq = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
- msg := ev.Msg().(*serverproto.CSChatMessageReq)
- role := model2.RoleMag.GetRoleOrKick(cliId, ev)
- if role == nil {
- return
- }
- util.InfoF("uid=%v nickname=%v receive CSChatMessageReq msg=%v", role.GetOpenId(), role.GetNickName(), string(msg.Message.Message))
- role.(model2.RoleLogicOuter).CheckChatInvalid(msg.TargetId, msg.Type, msg)
- })
- //私聊消息发送失败,存到离线信息中,并告诉客户端当前玩家离线
- serverproto.Handle_GAME_SSChatMessageAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
- msg := ev.Msg().(*serverproto.SSChatMessageAck)
- util.DebugF("receive SSChatMessageAck msg from other player msg=%v", msg)
- role := model2.RoleMag.GetRole(cliId)
- if role == nil {
- return
- }
- ackMsg := &serverproto.SCChatMessageAck{
- Error: int32(serverproto.ErrorCode_ERROR_OK),
- Type: msg.Type,
- TargetId: msg.TargetId,
- Message: msg.Message,
- }
- //发送在线聊天信息成功,回复自己
- if msg.Error == int32(serverproto.ErrorCode_ERROR_OK) {
- //send to db-mysql
- role.(*model2.Role).GetRoleChat().SendDB2Mysql(role.GetUUid(), msg.TargetId, msg.Type, msg.Message)
- role.ReplayGate(ackMsg, true)
- return
- }
- //离线消息存储(会有一次性获取不全离线消息的情况,正好在保存离线消息时,另外一个玩家上线并获取了
- // 之前的离线数据,需要下次再上线时才能获取该次离线数据)
- //需要做及时保存,否则玩家上线时将不会获取到离线消息
- ssMsg := &serverproto.SSChatMessageSaveReq{
- TargetId: msg.TargetId,
- FromPlayer: &serverproto.ChatPlayerBriefInfo{
- Uid: role.GetUUid(),
- NickName: role.GetNickName(),
- ImgId: role.(*model2.Role).GetImageId(),
- ConfigId: role.(*model2.Role).GetRoleHero().GetMainHero().ConfigId,
- Level: role.(*model2.Role).GetRoleLevel(),
- HeadFrameId: role.(*model2.Role).GetRoleBase().RoleData().HeadFrameId,
- Gender: role.(*model2.Role).GetRoleBase().GetRoleSex(),
- VipLevel: role.(*model2.Role).GetRoleVipLevel(),
- HeadId: role.(*model2.Role).GetHeadId(),
- },
- OfflineMsg: msg.Message,
- }
- role.(*model2.Role).SendDb(ssMsg)
- //send to db-mysql
- role.(*model2.Role).GetRoleChat().SendDB2Mysql(role.GetUUid(), msg.TargetId, msg.Type, msg.Message)
- //ackMsg.Error = int32(serverproto.ErrorCode_ERROR_CHAT_WORLD_TARGET_OFFLINE)
- if ackMsg.Type == int32(serverproto.ChatMessageType_CMT_PERSONAL) {
- ackMsg.Error = msg.Error
- } else {
- ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
- }
- role.ReplayGate(ackMsg, true)
- })
- //来自social消息(来自其他game的聊天消息)
- serverproto.Handle_GAME_SSChatMessageNtf = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
- msg := ev.Msg().(*serverproto.SSChatMessageNtf)
- util.DebugF("receive SSChatMessageNtf msg from other player msg=%v", msg)
- chatNtf := &serverproto.SCChatMessageNtf{}
- chatNtf.MsgList = append(chatNtf.MsgList, &serverproto.MessageContentInfo{
- Type: msg.Type,
- FromId: msg.FromId,
- Message: msg.Message,
- TargetId: msg.TargetId,
- })
- if msg.Type == int32(serverproto.ChatMessageType_CMT_PERSONAL) ||
- msg.Type == int32(serverproto.ChatMessageType_CMT_GUILD) {
- targetRole := model2.RoleMag.GetRoleFromUUid(msg.TargetId)
- if targetRole == nil {
- return
- }
- if !targetRole.(*model2.Role).GetRoleSocial().IsInBlackList(msg.FromId.Uid) {
- targetRole.(model2.RoleOuter).ReplayGate(chatNtf, true)
- }
- } else if msg.Type == int32(serverproto.ChatMessageType_CMT_WORLD) {
- model2.AddWorldMsg(msg.Type, msg.FromId, msg.Message, nil)
- //发送给当前服务器的所有玩家
- model2.RoleMag.SendMsg2OnlinePlayer(chatNtf, msg.FromId.Uid)
- }
- })
- //私聊玩家在线状态获取
- serverproto.Handle_GAME_CSChatPlayerStateReq = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
- msg := ev.Msg().(*serverproto.CSChatPlayerStateReq)
- util.DebugF("receive CSChatPlayerStateReq msg msg=%v", msg)
- //发送给social获取在线状态
- role := model2.RoleMag.GetRoleOrKick(cliId, ev)
- if role == nil {
- return
- }
- if len(msg.TargetIdList) <= 0 {
- return
- } else if msg.TargetIdList[0] == role.GetUUid() {
- util.InfoF("uid=%v receive CSChatPlayerStateReq is self invalid", role.GetUUid())
- return
- }
- role.(*model2.Role).SendSocial(msg)
- })
- //来自social,获取玩家在线状态消息回复
- serverproto.Handle_GAME_SCChatPlayerStateAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
- msg := ev.Msg().(*serverproto.SCChatPlayerStateAck)
- util.DebugF("receive SCChatPlayerStateAck msg=%v", msg)
- role := model2.RoleMag.GetRole(cliId)
- if role == nil {
- return
- }
- role.ReplayGate(msg, true)
- })
- //获取离线消息
- serverproto.Handle_GAME_CSChatOfflineMsgReq = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
- msg := ev.Msg().(*serverproto.CSChatOfflineMsgReq)
- util.DebugF("uid=%v receive CSChatOfflineMsgReq msg=%v", cliId.SessID, msg)
- //发送给social获取在线状态
- role := model2.RoleMag.GetRoleOrKick(cliId, ev)
- if role == nil {
- return
- }
- role.(model2.RoleLogicOuter).GetOfflineMsg(msg.TargetId)
- })
- //获取离线消息回复(db)
- serverproto.Handle_GAME_SCChatOfflineMsgAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
- msg := ev.Msg().(*serverproto.SCChatOfflineMsgAck)
- util.DebugF("receive SCChatOfflineMsgAck msg:=%v", msg)
- role := model2.RoleMag.GetRole(cliId)
- if role == nil {
- return
- }
- role.ReplayGate(msg, true)
- })
- //获取离线信息玩家列表回复(db)
- serverproto.Handle_GAME_SSChatOfflinePlayerAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
- msg := ev.Msg().(*serverproto.SSChatOfflinePlayerAck)
- util.DebugF("receive SSChatOfflinePlayerAck msg:=%v", msg)
- role := model2.RoleMag.GetRole(cliId)
- if role == nil {
- return
- }
- if msg.RoleOfflineMsgList != nil {
- role.(*model2.Role).GetRoleChat().AddOfflineMsg(msg.RoleOfflineMsgList.OfflineMsgPlayerList)
- }
- ntfMsg := &serverproto.SCChatOfflinePlayerNtf{
- OfflinePlayerList: msg.RoleOfflineMsgList,
- }
- role.ReplayGate(ntfMsg, true)
- })
- }
|