game_sync/worldsrv/platformmgr.go

892 lines
26 KiB
Go
Raw Permalink 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 (
"strconv"
"time"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/module"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/goserver/core/utils"
srvlibproto "mongo.games.com/goserver/srvlib/protocol"
"mongo.games.com/game/model"
"mongo.games.com/game/proto"
hallproto "mongo.games.com/game/protocol/gamehall"
loginproto "mongo.games.com/game/protocol/login"
serverproto "mongo.games.com/game/protocol/server"
webapiproto "mongo.games.com/game/protocol/webapi"
"mongo.games.com/game/srvdata"
)
const (
DefaultPlatform = "0"
DefaultPlatformInt = 0
)
// PlatformConfig 所有跟平台相关的配置不要再定义map数据结构了
type PlatformConfig struct {
Platform *Platform // 平台配置
EntrySwitch *webapiproto.EntrySwitch // 客户端游戏入口开关
CommonNotices *webapiproto.CommonNoticeList // 公告
PlayerPool *webapiproto.PlayerPool // 个人水池配置
}
type PlatformObserver interface {
OnPlatformCreate(p *Platform)
OnPlatformDestroy(p *Platform)
OnPlatformChangeDisabled(p *Platform, disabled bool)
OnPlatformGameFreeUpdate(p *Platform, oldCfg, newCfg *webapiproto.GameFree)
OnPlatformDestroyByGameFreeId(p *Platform, gameFreeId int32)
}
var PlatformMgrSingleton = &PlatformMgr{
configs: make(map[string]*PlatformConfig),
PackageList: make(map[string]*webapiproto.AppInfo),
GameStatus: make(map[int32]bool), //全局游戏开关
}
type PlatformMgr struct {
BaseClockSinker
//todo 所有跟平台相关的配置不要再定义map数据结构了
configs map[string]*PlatformConfig
PackageList map[string]*webapiproto.AppInfo // 包对应的平台,包标识
GameStatus map[int32]bool // 超管平台游戏开关游戏id
Observers []PlatformObserver
}
func (pm *PlatformMgr) RegisterObserver(observer PlatformObserver) {
for _, ob := range pm.Observers {
if ob == observer {
return
}
}
pm.Observers = append(pm.Observers, observer)
}
func (pm *PlatformMgr) UnregisterObserver(observer PlatformObserver) {
for i, ob := range pm.Observers {
if ob == observer {
pm.Observers = append(pm.Observers[:i], pm.Observers[i+1:]...)
break
}
}
}
func (pm *PlatformMgr) GetPlatforms() []*Platform {
var ret []*Platform
for _, v := range pm.configs {
if v != nil && v.Platform != nil {
ret = append(ret, v.Platform)
}
}
return ret
}
func (pm *PlatformMgr) CreatePlatform(id int32, isolated bool) *Platform {
pltId := strconv.Itoa(int(id))
p := NewPlatform(id, isolated)
pm.Get(pltId).Platform = p
if p != nil {
pm.OnPlatformCreate(p)
}
return p
}
// CreateDefaultPlatform 创建默认平台
func (pm *PlatformMgr) CreateDefaultPlatform() {
//默认平台数据
defaultPlatform := pm.CreatePlatform(DefaultPlatformInt, false)
defaultPlatform.Disable = false
//默认平台配置
pgc := defaultPlatform.PltGameCfg
if pgc != nil {
for _, value := range srvdata.PBDB_GameFreeMgr.Datas.Arr {
if value.GetGameId() > 0 {
pgc.games[value.GetId()] = &webapiproto.GameFree{
Status: true,
DbGameFree: value,
}
}
}
pgc.RecreateCache()
}
}
// UpsertPlatform 更新或新增平台
func (pm *PlatformMgr) UpsertPlatform(name string, isolated, disable bool, id int32, url string,
bindOption int32, serviceFlag bool, upgradeAccountGiveCoin, newAccountGiveCoin, perBankNoLimitAccount, exchangeMin,
exchangeLimit, exchangeTax, exchangeFlow, exchangeFlag, spreadConfig int32, vipRange []int32, otherParam string,
ccf *ClubConfig, verifyCodeType int32, thirdState map[int32]int32, customType int32, needDeviceInfo bool,
needSameName bool, exchangeForceTax int32, exchangeGiveFlow int32, exchangeVer int32, exchangeBankMax int32,
exchangeAlipayMax int32, dgHboCfg int32, PerBankNoLimitName int32, isCanUserBindPromoter bool,
userBindPromoterPrize int32, spreadWinLose bool, exchangeMultiple int32, registerVerifyCodeSwitch bool, merchantKey string,
bindTelReward map[int32]int64) *Platform {
pltId := strconv.Itoa(int(id))
p := pm.Get(pltId).Platform
if p == nil {
p = pm.CreatePlatform(id, isolated)
}
//oldIsolated := p.Isolated
//oldBindPromoter := p.IsCanUserBindPromoter
oldDisabled := p.Disable
//oldBindOption := p.BindOption
p.Id = id
p.Name = name
p.IdStr = pltId
p.ServiceUrl = url
p.BindOption = bindOption
p.ServiceFlag = serviceFlag
p.CustomType = customType
p.UpgradeAccountGiveCoin = upgradeAccountGiveCoin
p.NewAccountGiveCoin = newAccountGiveCoin
p.PerBankNoLimitAccount = perBankNoLimitAccount
p.ExchangeMin = exchangeMin
p.ExchangeLimit = exchangeLimit
p.SpreadConfig = spreadConfig
p.ExchangeTax = exchangeTax
p.ExchangeVer = exchangeVer
p.ExchangeForceTax = exchangeForceTax
p.ExchangeFlow = exchangeFlow
p.ExchangeFlag = exchangeFlag
p.VipRange = vipRange
p.OtherParams = otherParam
p.VerifyCodeType = verifyCodeType
p.RegisterVerifyCodeSwitch = registerVerifyCodeSwitch
p.ThirdGameMerchant = thirdState
//p.NeedDeviceInfo = needDeviceInfo
p.NeedSameName = needSameName
p.PerBankNoLimitName = PerBankNoLimitName
p.ExchangeGiveFlow = exchangeGiveFlow
p.ExchangeBankMax = exchangeBankMax
p.ExchangeAlipayMax = exchangeAlipayMax
p.DgHboConfig = dgHboCfg
p.IsCanUserBindPromoter = isCanUserBindPromoter
p.UserBindPromoterPrize = userBindPromoterPrize
p.SpreadWinLose = spreadWinLose
p.ExchangeMultiple = exchangeMultiple
p.MerchantKey = merchantKey
p.BindTelReward = bindTelReward
if p.ExchangeFlag&ExchangeFlag_Flow == 0 { //修正下
p.ExchangeFlow = 0
}
//if oldIsolated != isolated {
// pm.ChangeIsolated(name, isolated)
//}
if oldDisabled != disable {
pm.ChangeDisabled(name, disable)
}
//if oldBindPromoter != isCanUserBindPromoter {
// pm.ChangeIsCanBindPromoter(name, isCanUserBindPromoter)
//}
if ccf != nil {
p.ClubConfig = ccf
}
return p
}
// Get 获取平台相关配置不会返回nil
func (pm *PlatformMgr) Get(plt string) *PlatformConfig {
cfg, ok := pm.configs[plt]
if !ok {
cfg = new(PlatformConfig)
pm.configs[plt] = cfg
}
return cfg
}
func (this *PlatformMgr) UpdateConfig(config any) {
if config == nil {
return
}
switch v := config.(type) {
case *webapiproto.PlayerPool:
this.Get(v.GetPlatform()).PlayerPool = v
default:
logger.Logger.Errorf("unknown config type:%v", config)
}
}
func (pm *PlatformMgr) UpdateEntrySwitch(config *webapiproto.EntrySwitch) {
if config == nil {
return
}
pm.Get(config.Platform).EntrySwitch = config
}
func (pm *PlatformMgr) GetEntrySwitch(plt string) *webapiproto.EntrySwitch {
return pm.Get(plt).EntrySwitch
}
func (pm *PlatformMgr) UpdateCommonNotices(config *webapiproto.CommonNoticeList) {
if config == nil {
return
}
pm.Get(config.Platform).CommonNotices = config
}
func (pm *PlatformMgr) GetCommonNotices(plt string) *webapiproto.CommonNoticeList {
return pm.Get(plt).CommonNotices
}
func (pm *PlatformMgr) SyncGameFree(platform string, data *webapiproto.GameFree) {
packSgf := &loginproto.SCSyncGameFree{}
gc := &loginproto.GameConfig{
GameId: proto.Int32(data.DbGameFree.GetGameId()),
GameMode: proto.Int32(data.DbGameFree.GetGameMode()),
LogicId: proto.Int32(data.DbGameFree.GetId()),
State: proto.Bool(data.Status),
LimitCoin: proto.Int64(data.DbGameFree.GetLimitCoin()),
MaxCoinLimit: proto.Int64(data.DbGameFree.GetMaxCoinLimit()),
BaseScore: proto.Int32(data.DbGameFree.GetBaseScore()),
BetScore: proto.Int32(data.DbGameFree.GetBetLimit()),
OtherIntParams: data.DbGameFree.GetOtherIntParams(),
MaxBetCoin: data.DbGameFree.GetMaxBetCoin(),
MatchMode: proto.Int32(data.DbGameFree.GetMatchMode()),
}
if data.DbGameFree.GetLottery() != 0 {
gc.LotteryCfg = data.DbGameFree.LotteryConfig
}
packSgf.Data = append(packSgf.Data, gc)
if len(packSgf.Data) > 0 {
PlayerMgrSington.BroadcastMessageToPlatform(platform, int(loginproto.LoginPacketID_PACKET_SC_SYNCGAMEFREE), packSgf)
}
}
// UpsertGameFree 更新场次配置
func (pm *PlatformMgr) UpsertGameFree(platform string, data *webapiproto.GameFree) {
p := pm.GetPlatform(platform)
if p != nil {
pgc := p.PltGameCfg
if pgc != nil {
dbGameFree := srvdata.PBDB_GameFreeMgr.GetData(data.DbGameFree.Id)
if dbGameFree == nil {
return
}
if data.GetDbGameFree() == nil { //数据容错
data.DbGameFree = dbGameFree
} else {
CopyDBGameFreeField(dbGameFree, data.DbGameFree)
}
old, ok := pgc.games[data.DbGameFree.Id]
pgc.games[data.DbGameFree.Id] = data
found := false
if ok && old != nil {
if c, ok := pgc.cache[data.DbGameFree.Id]; ok {
for i := 0; i < len(c); i++ {
if c[i].DbGameFree.Id == data.DbGameFree.Id {
c[i] = data
found = true
break
}
}
}
}
if !found {
pgc.cache[data.DbGameFree.Id] = append(pgc.cache[data.DbGameFree.Id], data)
}
if ok && old != nil && !CompareGameFreeConfigChged(old, data) {
pm.OnPlatformGameFreeUpdate(p, old, data)
pm.SyncGameFree(p.IdStr, data)
}
}
}
}
func (pm *PlatformMgr) OnPlatformCreate(p *Platform) {
for _, observer := range pm.Observers {
observer.OnPlatformCreate(p)
}
}
func (pm *PlatformMgr) OnPlatformGameFreeUpdate(p *Platform, oldCfg, newCfg *webapiproto.GameFree) {
for _, observer := range pm.Observers {
observer.OnPlatformGameFreeUpdate(p, oldCfg, newCfg)
}
}
func (pm *PlatformMgr) OnPlatformDestroyByGameFreeId(p *Platform, gameFreeId int32) {
for _, observer := range pm.Observers {
observer.OnPlatformDestroyByGameFreeId(p, gameFreeId)
}
}
func (pm *PlatformMgr) OnPlatformChangeDisabled(p *Platform, disable bool) {
for _, observer := range pm.Observers {
observer.OnPlatformChangeDisabled(p, disable)
}
}
func (pm *PlatformMgr) ChangeDisabled(name string, disable bool) {
if p := pm.GetPlatform(name); p != nil {
if p.ChangeDisabled(disable) {
pm.OnPlatformChangeDisabled(p, disable)
}
}
}
func (pm *PlatformMgr) GetPlatform(platform string) *Platform {
return pm.Get(platform).Platform
}
func (pm *PlatformMgr) OnChangeSceneState(scene *Scene, startclose bool) {
}
func (pm *PlatformMgr) PlayerLogin(p *Player) {
if p.IsRob {
return
}
platform := pm.GetPlatform(p.Platform)
if platform != nil {
platform.PlayerLogin(p)
}
}
func (pm *PlatformMgr) Broadcast(packetid int, packet interface{}, players map[int32]*Player, exclude int32) {
mgs := make(map[*netlib.Session][]*srvlibproto.MCSessionUnion)
for _, p := range players {
if p != nil && p.gateSess != nil && p.IsOnLine() && exclude != p.SnId {
mgs[p.gateSess] = append(mgs[p.gateSess], &srvlibproto.MCSessionUnion{
Mccs: &srvlibproto.MCClientSession{
SId: p.sid,
},
})
}
}
for gateSess, v := range mgs {
if gateSess != nil && len(v) != 0 {
pack, err := MulticastMaker.CreateMulticastPacket(packetid, packet, v...)
if err == nil {
gateSess.Send(int(srvlibproto.SrvlibPacketID_PACKET_SS_MULTICAST), pack)
}
}
}
}
func (pm *PlatformMgr) PlayerLogout(p *Player) {
platform := pm.GetPlatform(p.Platform)
if platform != nil && platform.Isolated {
platform.PlayerLogout(p)
} else {
}
}
func (this *PlatformMgr) GetPackageTag(tag string) *webapiproto.AppInfo {
logger.Logger.Tracef("Get %v platform.", tag)
if pt, ok := this.PackageList[tag]; ok {
return pt
}
return nil
}
func (this *PlatformMgr) GetPlatformByPackageTag(tag string) (int32, int32, int32, int32, int32) {
logger.Logger.Tracef("Get %v platform.", tag)
if pt, ok := this.PackageList[tag]; ok {
return pt.PlatformId, 0, 0, 0, 0
} else {
return int32(DefaultPlatformInt), 0, 0, 0, 0
}
}
func (this *PlatformMgr) GetCurrencyByPackageTag(tag string) (string, int32) {
logger.Logger.Tracef("Get %v CurrencyRatio.", tag)
if pt, ok := this.PackageList[tag]; ok && pt.CurrencyType != "" && pt.CurrencyRatio != 0 {
return pt.CurrencyType, pt.CurrencyRatio
}
return "USD", 1
}
func (this *PlatformMgr) GetPlatformUpgradeAccountGiveCoinByPackageTag(tag string) int32 {
platform, _, _, _, _ := this.GetPlatformByPackageTag(tag)
return this.GetPlatformUpgradeAccountGiveCoinByPlatform(strconv.Itoa(int(platform)))
}
func (this *PlatformMgr) GetPlatformUpgradeAccountGiveCoinByPlatform(platform string) int32 {
platformData := this.GetPlatform(platform)
if platformData == nil {
return 0
}
return platformData.UpgradeAccountGiveCoin
}
func (this *PlatformMgr) GetGameFrees(platform string) map[int32]*webapiproto.GameFree {
p := this.GetPlatform(platform)
if p == nil {
return nil
}
data := make(map[int32]*webapiproto.GameFree)
for id, val := range p.PltGameCfg.games {
if !val.Status || !this.GameStatus[id] {
continue
}
if val.GroupId != 0 {
cfg := PlatformGameGroupMgrSington.GetGameGroup(val.GroupId)
if cfg != nil {
temp := &webapiproto.GameFree{
GroupId: cfg.GetId(),
Status: val.Status,
DbGameFree: cfg.GetDbGameFree(),
}
data[id] = temp
}
} else {
data[id] = val
}
}
return data
}
func (this *PlatformMgr) GetGameFree(platform string, gameFreeId int32) *webapiproto.GameFree {
p := this.GetPlatform(platform)
if p == nil {
return nil
}
gf := p.PltGameCfg.GetGameCfg(gameFreeId)
if gf == nil {
return nil
}
if !this.GameStatus[gameFreeId] || !gf.GetStatus() {
return nil
}
return gf
}
// CheckGameState 场次开关状态
func (this *PlatformMgr) CheckGameState(platform string, gameFreeId int32) bool {
gf := this.GetGameFree(platform, gameFreeId)
if gf == nil {
return false
}
return gf.Status
}
func (this *PlatformMgr) GetGameFreeGroup(platform string, gameFreeId int32) int32 {
c := this.GetGameFree(platform, gameFreeId)
if c != nil {
return c.GroupId
}
return 0
}
func (this *PlatformMgr) GetCommonNotice(plt string) *webapiproto.CommonNoticeList {
logger.Logger.Tracef("GetCommonNotice %v platform.", plt)
if cfg := this.GetCommonNotices(plt); cfg != nil {
//now := time.Now().Unix()
re := &webapiproto.CommonNoticeList{
Platform: cfg.Platform,
List: cfg.List,
}
//for _, v := range pt.List {
// if v.GetEndTime() > now && v.GetStartTime() < now {
// re.List = append(re.List, v)
// }
//}
return re
}
return nil
}
// ChangeGameStatus 后台切换超管游戏开关
func (this *PlatformMgr) ChangeGameStatus(cfgs []*hallproto.GameConfig1) {
//向所有玩家发送状态变化协议
pack := &hallproto.SCChangeGameStatus{}
for _, p := range this.GetPlatforms() {
for _, cfg := range cfgs {
gameFreeId := cfg.LogicId
data, ok := p.PltGameCfg.games[gameFreeId]
if data != nil && ok && data.Status { //自身有这个游戏,且处于开启状态
if !cfg.Status { //全局关,销毁游戏
pack.GameCfg = append(pack.GameCfg, cfg)
this.OnPlatformDestroyByGameFreeId(p, gameFreeId)
} else {
lgc := &hallproto.GameConfig1{
LogicId: proto.Int32(data.DbGameFree.Id),
LimitCoin: proto.Int64(data.DbGameFree.GetLimitCoin()),
MaxCoinLimit: proto.Int64(data.DbGameFree.GetMaxCoinLimit()),
BaseScore: proto.Int32(data.DbGameFree.GetBaseScore()),
BetScore: proto.Int32(data.DbGameFree.GetBetLimit()),
OtherIntParams: data.DbGameFree.GetOtherIntParams(),
MaxBetCoin: data.DbGameFree.GetMaxBetCoin(),
MatchMode: proto.Int32(data.DbGameFree.GetMatchMode()),
Status: data.Status,
}
if data.DbGameFree.GetLottery() != 0 { //彩金池
//lgc.LotteryCfg = data.DBGameFree.LotteryConfig
//_, gl := LotteryMgrSington.FetchLottery(plf, data.DBGameFree.GetId(), data.DBGameFree.GetGameId())
//if gl != nil {
// lgc.LotteryCoin = proto.Int64(gl.Value)
//}
}
pack.GameCfg = append(pack.GameCfg, lgc)
}
}
}
if len(pack.GameCfg) > 0 {
PlayerMgrSington.BroadcastMessageToPlatform(p.IdStr, int(hallproto.GameHallPacketID_PACKET_SC_CHANGEGAMESTATUS), pack)
}
}
}
// ChangeEntrySwitch 修改客户端游戏入口状态
func (this *PlatformMgr) ChangeEntrySwitch(platform string, cfg *webapiproto.EntrySwitch) {
p := PlatformMgrSingleton.GetPlatform(platform)
if p == nil {
return
}
pack := &hallproto.SCChangeEntrySwitch{}
for _, v := range cfg.GetDatas() {
pack.GameCfg = append(pack.GameCfg, v)
}
PlayerMgrSington.BroadcastMessageToPlatform(platform, int(hallproto.GameHallPacketID_PACKET_SC_CHANGEENTRYSWITCH), pack)
}
func (this *PlatformMgr) ModuleName() string {
return "PlatformMgr"
}
func (this *PlatformMgr) Init() {
}
func (this *PlatformMgr) LoadPlatform() {
//构建默认的平台数据
this.CreateDefaultPlatform()
//获取平台数据 platform_list
//不使用etcd的情况下走api获取
if !model.GameParamData.UseEtcd {
//buf, err := webapi.API_GetPlatformData(common.GetAppId())
//if err == nil {
// ar := webapi_proto.ASPlatformInfo{}
// err = proto.Unmarshal(buf, &ar)
// if err == nil && ar.Tag == webapi_proto.TagCode_SUCCESS {
// for _, value := range ar.Platforms {
// platform := this.CreatePlatform(value.Id, value.Isolated)
// platform.Name = value.PlatformName
// //platform.ConfigId = value.ConfigId
// platform.Disable = value.Disabled
// platform.ServiceUrl = value.CustomService
// platform.CustomType = value.CustomType
// platform.BindOption = value.BindOption
// //platform.ServiceFlag = value.ServiceFlag
// platform.UpgradeAccountGiveCoin = value.UpgradeAccountGiveCoin
// platform.NewAccountGiveCoin = value.NewAccountGiveCoin //新账号奖励金币
// platform.PerBankNoLimitAccount = value.PerBankNoLimitAccount //同一银行卡号绑定用户数量限制
// platform.ExchangeMin = value.ExchangeMin
// platform.ExchangeLimit = value.ExchangeLimit
// platform.ExchangeTax = value.ExchangeTax
// platform.ExchangeFlow = value.ExchangeFlow
// platform.ExchangeVer = value.ExchangeVer
// platform.ExchangeFlag = value.ExchangeFlag
// platform.ExchangeForceTax = value.ExchangeForceTax
// platform.ExchangeGiveFlow = value.ExchangeGiveFlow
// platform.VipRange = value.VipRange
// //platform.OtherParams = value.OtherParams
// platform.SpreadConfig = value.SpreadConfig
// //platform.RankSwitch = value.Leaderboard
// //platform.ClubConfig = value.ClubConfig
// platform.VerifyCodeType = value.VerifyCodeType
// //platform.RegisterVerifyCodeSwitch = value.RegisterVerifyCodeSwitch
// for _, v := range value.ThirdGameMerchant {
// platform.ThirdGameMerchant[v.Id] = v.Merchant
// }
// //platform.NeedDeviceInfo = value.NeedDeviceInfo
// platform.NeedSameName = value.NeedSameName
// platform.PerBankNoLimitName = value.PerBankNoLimitName
// platform.ExchangeAlipayMax = value.ExchangeAlipayMax
// platform.ExchangeBankMax = value.ExchangeBankMax
// //platform.DgHboConfig = value.DgHboConfig
// platform.IsCanUserBindPromoter = value.IsCanUserBindPromoter
// platform.UserBindPromoterPrize = value.UserBindPromoterPrize
// //platform.SpreadWinLose = value.SpreadWinLose
// platform.ExchangeMultiple = value.ExchangeMultiple
// if platform.ExchangeFlag&ExchangeFlag_Flow == 0 { //修正下
// platform.ExchangeFlow = 0
// }
// platform.MerchantKey = value.MerchantKey
// }
// logger.Logger.Trace("Create platform")
// } else {
// logger.Logger.Error("Unmarshal platform data error:", err)
// }
//} else {
// logger.Logger.Error("Get platfrom data error:", err)
//}
} else {
EtcdMgrSington.InitPlatform()
}
}
func (this *PlatformMgr) LoadPlatformGameFree() {
//不使用etcd的情况下走api获取
//获取平台详细信息 game_config_list
if !model.GameParamData.UseEtcd {
//logger.Logger.Trace("API_GetPlatformConfigData")
//buf, err := webapi.API_GetPlatformConfigData(common.GetAppId())
//if err == nil {
// pcdr := &webapi_proto.ASGameConfig{}
// err = proto.Unmarshal(buf, pcdr)
// if err == nil && pcdr.Tag == webapi_proto.TagCode_SUCCESS {
// platGameCfgs := pcdr.GetConfigs()
//
// //遍历所有平台配置
// for _, pgc := range platGameCfgs {
// platormId := pgc.GetPlatformId()
// platform := this.GetPlatform(strconv.Itoa(int(platormId)))
// if platform == nil {
// continue
// }
//
// for _, config := range pgc.GetDbGameFrees() {
// dbGameFree := srvdata.PBDB_GameFreeMgr.GetData(config.DbGameFree.Id)
// if dbGameFree == nil {
// logger.Logger.Error("Platform config data error logic id:", config)
// continue
// }
// platform.PltGameCfg.games[config.DbGameFree.Id] = config
// if config.GetDbGameFree() == nil { //数据容错
// config.DbGameFree = dbGameFree
// } else {
// CopyDBGameFreeField(dbGameFree, config.DbGameFree)
// }
// logger.Logger.Info("PlatformGameConfig data:", config.DbGameFree.Id)
// }
// platform.PltGameCfg.RecreateCache()
// }
// } else {
// logger.Logger.Error("Unmarshal platform config data error:", err, string(buf))
// }
//} else {
// logger.Logger.Error("Get platfrom config data error:", err)
//}
} else {
EtcdMgrSington.InitPlatformGameConfig()
}
}
func (this *PlatformMgr) LoadPlatformPackage() {
if !model.GameParamData.UseEtcd {
} else {
EtcdMgrSington.InitPlatformPackage()
}
}
func (this *PlatformMgr) LoadCommonNotice() {
if !model.GameParamData.UseEtcd {
} else {
EtcdMgrSington.InitCommonNotice()
}
}
func (this *PlatformMgr) LoadGameMatch() {
if !model.GameParamData.UseEtcd {
} else {
EtcdMgrSington.InitGameMatchDate()
}
}
// LoadGlobalGameStatus 加载超管平台游戏开关
func (this *PlatformMgr) LoadGlobalGameStatus() {
//不使用etcd的情况下走api获取
if !model.GameParamData.UseEtcd {
////获取全局游戏开关
//logger.Logger.Trace("API_GetGlobalGameStatus")
//buf, err := webapi.API_GetGlobalGameStatus(common.GetAppId())
//if err == nil {
// as := webapi_proto.ASGameConfigGlobal{}
// err = proto.Unmarshal(buf, &as)
// if err == nil && as.Tag == webapi_proto.TagCode_SUCCESS {
// if as.GetGameStatus() != nil {
// status := as.GetGameStatus().GetGameStatus()
// for _, v := range status {
// gameId := v.GetGameId()
// status := v.GetStatus()
// PlatformMgrSingleton.GameStatus[gameId] = status
// }
// }
// } else {
// logger.Logger.Error("Unmarshal GlobalGameStatus data error:", err)
// }
//} else {
// logger.Logger.Error("Get GlobalGameStatus data error:", err)
//}
} else {
EtcdMgrSington.InitGameGlobalStatus()
}
}
// LoadEntrySwitch 拉取界面入口开关
func (this *PlatformMgr) LoadEntrySwitch() {
//不使用etcd的情况下走api获取
if model.GameParamData.UseEtcd {
EtcdMgrSington.InitEntrySwitch()
} else {
}
}
func (this *PlatformMgr) Update() {
}
func (this *PlatformMgr) Shutdown() {
module.UnregisteModule(this)
}
func (this *PlatformMgr) InterestClockEvent() int {
return 1<<CLOCK_EVENT_HOUR | 1<<CLOCK_EVENT_DAY
}
func (this *PlatformMgr) OnDayTimer() {
for _, platform := range this.GetPlatforms() {
utils.CatchPanic(func() {
platform.OnDayTimer()
})
}
}
func (this *PlatformMgr) OnHourTimer() {
for _, platform := range this.GetPlatforms() {
utils.CatchPanic(func() {
platform.OnHourTimer()
})
}
}
// CopyDBGameFreeField 需要使用本地配置的属性
// src 本地场次配置
// dst 后台场次配置
func CopyDBGameFreeField(src, dst *serverproto.DB_GameFree) {
dst.Id = src.Id
dst.Name = src.Name
dst.Title = src.Title
dst.ShowType = src.ShowType
dst.SubShowType = src.SubShowType
dst.Flag = src.Flag
dst.GameRule = src.GameRule
dst.TestTakeCoin = src.TestTakeCoin
dst.SceneType = src.SceneType
dst.GameType = src.GameType
dst.GameId = src.GameId
dst.GameMode = src.GameMode
dst.ShowId = src.ShowId
dst.ServiceFee = src.ServiceFee
dst.Turn = src.Turn
dst.BetDec = src.BetDec
//dst.CorrectNum = src.CorrectNum
//dst.CorrectRate = src.CorrectRate
//dst.Deviation = src.Deviation
//dst.Ready = src.Ready
dst.Ai = src.Ai
dst.Jackpot = src.Jackpot
//dst.ElementsParams = src.ElementsParams
//dst.OtherElementsParams = src.OtherElementsParams
//dst.DownRiceParams = src.DownRiceParams
//dst.InitValue = src.InitValue
//dst.LowerLimit = src.LowerLimit
//dst.UpperLimit = src.UpperLimit
//dst.UpperOffsetLimit = src.UpperOffsetLimit
//dst.MaxOutValue = src.MaxOutValue
//dst.ChangeRate = src.ChangeRate
//dst.MinOutPlayerNum = src.MinOutPlayerNum
//dst.UpperLimitOfOdds = src.UpperLimitOfOdds
if len(dst.RobotNumRng) < 2 {
dst.RobotNumRng = src.RobotNumRng
}
//dst.SameIpLimit = src.SameIpLimit
//dst.BaseRate = src.BaseRate
//dst.CtroRate = src.CtroRate
//dst.HardTimeMin = src.HardTimeMin
//dst.HardTimeMax = src.HardTimeMax
//dst.NormalTimeMin = src.NormalTimeMin
//dst.NormalTimeMax = src.NormalTimeMax
//dst.EasyTimeMin = src.EasyTimeMin
//dst.EasyTimeMax = src.EasyTimeMax
//dst.EasrierTimeMin = src.EasrierTimeMin
//dst.EasrierTimeMax = src.EasrierTimeMax
dst.GameType = src.GameType
dst.GameDif = src.GameDif
dst.GameClass = src.GameClass
dst.PlatformName = src.PlatformName
if len(dst.MaxBetCoin) == 0 {
dst.MaxBetCoin = src.MaxBetCoin
}
//预创建房间数量走后台配置
//dst.CreateRoomNum = src.CreateRoomNum
//后台功能做上后,优先使用后台的配置,默认直接用表格种配好的
//if !model.GameParamData.MatchTrueManUseWeb {
// dst.MatchTrueMan = src.MatchTrueMan
//}
////默认走本地配置
//if dst.PlayerWaterRate == nil {
// tv := src.GetPlayerWaterRate()
// dst.PlayerWaterRate = &tv
//}
//
//if dst.BetWaterRate == nil {
// tv := src.GetBetWaterRate()
// dst.BetWaterRate = &tv
//}
}
func init() {
ClockMgrSington.RegisteSinker(PlatformMgrSingleton)
module.RegisteModule(PlatformMgrSingleton, time.Second*2, 0)
RegisterParallelLoadFunc("拉取平台数据", func() error {
PlatformMgrSingleton.LoadPlatform()
return nil
})
RegisterParallelLoadFunc("拉取平台游戏开关", func() error {
PlatformMgrSingleton.LoadGlobalGameStatus()
return nil
})
RegisterParallelLoadFunc("拉取游戏入口开关", func() error {
PlatformMgrSingleton.LoadEntrySwitch()
return nil
})
RegisterParallelLoadFunc("拉取平台游戏详细配置", func() error {
PlatformMgrSingleton.LoadPlatformGameFree()
return nil
})
RegisterParallelLoadFunc("平台包数据", func() error {
PlatformMgrSingleton.LoadPlatformPackage()
return nil
})
RegisterParallelLoadFunc("平台公告", func() error {
PlatformMgrSingleton.LoadCommonNotice()
return nil
})
RegisterParallelLoadFunc("平台比赛", func() error {
PlatformMgrSingleton.LoadGameMatch()
return nil
})
}