go_dreamfactory/modules/privilege/module.go
2023-11-22 14:35:07 +08:00

474 lines
13 KiB
Go

package privilege
import (
"go_dreamfactory/comm"
"go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/event"
"go_dreamfactory/lego/sys/mgo"
"go_dreamfactory/modules"
"go_dreamfactory/pb"
"go_dreamfactory/sys/configure"
"go_dreamfactory/utils"
"go.mongodb.org/mongo-driver/bson/primitive"
)
func NewModule() core.IModule {
m := new(Privilege)
return m
}
type Privilege struct {
modules.ModuleBase
api_comp *apiComp
configure *configureComp
modelPrivilege *ModelPrivilege
mail comm.Imail
service core.IService
modelVip *ModelVip
}
//模块名
func (this *Privilege) GetType() core.M_Modules {
return comm.ModulePrivilege
}
//模块初始化接口 注册用户创建角色事件
func (this *Privilege) 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
return
}
//装备组件
func (this *Privilege) OnInstallComp() {
this.ModuleBase.OnInstallComp()
this.api_comp = this.RegisterComp(new(apiComp)).(*apiComp)
this.modelPrivilege = this.RegisterComp(new(ModelPrivilege)).(*ModelPrivilege)
this.configure = this.RegisterComp(new(configureComp)).(*configureComp)
this.modelVip = this.RegisterComp(new(ModelVip)).(*ModelVip)
}
func (this *Privilege) Start() (err error) {
var module core.IModule
if module, err = this.service.GetModule(comm.ModuleMail); err != nil {
return
}
this.mail = module.(comm.Imail)
if err = this.ModuleBase.Start(); err != nil {
return
}
event.RegisterGO(comm.EventUserOffline, this.EventUserOffline)
return
}
//Event------------------------------------------------------------------------------------------------------------
func (this *Privilege) EventUserOffline(uid, sessionid string) {
//this.modelPrivilege.DelByUId(session.GetUserId(), db.SetDBMgoLog(false))
}
// 购买了一个新的特权
func (this *Privilege) Delivery(session comm.IUserSession, pId int32) (errdata *pb.ErrorData, items []*pb.UserAssets) {
var (
bFind bool
cId int32
)
conf, err := this.configure.GetPrivilegeCard(pId)
if err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
}
// 是不是购买过
list, err := this.modelPrivilege.getPrivilegeList(session.GetUserId())
if err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_DBError,
Title: pb.ErrorCode_DBError.ToString(),
Message: err.Error(),
}
return
}
for _, v := range list {
if v.CId == cId {
update := map[string]interface{}{}
if v.ETime > configure.Now().Unix() { // 加时间
// 检测能否续费
if v.ETime-configure.Now().Unix() > int64(conf.RenewDay)*24*3600 {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_PayRenewTimeErr,
Title: pb.ErrorCode_PayRenewTimeErr.ToString(),
}
return
}
v.ETime += int64(conf.AssertDay) * 24 * 3600
update["eTime"] = v.ETime
} else { // 过期了
v.CTime = configure.Now().Unix()
v.ETime = v.CTime + int64(conf.AssertDay)*24*3600
update["cTime"] = v.CTime
update["eTime"] = v.ETime
}
if err = this.modelPrivilege.Change(session.GetUserId(), update); err != nil {
this.Errorf("err:%v", err)
return
}
bFind = true
break
}
}
if !bFind { // 创建一条新的信息
data := &pb.DBPrivilege{
Id: primitive.NewObjectID().Hex(),
Uid: session.GetUserId(),
CId: cId,
CTime: configure.Now().Unix(),
ETime: configure.Now().Unix() + int64(conf.AssertDay*24*3600), // 设置过期时间
RewardTime: configure.Now().Unix(),
}
// 特权插入
vip, err := this.modelVip.getVipList(session.GetUserId())
if err != nil && err == mgo.MongodbNil { // 没有数据 直接创建一条
vip = &pb.DBVip{
Id: primitive.NewObjectID().Hex(),
Uid: session.GetUserId(),
Reward: map[int32]bool{},
Privilege: map[int32]*pb.PrivilegeList{},
CTime: configure.Now().Unix(),
RewardTime: 0,
}
if err = this.modelVip.addVipData(session.GetUserId(), vip); err != nil {
this.Errorf("err:%v", err)
return
}
}
if vip.Id != "" {
update := map[string]interface{}{}
for _, v := range conf.PrivilegeId {
conf := this.configure.GetPrivilegeData(v)
if conf != nil {
if _, ok := vip.Privilege[conf.PrivilegeType]; ok {
// 过滤重复的特权
bRepeat := false
for _, v1 := range vip.Privilege[conf.PrivilegeType].PrivilegeID {
if v1 == v {
bRepeat = true
break
}
}
if !bRepeat {
vip.Privilege[conf.PrivilegeType].PrivilegeID = append(vip.Privilege[conf.PrivilegeType].PrivilegeID, v)
}
} else {
sz := &pb.PrivilegeList{}
sz.PrivilegeID = append(sz.PrivilegeID, v)
vip.Privilege[conf.PrivilegeType] = sz
}
}
}
update["privilege"] = vip.Privilege
this.modelVip.modifyVipData(session.GetUserId(), update)
}
list = append(list, data)
this.modelPrivilege.addNewPrivilegeData(session.GetUserId(), data)
this.SendDailyMail(session, cId, 1, conf.PType)
}
// 即使奖励 马上发送
if errdata = this.DispenseRes(session, conf.DisposableReward, true); errdata != nil {
return
}
for _, v := range conf.DisposableReward {
items = append(items, &pb.UserAssets{
A: v.A,
T: v.T,
N: v.N,
})
}
// 推送
session.SendMsg(string(this.GetType()), PrivilegeBuyYuekaResp, &pb.PrivilegeBuyYuekaResp{Data: list})
go this.AsynHandleSession(session.Clone(), func(session comm.IUserSession) {
this.WriteUserLog(session.GetUserId(), 0, "PrivilegeBuyYuekaReq", items)
})
return
}
// 续费特权
func (this *Privilege) RenewPrivilegeCard(session comm.IUserSession, cId int32) (errdata *pb.ErrorData) {
list, err := this.modelPrivilege.getPrivilegeList(session.GetUserId())
if err != nil {
return
}
for _, v := range list {
if v.CId == cId {
conf, err := this.configure.GetPrivilegeCard(cId)
if err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ReqParameterError.ToString(),
Message: err.Error(),
}
return
}
if conf.RenewDay >= int32(configure.Now().Unix()-v.ETime)/(24*3600) {
v.ETime += int64(conf.AssertDay) * 24 * 3600
mapData := make(map[string]interface{}, 0)
mapData["eTime"] = v.ETime
this.modelPrivilege.modifyPrivilegeData(session.GetUserId(), v.Id, mapData)
// 发放奖励
if errdata = this.DispenseRes(session, conf.DisposableReward, true); errdata != nil {
break
}
session.SendMsg(string(this.GetType()), PrivilegeBuyYuekaResp, &pb.PrivilegeGetListResp{Data: list})
go this.AsynHandleSession(session.Clone(), func(session comm.IUserSession) {
this.WriteUserLog(session.GetUserId(), 0, "PrivilegeGetListReq", conf.DisposableReward)
})
} else {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_PrivilegeRenewTime,
Title: pb.ErrorCode_PrivilegeRenewTime.ToString(),
}
}
break
}
}
errdata = &pb.ErrorData{
Code: pb.ErrorCode_PrivilegeNotFound,
Title: pb.ErrorCode_PrivilegeNotFound.ToString(),
}
return
}
// 查询特权特权
func (this *Privilege) CheckPrivilege(session comm.IUserSession, cId int32) bool {
list, err := this.modelPrivilege.getPrivilegeList(session.GetUserId())
if err != nil {
return false
}
for _, v := range list {
if v.CId == cId {
if v.ETime < configure.Now().Unix() { // 判断当前特权是否过期
return false
}
return true
}
}
return false
}
// 检查特权 并发送每日邮件
func (this *Privilege) CheckDailyPrivilegeMail(session comm.IUserSession) {
vipList, err := this.modelVip.getVipList(session.GetUserId())
if err != nil {
return
}
list, err := this.modelPrivilege.getPrivilegeList(session.GetUserId())
if err != nil {
return
}
for _, v := range list {
conf, err := this.configure.GetPrivilegeCard(v.CId)
if err != nil {
return
}
if v.ETime < configure.Now().Unix() { // 判断当前特权是否过期
update := map[string]interface{}{}
for _, id := range conf.PrivilegeId { // 找到过期的特权 计算过期天数
data := this.configure.GetPrivilegeData(id)
if data != nil {
if v, ok := vipList.Privilege[data.PrivilegeType]; ok {
for i, v1 := range v.PrivilegeID {
if v1 == id {
v.PrivilegeID = append(v.PrivilegeID[:i], v.PrivilegeID[i+1:]...)
break
}
}
}
}
}
update["privilege"] = vipList.Privilege
this.modelVip.modifyVipData(session.GetUserId(), update) // 更新数据
} else {
// 检查 每日奖励是否发放
if !utils.IsToday(v.RewardTime) {
v.RewardTime = configure.Now().Unix()
if err = this.modelPrivilege.Change(session.GetUserId(), map[string]interface{}{
"rewardTime": v.RewardTime,
}); err != nil {
this.Errorf("err:%v", err)
return
}
// 检查离上次领奖过去几天
dt := configure.Now().Unix() - utils.GetZeroTime(v.RewardTime)
count := dt / (24 * 3600)
this.SendDailyMail(session, v.CId, int32(count+1), conf.PType)
}
}
if !utils.IsToday(v.RewardTime) {
// 每日奖励
if v, ok := vipList.Privilege[comm.PrivilegeType1]; ok {
this.SendDailyPrivilegeMail(session, v.PrivilegeID)
}
vipList.RewardTime = configure.Now().Unix()
if err = this.modelVip.Change(session.GetUserId(), map[string]interface{}{
"rewardTime": v.RewardTime,
}); err != nil {
this.Errorf("err:%v", err)
return
}
}
}
return
}
func (this *Privilege) SendDailyMail(session comm.IUserSession, cId int32, count int32, pType int32) {
conf, err := this.configure.GetPrivilegeCard(cId)
if err != nil {
return
}
var (
res []*pb.UserAssets
)
for _, v := range conf.DayReward {
res = append(res, &pb.UserAssets{
A: v.A,
T: v.T,
N: v.N,
})
}
for i := 0; i < int(count); i++ {
if pType == 1 {
this.mail.SendMailByCid(session, comm.Yueka_1, res)
} else if pType == 2 {
this.mail.SendMailByCid(session, comm.Yueka_2, res)
}
}
}
func (this *Privilege) CheckAllPrivilege(session comm.IUserSession) map[int32]*pb.PrivilegeList {
vip, err := this.modelVip.getVipList(session.GetUserId())
if err != nil {
return make(map[int32]*pb.PrivilegeList)
}
return vip.Privilege
}
func (this *Privilege) AddVipData(session comm.IUserSession, oldVip, newVip int32) {
defer this.PutUserSession(session)
if newVip <= oldVip {
return
}
vip, err := this.modelVip.getVipList(session.GetUserId())
if err != nil && err == mgo.MongodbNil { // 没有数据 直接创建一条
vip = &pb.DBVip{
Id: primitive.NewObjectID().Hex(),
Uid: session.GetUserId(),
Reward: map[int32]bool{},
Privilege: map[int32]*pb.PrivilegeList{},
CTime: configure.Now().Unix(),
RewardTime: configure.Now().Unix(),
}
if err = this.modelVip.addVipData(session.GetUserId(), vip); err != nil {
this.Errorf("err:%v", err)
return
}
}
for i := oldVip + 1; i <= newVip; i++ {
conf := this.configure.GetVipConfigureData(i)
if conf != nil {
for _, v := range conf.VipPrivilege {
data := this.configure.GetPrivilegeData(v)
if data != nil {
if _, ok := vip.Privilege[data.PrivilegeType]; ok {
vip.Privilege[data.PrivilegeType].PrivilegeID = append(vip.Privilege[data.PrivilegeType].PrivilegeID, v)
} else {
sz := &pb.PrivilegeList{}
sz.PrivilegeID = append(sz.PrivilegeID, v)
vip.Privilege[data.PrivilegeType] = sz
}
}
}
// 发放每日福利
var res []*pb.UserAssets
for _, v := range conf.Daygift {
res = append(res, &pb.UserAssets{
A: v.A,
T: v.T,
N: v.N,
})
}
this.mail.SendMailByCid(session, comm.VipDaily, res)
}
}
this.modelVip.modifyVipData(session.GetUserId(), map[string]interface{}{
"privilege": vip.Privilege,
})
session.SendMsg(string(this.GetType()), PrivilegeGetListResp, &pb.PrivilegeVipListResp{Data: vip})
session.Push()
}
// 发送特权每日奖励
func (this *Privilege) SendDailyPrivilegeMail(session comm.IUserSession, cId []int32) {
var (
res []*pb.UserAssets
totalCount int32 // 获得的钻石累加
)
for _, id := range cId {
conf := this.configure.GetPrivilegeData(id)
if conf != nil {
totalCount += conf.PrivilegeParameter
}
}
if totalCount > 0 {
res = append(res, &pb.UserAssets{
A: "attr",
T: "diamond",
N: totalCount,
})
this.mail.SendMailByCid(session, comm.VipDaily, res)
}
}
func (this *Privilege) GetCountByPrivilegeId(uid string, pType int32) (count int32) {
if this.IsCross() { // 跨服情况
if model, err := this.GetDBModelByUid(uid, comm.TableVip); err == nil {
vip := &pb.DBVip{}
if err = model.Get(uid, vip); err == nil {
if v, ok := vip.Privilege[pType]; ok {
data := this.configure.GetPrivilegeByType(pType)
for _, v1 := range v.PrivilegeID {
if c, ok1 := data[v1]; ok1 {
count += c
}
}
}
}
}
} else {
if vip, err := this.modelVip.getVipList(uid); err == nil {
if v, ok := vip.Privilege[pType]; ok {
data := this.configure.GetPrivilegeByType(pType)
for _, v1 := range v.PrivilegeID {
if c, ok1 := data[v1]; ok1 {
count += c
}
}
}
}
}
return
}