go_dreamfactory/modules/activity/module.go

443 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_dreamfactory/utils"
"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 // 开服任务
}
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) {
err = this.ModuleBase.Init(service, module, options)
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) {
err = this.ModuleBase.Start()
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 !db.IsCross() {
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
}
}
}
this.service.RegisterFunctionName(string(comm.Rpc_ActivityOver), this.Rpc_ActivityOver)
this.service.RegisterFunctionName(string(comm.Rpc_ActivityStar), this.Rpc_ActivityStar)
return
}
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) {
// var db *pb.DBHuodong
// db = &pb.DBHuodong{
// Id: primitive.NewObjectID().Hex(),
// Hdid: 10001,
// Rtime: 1680105599,
// Itype: 0,
// Name: "累计充值活动",
// Img: "",
// Showtime: "03月15日00:00-03月20日23:59",
// PressImg: "huodong_btn4_1.png",
// Intr: "累计充值,限时福利",
// Etime: 1680105599,
// NormalImg: "huodong_btn4.png",
// Stime: 1679414400,
// Tab: 2,
// Ttype: 0,
// Icon: "ico_event_yxjl",
// Open: 1,
// Order: 102,
// Stype: 10009,
// Htype: 9,
// Data: &pb.ActivityInfo{},
// }
// for i := 0; i < 6; i++ {
// var p []*pb.UserAssets
// p = append(p, &pb.UserAssets{
// A: "item",
// T: "10000001",
// N: 1,
// })
// db.Data.Prize = append(db.Data.Prize, &pb.Arr{
// Prize: p,
// Val: int32(i) + 1,
// })
// }
// this.modelhdList.addHdInfo(db)
// fmt.Printf("%v", db)
// return
// }
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
}
// 通过活动ID查找
func (this *Activity) GetHdInfoByHdId(oid string) (result *pb.DBHuodong, err error) {
result, err = this.modelhdList.getHdListByHdId(oid)
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 data, err := this.modelhdData.getHddataByOid(session.GetUserId(), activity.Id); err == nil {
// 注意 Gotarr:map[int32]int32 key value 已经挑战的次数
if !utils.IsToday(data.Lasttime) { // 不是今天重置
data.Lasttime = configure.Now().Unix()
data.Gotarr = make(map[int32]int32)
// 计算进度
data.Val = int32((configure.Now().Unix()-activity.Stime)/24*3600) + 1
update["lasttime"] = data.Lasttime
update["val"] = data.Val
update["gotarr"] = data.Gotarr
bChange = true
}
if data.Val == 0 {
var pos int32
var maxday int32
_days := this.configure.GetHDCelebrationData()
for _, v := range _days { // 开启循环
maxday += v
}
_sub := int32((configure.Now().Unix() - activity.Stime) / (24 * 3600))
_sub = _sub%maxday + 1
for index, v := range _days {
for i := 0; i < int(v); i++ {
pos++
if _sub == pos {
data.Val = int32(index) + 1 // 计算val 值
update["val"] = data.Val
break
}
}
}
data.Val = 1
}
if conf, err := this.configure.GetHDCelebration(data.Val); err == nil {
for _, v1 := range conf.Bosstype {
if v1 == 0 { // bosstype 为0 表示所有的boss 类型都算
bosstype = 0
break
}
}
if conf.Systemtype == systemtype {
data.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"] = data.Gotarr
bChange = true
if data.Gotarr[bosstype] <= idays {
bDouble = true
}
}
}
if bChange {
var sz []*pb.DBActivityData
this.modelhdData.ModifyActivityList(session.GetUserId(), data.Id, update)
// 推送活动数据进度变化
sz = append(sz, data)
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()
for _, id := range oids {
if activity, err = this.modelhdList.getHdListByHdId(id); err != nil {
if activity.Stime > curTime || curTime > activity.Etime { // 不在活动范围内数据不给活动记录数据
continue
}
}
if activity.Itype == pb.HdType_HdTypeSign || activity.Itype == pb.HdType_HdLevel || activity.Itype == pb.HdType_HdCelebration {
list, _ = this.modelhdData.getHddataByOid(session.GetUserId(), id)
if activity.Itype == pb.HdType_HdTypeSign {
if list.Val == 0 || !utils.IsToday(list.Lasttime) {
list.Lasttime = curTime
list.Val += 1
update := make(map[string]interface{})
update["lasttime"] = list.Lasttime
update["val"] = list.Val
this.modelhdData.ModifyActivityList(session.GetUserId(), list.Id, update)
}
}
// 开服等级活动
if activity.Itype == pb.HdType_HdLevel {
if user := this.ModuleUser.GetUser(session.GetUserId()); user != nil {
if list.Val != user.Lv {
list.Val = user.Lv
list.Lasttime = curTime
update := make(map[string]interface{})
update["lasttime"] = list.Lasttime
update["val"] = list.Val
this.modelhdData.ModifyActivityList(session.GetUserId(), list.Id, update)
}
}
}
// 获取开服庆典活动
if activity.Itype == pb.HdType_HdCelebration {
// key := fmt.Sprintf("%s-%s", session.GetUserId(), id)
if list, err = this.modelhdData.getHddataByOid(session.GetUserId(), id); err == nil {
if !utils.IsToday(list.Lasttime) || list.Val == 0 { // 不是今天重置
list.Lasttime = configure.Now().Unix()
list.Gotarr = make(map[int32]int32)
update := make(map[string]interface{})
// 计算进度
update["lasttime"] = list.Lasttime
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))
_sub = _sub%maxday + 1
for index, v := range _days {
for i := 0; i < int(v); i++ {
pos++
if _sub == pos {
list.Val = int32(index) + 1 // 计算val 值
update["val"] = list.Val
break
}
}
}
this.modelhdData.ModifyActivityList(session.GetUserId(), list.Id, update)
}
}
}
}
if list != nil {
result = append(result, list)
}
}
return
}
func (this *Activity) Rpc_Activity(ctx context.Context, args string, reply *pb.EmptyResp) (err error) {
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()},
)
var (
szOverActivity []string
)
szOverActivity = args.Param2
for _, v := range szOverActivity {
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
}
}
}
this.Debug("szOverActivity", log.Field{Key: "args", Value: szOverActivity})
return
}
// 活动开启通知
func (this *Activity) Rpc_ActivityStar(ctx context.Context, args *pb.RPCGeneralReqB1, reply *pb.EmptyResp) (err error) {
this.Debug("Rpc_ActivityStar",
log.Field{Key: "args", Value: args.String()},
)
var (
szOverActivity []string
)
szOverActivity = args.Param2
for _, v := range szOverActivity {
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
}
}
}
this.Debug("szOverActivity", log.Field{Key: "args", Value: szOverActivity})
return
}