278 lines
8.3 KiB
Go
278 lines
8.3 KiB
Go
package game
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"fmt"
|
|
"server/GoUtil"
|
|
"server/MergeConst"
|
|
mergeCluster "server/cluster"
|
|
"server/conf"
|
|
"server/game/mod/card"
|
|
"server/game/mod/friend"
|
|
"server/game/mod/item"
|
|
"server/game/mod/msg"
|
|
"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_SYNC, f.sync)
|
|
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_PLAYROOM_KISS, f.sendToPlayerOnline)
|
|
f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_GAME, f.sendToPlayer)
|
|
|
|
f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_GET, f.GetVarUserData)
|
|
f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_SET, f.SetVarUserData)
|
|
|
|
f.RegisterHandler(msg.HANDLE_TYPE_VAR_EXPIRE_SET, f.SetExpireVarData)
|
|
|
|
f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_LOGIN, 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 (f *FriendMgr) sync(m *msg.Msg) (interface{}, error) {
|
|
data := f.getData().List[m.From]
|
|
return data, nil
|
|
}
|
|
|
|
func (f *FriendMgr) GetVarUserData(m *msg.Msg) (interface{}, error) {
|
|
Key := GoUtil.GetUserKey(int64(m.To))
|
|
data := G_GameLogicPtr.VarMgr.GetUserVar(Key)
|
|
if data == nil {
|
|
data = &VarUserData{
|
|
Upvote: 0,
|
|
}
|
|
}
|
|
return data, nil
|
|
}
|
|
|
|
func (f *FriendMgr) SetVarUserData(m *msg.Msg) (interface{}, error) {
|
|
VarOp := m.Extra.(VarOpration)
|
|
Key := GoUtil.GetUserKey(int64(m.To))
|
|
data := G_GameLogicPtr.VarMgr.GetUserVar(Key)
|
|
switch VarOp.Type {
|
|
case VAR_OP_UPVOTE:
|
|
data.Upvote++
|
|
case VAR_OP_CHIP:
|
|
data.Chip += VarOp.Data.(int)
|
|
case VAR_OP_CHIP_SET:
|
|
data.Chip = VarOp.Data.(int)
|
|
case VAR_OP_KISS:
|
|
data.Kiss = VarOp.Data.(int)
|
|
}
|
|
return &VarOpration{
|
|
Data: data,
|
|
Code: MergeConst.SUCCESS,
|
|
}, nil
|
|
}
|
|
|
|
func (f *FriendMgr) SetExpireVarData(m *msg.Msg) (interface{}, error) {
|
|
VarOp := m.Extra.(VarOpration)
|
|
switch VarOp.Type {
|
|
case VAR_OP_CATNIP_LOCK:
|
|
data := VarOp.Data.(CatnipLock)
|
|
MyKey := GoUtil.GetCatnipLockKey(data.Uid, data.GameId)
|
|
OtherKey := GoUtil.GetCatnipLockKey(data.Partner, data.GameId)
|
|
ExpireData := G_GameLogicPtr.VarMgr.GetExpireVar(OtherKey)
|
|
if _, ok := ExpireData.D.(*CatnipLock); ok {
|
|
return nil, fmt.Errorf("catnip lock already exists for %d in game %d", data.Uid, data.GameId)
|
|
}
|
|
G_GameLogicPtr.VarMgr.SetExpireVar(MyKey, &VarExpireData{
|
|
T: int64(data.End + 24*3600), // 设置过期时间
|
|
D: &data,
|
|
})
|
|
G_GameLogicPtr.VarMgr.SetExpireVar(OtherKey, &VarExpireData{
|
|
T: int64(data.End + 24*3600), // 设置过期时间
|
|
D: &CatnipLock{
|
|
Uid: data.Partner,
|
|
Partner: data.Uid,
|
|
GameId: data.GameId,
|
|
End: data.End,
|
|
},
|
|
})
|
|
}
|
|
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 FriendMgrSend(m1 *msg.Msg) error {
|
|
if m1.SendT == 0 {
|
|
m1.SendT = GoUtil.Now()
|
|
}
|
|
m := m1.Clone()
|
|
ToServer := GoUtil.GetServerIdByUid(m.To)
|
|
if ToServer != conf.Server.ServerID {
|
|
err := mergeCluster.SendServerMsg(m, ToServer)
|
|
if err != nil { // 区服不在线
|
|
G_GameLogicPtr.FriendMgrSend(m)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
G_GameLogicPtr.FriendMgrSend(m)
|
|
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)
|
|
}
|
|
|
|
func FriendMgrCall(m *msg.Msg) interface{} {
|
|
ToServer := GoUtil.GetServerIdByUid(m.To)
|
|
if ToServer != conf.Server.ServerID {
|
|
r, err := mergeCluster.CallServerMsg(m, ToServer)
|
|
if err != nil { // 区服不在线
|
|
log.Debug("FriendMgrCall err %v", err)
|
|
return nil
|
|
}
|
|
return r
|
|
}
|
|
return G_GameLogicPtr.FriendMgrCall(m.Clone())
|
|
}
|