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