package main import ( "encoding/json" "time" "mongo.games.com/goserver/core/basic" "mongo.games.com/goserver/core/i18n" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/task" "mongo.games.com/game/common" "mongo.games.com/game/model" "mongo.games.com/game/mq" ) var PermitMgrInst = new(PermitMgr) type PermitMgr struct { common.BaseClockSinker } func (r *PermitMgr) InterestClockEvent() int { return 1 << common.ClockEventDay } func (r *PermitMgr) OnDayTimer() { logger.Logger.Info("(this *PermitMgr) OnDayTimer") now := time.Now() for _, v := range PlatformMgrSingleton.GetPlatforms() { platform := v.IdStr pl := PlatformMgrSingleton.GetConfig(platform).ActPermitConfig if pl == nil { continue } b := model.GetStrKVGameData(common.PermitStartTsKey + platform) if b == "" { logger.Logger.Errorf("(this *PermitMgr) OnDayTimer GetStrKVGameData not found") continue } se := new(model.PermitStartTs) if err := json.Unmarshal([]byte(b), se); err != nil { logger.Logger.Errorf("(this *PermitMgr) OnDayTimer json.Unmarshal err:%v", err) continue } logger.Logger.Tracef("(this *PermitMgr) OnDayTimer se:%+v now:%v", *se, now) if se.StartTs <= now.Unix() && now.Unix() < se.EndTs { // 在活动内 continue } if now.Unix() < se.StartTs { // 活动未开始 continue } if now.Unix() >= se.EndTs { // 活动结束,发送排行榜奖励 startTs := se.StartTs var err error var list *model.FindPlayerPermitListReply var players []*model.PlayerBaseInfo task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { list, err = model.FindPlayerPermitList(&model.FindPlayerPermitListArgs{ Platform: platform, StartTs: startTs, }) for _, vv := range list.List { player := PlayerMgrSington.GetPlayerBySnId(vv.SnId) if player != nil { players = append(players, &model.PlayerBaseInfo{ SnId: player.SnId, LastChannel: player.LastChannel, }) } else { baseInfo := model.GetPlayerBaseInfo(platform, vv.SnId) players = append(players, baseInfo) } } return nil }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { if err != nil { logger.Logger.Errorf("PermitMgr OnDayTimer FindPlayerPermitList err:%v", err) return } for k, player := range players { if player == nil { logger.Logger.Errorf("PermitMgr OnDayTimer FindPlayerPermitList player is nil %v", list.List[k].SnId) continue } curPlayer := player // 发送奖励 cfg := PlatformMgrSingleton.GetPermitConfig(platform, player.LastChannel).GetRankConfig() rank := k + 1 for _, rankInfo := range cfg { var has bool var items []int64 for r := rankInfo.GetStart(); r <= rankInfo.GetEnd(); r++ { if rank == int(r) { has = true var awards []model.AwardItem for _, item := range rankInfo.GetItemId() { items = append(items, int64(item.GetItemId())) items = append(items, item.GetItemNum()) awards = append(awards, model.AwardItem{ Id: item.GetItemId(), Num: item.GetItemNum(), }) } if len(items) == 0 { break } logger.Logger.Infof("PermitMgr rank award snid:%v rank:%v", player.SnId, rank) // 领奖记录 mq.Write(&model.BackendPermitRank{ Platform: platform, StartTs: startTs, SnId: curPlayer.SnId, Rank: int32(rank), Score: list.List[k].Exp, Awards: awards, }) // 发邮件 var newMsg *model.Message task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { title := i18n.Tr("languages", "PermitAwardTitle") content := i18n.Tr("languages", "PermitAward", []int{rank, rank, rank, rank}) newMsg = model.NewMessage("", 0, "", curPlayer.SnId, model.MSGTYPE_RANK_PermitReward, title, content, 0, 0, model.MSGSTATE_UNREAD, time.Now().Unix(), 0, "", items, platform, model.HallTienlen, nil) err := model.InsertMessage(platform, newMsg) if err != nil { logger.Logger.Errorf("发送邮件失败 snid:%v err:%v", curPlayer.SnId, err) return err } return nil }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { p := PlayerMgrSington.GetPlayerBySnId(curPlayer.SnId) if p != nil { p.AddMessage(newMsg) } })).Start() break } } if has { break } } } })).StartByExecutor("permit_rank_award") // 活动已结束, 新开始 se.StartTs = se.EndTs se.EndTs = se.EndTs + int64(pl.Days*24*3600) if now.Unix() < se.StartTs || now.Unix() >= se.EndTs { se.StartTs = common.GetDayStartTs(now.Unix()) se.EndTs = se.StartTs + int64(pl.Days*24*3600) } PlatformMgrSingleton.GetConfig(platform).PermitStartTs = se.StartTs PlatformMgrSingleton.GetConfig(platform).PermitEndTs = se.EndTs for _, v := range PlayerMgrSington.playerOfPlatform[platform] { v.ResetPermit() } b, err := json.Marshal(se) if err != nil { logger.Logger.Errorf("(this *PermitMgr) OnDayTimer json.Marshal err:%v", err) continue } task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { model.UptStrKVGameData(common.PermitStartTsKey+platform, string(b)) return nil }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { if se.StartTs > 0 { mq.Write(&model.BackendPermitCycle{ Platform: platform, StartTs: se.StartTs, EndTs: se.EndTs - 1, }) } })).StartByExecutor("permit_start_ts") } } } func init() { common.ClockMgrSingleton.RegisterSinker(PermitMgrInst) }