453 lines
13 KiB
Go
453 lines
13 KiB
Go
package activity
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/lego/base"
|
|
"go_dreamfactory/lego/core"
|
|
|
|
"go_dreamfactory/lego/sys/log"
|
|
"go_dreamfactory/modules"
|
|
"go_dreamfactory/pb"
|
|
"go_dreamfactory/sys/configure"
|
|
"go_dreamfactory/sys/db"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
)
|
|
|
|
type Activity struct {
|
|
modules.ModuleBase
|
|
api *apiComp
|
|
configure *configureComp
|
|
|
|
service base.IRPCXService
|
|
modelhdList *modelHdList
|
|
modelhdData *modelhdData
|
|
|
|
mail comm.Imail
|
|
warorder comm.IWarorder // 战令
|
|
pay comm.IPay // 支付
|
|
shopcenter comm.IShopcenter // 活动中心
|
|
addrecharge comm.IAddrecharge // 活动中心
|
|
kftask comm.IActivityNotice // 开服任务
|
|
uigame comm.IUiGame // ui小游戏
|
|
}
|
|
|
|
func NewModule() core.IModule {
|
|
return &Activity{}
|
|
}
|
|
|
|
func (this *Activity) GetType() core.M_Modules {
|
|
return comm.ModuleActivity
|
|
}
|
|
|
|
func (this *Activity) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) {
|
|
if err = this.ModuleBase.Init(service, module, options); err != nil {
|
|
return
|
|
}
|
|
this.service = service.(base.IRPCXService)
|
|
|
|
// ticker := time.NewTicker(time.Second * 10)
|
|
// go func() {
|
|
// for {
|
|
// select {
|
|
// case <-ticker.C:
|
|
// this.CreateHdData()
|
|
// return
|
|
// }
|
|
// }
|
|
// }()
|
|
return
|
|
}
|
|
func (this *Activity) Start() (err error) {
|
|
if err = this.ModuleBase.Start(); err != nil {
|
|
return
|
|
}
|
|
|
|
this.service.RegisterFunctionName(string(comm.Rpc_Activity), this.Rpc_Activity)
|
|
var module core.IModule
|
|
if module, err = this.service.GetModule(comm.ModuleMail); err != nil {
|
|
return
|
|
}
|
|
this.mail = module.(comm.Imail)
|
|
if module, err = this.service.GetModule(comm.ModuleWarorder); err != nil {
|
|
return
|
|
}
|
|
this.warorder = module.(comm.IWarorder)
|
|
if module, err = this.service.GetModule(comm.ModulePay); err != nil {
|
|
return
|
|
}
|
|
this.pay = module.(comm.IPay)
|
|
if module, err = this.service.GetModule(comm.ModuleShopCenter); err != nil {
|
|
return
|
|
}
|
|
this.shopcenter = module.(comm.IShopcenter)
|
|
|
|
if module, err = this.service.GetModule(comm.ModuleAddrecharge); err != nil {
|
|
return
|
|
}
|
|
this.addrecharge = module.(comm.IAddrecharge)
|
|
if module, err = this.service.GetModule(comm.ModuleKFTask); err != nil {
|
|
return
|
|
}
|
|
this.kftask = module.(comm.IActivityNotice)
|
|
if module, err = this.service.GetModule(comm.ModulePuzzle); err != nil {
|
|
return
|
|
}
|
|
this.uigame = module.(comm.IUiGame)
|
|
if !db.IsCross() {
|
|
this.ReloadActivity()
|
|
}
|
|
this.service.RegisterFunctionName(string(comm.Rpc_ActivityOver), this.Rpc_ActivityOver)
|
|
this.service.RegisterFunctionName(string(comm.Rpc_ActivityStart), this.Rpc_ActivityStart)
|
|
|
|
return
|
|
}
|
|
|
|
func (this *Activity) ReloadActivity() {
|
|
this.modelhdList.LoadActivityData()
|
|
for k, v := range this.modelhdList.activity {
|
|
switch k {
|
|
case pb.HdType_HdTypeWarorder, pb.HdType_SupplyWarOrder, pb.HdType_MoondreamWarOrder:
|
|
this.warorder.ActivityOpenNotice(v)
|
|
break
|
|
case pb.HdType_HdTypePay, pb.HdType_ShopCenterPayPakcge:
|
|
this.pay.ActivityOpenNotice(v)
|
|
break
|
|
case pb.HdType_XSFundPhysical, pb.HdType_XSFundRecruit, pb.HdType_XSFundExp:
|
|
this.shopcenter.ActivityOpenNotice(v)
|
|
break
|
|
case pb.HdType_AddUpRecharge:
|
|
this.addrecharge.ActivityOpenNotice(v)
|
|
break
|
|
case pb.HdType_KFSevenTask:
|
|
this.kftask.ActivityOpenNotice(v)
|
|
break
|
|
case pb.HdType_HdPuzzle, pb.HdType_HdLattice, pb.HdType_HdMiner:
|
|
this.uigame.ActivityOpenNotice(v)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
func (this *Activity) OnInstallComp() {
|
|
this.ModuleBase.OnInstallComp()
|
|
this.api = this.RegisterComp(new(apiComp)).(*apiComp)
|
|
this.configure = this.RegisterComp(new(configureComp)).(*configureComp)
|
|
this.modelhdData = this.RegisterComp(new(modelhdData)).(*modelhdData)
|
|
this.modelhdList = this.RegisterComp(new(modelHdList)).(*modelHdList)
|
|
}
|
|
|
|
func (this *Activity) CreateHdData() (err error) {
|
|
this.modelhdList.getHdInfo()
|
|
return
|
|
}
|
|
|
|
func (this *Activity) GetAllHdInfo() (activity map[pb.HdType]*pb.DBHuodong) {
|
|
return this.modelhdList.getHdInfo()
|
|
}
|
|
func (this *Activity) GetHdInfoByItype(itype pb.HdType) (result *pb.DBHuodong, err error) {
|
|
if c := this.modelhdList.getHdInfo(); c != nil {
|
|
if _, ok := c[itype]; ok {
|
|
result = c[itype]
|
|
return
|
|
}
|
|
}
|
|
err = fmt.Errorf("Not found :%d type activity", itype)
|
|
return
|
|
}
|
|
|
|
// 统计庆典活动完成情况
|
|
func (this *Activity) HDCelebration(session comm.IUserSession, systemtype int32, bosstype int32) bool {
|
|
bDouble := false // 是否开启双倍奖励
|
|
if activity := this.modelhdList.getHdInfoByType(pb.HdType_HdCelebration); activity != nil {
|
|
// for _, v := range activity {
|
|
if configure.Now().Unix() > activity.Stime && configure.Now().Unix() < activity.Etime { // 活动范围内
|
|
update := make(map[string]interface{})
|
|
bChange := false
|
|
// 查询玩家活动记录
|
|
if list, err := this.modelhdData.getHddataByOid(session.GetUserId(), activity.Id); err == nil {
|
|
// 注意 Gotarr:map[int32]int32 key value 已经挑战的次数
|
|
|
|
if list.Lasttime < configure.Now().Unix() || list.Val == 0 { // 不是今天重置
|
|
list.Gotarr = make(map[int32]int32)
|
|
update := make(map[string]interface{})
|
|
|
|
update["gotarr"] = list.Gotarr
|
|
var maxday int32
|
|
_days := this.configure.GetHDCelebrationData()
|
|
for _, v := range _days { // 开启循环
|
|
maxday += v
|
|
}
|
|
var pos int32
|
|
_sub := int32((configure.Now().Unix() - activity.Stime) / (24 * 3600))
|
|
|
|
for index, v := range _days {
|
|
find := false
|
|
for i := 0; i < int(v); i++ {
|
|
pos++
|
|
if _sub%maxday+1 == pos {
|
|
list.Val = int32(index) + 1 // 计算val 值
|
|
update["val"] = list.Val
|
|
find = true
|
|
break
|
|
}
|
|
}
|
|
if find { // 找到剩余的天数
|
|
list.Lasttime = activity.Stime + int64(_sub+pos%v+1)*24*3600
|
|
update["lasttime"] = list.Lasttime
|
|
break
|
|
}
|
|
}
|
|
}
|
|
if conf, err := this.configure.GetHDCelebration(list.Val); err == nil {
|
|
bfound := false
|
|
for _, v1 := range conf.Bosstype {
|
|
if v1 == 0 { // bosstype 为0 表示所有的boss 类型都算
|
|
bosstype = 0
|
|
bfound = true
|
|
break
|
|
}
|
|
if v1 == bosstype {
|
|
bfound = true
|
|
break
|
|
}
|
|
}
|
|
if !bfound {
|
|
return false
|
|
}
|
|
if conf.Systemtype == systemtype {
|
|
list.Gotarr[bosstype] += 1
|
|
// 天数
|
|
var idays int32
|
|
for i, v1 := range conf.Bosstype {
|
|
if v1 == bosstype || v1 == 0 { // bosstype 为0 表示所有的boss 类型都算
|
|
idays = conf.Num[i]
|
|
break
|
|
}
|
|
}
|
|
// 更新信息
|
|
update["gotarr"] = list.Gotarr
|
|
bChange = true
|
|
if list.Gotarr[bosstype] <= idays {
|
|
bDouble = true
|
|
}
|
|
}
|
|
}
|
|
|
|
if bChange {
|
|
var sz []*pb.DBActivityData
|
|
this.modelhdData.ModifyActivityList(session.GetUserId(), list.Id, update)
|
|
// 推送活动数据进度变化
|
|
sz = append(sz, list)
|
|
session.SendMsg(string(this.GetType()), "datachange", &pb.ActivityDataChangePush{
|
|
Data: sz,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return bDouble
|
|
}
|
|
|
|
// 接口废弃
|
|
func (this *Activity) GetHdData(session comm.IUserSession, oids []string) (result []*pb.DBActivityData) {
|
|
var (
|
|
activity *pb.DBHuodong
|
|
err error
|
|
list *pb.DBActivityData
|
|
)
|
|
curTime := configure.Now().Unix()
|
|
|
|
if activity, err = this.GetHdInfoByItype(pb.HdType_HdCelebration); err != nil {
|
|
this.Errorln(err)
|
|
return
|
|
}
|
|
if activity.Stime > curTime || curTime > activity.Etime { // 不在活动范围内数据不给活动记录数据
|
|
return
|
|
}
|
|
id := activity.Id
|
|
list, _ = this.modelhdData.getHddataByOid(session.GetUserId(), id)
|
|
// 获取开服庆典活动
|
|
if activity.Itype == pb.HdType_HdCelebration {
|
|
if list, err = this.modelhdData.getHddataByOid(session.GetUserId(), id); err == nil {
|
|
if list.Lasttime < configure.Now().Unix() || list.Val == 0 { // 不是今天重置
|
|
list.Gotarr = make(map[int32]int32)
|
|
update := make(map[string]interface{})
|
|
|
|
update["gotarr"] = list.Gotarr
|
|
var maxday int32
|
|
_days := this.configure.GetHDCelebrationData()
|
|
for _, v := range _days { // 开启循环
|
|
maxday += v
|
|
}
|
|
var pos int32
|
|
_sub := int32((configure.Now().Unix() - activity.Stime) / (24 * 3600))
|
|
|
|
for index, v := range _days {
|
|
find := false
|
|
for i := 0; i < int(v); i++ {
|
|
pos++
|
|
if _sub%maxday+1 == pos {
|
|
list.Val = int32(index) + 1 // 计算val 值
|
|
update["val"] = list.Val
|
|
find = true
|
|
break
|
|
}
|
|
}
|
|
if find { // 找到剩余的天数
|
|
list.Lasttime = activity.Stime + int64(_sub+pos%v+1)*24*3600
|
|
update["lasttime"] = list.Lasttime
|
|
break
|
|
}
|
|
}
|
|
this.modelhdData.ModifyActivityList(session.GetUserId(), list.Id, update)
|
|
}
|
|
}
|
|
}
|
|
|
|
result = append(result, list)
|
|
return
|
|
}
|
|
|
|
func (this *Activity) Rpc_Activity(ctx context.Context, req *pb.RPCGeneralReqA1, reply *pb.RPCGeneralReqA1) (err error) {
|
|
this.Debug("Rpc_Activity",
|
|
log.Field{Key: "args", Value: req.Param1},
|
|
)
|
|
this.modelhdList.LoadActivityData()
|
|
return
|
|
}
|
|
|
|
// 活动结束通知
|
|
func (this *Activity) Rpc_ActivityOver(ctx context.Context, args *pb.RPCGeneralReqB1, reply *pb.EmptyResp) (err error) {
|
|
this.Debug("Rpc_ActivityOver",
|
|
log.Field{Key: "args", Value: args.String()},
|
|
)
|
|
|
|
for _, v := range args.Param2 {
|
|
hd := &pb.DBHuodong{}
|
|
if err := this.modelhdList.DB.FindOne(core.SqlTable(this.modelhdList.TableName), bson.M{"_id": v}).Decode(hd); err != nil {
|
|
switch hd.Itype {
|
|
case pb.HdType_HdTypeWarorder, pb.HdType_SupplyWarOrder, pb.HdType_MoondreamWarOrder:
|
|
this.warorder.ActivityCloseNotice(hd)
|
|
break
|
|
case pb.HdType_HdTypePay, pb.HdType_ShopCenterPayPakcge:
|
|
this.pay.ActivityCloseNotice(hd)
|
|
break
|
|
case pb.HdType_XSFundPhysical, pb.HdType_XSFundRecruit, pb.HdType_XSFundExp:
|
|
this.shopcenter.ActivityCloseNotice(hd)
|
|
break
|
|
case pb.HdType_AddUpRecharge:
|
|
this.addrecharge.ActivityCloseNotice(hd)
|
|
break
|
|
case pb.HdType_KFSevenTask:
|
|
this.kftask.ActivityCloseNotice(hd)
|
|
break
|
|
case pb.HdType_HdPuzzle, pb.HdType_HdLattice, pb.HdType_HdMiner:
|
|
this.uigame.ActivityCloseNotice(hd)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
this.Debug("szOverActivity", log.Field{Key: "args", Value: args.Param2})
|
|
return
|
|
}
|
|
|
|
// 活动开启通知
|
|
|
|
func (this *Activity) Rpc_ActivityStart(ctx context.Context, args *pb.RPCGeneralReqB1, reply *pb.EmptyResp) (err error) {
|
|
this.Debug("Rpc_ActivityStart",
|
|
log.Field{Key: "args", Value: args.String()},
|
|
)
|
|
|
|
for _, v := range args.Param2 {
|
|
hd := &pb.DBHuodong{}
|
|
if err := this.modelhdList.DB.FindOne(core.SqlTable(this.modelhdList.TableName), bson.M{"_id": v}).Decode(hd); err == nil {
|
|
switch hd.Itype {
|
|
case pb.HdType_HdTypeWarorder, pb.HdType_SupplyWarOrder, pb.HdType_MoondreamWarOrder:
|
|
this.warorder.ActivityOpenNotice(hd)
|
|
break
|
|
case pb.HdType_HdTypePay, pb.HdType_ShopCenterPayPakcge:
|
|
this.pay.ActivityOpenNotice(hd)
|
|
break
|
|
case pb.HdType_XSFundPhysical, pb.HdType_XSFundRecruit, pb.HdType_XSFundExp:
|
|
this.shopcenter.ActivityOpenNotice(hd)
|
|
break
|
|
case pb.HdType_AddUpRecharge:
|
|
this.addrecharge.ActivityOpenNotice(hd)
|
|
break
|
|
case pb.HdType_KFSevenTask:
|
|
this.kftask.ActivityOpenNotice(hd)
|
|
break
|
|
case pb.HdType_HdPuzzle, pb.HdType_HdLattice, pb.HdType_HdMiner:
|
|
this.uigame.ActivityOpenNotice(hd)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
this.Debug("szOverActivity", log.Field{Key: "args", Value: args.Param2})
|
|
return
|
|
}
|
|
|
|
// 通过活动类型获取活动信息
|
|
func (this *Activity) GetHdDataByHdType(session comm.IUserSession, itype pb.HdType) (result []*pb.DBActivityData) {
|
|
var (
|
|
activity *pb.DBHuodong
|
|
err error
|
|
list *pb.DBActivityData
|
|
)
|
|
curTime := configure.Now().Unix()
|
|
|
|
if activity, err = this.GetHdInfoByItype(itype); err != nil {
|
|
this.Errorln(err)
|
|
return
|
|
}
|
|
if activity.Stime > curTime || curTime > activity.Etime { // 不在活动范围内数据不给活动记录数据
|
|
return
|
|
}
|
|
id := activity.Id
|
|
list, _ = this.modelhdData.getHddataByOid(session.GetUserId(), id)
|
|
// 获取开服庆典活动
|
|
if activity.Itype == pb.HdType_HdCelebration {
|
|
if list, err = this.modelhdData.getHddataByOid(session.GetUserId(), id); err == nil {
|
|
if list.Lasttime < configure.Now().Unix() || list.Val == 0 { // 不是今天重置
|
|
list.Gotarr = make(map[int32]int32)
|
|
update := make(map[string]interface{})
|
|
|
|
update["gotarr"] = list.Gotarr
|
|
var maxday int32
|
|
_days := this.configure.GetHDCelebrationData()
|
|
for _, v := range _days { // 开启循环
|
|
maxday += v
|
|
}
|
|
var pos int32
|
|
_sub := int32((configure.Now().Unix() - activity.Stime) / (24 * 3600))
|
|
|
|
for index, v := range _days {
|
|
find := false
|
|
for i := 0; i < int(v); i++ {
|
|
pos++
|
|
if _sub%maxday+1 == pos {
|
|
list.Val = int32(index) + 1 // 计算val 值
|
|
update["val"] = list.Val
|
|
find = true
|
|
break
|
|
}
|
|
}
|
|
if find { // 找到剩余的天数
|
|
list.Lasttime = activity.Stime + int64(_sub+pos%v+1)*24*3600
|
|
update["lasttime"] = list.Lasttime
|
|
break
|
|
}
|
|
}
|
|
this.modelhdData.ModifyActivityList(session.GetUserId(), list.Id, update)
|
|
}
|
|
}
|
|
}
|
|
|
|
result = append(result, list)
|
|
return
|
|
}
|