game_sync/worldsrv/activity_redpacket.go

187 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"fmt"
"golang.org/x/exp/maps"
"time"
"mongo.games.com/goserver/core/logger"
"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
playerLimit := WelfareMgrSington.GetConfig(p.Platform).RedPacketConfig.GetPlayerLimit()
if playerLimit > 0 && cfg.GetMaxCount() > 0 {
if playerLimit < int32(cfg.GetMaxCount()) {
limit = playerLimit
} else {
limit = int32(cfg.GetMaxCount())
}
} else {
if playerLimit > 0 {
limit = playerLimit
}
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()
}