pet_home_server/src/server/game/friend_mgr.go
2025-12-24 10:27:56 +08:00

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)
}