package game import ( "encoding/gob" "fmt" mergeCluster "server/cluster" "server/conf" "server/game/mod/card" "server/game/mod/friend" "server/game/mod/item" "server/game/mod/msg" GoUtil "server/game_util" "server/pkg/github.com/name5566/leaf/log" ) type FriendMgr struct { *ServerMod } type FirendData struct { Id int64 List map[int][]*msg.Msg // 本服信箱 ClusterMsg map[int][]*msg.Msg // 集群信箱 } func (f *FriendMgr) Init() { gob.Register(card.CardInfo{}) gob.Register(item.Item{}) gob.Register([]*item.Item{}) // 注册 []*item.Item 类型 gob.Register(friend.ReplyInfo{}) f.key = FRIEND_MGR_KEY f.data = &FirendData{ List: make(map[int][]*msg.Msg), ClusterMsg: make(map[int][]*msg.Msg), } // 注册处理函数 f.init() if f.data.(*FirendData).List == nil { f.data.(*FirendData).List = make(map[int][]*msg.Msg) } if f.data.(*FirendData).ClusterMsg == nil { f.data.(*FirendData).ClusterMsg = make(map[int][]*msg.Msg) } f.RegisterHandler(msg.HANDLE_TYPE_APPLY, f.sendToPlayer) f.RegisterHandler(msg.HADNLE_TYPE_AGREE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_DEL, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_REFUSE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_INVITE_ADD_FRIEND, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_INVITE_FRIEND, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_FRIEND_GREETING_REPLY, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_FRIEND_SPONSOER, f.sendToPlayer) // 卡牌消息 f.RegisterHandler(msg.HANDLE_TYPE_REQ_CARD, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_REFUSE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_FINISH, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD_FAIL, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_EX_CARD, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_SELECT_EX_CARD, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_ARGREE_EX_CARD, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_SELECT_CARD, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_EX_CARD, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_SEND_CARD, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_LOSE, f.sendToPlayer) f.RegisterHandler(msg.FRIEND_TREASURE_HANDLE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_HANDBOOK_COLLECTION, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_HANDBOOK_UPVOTE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_SEND_CHARGE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CHARGE_RECEIVE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_WISHLIST_SEND, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_WISHLIST_AGREE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_UPVOTE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_RESULT, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_TREASURE_RESULT, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_FACEBOOK_UNBIND, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_INVITE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_AGREE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_REFUSE, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_GROWTH, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_AGREE_DEL, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_SEND_EMOJI, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_KISS, f.sendToPlayerOnline) f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_GAME, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_LOGIN, f.SendMsgToCenter) f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_INRANK, f.SendMsgToCenter) } func (f *FriendMgr) getData() *FirendData { return f.data.(*FirendData) } func (f *FriendMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) { Now := GoUtil.Now() for k, v := range f.getData().List { for j, msg := range v { if msg.End < Now-7*24*3600 { f.getData().List[k] = append(f.getData().List[k][:j], f.getData().List[k][j+1:]...) } } } return nil, nil } // 通知玩家 func (f *FriendMgr) sendToPlayer(m *msg.Msg) (interface{}, error) { f.getData().Id++ m.Id = f.getData().Id err := sendToPlayer(m) if err == nil { m.H = 1 } ToServerId := GoUtil.GetServerIdByUid(m.To) if ToServerId != conf.Server.ServerID { f.getData().ClusterMsg[m.To] = append(f.getData().ClusterMsg[m.To], m) // 保存到集群消息 } else { f.getData().List[m.To] = append(f.getData().List[m.To], m) // 保存到本地消息 } log.Debug("send to player %d success, msg :%v", m.To, m) return nil, nil } // 通知玩家 func (f *FriendMgr) sendToPlayerOnline(m *msg.Msg) (interface{}, error) { f.getData().Id++ m.Id = f.getData().Id sendToPlayerOnline(m) return nil, nil } // 发送消息给玩家 func sendToPlayer(m *msg.Msg) error { p := G_GameLogicPtr.GetPlayer(int64(m.To)) if p == nil || p.stop { return fmt.Errorf("player %d not online", m.To) } p.Send(m.Clone()) return nil } func sendToPlayerOnline(m *msg.Msg) error { p := G_GameLogicPtr.GetPlayer(int64(m.To)) if p == nil || p.stop { return fmt.Errorf("player %d not online", m.To) } p.Send(m.Clone()) return nil } // 集群好友消息同步 func ClusterFriendSync(m *msg.Msg) error { if v, ok := G_GameLogicPtr.FriendMgr.getData().ClusterMsg[m.To]; ok { for _, msg := range v { if msg.H == 1 { continue } err := mergeCluster.SendServerMsg(msg.Clone(), m.To) if err == nil { msg.H = 1 } } } return nil } // 异步发送消息给中心服 func (f *FriendMgr) SendMsgToCenter(m *msg.Msg) (interface{}, error) { return nil, mergeCluster.SendServerMsg(m, conf.Server.CenterNode) } func (f *FriendMgr) CallMsgToCenter(m *msg.Msg) (interface{}, error) { return mergeCluster.CallServerMsg(m, conf.Server.CenterNode) }