package main import ( "context" "encoding/json" "strconv" "strings" "time" "go.etcd.io/etcd/client/v3" "mongo.games.com/game/common" "mongo.games.com/game/etcd" "mongo.games.com/game/model" "mongo.games.com/game/proto" loginproto "mongo.games.com/game/protocol/login" webapiproto "mongo.games.com/game/protocol/webapi" "mongo.games.com/goserver/core/logger" ) // EtcdMgrSington etcd数据读取 // Deprecated: use [etcd] instead // 使用 etcd.Register 代替 // todo EtcdMgrSington 用新方法替换 var EtcdMgrSington = &EtcdMgr{ Client: &etcd.Client{}, } type EtcdMgr struct { *etcd.Client } // 加载组配置 func (this *EtcdMgr) InitGameGroup() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_GROUPCONFIG_PREFIX) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_GROUPCONFIG_PREFIX) if err == nil { for i := int64(0); i < res.Count; i++ { var value webapiproto.GameConfigGroup err = proto.Unmarshal(res.Kvs[i].Value, &value) if err == nil { PlatformGameGroupMgrSington.UpsertGameGroup(&value) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) panic:%v", etcd.ETCDKEY_GROUPCONFIG_PREFIX, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_GROUPCONFIG_PREFIX, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_GROUPCONFIG_PREFIX, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: var value webapiproto.GameConfigGroup err := proto.Unmarshal(ev.Kv.Value, &value) if err == nil { PlatformGameGroupMgrSington.UpsertGameGroup(&value) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) panic:%v", etcd.ETCDKEY_GROUPCONFIG_PREFIX, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载黑名单配置 func (this *EtcdMgr) InitBlackList() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_BLACKLIST_PREFIX) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_BLACKLIST_PREFIX) if err == nil { for i := int64(0); i < res.Count; i++ { var value BlackInfoApi err = json.Unmarshal(res.Kvs[i].Value, &value) if err == nil { BlackListMgrSington.InitBlackInfo(&value) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) panic:%v", etcd.ETCDKEY_BLACKLIST_PREFIX, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_BLACKLIST_PREFIX, err) } } return -1 } //@test code //go func() { // for { // i := int32(1) // data := BlackInfoApi{ // Id: i, // Snid: i, // Creator: rand.Int31(), // } // buf, err := json.Marshal(data) // if err == nil { // key := fmt.Sprintf("%s%d", etcd.ETCDKEY_BLACKLIST_PREFIX, i) // putResp, err := this.PutValue(key, string(buf)) // if err == nil { // if putResp.PrevKv != nil { // logger.Logger.Trace("@etcdtest put", string(putResp.PrevKv.Key), string(putResp.PrevKv.Value)) // } // //delResp, err := this.DelValue(key) // //if err == nil { // // logger.Logger.Trace("@etcdtest del", delResp.Deleted) // //} // } // } // } //}() //@test code //ETCD中现在只有公共黑名单信息 //如果删除公共黑名单信息使用ETCD删除 //如果删除个人玩家身上的黑名单信息使用API删除 // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_BLACKLIST_PREFIX, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: dirs := strings.Split(string(ev.Kv.Key), "/") n := len(dirs) if n > 0 { last := dirs[n-1] id, err := strconv.Atoi(last) if err == nil { if value, exist := BlackListMgrSington.BlackList[int32(id)]; exist { BlackListMgrSington.RemoveBlackInfo(value.Id, value.Platform) } } } case clientv3.EventTypePut: var value BlackInfoApi err := json.Unmarshal(ev.Kv.Value, &value) if err == nil { BlackListMgrSington.UpsertBlackInfo(&value) if (value.Space & int32(BlackState_Login)) != 0 { var targetPlayer []*Player //确定用户是否在线 for _, value := range PlayerMgrSington.players { _, ok := BlackListMgrSington.CheckPlayerInBlack(value.PlayerData, BlackState_Login) if ok { targetPlayer = append(targetPlayer, value) } } for _, p := range targetPlayer { if p.sid != 0 { p.Kickout(int32(loginproto.SSDisconnectTypeCode_SSDTC_BlackList)) } else { LoginStateMgrSington.LogoutByAccount(p.AccountId) } } } } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) panic:%v", etcd.ETCDKEY_BLACKLIST_PREFIX, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 初始化代理数据 func (this *EtcdMgr) InitPromoterConfig() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 初始化代理数据 拉取数据:", etcd.ETCDKEY_PROMOTER_PREFIX) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_PROMOTER_PREFIX) if err == nil { for i := int64(0); i < res.Count; i++ { var promoterConfig *PromoterConfig err = json.Unmarshal(res.Kvs[i].Value, &promoterConfig) if err == nil { PromoterMgrSington.AddConfig(promoterConfig) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) panic:%v", etcd.ETCDKEY_PROMOTER_PREFIX, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_PROMOTER_PREFIX, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_PROMOTER_PREFIX, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: dirs := strings.Split(string(ev.Kv.Key), "/") n := len(dirs) if n > 0 { promoterConfig := dirs[n-1] PromoterMgrSington.RemoveConfigByKey(promoterConfig) } /* var promoterConfig *PromoterConfig err := json.Unmarshal(ev.Kv.Value, &promoterConfig) if err == nil { PromoterMgrSington.RemoveConfigByKey(promoterConfig) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) panic:%v", etcd.ETCDKEY_PROMOTER_PREFIX, err) } */ case clientv3.EventTypePut: var promoterConfig *PromoterConfig err := json.Unmarshal(ev.Kv.Value, &promoterConfig) if err == nil { PromoterMgrSington.AddConfig(promoterConfig) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) panic:%v", etcd.ETCDKEY_PROMOTER_PREFIX, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载活动give配置 func (this *EtcdMgr) InitPlatformAct() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_ACT_GIVE_PREFIX) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_ACT_GIVE_PREFIX) if err == nil { for i := int64(0); i < res.Count; i++ { var vipConfig ActGivePlateformConfig err = json.Unmarshal(res.Kvs[i].Value, &vipConfig) if err == nil { ActMgrSington.AddGiveConfig(&vipConfig, vipConfig.Platform) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) panic:%v", etcd.ETCDKEY_ACT_GIVE_PREFIX, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_ACT_GIVE_PREFIX, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_ACT_GIVE_PREFIX, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: var vipConfig ActGivePlateformConfig err := json.Unmarshal(ev.Kv.Value, &vipConfig) if err == nil { ActMgrSington.AddGiveConfig(&vipConfig, vipConfig.Platform) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) panic:%v", etcd.ETCDKEY_ACT_GOLDCOME_PREFIX, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载七日签到 func (this *EtcdMgr) InitSign7() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_ACT_7SIGN) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_ACT_7SIGN) if err == nil { for i := int64(0); i < res.Count; i++ { cfg := &webapiproto.Welfare7SignDateList{} //msg := &webapi.ASSrvCtrlClose{} err = proto.Unmarshal(res.Kvs[i].Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateSign7(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_7SIGN, cfg.Platform, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_ACT_7SIGN, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_ACT_7SIGN, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: cfg := &webapiproto.Welfare7SignDateList{} err := proto.Unmarshal(ev.Kv.Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateSign7(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_7SIGN, cfg.Platform, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载轮盘 func (this *EtcdMgr) InitTurnplate() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_ACT_TURNPLATE) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_ACT_TURNPLATE) if err == nil { for i := int64(0); i < res.Count; i++ { cfg := &webapiproto.WelfareTurnplateDateList{} //msg := &webapi.ASSrvCtrlClose{} err = proto.Unmarshal(res.Kvs[i].Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateTurnplate(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_TURNPLATE, cfg.Platform, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_ACT_TURNPLATE, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_ACT_TURNPLATE, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: cfg := &webapiproto.WelfareTurnplateDateList{} err := proto.Unmarshal(ev.Kv.Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateTurnplate(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_TURNPLATE, cfg.Platform, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载盲盒 func (this *EtcdMgr) InitBlindBox() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_ACT_BLINDBOX) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_ACT_BLINDBOX) if err == nil { for i := int64(0); i < res.Count; i++ { cfg := &webapiproto.WelfareBlindBoxDataList{} //msg := &webapi.ASSrvCtrlClose{} err = proto.Unmarshal(res.Kvs[i].Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateBlindBox(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_BLINDBOX, cfg.Platform, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_ACT_BLINDBOX, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_ACT_BLINDBOX, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: cfg := &webapiproto.WelfareBlindBoxDataList{} err := proto.Unmarshal(ev.Kv.Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateBlindBox(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_BLINDBOX, cfg.Platform, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载首充 func (this *EtcdMgr) InitFirstPay() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_ACT_FIRSTPAY) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_ACT_FIRSTPAY) if err == nil { for i := int64(0); i < res.Count; i++ { cfg := &webapiproto.WelfareFirstPayDataList{} //msg := &webapi.ASSrvCtrlClose{} err = proto.Unmarshal(res.Kvs[i].Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateFirstPay(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_FIRSTPAY, cfg.Platform, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_ACT_FIRSTPAY, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_ACT_FIRSTPAY, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: cfg := &webapiproto.WelfareFirstPayDataList{} err := proto.Unmarshal(ev.Kv.Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateFirstPay(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_FIRSTPAY, cfg.Platform, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载连续充值 func (this *EtcdMgr) InitContinuousPay() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_ACT_CONTINUOUSPAY) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_ACT_CONTINUOUSPAY) if err == nil { for i := int64(0); i < res.Count; i++ { cfg := &webapiproto.WelfareContinuousPayDataList{} //msg := &webapi.ASSrvCtrlClose{} err = proto.Unmarshal(res.Kvs[i].Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateContinuousPay(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_CONTINUOUSPAY, cfg.Platform, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_ACT_CONTINUOUSPAY, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_ACT_CONTINUOUSPAY, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: cfg := &webapiproto.WelfareContinuousPayDataList{} err := proto.Unmarshal(ev.Kv.Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdateContinuousPay(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_CONTINUOUSPAY, cfg.Platform, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载VIP func (this *EtcdMgr) InitUpdateVIPcfg() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_VIP_CFG) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_VIP_CFG) if err == nil { for i := int64(0); i < res.Count; i++ { cfg := &webapiproto.VIPcfgDataList{} //msg := &webapi.ASSrvCtrlClose{} err = proto.Unmarshal(res.Kvs[i].Value, cfg) if err == nil && cfg.Platform != "" { VipMgrSington.UpdateVIPcfg(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_VIP_CFG, cfg.Platform, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_VIP_CFG, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_VIP_CFG, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: cfg := &webapiproto.VIPcfgDataList{} err := proto.Unmarshal(ev.Kv.Value, cfg) if err == nil && cfg.Platform != "" { VipMgrSington.UpdateVIPcfg(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_VIP_CFG, cfg.Platform, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载段位配置 func (this *EtcdMgr) InitUpdateChessRankcfg() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_CHESSRANK_CFG) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_CHESSRANK_CFG) if err == nil { for i := int64(0); i < res.Count; i++ { cfg := &webapiproto.ChessRankcfgData{} err = proto.Unmarshal(res.Kvs[i].Value, cfg) if err == nil && cfg.Platform != "" { ChessRankMgrSington.UpdateChessRankConfig(cfg) logger.Logger.Tracef("ChessRankConfig %v", cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_CHESSRANK_CFG, cfg.Platform, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_CHESSRANK_CFG, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_CHESSRANK_CFG, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: cfg := &webapiproto.ChessRankcfgData{} err := proto.Unmarshal(ev.Kv.Value, cfg) if err == nil && cfg.Platform != "" { ChessRankMgrSington.UpdateChessRankConfig(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_CHESSRANK_CFG, cfg.Platform, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载抽手机活动 func (this *EtcdMgr) InitPhoneLottery() { initFunc := func() int64 { if model.GameParamData.UseEtcd { logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_ACT_PHONELOTTERY) res, err := this.GetValueWithPrefix(etcd.ETCDKEY_ACT_PHONELOTTERY) if err == nil { for i := int64(0); i < res.Count; i++ { cfg := &webapiproto.WelfarePhoneLotteryStatus{} //msg := &webapi.ASSrvCtrlClose{} err = proto.Unmarshal(res.Kvs[i].Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdatePhoneLotteryStatus(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_PHONELOTTERY, cfg.Platform, err) } } if res.Header != nil { return res.Header.Revision } } else { logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_ACT_PHONELOTTERY, err) } } return -1 } // 监控数据变动 watchFunc := func(ctx context.Context, revision int64) { this.GoWatch(ctx, revision, etcd.ETCDKEY_ACT_PHONELOTTERY, func(res clientv3.WatchResponse) error { for _, ev := range res.Events { switch ev.Type { case clientv3.EventTypeDelete: case clientv3.EventTypePut: cfg := &webapiproto.WelfarePhoneLotteryStatus{} err := proto.Unmarshal(ev.Kv.Value, cfg) if err == nil && cfg.Platform != "" { WelfareMgrSington.UpdatePhoneLotteryStatus(cfg) } else { logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_ACT_PHONELOTTERY, cfg.Platform, err) } } } return nil }) } this.InitAndWatch(initFunc, watchFunc) } // 加载 调控黑白名单 //func (this *EtcdMgr) InitWBCtrlCFG() { // initFunc := func() int64 { // if model.GameParamData.UseEtcd { // logger.Logger.Info("ETCD 拉取数据:", etcd.ETCDKEY_WBCtrl_CFG) // res, err := this.GetValueWithPrefix(etcd.ETCDKEY_WBCtrl_CFG) // if err == nil { // for i := int64(0); i < res.Count; i++ { // cfg := &webapi_proto.WbCtrlCfg{} // err = proto.Unmarshal(res.Kvs[i].Value, cfg) // if err == nil && cfg.Platform != "" { // WBCtrlCfgMgr.UpdateConfig(cfg) // } else { // logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_WBCtrl_CFG, cfg.Platform, err) // } // } // if res.Header != nil { // return res.Header.Revision // } // } else { // logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_WBCtrl_CFG, err) // } // } // return -1 // } // // // 监控数据变动 // watchFunc := func(ctx context.Context, revision int64) { // this.GoWatch(ctx, revision, etcd.ETCDKEY_WBCtrl_CFG, func(res clientv3.WatchResponse) error { // for _, ev := range res.Events { // switch ev.Type { // case clientv3.EventTypeDelete: // case clientv3.EventTypePut: // cfg := &webapi_proto.WbCtrlCfg{} // err := proto.Unmarshal(ev.Kv.Value, cfg) // if err == nil && cfg.Platform != "" { // WBCtrlCfgMgr.UpdateConfig(cfg) // } else { // logger.Logger.Errorf("etcd desc WithPrefix(%v) Platform %v panic:%v", etcd.ETCDKEY_WBCtrl_CFG, cfg.Platform, err) // } // } // } // return nil // }) // } // // this.InitAndWatch(initFunc, watchFunc) //} func (this *EtcdMgr) Init() { if model.GameParamData.UseEtcd { logger.Logger.Infof("EtcdClient开始连接url:%v;etcduser:%v;etcdpwd:%v", common.CustomConfig.GetStrings("etcdurl"), common.CustomConfig.GetString("etcduser"), common.CustomConfig.GetString("etcdpwd")) err := this.Open(common.CustomConfig.GetStrings("etcdurl"), common.CustomConfig.GetString("etcduser"), common.CustomConfig.GetString("etcdpwd"), time.Minute) if err != nil { logger.Logger.Tracef("EtcdMgr.Open err:%v", err) return } } } func (this *EtcdMgr) Shutdown() { this.Close() } func (this *EtcdMgr) Reset() { this.Close() this.Init() this.ReInitAndWatchAll() }