177 lines
5.7 KiB
Go
177 lines
5.7 KiB
Go
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)
|
|
}
|