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 } if cfg.GetMaxCount() <= 0 { return -1, -1 } n := 0 if p.WelfData != nil && p.WelfData.RedPacket != nil { if _, exist := p.WelfData.RedPacket[cfg.GetId()]; exist { n = int(p.WelfData.RedPacket[cfg.GetId()].N) } } remainCount := cfg.GetMaxCount() - int64(n) if remainCount < 0 { remainCount = 0 } return cfg.GetMaxCount(), 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() }