game_sync/dbproxy/mq/c_invite.go

215 lines
6.0 KiB
Go

package mq
import (
"encoding/json"
"errors"
"time"
"mongo.games.com/goserver/core/broker"
"mongo.games.com/goserver/core/broker/rabbitmq"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/game/common"
"mongo.games.com/game/dbproxy/svc"
"mongo.games.com/game/model"
"mongo.games.com/game/mq"
)
func init() {
mq.RegisterSubscriber(model.EvtInvite, func(e broker.Event) (err error) {
msg := e.Message()
if msg != nil {
defer func() {
e.Ack()
}()
var log model.EvtInviteMsg
err = json.Unmarshal(msg.Body, &log)
if err != nil {
logger.Logger.Errorf("EvtInvite json.Unmarshal error:%v msg:%v", err, string(msg.Body))
return
}
logger.Logger.Tracef("EvtInvite log:%+v", log)
now := time.Unix(log.Ts, 0).Local() // 数据创建时间
get := func(snid int32) (*model.EvtInviteAckMsg, error) {
if snid == 0 {
return nil, errors.New("not found")
}
n := new(model.EvtInviteAckMsg)
n.Platform = log.Platform
n.Snid = snid
n.Score, n.Num, n.Money, _, err = svc.GetInviteData(log.Platform, snid)
return n, err
}
// 增加积分
add := func(snid int32, score, money, rate int64) error {
if snid == 0 {
return nil
}
err = svc.AddInviteScore(log.Platform, snid, score*rate/10000, money, now)
if err != nil {
logger.Logger.Errorf("EvtInvite add error:%v snid:%v score:%v rate:%v", err, snid, score, rate)
return err
}
msg, err := get(snid)
if err != nil {
logger.Logger.Errorf("EvtInvite add find error:%v snid:%v score:%v rate:%v", err, snid, score, rate)
return err
}
mq.Send(model.EvtInviteAck, msg)
return nil
}
// 重置积分
reset := func(snid int32) error {
if snid == 0 {
return nil
}
_, _, _, ts, err := svc.GetInviteData(log.Platform, snid) // 上次更新时间
if err != nil {
logger.Logger.Errorf("EvtInvite GetInviteData error:%v snid:%v", err, snid)
return err
}
inSameWeek := common.InSameWeek(ts, now)
if !inSameWeek {
err = svc.ClearInviteScore(log.Platform, snid, now)
if err != nil {
logger.Logger.Errorf("EvtInvite ClearInviteScore error:%v snid:%v", err, snid)
return err
}
msg, err := get(snid)
if err != nil {
logger.Logger.Errorf("EvtInvite get error:%v snid:%v", err, snid)
return err
}
msg.Score = 0
mq.Send(model.EvtInviteAck, msg)
}
return nil
}
// 当前玩家积分是否跨周重置
err = reset(log.SnId)
if err != nil {
logger.Logger.Errorf("EvtInvite reset 1 error:%v snid:%v", err, log.SnId)
return err
}
// 父节点积分是否跨周重置
// 一级
err = reset(log.InviteSnId)
if err != nil {
logger.Logger.Errorf("EvtInvite reset 2 error:%v snid:%v", err, log.InviteSnId)
return err
}
// 二级
ppsnid, err := svc.GetPSnId(log.Platform, log.InviteSnId)
if err != nil {
logger.Logger.Errorf("EvtInvite GetPSnId 1 error:%v snid:%v", err, log.InviteSnId)
return err
}
if ppsnid > 0 {
err = reset(ppsnid)
if err != nil {
logger.Logger.Errorf("EvtInvite reset 3 error:%v snid:%v", err, ppsnid)
return err
}
}
var addRechargeScore bool
if log.Tp != common.InviteScoreCheckWeek {
addRechargeScore, err = svc.SaveInviteScore(&log.InviteScore, log.RechargeScore)
if err != nil {
logger.Logger.Errorf("EvtInvite SaveInviteScore error:%v msg:%+v %+v", err, log.InviteScore, log)
return err
}
}
switch log.Tp {
case common.InviteScoreTypeBind:
code, err := svc.GetCodeBySnId(log.Platform, log.InviteSnId)
if err != nil {
logger.Logger.Errorf("EvtInvite GetCodeBySnId error:%v %v", err, log.InviteSnId)
return err
}
// 绑定关系
err = svc.BindInviteSnId(log.Platform, log.SnId, log.InviteSnId, code)
if err != nil {
logger.Logger.Errorf("EvtInvite BindInviteSnId error:%v msg:%+v", err, log.InviteScore)
return err
}
// 更新绑定数量
// 更新邀请积分
// 1.邀请人增加积分
add(log.InviteSnId, log.Score, 0, 10000)
// 2.上级增加积分
var psnid int32
if len(log.Rate) > 0 {
psnid, err = svc.GetPSnId(log.Platform, log.InviteSnId)
if err != nil {
logger.Logger.Errorf("EvtInvite GetPSnId 2 error:%v snid:%v", err, log.InviteSnId)
return err
}
if psnid > 0 {
add(psnid, log.Score, 0, log.Rate[0])
}
}
if len(log.Rate) > 1 && psnid > 0 {
psnid, err = svc.GetPSnId(log.Platform, psnid)
if err != nil {
logger.Logger.Errorf("EvtInvite GetPSnId 2 error:%v snid:%v", err, log.InviteSnId)
return err
}
if psnid > 0 {
add(psnid, log.Score, 0, log.Rate[1])
}
}
case common.InviteScoreTypePay:
// 更新充值积分,上级积分增加
add(log.SnId, log.Score, 0, 10000)
var psnid int32
if len(log.Rate) > 0 {
add(log.InviteSnId, log.Score, log.Money, log.Rate[0])
psnid, err = svc.GetPSnId(log.Platform, log.InviteSnId)
if err != nil {
logger.Logger.Errorf("EvtInvite GetPSnId 3 error:%v snid:%v", err, log.InviteSnId)
return err
}
}
if len(log.Rate) > 1 && psnid > 0 {
add(psnid, log.Score, 0, log.Rate[1])
psnid, err = svc.GetPSnId(log.Platform, psnid)
if err != nil {
logger.Logger.Errorf("EvtInvite GetPSnId 4 error:%v snid:%v", err, psnid)
return err
}
}
if len(log.Rate) > 2 && psnid > 0 {
add(psnid, log.Score, 0, log.Rate[2])
}
if addRechargeScore {
add(log.InviteSnId, log.RechargeScore, log.Money, 10000)
}
case common.InviteScoreTypeRecharge:
// 更新自己的积分
if addRechargeScore {
add(log.InviteSnId, log.RechargeScore, log.Money, 10000)
} else {
add(log.InviteSnId, 0, log.Money, 10000)
}
case common.InviteScoreCheckWeek:
default:
logger.Logger.Errorf("EvtInvite tp error, %v", log.Tp)
return err
}
}
return nil
}, broker.Queue(model.EvtInvite), broker.DisableAutoAck(), rabbitmq.DurableQueue())
}