268 lines
7.6 KiB
Go
268 lines
7.6 KiB
Go
package svc
|
|
|
|
import (
|
|
"errors"
|
|
"mongo.games.com/game/dao"
|
|
"net/rpc"
|
|
"time"
|
|
|
|
"github.com/globalsign/mgo"
|
|
"github.com/globalsign/mgo/bson"
|
|
"mongo.games.com/game/dbproxy/mongo"
|
|
"mongo.games.com/game/model"
|
|
"mongo.games.com/goserver/core/logger"
|
|
)
|
|
|
|
var (
|
|
JybUserDBName = "log"
|
|
JybUserCollName = "log_jybuser"
|
|
ErrJybUserDBNotOpen = model.NewDBError(JybUserDBName, JybUserCollName, model.NotOpen)
|
|
)
|
|
|
|
func JybuserCollection(plt string) *mongo.Collection {
|
|
s := mongo.MgoSessionMgrSington.GetPltMgoSession(plt, JybUserDBName)
|
|
if s != nil {
|
|
c, first := s.DB().C(JybUserCollName)
|
|
if first {
|
|
// c.EnsureIndex(mgo.Index{Key: []string{"platform"}, Background: true, Sparse: true})
|
|
c.EnsureIndex(mgo.Index{Key: []string{"snid"}, Background: true, Sparse: true})
|
|
}
|
|
return c
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type JybUserSvc struct {
|
|
}
|
|
|
|
// 验证+
|
|
func (svc *JybUserSvc) VerifyJybUser(args *model.GetJybInfoArgs, ret *bool) error {
|
|
cjybuse := JybuserCollection(args.Plt)
|
|
if cjybuse == nil {
|
|
return ErrJybUserDBNotOpen
|
|
}
|
|
cjyb := JybCollection(args.Plt)
|
|
if cjyb == nil {
|
|
return ErrJybDBNotOpen
|
|
}
|
|
jyb := &model.JybInfo{}
|
|
err := cjyb.Find(bson.M{"_id": bson.ObjectIdHex(args.Id)}).One(jyb)
|
|
if err != nil {
|
|
logger.Logger.Errorf("VerifyJybUser sind:%v Find %v error %v", args.SnId, args.Id, err)
|
|
return err
|
|
}
|
|
if _, exist := jyb.Code[args.UseCode]; !exist { // 该兑换码已经被领取
|
|
return model.ErrJybISReceive
|
|
}
|
|
|
|
jybuser := &model.JybUserInfo{}
|
|
err = cjybuse.Find(bson.M{"snid": args.SnId, "platform": &args.Plt}).One(jybuser)
|
|
if err != nil {
|
|
if err == mgo.ErrNotFound {
|
|
info := model.NewJybUserInfo(args.SnId, args.Plt)
|
|
err = cjybuse.Insert(info) // 考虑创建失败~
|
|
if err != nil {
|
|
logger.Logger.Error("sind:%v svc.VerifyJybUser is Insert err ", args.SnId, err)
|
|
return err
|
|
}
|
|
*ret = true // 说明没有领取过礼包 直接返回
|
|
return nil
|
|
}
|
|
logger.Logger.Errorf("sind:%v VerifyJybUser error ", args.SnId, err)
|
|
return err
|
|
}
|
|
if _, exist := jybuser.JybInfos[args.Id]; exist { // 该类型礼包玩家已经领取过
|
|
return model.ErrJYBPlCode
|
|
}
|
|
// 可以领取
|
|
*ret = true
|
|
return nil
|
|
}
|
|
|
|
// 验证+更新
|
|
func (svc *JybUserSvc) VerifyUpJybUser(args *model.VerifyUpJybInfoArgs, ret *model.JybInfo) error {
|
|
cjybuse := JybuserCollection(args.Plt)
|
|
if cjybuse == nil {
|
|
return ErrJybUserDBNotOpen
|
|
}
|
|
cjyb := JybCollection(args.Plt)
|
|
if cjyb == nil {
|
|
return ErrJybDBNotOpen
|
|
}
|
|
if args.CodeType != 1 {
|
|
err := cjyb.Find(bson.M{"codestart": args.CodeStart}).One(ret)
|
|
if err != nil {
|
|
logger.Logger.Warn("VerifyUpJybUser snid %v error codestart %v code %v JybInfo %v", args.SnId, args.CodeStart, args.UseCode, err)
|
|
return model.ErrJybIsNotExist
|
|
}
|
|
if ret.StartTime > 0 && ret.EndTime > 0 {
|
|
ts := time.Now().Unix()
|
|
if ts < ret.StartTime || ts > ret.EndTime { // 未开始
|
|
return model.ErrJybTsTimeErr
|
|
}
|
|
}
|
|
if _, exist := ret.Code[args.UseCode]; !exist { // 该兑换码已经被领取
|
|
return model.ErrJybISReceive
|
|
}
|
|
} else {
|
|
jk := &model.JybKey{}
|
|
if jk = getJyb(cjyb, args.Plt); jk == nil {
|
|
logger.Logger.Errorf("DelJybjybkey is nil ")
|
|
return errors.New("jybkey is nil")
|
|
}
|
|
|
|
if jk.GeCode == nil { // 不存在通用礼包
|
|
logger.Logger.Warn("VerifyUpJybUser NewJybKey GeCode is nil")
|
|
return model.ErrJybIsNotExist
|
|
} else if id, exist := jk.GeCode[args.UseCode]; !exist {
|
|
logger.Logger.Warn("VerifyUpJybUser NewJybKey Find err")
|
|
return model.ErrJybIsNotExist
|
|
} else {
|
|
|
|
cid := bson.ObjectIdHex(id)
|
|
err := cjyb.Find(bson.M{"_id": cid}).One(ret)
|
|
if err != nil {
|
|
logger.Logger.Errorf("VerifyUpJybUser snid %v error id %v %v", args.SnId, id, err)
|
|
return err
|
|
}
|
|
}
|
|
if ret.StartTime > 0 && ret.EndTime > 0 {
|
|
ts := time.Now().Unix()
|
|
if ts < ret.StartTime || ts > ret.EndTime { // 未开始
|
|
return model.ErrJybTsTimeErr
|
|
}
|
|
}
|
|
}
|
|
|
|
return upJybUser(cjybuse, cjyb, args.SnId, args.CodeType, args.Plt, args.UseCode, ret)
|
|
}
|
|
|
|
func upJybUser(cjybuse, cjyb *mongo.Collection, snId, codeType int32, plt, useCode string, ret *model.JybInfo) error {
|
|
jybuser := &model.JybUserInfo{}
|
|
err := cjybuse.Find(bson.M{"snid": snId, "platform": plt}).One(jybuser)
|
|
if err != nil {
|
|
if err == mgo.ErrNotFound {
|
|
jybuser = model.NewJybUserInfo(snId, plt)
|
|
err = cjybuse.Insert(jybuser) // 考虑创建失败~
|
|
if err != nil {
|
|
logger.Logger.Error("svc.VerifyJybUser is Insert err ", err)
|
|
return err
|
|
}
|
|
} else {
|
|
logger.Logger.Errorf("VerifyJybUser error ", err)
|
|
return err
|
|
}
|
|
}
|
|
jybuseerid := ret.JybId.Hex()
|
|
if jybuser.JybInfos == nil {
|
|
jybuser.JybInfos = make(map[string]int32)
|
|
} else if _, exist := jybuser.JybInfos[jybuseerid]; exist { // 该类型礼包玩家已经领取过
|
|
if ret.CodeType != 3 {
|
|
return model.ErrJYBPlCode
|
|
}
|
|
}
|
|
|
|
jybuser.JybInfos[jybuseerid]++
|
|
|
|
err = cjybuse.Update(bson.M{"_id": jybuser.JybUserId}, bson.D{{"$set", bson.D{{"jybinfos", jybuser.JybInfos}}}})
|
|
if err != nil {
|
|
logger.Logger.Error("UpgradeJyb error ", err)
|
|
return err
|
|
}
|
|
if codeType != 1 {
|
|
delete(ret.Code, useCode) // 局部map不存在并发安全问题 重复删除问题无法解决
|
|
}
|
|
ret.Receive++
|
|
err = cjyb.Update(bson.M{"_id": ret.JybId}, bson.D{{"$set", bson.D{{"code", ret.Code}, {"receive", ret.Receive}}}})
|
|
if err != nil {
|
|
logger.Logger.Errorf("UpgradeJyb error %v", err)
|
|
return err
|
|
}
|
|
c, err := dao.GetJybCodeLog(plt)
|
|
if err == nil {
|
|
err = c.Save(&model.JybCodeLog{
|
|
JybId: jybuseerid,
|
|
Ts: time.Now().Unix(),
|
|
SnId: snId,
|
|
Code: useCode,
|
|
})
|
|
if err != nil {
|
|
logger.Logger.Errorf("save JybCodeLog error %v", err)
|
|
}
|
|
} else {
|
|
logger.Logger.Errorf("GetJybCodeLog error %v", err)
|
|
return nil
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
// 更新记录玩家领取过的礼包 先只是记录id 更新之前必须先验证
|
|
func (svc *JybUserSvc) UpgradeJybUser(args *model.GetJybInfoArgs, ret *model.JybInfo) error {
|
|
cjybuse := JybuserCollection(args.Plt)
|
|
if cjybuse == nil {
|
|
return ErrJybUserDBNotOpen
|
|
}
|
|
cjyb := JybCollection(args.Plt)
|
|
if cjyb == nil {
|
|
return ErrJybDBNotOpen
|
|
}
|
|
cid := bson.ObjectIdHex(args.Id)
|
|
err := cjyb.Find(bson.M{"_id": cid}).One(ret)
|
|
if err != nil {
|
|
logger.Logger.Errorf("VerifyJybUser error id %v %v %v", args.Id, args, err)
|
|
return err
|
|
}
|
|
return upJybUser(cjybuse, cjyb, args.SnId, args.CodeType, args.Plt, args.UseCode, ret)
|
|
}
|
|
|
|
// 回退
|
|
func (svc *JybUserSvc) BackOffJybUser(args *model.GetJybInfoArgs, ret *bool) error {
|
|
cjybuse := JybuserCollection(args.Plt)
|
|
if cjybuse == nil {
|
|
return ErrJybUserDBNotOpen
|
|
}
|
|
cjyb := JybCollection(args.Plt)
|
|
if cjyb == nil {
|
|
return ErrJybDBNotOpen
|
|
}
|
|
|
|
jyb := &model.JybInfo{}
|
|
err := cjyb.Find(bson.M{"_id": bson.ObjectIdHex(args.Id)}).One(jyb)
|
|
if err != nil {
|
|
logger.Logger.Error("BackOffJybUser error ", err)
|
|
return err
|
|
}
|
|
jyb.Code[args.UseCode] = 1 // 将该礼包存入
|
|
jyb.Receive--
|
|
err = cjyb.Update(bson.M{"_id": jyb.JybId}, bson.D{{"$set", bson.D{{"code", jyb.Code}, {"receive", jyb.Receive}}}})
|
|
|
|
jybuser := &model.JybUserInfo{}
|
|
err = cjybuse.Find(bson.M{"snid": args.SnId, "platform": &args.Plt}).One(jybuser)
|
|
if err != nil {
|
|
if err == mgo.ErrNotFound { //
|
|
info := model.NewJybUserInfo(args.SnId, args.Plt)
|
|
err = cjybuse.Insert(info) // 考虑创建失败~
|
|
if err != nil {
|
|
logger.Logger.Error("svc.BackOffJybUser is Insert err ", err)
|
|
return err
|
|
}
|
|
*ret = true // 说明没有领取过礼包 直接返回
|
|
return nil
|
|
}
|
|
logger.Logger.Errorf("BackOffJybUser error ", err)
|
|
return err
|
|
}
|
|
|
|
delete(jybuser.JybInfos, args.Id) // 删除该玩家领取记录
|
|
err = cjybuse.Update(bson.M{"_id": jybuser.JybUserId}, bson.D{{"$set", bson.D{{"jybinfos", jybuser.JybInfos}}}})
|
|
|
|
return err
|
|
}
|
|
|
|
var _JybUserSvc = &JybUserSvc{}
|
|
|
|
func init() {
|
|
rpc.Register(_JybUserSvc)
|
|
}
|