186 lines
3.9 KiB
Go
186 lines
3.9 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"golang.org/x/exp/maps"
|
||
"mongo.games.com/goserver/core/logger"
|
||
"time"
|
||
|
||
"mongo.games.com/goserver/core/module"
|
||
|
||
"mongo.games.com/game/common"
|
||
"mongo.games.com/game/model"
|
||
webapiproto "mongo.games.com/game/protocol/webapi"
|
||
)
|
||
|
||
var RedPacketMgrInst = &RedPacketMgr{
|
||
RedPacketData: make(map[string]map[int64]*model.RedPacket),
|
||
}
|
||
|
||
func init() {
|
||
module.RegisteModule(RedPacketMgrInst, time.Hour, 0)
|
||
|
||
common.RegisterClockFunc(&common.ClockFunc{
|
||
OnDayTimerFunc: func() {
|
||
RedPacketMgrInst.RedPacketData = make(map[string]map[int64]*model.RedPacket)
|
||
},
|
||
})
|
||
}
|
||
|
||
type RedPacketMgr struct {
|
||
RedPacketData map[string]map[int64]*model.RedPacket // 红包活动状态 平台:活动id:活动状态
|
||
}
|
||
|
||
func (m *RedPacketMgr) ModuleName() string {
|
||
return "RedPacketMgr"
|
||
}
|
||
|
||
func (m *RedPacketMgr) Init() {
|
||
// 加载红包配置
|
||
for _, v := range PlatformMgrSingleton.GetPlatforms() {
|
||
if v == nil || v.IdStr == common.Platform_Sys {
|
||
continue
|
||
}
|
||
list, err := model.GetRedPacketAll(v.IdStr)
|
||
if err != nil {
|
||
panic(fmt.Sprintf("GetRedPacketAll error: %v", err))
|
||
}
|
||
for _, v1 := range list {
|
||
if m.RedPacketData[v.IdStr] == nil {
|
||
m.RedPacketData[v.IdStr] = make(map[int64]*model.RedPacket)
|
||
}
|
||
m.RedPacketData[v.IdStr][v1.Cid] = &model.RedPacket{
|
||
Cid: v1.Cid,
|
||
Use: v1.Use,
|
||
Ts: v1.Ts,
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
func (m *RedPacketMgr) Update() {
|
||
}
|
||
|
||
func (m *RedPacketMgr) Shutdown() {
|
||
// 保存红包配置
|
||
for k, v := range m.RedPacketData {
|
||
if err := model.UpdateRedPacketAll(k, maps.Values(v)); err != nil {
|
||
logger.Logger.Errorf("UpdateRedPacketAll error: %v", err)
|
||
}
|
||
}
|
||
|
||
module.UnregisteModule(m)
|
||
}
|
||
|
||
// GetRemainReward 获取剩余奖励数量
|
||
func (m *RedPacketMgr) GetRemainReward(plt string, id int64) int64 {
|
||
v, ok := m.RedPacketData[plt]
|
||
if !ok {
|
||
v = make(map[int64]*model.RedPacket)
|
||
m.RedPacketData[plt] = v
|
||
}
|
||
d, ok := v[id]
|
||
if !ok {
|
||
d = &model.RedPacket{
|
||
Cid: id,
|
||
Use: make(map[int64]int64),
|
||
Ts: time.Now().Unix(),
|
||
}
|
||
v[id] = d
|
||
}
|
||
|
||
cfg := WelfareMgrSington.GetConfig(plt).RedPacketConfig
|
||
if cfg == nil {
|
||
return 0
|
||
}
|
||
|
||
for _, v := range cfg.GetList() {
|
||
if v.Id == id {
|
||
total := 0
|
||
for k1, v1 := range d.Use {
|
||
total += int(k1 * v1)
|
||
}
|
||
|
||
ret := v.GetTotalNum() - int64(total)
|
||
if ret < 0 {
|
||
ret = 0
|
||
}
|
||
return ret
|
||
}
|
||
}
|
||
|
||
return 0
|
||
|
||
}
|
||
|
||
// GetRemainTimes 获取剩余次数
|
||
// 返回最大次数和剩余次数
|
||
func (m *RedPacketMgr) GetRemainTimes(p *Player, id int64) (int64, int64) {
|
||
var cfg *webapiproto.RedPacketInfo
|
||
for _, v := range WelfareMgrSington.GetConfig(p.Platform).RedPacketConfig.GetList() {
|
||
if v.GetId() == id {
|
||
cfg = v
|
||
break
|
||
}
|
||
}
|
||
return m.GetRemainTimesByConfig(p, cfg)
|
||
}
|
||
|
||
// GetRemainTimesByConfig 获取剩余次数
|
||
// 返回最大次数和剩余次数
|
||
func (m *RedPacketMgr) GetRemainTimesByConfig(p *Player, cfg *webapiproto.RedPacketInfo) (int64, int64) {
|
||
if cfg == nil {
|
||
return 0, 0
|
||
}
|
||
|
||
var limit int32
|
||
if cfg.GetPlayerLimit() > 0 && cfg.GetMaxCount() > 0 {
|
||
if cfg.GetPlayerLimit() < int32(cfg.GetMaxCount()) {
|
||
limit = cfg.GetPlayerLimit()
|
||
} else {
|
||
limit = int32(cfg.GetMaxCount())
|
||
}
|
||
} else {
|
||
if cfg.GetPlayerLimit() > 0 {
|
||
limit = cfg.GetPlayerLimit()
|
||
}
|
||
if cfg.GetMaxCount() > 0 {
|
||
limit = int32(cfg.GetMaxCount())
|
||
}
|
||
}
|
||
if limit <= 0 {
|
||
return -1, -1
|
||
}
|
||
n := 0
|
||
if p.WelfData != nil && p.WelfData.RedPacket != nil {
|
||
if _, exist := p.WelfData.RedPacket[cfg.GetId()]; exist {
|
||
n = p.WelfData.RedPacket[cfg.GetId()]
|
||
}
|
||
}
|
||
remainCount := int64(limit) - int64(n)
|
||
if remainCount < 0 {
|
||
remainCount = 0
|
||
}
|
||
return int64(limit), remainCount
|
||
}
|
||
|
||
// AddUse 添加使用红包
|
||
func (m *RedPacketMgr) AddUse(plt string, id int64, n int64) {
|
||
v, ok := m.RedPacketData[plt]
|
||
if !ok {
|
||
v = make(map[int64]*model.RedPacket)
|
||
m.RedPacketData[plt] = v
|
||
}
|
||
d, ok := v[id]
|
||
if !ok {
|
||
d = &model.RedPacket{
|
||
Cid: id,
|
||
Use: make(map[int64]int64),
|
||
Ts: time.Now().Unix(),
|
||
}
|
||
v[id] = d
|
||
}
|
||
d.Use[n]++
|
||
d.Ts = time.Now().Unix()
|
||
}
|