game_sync/tools/etcdtool/main.go

1967 lines
60 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 (
"encoding/json"
"fmt"
_ "games.yol.com/win88"
"go.etcd.io/etcd/client/v3"
"mongo.games.com/game/common"
"mongo.games.com/game/etcd"
"mongo.games.com/game/protocol/server"
"mongo.games.com/game/srvdata"
"mongo.games.com/game/webapi"
"mongo.games.com/goserver/core"
_ "mongo.games.com/goserver/core/i18n"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/module"
"net"
"strconv"
"time"
)
//获取平台数据 platform_list
// 排行榜开关
type RankSwitch struct {
Asset int32 // 财富榜
Recharge int32 // 充值榜
Exchange int32 // 兑换榜
Profit int32 // 盈利榜
}
// 俱乐部配置
type ClubConfig struct {
CreationCoin int64 //创建俱乐部金额
IncreaseCoin int64 //升级俱乐部金额
ClubInitPlayerNum int32 //俱乐部初始人数
IncreasePlayerNum int32 //升级人数增加
IsOpenClub bool //是否开放俱乐部
CreateClubCheckByManual bool //创建俱乐部人工审核true=手动
EditClubNoticeByManual bool //修改公告人工审核true=手动
CreateRoomAmount int64 //创建房间金额(分/局)
GiveCoinRate []int64 //会长充值额外赠送比例
}
type PlatformInfoApi struct {
PlatformName string
Isolated bool
Disabled bool
ConfigId int32
CustomService string
BindOption int32
ServiceFlag int32
UpgradeAccountGiveCoin int32 //升级账号奖励金币
NewAccountGiveCoin int32 //新账号奖励金币
PerBankNoLimitAccount int32 //同一银行卡号绑定用户数量限制
ExchangeMin int32 //最低兑换金额
ExchangeLimit int32 //兑换限制
ExchangeTax int32 //兑换税收(万分比)
ExchangeForceTax int32 //强制兑换税收
ExchangeFlow int32 //兑换流水比例
ExchangeGiveFlow int32 //赠送兑换流水比例
ExchangeFlag int32 //兑换标记 二进制 第一位:兑换税收 第二位:流水比例
ExchangeVer int32 //兑换版本
ExchangeMultiple int32 //兑换基数
VipRange []int32 //VIP充值区间
OtherParams string //其他参数json串
SpreadConfig int32
Leaderboard RankSwitch
ClubConfig *ClubConfig //俱乐部配置
VerifyCodeType int32 //验证码方式
ThirdGameMerchant map[int32]int32 //三方游戏平台状态
CustomType int32
NeedDeviceInfo bool
NeedSameName bool //绑定的银行卡和支付宝用户名字需要相同
ExchangeBankMax int32 //银行卡最大兑换金额 0不限制
ExchangeAlipayMax int32 //支付宝最大兑换金额 0不限制
DgHboConfig int32 //dg hbo配置默认0dg 1 hbo 2
PerBankNoLimitName int32 //银行卡名字数量限制
IsCanUserBindPromoter bool //是否允许用户手动绑定推广员
UserBindPromoterPrize int32 //手动绑定奖励
}
type PackageListApi struct {
Tag string //android包名或者ios标记
Platform int32 //所属平台
ChannelId int32 //渠道ID
PromoterId int32 //推广员ID
PromoterTree int32 //无级推广树
SpreadTag int32 //全民包标识 0:普通包 1:全民包
OpenInstallTag int32 //是否是openinstall包 0:不是 1:是
Status int32 //状态
AppStore int32 //是否是苹果商店包 0:不是 1:是
ExchangeFlag int32 //兑换标记 0 关闭包返利 1打开包返利 受平台配置影响
ExchangeFlow int32 //兑换比例
IsForceBind int32
}
type PlatformCoinfig struct {
Id int32
Params []PlatConDataDetail
Parent_id int32
Platform int32
}
// 游戏平台配置
type PlatConDataDetail struct {
LogicId int32 ////对应DB_GameFree.xlsx中的id
Param string //参数
State int32 //开关 0:关 1
GroupId int32 //组id
DBGameFree *server.DB_GameFree //游戏配置
}
// 游戏平台状态
type PlatConfState struct {
LogicId int32 //对应GameGlobalState中的LogicId
Param string //参数
State int32 //开关 0:关 1
GroupId int32 //组id
DBGameFree *server.DB_GameFree //配置参数
}
var PlatformList = make(map[string]*PlatformInfoApi)
var PackageList = make(map[string]*PackageListApi)
var PlatConList = make(map[int32]*PlatformCoinfig)
var etcdCli = &etcd.Client{}
var waitCnt int
var isClearEtcd = "n" //是否清理etcd数据默认是不清理
var isPutToEtcd = "n" //是否拉取数据到etcd默认是不拉取
var isWatchEtcd = "n" //是否监控etcd,默认是不监控
func main() {
logger.Trace(`==================== Tips: Submit Your Choice =======================`)
logger.Tracef(`Do you want delete etcd only key=%v data (y/n) `, etcd.ETCDKEY_ROOT_PREFIX)
fmt.Scan(&isClearEtcd)
logger.Tracef(`Do you want put data to etcd by WebAPI (y/n) `)
fmt.Scan(&isPutToEtcd)
logger.Tracef(`Do you want watch etcd (y/n) `)
fmt.Scan(&isWatchEtcd)
var err error
if isClearEtcd != "y" && isPutToEtcd != "y" && isWatchEtcd != "y" {
logger.Errorf(`you don't have select any action, bye! `)
goto END
}
defer core.ClosePackages()
core.LoadPackages("config.json")
logger.Trace("etcdurl=", common.CustomConfig.GetStrings("etcdurl"))
logger.Trace("etcduser=", common.CustomConfig.GetString("etcduser"))
logger.Trace("etcdpwd=", common.CustomConfig.GetString("etcdpwd"))
logger.Trace("正在连接ETCD服务...")
err = etcdCli.Open(common.CustomConfig.GetStrings("etcdurl"), common.CustomConfig.GetString("etcduser"), common.CustomConfig.GetString("etcdpwd"), time.Minute)
if err != nil {
logger.Error("etcd connect fail because : ", err)
return
}
logger.Trace("连接ETCD服务成功")
if isClearEtcd == "y" {
logger.Trace("delete etcd data...")
rep, err := etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ROOT_PREFIX)
if err != nil {
logger.Logger.Errorf("delete etcd date err:%v", err)
} else {
logger.Tracef("delete %v item in key=%v", rep.Deleted, etcd.ETCDKEY_ROOT_PREFIX)
}
}
if isPutToEtcd == "y" {
logger.Trace("是否只获取公共黑名单数据=", common.CustomConfig.GetBool("UseBlacklistBindPlayerinfo"))
//PutTestPlatform2Etcd()
//return
LoadActGoldCome()
PutActGoldCome2Etcd()
return
LoadRebateData()
PutRebateTaskEtcd()
//获取平台列表
GetPlatformList()
PutPlatform2Etcd()
//包
//LoadPlatformPackage()
PutPlatformPackage2Etcd()
//
LoadPlatformConfig()
PutPlatformConfig2Etcd()
//
LoadGameGroup()
PutPlatformGroup2Etcd()
//
LoadBullet()
PutBullet2Etcd()
//
LoadCustomer()
PutCustomer2Etcd()
LoadBlackList()
PutBlackList2Etcd()
LoadActSign()
PutActSign2Etcd()
//
LoadActGoldTask()
PutActGoldTask2Etcd()
//
LoadActOnlineReward()
PutActOnlineReward2Etcd()
LoadLuckyTurntableConfig()
PutLuckyTurntableConfig2Etcd()
LoadYebConfig()
PutYeb2ConfigEtcd()
LoadPromoterData()
PutPromoterEtcd()
LoadActVipData()
PutActVipEtcd()
LoadActWxShareData()
PutActWxShareEtcd()
LoadActData()
PutAcEtcd()
LoadRandomPrizeData()
PutRandomPrizeEtcd()
LoadActFPayData()
PutAcFPayEtcd()
}
if isWatchEtcd == "y" {
logger.Trace("Tip:watching etcd ,you can get/put keys....")
go func() {
defer func() {
if err := recover(); err != nil {
logger.Logger.Errorf("etcd watch WithPrefix(%v) panic:%v", etcd.ETCDKEY_ROOT_PREFIX, err)
}
logger.Logger.Warnf("etcd watch WithPrefix(%v) quit!!!", etcd.ETCDKEY_ROOT_PREFIX)
}()
var times int64
for {
times++
logger.Logger.Warnf("etcd watch WithPrefix(%v) start[%v]!!!", etcd.ETCDKEY_ROOT_PREFIX, times)
rch := etcdCli.WatchWithPrefix(etcd.ETCDKEY_ROOT_PREFIX, 0)
for wresp := range rch {
if wresp.Canceled {
logger.Logger.Warnf("etcd watch WithPrefix(%v) be closed, reason:%v", etcd.ETCDKEY_ROOT_PREFIX, wresp.Err())
continue
}
for _, ev := range wresp.Events {
switch ev.Type {
case clientv3.EventTypeDelete:
logger.Logger.Infof("etcd desc WithPrefix(%v) delete data:%v", string(ev.Kv.Key), string(ev.Kv.Value))
case clientv3.EventTypePut:
logger.Logger.Infof("etcd desc WithPrefix(%v) put data:%v", string(ev.Kv.Key), string(ev.Kv.Value))
}
}
}
}
}()
}
END:
//启动业务模块
waiter := module.Start()
waiter.Wait("main()")
}
// 平台列表
func GetPlatformList() {
type ApiResult struct {
Tag int
Msg []PlatformInfoApi
}
logger.Logger.Trace("start API_GetPlatformList")
platformBuff, err := webapi.API_GetPlatformData(common.GetAppId())
if err == nil {
//logger.Logger.Trace("API_GetPlatformData:", string(platformBuff))
ar := ApiResult{}
err = json.Unmarshal(platformBuff, &ar)
if err == nil && ar.Tag == 0 {
for i := 0; i < len(ar.Msg); i++ {
PlatformList[ar.Msg[i].PlatformName] = &ar.Msg[i]
}
} else {
logger.Logger.Error("Unmarshal platform data error:", err, string(platformBuff))
}
} else {
logger.Logger.Error("Get platfrom data error:", err)
}
}
func PutTestPlatform2Etcd() {
for i := 1; i < 10000; i++ {
s := "{\"PlatformName\":\"9\",\"Isolated\":true,\"Disabled\":true,\"ConfigId\":9,\"CustomService\":\"\",\"BindOption\":1,\"ServiceFlag\":1,\"UpgradeAccountGiveCoin\":300,\"NewAccountGiveCoin\":0,\"PerBankNoLimitAccount\":1,\"ExchangeMin\":10000,\"ExchangeLimit\":300,\"ExchangeTax\":100,\"ExchangeForceTax\":0,\"ExchangeMultiple\":0,\"ExchangeFlow\":0,\"ExchangeGiveFlow\":0,\"ExchangeFlag\":1,\"ExchangeVer\":0,\"VipRange\":[10000,50000,100000,300000,500000,1000000],\"OtherParams\":\"\",\"SpreadConfig\":1,\"Leaderboard\":{\"Asset\":0,\"Recharge\":0,\"Exchange\":0,\"Profit\":0},\"ClubConfig\":{\"CreationCoin\":10000,\"IncreaseCoin\":100000,\"ClubInitPlayerNum\":50,\"IncreasePlayerNum\":50,\"IsOpenClub\":false,\"CreateClubCheckByManual\":false,\"EditClubNoticeByManual\":false,\"CreateRoomAmount\":1,\"GiveCoinRate\":[1,2,3,4,5,6,7,8,9,10]},\"VerifyCodeType\":0,\"ThirdGameMerchant\":{\"38\":1,\"39\":1,\"41\":0,\"43\":1,\"46\":0,\"47\":0,\"48\":0},\"CustomType\":0,\"NeedDeviceInfo\":false,\"NeedSameName\":false,\"ExchangeBankMax\":0,\"ExchangeAlipayMax\":0,\"DgHboConfig\":0}"
data, err := json.Marshal(s)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_PLATFORM_PREFIX, "7"), string(s))
if err != nil {
logger.Logger.Tracef("PutPlatform2Etcd err:%v data:%v", err, string(s))
}
} else {
logger.Logger.Errorf("PutPlatform2Etcd err:%v data:%v", err, string(data))
}
}
}
func PutPlatform2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_PLATFORM_PREFIX)
logger.Logger.Trace("ETCD_PutPlatform2Etcd")
for name, p := range PlatformList {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_PLATFORM_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutPlatform2Etcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutPlatform2Etcd err:%v data:%v", err, string(data))
}
}
}
// 包列表
//func LoadPlatformPackage() {
// //获取包对应关系 package_list
// logger.Logger.Trace("start API_PackageList")
// packageBuff, err := webapi.API_PackageList(common.GetAppId())
// if err == nil {
// type ApiResult struct {
// Tag int
// Msg []PackageListApi
// }
// ar := ApiResult{}
// err = json.Unmarshal(packageBuff, &ar)
// if err == nil && ar.Tag == 0 {
// for i := 0; i < len(ar.Msg); i++ {
// if ar.Msg[i].Platform == 0 {
// ar.Msg[i].Platform = 1
// }
// PackageList[ar.Msg[i].Tag] = &ar.Msg[i]
// //logger.Logger.Trace("PlatformPackage data:", ar.Msg[i])
// }
// } else {
// logger.Logger.Error("Unmarshal package list data error:", err, string(packageBuff))
// }
// } else {
// logger.Logger.Error("Get package list data error:", err)
// }
//}
func PutPlatformPackage2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_PACKAGE_PREFIX)
logger.Logger.Trace("ETCD_PutPlatformPackage2Etcd")
//type ETCDPackageInfo struct {
// Tag string //android包名或者ios标记
// Platform int32 //所属平台
// Channel int32 //渠道ID
// Promoter int32 //推广员ID
// PromoterTree int32 //无级推广树
// SpreadTag int32 //全民包标识 0:普通包 1:全民包
// Status int32 //状态
//}
count := len(PackageList)
cur := 0
for name, p := range PackageList {
//value := &ETCDPackageInfo{
// Tag: p.Tag,
// Platform: p.Platform,
// Channel: p.ChannelId,
// Promoter: p.PromoterId,
// PromoterTree: p.PromoterTree,
// SpreadTag: p.SpreadTag,
// Status: p.Status,
//}
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_PACKAGE_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutPlatformPackage2Etcd err:%v data:%v", err, string(data))
} else {
//logger.Logger.Tracef("PutPlatformPackage2Etcd succes:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutPlatformPackage2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
func LoadPlatformConfig() {
//获取平台详细信息 game_config_list
type PlatformConfigApi struct {
Id int32
Params []PlatConfState
Parent_id int32
Platform int32
}
type PlatformConfigDataResult struct {
Tag int
Msg []PlatformConfigApi
}
//logger.Logger.Trace("LoadPlatformConfig")
configBuff, err := webapi.API_GetPlatformConfigData(common.GetAppId())
//logger.Trace(string(configBuff))
if err == nil {
pcdr := PlatformConfigDataResult{}
err = json.Unmarshal(configBuff, &pcdr)
if err == nil && pcdr.Tag == 0 {
for _, config := range pcdr.Msg {
pc := &PlatformCoinfig{
Id: config.Id,
Parent_id: config.Parent_id,
Platform: config.Platform,
}
println(pc.Id)
for _, config := range config.Params {
dbGameFree := srvdata.PBDB_GameFreeMgr.GetData(config.LogicId)
if dbGameFree == nil {
logger.Logger.Error("Platform config data error logic id:", config.LogicId)
continue
}
pcd := PlatConDataDetail{
LogicId: config.LogicId,
Param: config.Param,
State: config.State,
GroupId: config.GroupId,
DBGameFree: config.DBGameFree,
}
if pcd.DBGameFree == nil { //数据容错
pcd.DBGameFree = dbGameFree
} else {
CopyDBGameFreeField(dbGameFree, pcd.DBGameFree)
}
pc.Params = append(pc.Params, pcd)
}
//logger.Logger.Info("PlatformCoinfig data:", pc)
PlatConList[config.Id] = pc
}
} else {
logger.Logger.Error("Unmarshal platform config data error:", err, string(configBuff))
}
} else {
logger.Logger.Error("Get platfrom config data error:", err)
}
}
func PutPlatformConfig2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_GAMECONFIG_PREFIX)
logger.Logger.Trace("ETCD_PutPlatformConfig2Etcd")
count := len(PlatConList)
cur := 0
for name, p := range PlatConList {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_GAMECONFIG_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutPlatformConfig2Etcd err:%v data:%v", err, string(data))
} else {
//logger.Logger.Tracef("PutPlatformConfig2Etcd succes:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutPlatformConfig2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type PlatformGameGroup struct {
GroupId int32 `json:"id"`
LogicId int32 `json:"LogicId"`
State int32 `json:"State"`
DBGameFree *server.DB_GameFree `json:"DBGameFree"` //游戏配置
}
var GameGroups = make(map[int32]*PlatformGameGroup)
func LoadGameGroup() {
//获取包对应关系 package_list
logger.Logger.Trace("API_GetGameGroupData")
packageBuff, err := webapi.API_GetGameGroupData(common.GetAppId())
if err == nil {
type ApiResult struct {
Tag int
Msg []*PlatformGameGroup
}
ar := ApiResult{}
err = json.Unmarshal(packageBuff, &ar)
if err == nil && ar.Tag == 0 {
for _, value := range ar.Msg {
dbGameFree := srvdata.PBDB_GameFreeMgr.GetData(value.LogicId)
if dbGameFree == nil {
continue
}
if value.DBGameFree == nil {
value.DBGameFree = dbGameFree
} else {
CopyDBGameFreeField(dbGameFree, value.DBGameFree)
}
GameGroups[value.GroupId] = value
//logger.Logger.Trace("PlatformGameGroup data:", value)
}
} else {
logger.Logger.Error("Unmarshal PlatformGameGroup data error:", err, string(packageBuff))
}
} else {
logger.Logger.Error("Get PlatformGameGroup data error:", err)
}
}
func PutPlatformGroup2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_GROUPCONFIG_PREFIX)
logger.Logger.Trace("ETCD_PutPlatformGroup2Etcd")
count := len(GameGroups)
cur := 0
for name, p := range GameGroups {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_GROUPCONFIG_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutPlatformGroup2Etcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutPlatformGroup2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type Bullet struct {
Id int32
Sort int32 //排序
Platform string
NoticeTitle string
NoticeContent string
UpdateTime string
State int //0 关闭 1开启
} //声明与world中一样的结构体
type ApiBulletResult struct {
Tag int
Msg []Bullet
}
var BulletMsgList = make(map[int32]*Bullet)
func LoadBullet() {
logger.Logger.Trace("LoadBullet")
buff, err := webapi.API_GetBulletData(common.GetAppId())
//logger.Logger.Warn("bulletin buff: ", string(buff))
if err == nil {
info := ApiBulletResult{}
err = json.Unmarshal([]byte(buff), &info)
if err == nil {
for i := 0; i < len(info.Msg); i++ {
BulletMsgList[info.Msg[i].Id] = &info.Msg[i]
}
} else {
logger.Logger.Error("Unmarshal Bullet data error:", err, string(buff))
}
} else {
logger.Logger.Error("Get Bullet data error:", err)
}
}
func PutBullet2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_BULLETIN_PREFIX)
logger.Logger.Trace("ETCD_PutBullet2Etcd")
count := len(BulletMsgList)
cur := 0
for name, p := range BulletMsgList {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_BULLETIN_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutCustomer2Etcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutCustomer2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
func CompBullet() {
logger.Logger.Trace("LoadBullet")
buff, err := webapi.API_GetBulletData(common.GetAppId())
//logger.Logger.Warn("bulletin buff: ", string(buff))
if err == nil {
info := ApiBulletResult{}
err = json.Unmarshal([]byte(buff), &info)
if err == nil {
for i := 0; i < len(info.Msg); i++ {
BulletMsgList[info.Msg[i].Id] = &info.Msg[i]
}
res, err := etcdCli.GetValueWithPrefix(etcd.ETCDKEY_BULLETIN_PREFIX)
if err == nil {
for i := int64(0); i < res.Count; i++ {
var info Bullet
err = json.Unmarshal(res.Kvs[i].Value, &info)
if err == nil {
if BulletMsgList[info.Id] == nil {
etcdCli.DelValue(string(res.Kvs[i].Key))
//logger.Logger.Errorf("etcd json pasre : ", string(res.Kvs[i].Key))
}
} else {
logger.Logger.Errorf("etcd json pasre err: ", res.Kvs[i].Key, err)
}
}
} else {
logger.Logger.Errorf("etcd get WithPrefix(%v) panic:%v", etcd.ETCDKEY_BULLETIN_PREFIX, err)
return
}
} else {
logger.Logger.Error("Unmarshal Bullet data error:", err, string(buff))
return
}
} else {
logger.Logger.Error("Get Bullet data error:", err)
return
}
}
type Customer struct {
Id int32
Platform string
Weixin_account string
Qq_account string
Headurl string
Nickname string
Status int
Ext string
} //声明与world中一样的结构体
type ApiCustomerResult struct {
Tag int
Msg []Customer
}
var CustomerMsgList = make(map[int32]*Customer)
func LoadCustomer() {
logger.Logger.Trace("LoadCustomer")
buff, err := webapi.API_GetCustomerData(common.GetAppId())
//logger.Logger.Trace("customer buff:", string(buff))
if err == nil {
c_info := ApiCustomerResult{}
err = json.Unmarshal([]byte(buff), &c_info)
if err == nil {
for i := 0; i < len(c_info.Msg); i++ {
CustomerMsgList[c_info.Msg[i].Id] = &c_info.Msg[i]
}
} else {
logger.Logger.Trace("CustomerMgr is Unmarshal error.", err, string(buff))
}
} else {
logger.Logger.Trace("API_GetCustomerData is error. ", err)
}
}
func PutCustomer2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_AGENTCUSTOMER_PREFIX)
logger.Logger.Trace("ETCD_PutCustomer2Etcd")
count := len(CustomerMsgList)
cur := 0
for name, p := range CustomerMsgList {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_AGENTCUSTOMER_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutCustomer2Etcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutCustomer2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type BlackInfo struct {
Id int32
BlackType int //1.游戏2.兑换3.充值
MemberId int32 //
AlipayAccount string
AlipayName string
Bankcard string
Ip string //support like "192.0.2.0/24" or "2001:db8::/32", as defined in RFC 4632 and RFC 4291.
Platform string
PackageTag string
ipNet *net.IPNet
}
type BlackInfoApi struct {
Id int32
Space int32
Snid int32
Alipay_account string
Alipay_name string
Bankcard string
Ip string
Platform string
PackageTag string
Explain string
Creator int32
Create_time string
Update_time string
} //声明与world一样结构体
var BlackList = make(map[int32]BlackInfoApi)
func LoadBlackList() {
type ApiResult struct {
Tag int
Msg []BlackInfoApi
}
logger.Logger.Trace("LoadBlackList")
page := 1
for {
logger.Logger.Trace("LoadBlackList req page:%v", page)
var buff []byte
var err error
if common.CustomConfig.GetBool("UseBlacklistBindPlayerinfo") {
buff, err = webapi.API_GetCommonBlackData(common.GetAppId(), page)
} else {
buff, err = webapi.API_GetBlackData(common.GetAppId(), page)
}
if err == nil {
ar := ApiResult{}
err = json.Unmarshal(buff, &ar)
if err == nil {
for _, value := range ar.Msg {
BlackList[value.Id] = value
}
if len(ar.Msg) < 5000 {
break
} else {
page++
}
} else {
logger.Logger.Error("Unmarshal black data error:", err, string(buff))
break
}
} else {
logger.Logger.Error("Init black list failed.", err, string(buff))
break
}
}
}
func PutBlackList2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_BLACKLIST_PREFIX)
logger.Logger.Trace("ETCD_PutBlackList2Etcd")
count := len(BlackList)
cur := 0
for name, p := range BlackList {
data, err := json.Marshal(&p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_BLACKLIST_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutBlackList2Etcd err:%v data:%v", err, string(data))
} else {
//logger.Logger.Tracef("PutBlackList2Etcd succes:%v data:%v", err, string(data))
}
//time.Sleep(time.Millisecond * 200)
} else {
logger.Logger.Errorf("PutBlackList2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type SignConfig struct {
ConfigTickets int64 //tickets
Platform string
StartAct int32 //活动是否开启
StartTickets int64 //tickets
Reward [][]int64 // [vipLevel][dayIndex]
} //声明与world中一样的结构体
var SignConfigs = make(map[string]SignConfig)
func LoadActSign() {
type SignConfigApi struct {
Params []SignConfig
}
type ApiResult struct {
Tag int
Msg SignConfigApi
}
logger.Logger.Trace("LoadActSign")
buff, err := webapi.API_GetPlatformSignConfig(common.GetAppId())
if err == nil {
ar := ApiResult{}
err = json.Unmarshal(buff, &ar)
if err == nil {
for _, value := range ar.Msg.Params {
if value.StartAct > 0 {
SignConfigs[value.Platform] = value
//logger.Logger.Trace("value:", value)
}
}
} else {
logger.Logger.Error("Unmarshal ActSign data error:", err, " buff:", string(buff))
}
} else {
logger.Logger.Error("Init ActSign list failed.")
}
}
func PutActSign2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_SIGNIN_PREFIX)
logger.Logger.Trace("ETCD_PutActSign2Etcd")
count := len(SignConfigs)
cur := 0
for name, p := range SignConfigs {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_SIGNIN_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutActSign2Etcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutActSign2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type GoldTaskConfig struct {
TaskId int32 //
TaskDsc string
StartAct int32 //活动是否开启, 0:关闭 1:开启
GameId int32 //
TaskSort int32 //0,游戏对局; 1,打死某类鱼
TaskParam []int64 //活动参数 0;[count]; 1[fishid, count]
LimitTimes int32 //限制次数
Reward int64 //奖励
DurationSort int32 //持续时间 0:永久有效, 1每天清除; 2,...
}
type APIGoldTaskConfigs struct {
Datas []GoldTaskConfig //[taskid]
Platform string //平台
ConfigVer int64 //时间戳
StartAct int32 //开关
} //声明与world中一样的结构体
var ActGoldTaskMap = make(map[string]APIGoldTaskConfigs)
func LoadActGoldTask() {
type ApiResult struct {
Tag int
Msg []APIGoldTaskConfigs
}
logger.Logger.Trace("LoadActGoldTask")
buff, err := webapi.API_GetGoldTaskConfig(common.GetAppId())
if err == nil {
ar := ApiResult{}
err = json.Unmarshal(buff, &ar)
if err == nil {
//logger.Logger.Trace("API_GetGoldTaskConfig response:", string(buff))
for _, plateformConfig := range ar.Msg {
//logger.Logger.Trace("Platform:", plateformConfig.Platform, " ConfigVer:", plateformConfig.ConfigVer)
ActGoldTaskMap[plateformConfig.Platform] = plateformConfig
}
} else {
logger.Logger.Error("Unmarshal ActGoldTaskMgr data error:", err, " buff:", string(buff))
}
} else {
logger.Logger.Error("Init ActGoldTaskMgr list failed.")
}
}
func PutActGoldTask2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_GOLDTASK_PREFIX)
logger.Logger.Trace("ETCD_PutActGoldTask2Etcd")
count := len(ActGoldTaskMap)
cur := 0
for name, p := range ActGoldTaskMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_GOLDTASK_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutActGoldTask2Etcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutActGoldTask2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type GoldComeConfig struct {
TaskId int32 //
TaskDsc string
StartAct int32 //活动是否开启, 0:关闭 1:开启
GameId int32 //
WinType int32 //1,输赢分数; 2下注流水
MinTimes int64 //责任局数
BeginHour int32
BeginMinute int32
EndHour int32
EndMinute int32
Reward []int64 //奖励1~20名奖励
} //声明与world中一样的结构体
type RobotType int32
const (
ROBOTTYPE_ROBOT_CLOSE RobotType = iota //0:不使用机器人
ROBOTTYPE_ROBOT_OPEN = 1 //1:使用机器人
)
type APIGoldComeConfig struct {
Datas []GoldComeConfig //[taskid]
Platform string //平台
ConfigVer int64 //版本号
StartAct int32 //开启标记
RobotType RobotType //机器人类型
} //声明与world中一样的结构体
var ActGoldComeMap = make(map[string]APIGoldComeConfig)
func LoadActGoldCome() {
type ApiResult struct {
Tag int
Msg []APIGoldComeConfig
}
logger.Logger.Trace("LoadActGoldCome")
buff, err := webapi.API_GetGoldComeConfig(common.GetAppId())
if err == nil {
ar := ApiResult{}
err = json.Unmarshal(buff, &ar)
if err == nil {
for _, plateformConfig := range ar.Msg {
ActGoldComeMap[plateformConfig.Platform] = plateformConfig
}
} else {
logger.Logger.Error("Unmarshal ActGoldComeMgr data error:", err, " buff:", string(buff))
}
} else {
logger.Logger.Error("Init ActGoldComeMgr list failed.")
}
}
func PutActGoldCome2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_GOLDCOME_PREFIX)
logger.Logger.Trace("ETCD_PutActGoldCome2Etcd")
count := len(ActGoldComeMap)
cur := 0
for name, p := range ActGoldComeMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_GOLDCOME_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutActGoldCome2Etcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutActGoldCome2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type OnlineRewardConfig struct {
Id int32
OnlineDuration int32
RewardAmount int64
}
type PlatformOnlineRewardConfig struct {
Platform string
StartAct int32 //活动是否开启
StartTickets int64 //tickets
Version int32 // 活动版本
PayNeed int32 //充值需要的
Reward []OnlineRewardConfig `json:"Data,omitempty"`
} //声明与world中一样的结构体
type ApiOnlineRewardDatas struct {
Params []PlatformOnlineRewardConfig
}
var ActOnlineRewardMap = make(map[string]PlatformOnlineRewardConfig)
type LuckyTurntableConfig struct {
TurntableType int32 `json:"Type"` // 转盘类型
PoolInitAmount int64 `json:"PoolCoin"` // 水池初始额度
ScoreCost int64 // 积分消耗
Reward []int64 // 奖励依次为小奖1、小奖2、中奖1、中奖2、大奖1、大奖2、特大奖1、特大奖2
PoolModify int64 `json:"PoolChange"` // 水池变化额度
}
type PlatformLuckyTurntableConfig struct {
Platform string // 平台名
StartAct int32 // 活动是否开启
StartTickets int64 // tickets
Version int32 // 活动版本
Turntables []*LuckyTurntableConfig `json:"Data"`
MapTurntables map[int32]*LuckyTurntableConfig
} //声明与world一样的结构体
type ApiResultDatas struct {
Params []PlatformLuckyTurntableConfig
}
var LuckyTurntableMap = make(map[string]PlatformLuckyTurntableConfig)
// 平台幸运转盘活动
func LoadLuckyTurntableConfig() {
type ApiResult struct {
Tag int
Msg ApiResultDatas
}
logger.Logger.Trace("LoadLuckyTurntableConfig")
buff, err := webapi.API_GetLuckyTurntableConfig(common.GetAppId())
if err == nil {
ar := ApiResult{}
err = json.Unmarshal(buff, &ar)
if err == nil {
for _, value := range ar.Msg.Params {
//if value.StartAct > 0 {
LuckyTurntableMap[value.Platform] = value
//logger.Logger.Trace("value:", value)
//}
}
} else {
logger.Logger.Error("LuckyTurntableConfig.Init Unmarshal LuckyTurntableConfig data error:", err, " buff:", string(buff))
}
} else {
logger.Logger.Error("LuckyTurntableConfig.Init webapi.API_GetLuckyTurntableConfig failed.")
}
}
func PutLuckyTurntableConfig2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_LUCKLYTURNTABLE_PREFIX)
logger.Logger.Trace("ETCD_PutLuckyTurntableConfig2Etcd")
count := len(LuckyTurntableMap)
cur := 0
for name, p := range LuckyTurntableMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_LUCKLYTURNTABLE_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutLuckyTurntableConfig2Etcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutLuckyTurntableConfig2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
func LoadActOnlineReward() {
type ApiResult struct {
Tag int
Msg ApiOnlineRewardDatas
}
logger.Logger.Trace("LoadActOnlineReward")
buff, err := webapi.API_GetOnlineRewardConfig(common.GetAppId())
if err == nil {
ar := ApiResult{}
err = json.Unmarshal(buff, &ar)
if err == nil {
for _, value := range ar.Msg.Params {
//if value.StartAct > 0 {
ActOnlineRewardMap[value.Platform] = value
//logger.Logger.Trace("value:", value)
//}
}
} else {
logger.Logger.Error("ActOnlineRewardMgr.Init Unmarshal ActOnlineReward data error:", err, " buff:", string(buff))
}
} else {
logger.Logger.Error("ActOnlineRewardMgr.Init webapi.API_GetOnlineRewardConfig failed.")
}
}
func PutActOnlineReward2Etcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_ONLINEREWARD_PREFIX)
logger.Logger.Trace("ETCD_PutActOnlineReward2Etcd")
count := len(ActOnlineRewardMap)
cur := 0
for name, p := range ActOnlineRewardMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_ONLINEREWARD_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutActOnlineReward2Etcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutActOnlineReward2Etcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type YebConfig struct {
Platform string // 平台名
StartAct int32 // 活动是否开启
StartTickets int64 // tickets
Version int32 // 活动版本
Rate int64 // 配置利率(每万元收益,单位:分)
} //与world中一样
var YebConfigMap = make(map[string]YebConfig)
// 平台余额宝活动
func LoadYebConfig() {
type ApiResultDatas struct {
Params []YebConfig
}
type ApiResult struct {
Tag int
Msg ApiResultDatas
}
logger.Logger.Trace("LoadYebConfig")
buff, err := webapi.API_GetYebConfig(common.GetAppId())
if err == nil {
ar := ApiResult{}
err = json.Unmarshal(buff, &ar)
if err == nil {
for _, value := range ar.Msg.Params {
//if value.StartAct > 0 {
YebConfigMap[value.Platform] = value
//logger.Logger.Trace("value:", value)
//}
}
} else {
logger.Logger.Error("API_GetYebConfig.Init Unmarshal API_GetYebConfig data error:", err, " buff:", string(buff))
}
} else {
logger.Logger.Error("API_GetYebConfig.Init webapi.API_GetYebConfig failed.")
}
}
func PutYeb2ConfigEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_YEB_PREFIX)
logger.Logger.Trace("ETCD_PutYeb2ConfigEtcd")
count := len(YebConfigMap)
cur := 0
for name, p := range YebConfigMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_YEB_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutYeb2ConfigEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutYeb2ConfigEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type RebateGameCfg struct {
BaseCoin [3]int32 //返利基准
RebateRate [3]int32 //返利比率
GameId int32 //游戏id
GameMode int32 //游戏类型
MaxRebateCoin int64 //最高返利
}
type RebateGameThirdCfg struct {
BaseCoin [3]int32 //返利基准
RebateRate [3]int32 //返利比率
ThirdName string //第三方key
ThirdShowName string //前端显示name
MaxRebateCoin int64 //最高返利
ThirdId string //三方游戏id
}
type RebateInfo struct {
Platform string //平台名称
RebateSwitch bool //返利开关
RebateManState int //返利是开启个人返利 0 关闭 1 开启
ReceiveMode int //领取方式 0实时领取 1次日领取
NotGiveOverdue int //0不过期 1过期不给 2过期邮件给
RebateGameCfg []*RebateGameCfg //key为"gameid"+"gamemode"
RebateGameThirdCfg []*RebateGameThirdCfg //第三方key
Version int //活动版本 后台控制
}
type RebateTask struct {
Platform string //平台名称
RebateSwitch bool //返利开关
RebateManState int //返利是开启个人返利 0 关闭 1 开启
ReceiveMode int //领取方式 0实时领取 1次日领取
NotGiveOverdue int //0不过期 1过期不给 2过期邮件给
RebateGameCfg map[string]*RebateGameCfg //key为"gameid"+"gamemode"
RebateGameThirdCfg map[string]*RebateGameThirdCfg //第三方key
Version int //活动版本 后台控制
}
var RebateTaskMap = make(map[string]*RebateTask)
func LoadRebateData() {
logger.Logger.Trace("LoadRebateData")
//获取平台返利数据
type ApiResult struct {
Tag int
Msg []RebateInfo
}
rebateBuff, err := webapi.API_GetGameRebateConfig(common.GetAppId())
if err == nil {
logger.Logger.Trace("API_GetGameRebateConfig:", string(rebateBuff))
ar := ApiResult{}
err = json.Unmarshal(rebateBuff, &ar)
if err == nil && ar.Tag == 0 {
for _, v := range ar.Msg {
RebateTaskMap[v.Platform] = &RebateTask{
Platform: v.Platform,
RebateSwitch: v.RebateSwitch,
ReceiveMode: v.ReceiveMode,
RebateManState: v.RebateManState,
NotGiveOverdue: v.NotGiveOverdue,
Version: v.Version,
}
RebateTaskMap[v.Platform].RebateGameCfg = make(map[string]*RebateGameCfg)
RebateTaskMap[v.Platform].RebateGameThirdCfg = make(map[string]*RebateGameThirdCfg)
for _, cfg := range v.RebateGameCfg {
for _, dfm := range srvdata.PBDB_GameFreeMgr.Datas.Arr {
if dfm.GetGameId() == cfg.GameId && dfm.GetGameMode() == cfg.GameMode {
RebateTaskMap[v.Platform].RebateGameCfg[dfm.GetGameDif()] = cfg
break
}
}
}
for _, cfg := range v.RebateGameThirdCfg {
RebateTaskMap[v.Platform].RebateGameThirdCfg[cfg.ThirdId] = cfg
}
}
} else {
logger.Logger.Error("Unmarshal RebateTask data error:", err, string(rebateBuff))
}
} else {
logger.Logger.Error("Get RebateTask data error:", err)
}
}
func PutRebateTaskEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_CONFIG_REBATE)
logger.Logger.Trace("ETCD_PutRebateTaskEtcd")
count := len(RebateTaskMap)
cur := 0
for name, p := range RebateTaskMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_CONFIG_REBATE, name), string(data))
if err != nil {
logger.Logger.Tracef("PutRebateTaskEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutRebateTaskEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type PromoterConfig struct {
PromoterID string //代理ID
Platform string //平台
PromoterType int32 //代理类型 0 全民 1无限代理 2 渠道 3 推广员
UpgradeAccountGiveCoin int32 //升级账号奖励金币
NewAccountGiveCoin int32 //新账号奖励金币
ExchangeTax int32 //兑换税收(万分比)
ExchangeForceTax int32 //强制兑换税收
ExchangeFlow int32 //兑换流水比例
ExchangeGiveFlow int32 //赠送兑换流水比例
ExchangeFlag int32 //兑换标记
IsInviteRoot int32 //是否绑定全民用户
}
var PromoterMap = make(map[string]*PromoterConfig)
func LoadPromoterData() {
logger.Logger.Trace("LoadPromoterData")
//获取平台返利数据
type ApiResult struct {
Tag int
Msg []PromoterConfig
}
rebateBuff, err := webapi.API_GetPromoterConfig(common.GetAppId())
if err == nil {
logger.Logger.Trace("API_GetPromoterConfig:", string(rebateBuff))
ar := ApiResult{}
err = json.Unmarshal(rebateBuff, &ar)
if err == nil && ar.Tag == 0 {
for _, v := range ar.Msg {
temp := v
PromoterMap[v.PromoterID+"_"+strconv.Itoa(int(v.PromoterType))] = &temp
}
} else {
logger.Logger.Error("Unmarshal Promoter data error:", err, string(rebateBuff))
}
} else {
logger.Logger.Error("Get Promoter data error:", err)
}
}
func PutPromoterEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_PROMOTER_PREFIX)
logger.Logger.Trace("ETCD_PutPromoterEtcd")
count := len(PromoterMap)
cur := 0
for name, p := range PromoterMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_PROMOTER_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("ETCD_PutPromoterEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("ETCD_PutPromoterEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type ActVipRewardConfig struct {
LevelCoin int32 //等级奖励金币
DayCoin int32 //每日奖励
WeekCoin int32 //每周奖励
MonthCoin int32 //每月奖励
}
type ActVipPlateformConfig struct {
VipBonusInfo []ActVipRewardConfig //奖励信息
Platform string //平台
StartAct int32 //活动开启标记 0:关闭 1:开启
}
var ActVipMap = make(map[string]*ActVipPlateformConfig)
func LoadActVipData() {
logger.Logger.Trace("LoadActVipData")
//获取平台返利数据
type ApiResult struct {
Tag int
Msg []ActVipPlateformConfig
}
rebateBuff, err := webapi.API_GetActVipConfig(common.GetAppId())
if err == nil {
logger.Logger.Trace("API_GetPromoterConfig:", string(rebateBuff))
ar := ApiResult{}
err = json.Unmarshal(rebateBuff, &ar)
if err == nil && ar.Tag == 0 {
for _, v := range ar.Msg {
temp := v
ActVipMap[temp.Platform] = &temp
}
} else {
logger.Logger.Error("Unmarshal ActVip data error:", err, string(rebateBuff))
}
} else {
logger.Logger.Error("Get ActVip data error:", err)
}
}
func PutActVipEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_VIP_PREFIX)
logger.Logger.Trace("ETCD_PutActVipEtcd")
count := len(ActVipMap)
cur := 0
for name, p := range ActVipMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_VIP_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("ETCD_ActVipMapEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("ETCD_ActVipMapEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type ShareConfig struct {
Platform string // 平台id
Status int32 // 开关
Number int64 // 分享彩金
Times int64 // 每日领取次数
FriendUrl string
SpaceUrl string
VipLevel int32 // vip等级下限
Recharge int64 // 充值下限
}
var ActWxShareMap = make(map[string]*ShareConfig)
func LoadActWxShareData() {
logger.Logger.Trace("LoadActWxShareData")
//获取平台返利数据
type ApiResult struct {
Tag int
Msg []ShareConfig
}
rebateBuff, err := webapi.API_GetWeiXinShareConfig(common.GetAppId())
if err == nil {
//logger.Logger.Trace("API_GetPromoterConfig:", string(rebateBuff))
ar := ApiResult{}
err = json.Unmarshal(rebateBuff, &ar)
if err == nil && ar.Tag == 0 {
for _, v := range ar.Msg {
temp := v
ActWxShareMap[temp.Platform] = &temp
}
} else {
logger.Logger.Error("Unmarshal ActWxShare data error:", err, string(rebateBuff))
}
} else {
logger.Logger.Error("Get ActWxShare data error:", err)
}
}
func PutActWxShareEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_WEIXIN_SHARE_PREFIX)
logger.Logger.Trace("ETCD_PutActEtcd")
count := len(ActWxShareMap)
cur := 0
for name, p := range ActWxShareMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_WEIXIN_SHARE_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("ETCD_PutActWxShareEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("ETCD_PutActWxShareEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type ActGiveConfig struct {
Tag int32 //赠与类型
IsStop int32 //是否阻止 1阻止 0放开
NeedFlow int32
}
type ActGivePlateformConfig struct {
ActInfo map[string]*ActGiveConfig //奖励信息
Platform string //平台
}
var ActMap = make(map[string]*ActGivePlateformConfig)
func LoadActData() {
logger.Logger.Trace("LoadActData")
//获取平台返利数据
type ApiResult struct {
Tag int
Msg []ActGivePlateformConfig
}
rebateBuff, err := webapi.API_GetActConfig(common.GetAppId())
if err == nil {
//logger.Logger.Trace("API_GetPromoterConfig:", string(rebateBuff))
ar := ApiResult{}
err = json.Unmarshal(rebateBuff, &ar)
if err == nil && ar.Tag == 0 {
for _, v := range ar.Msg {
temp := v
ActMap[temp.Platform] = &temp
}
} else {
logger.Logger.Error("Unmarshal Act data error:", err, string(rebateBuff))
}
} else {
logger.Logger.Error("Get Act data error:", err)
}
}
func PutAcEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_GIVE_PREFIX)
logger.Logger.Trace("ETCD_PutActEtcd")
count := len(ActMap)
cur := 0
for name, p := range ActMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_GIVE_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("ETCD_PutActEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("ETCD_PutActEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type RandRange struct {
Low int32
High int32
}
type RandCoinData struct {
Id int //红包活动编号
Platform string
IsOpen bool
DType int //红包类型 0:全量红包 1随机红包 2五福红包
StartTs int64 //开始时间
EndTs int64 //结束时间
CoinTs int64 //可以领奖的时间(五福红包有特殊的时间,其他的和开始时间是一样的)
Title string //红包标题
Context string //红包文案
Count int32 //红包数量
TotleCoin int64 //红包总额度(写错成了totlecoin想修改成coin但是这个需要后端配合修改后端改起来麻烦所以不要纠结这个变量名
VipSel []int //红包VIP选项 勾选的VIP等级
ExtCoin int64 //红包额外条件
RandCoin []RandRange //VIP随机范围随机红包特有
NewYear []int //五福参数(五福红包特有)邀请好友数量,好友流水,每日充值,游戏局数,个人流水
}
type ActConfig struct {
Platform string
IsOpen bool
ActivityArr []*RandCoinData
}
var RandomPrizeMap = make(map[string]*ActConfig)
func LoadRandomPrizeData() {
logger.Logger.Trace("LoadRandomPrizeData")
//获取平台返利数据
type ApiResult struct {
Tag int
Msg []*ActConfig
}
rebateBuff, err := webapi.API_GetRandCoinData(common.GetAppId())
if err == nil {
//logger.Logger.Trace("API_GetPromoterConfig:", string(rebateBuff))
ar := ApiResult{}
err = json.Unmarshal(rebateBuff, &ar)
if err == nil && ar.Tag == 0 {
for _, v := range ar.Msg {
RandomPrizeMap[v.Platform] = v
}
} else {
logger.Logger.Error("Unmarshal RandomPrize data error:", err, string(rebateBuff))
}
} else {
logger.Logger.Error("Get RandomPrize data error:", err)
}
}
func PutRandomPrizeEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_RANDCOIN_PREFIX)
logger.Logger.Trace("ETCD_PutActEtcd")
count := len(RandomPrizeMap)
cur := 0
for name, p := range RandomPrizeMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_RANDCOIN_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("ETCD_PutActEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("ETCD_PutActEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
type ActFPayWinConfig struct {
WinType int32 //类型
WinRate int32 //赢取比例
}
type ActFPayConfig struct {
StartAct int32 //活动开启标记 0:关闭 1:开启
ConfigVer int32 //版本
PlayerAddMax int32 //玩家数量 //每分钟增长最大
PlayerAddMin int32 //玩家数量 //每分钟增长最小
StartTime int32 //开启时间 //秒
EndTime int32 //结束时间 //秒
FPayCoin int32 //首充金额
FPayGiveType int32 //赠送类型 0 金额 1 比例
FPayGiveCoin int32 //赠送金额
NeedWinCoin int32 //需要完成赢取金额
Remark string //备注
WinConfig map[string]*ActFPayWinConfig //赢取比例配置
}
type ActFPayPlateformConfig struct {
FPayInfo *ActFPayConfig //奖励信息
Platform string //平台
}
var ActFPayMap = make(map[string]*ActFPayPlateformConfig)
func LoadActFPayData() {
logger.Logger.Trace("LoadActData")
//获取平台返利数据
type ApiResult struct {
Tag int
Msg []ActFPayPlateformConfig
}
rebateBuff, err := webapi.API_GetActFPayConfig(common.GetAppId())
if err == nil {
logger.Logger.Trace("API_GetActFPayConfig:", string(rebateBuff))
ar := ApiResult{}
err = json.Unmarshal(rebateBuff, &ar)
if err == nil && ar.Tag == 0 {
for _, v := range ar.Msg {
temp := v
ActFPayMap[temp.Platform] = &temp
}
} else {
logger.Logger.Error("Unmarshal ActFPay data error:", err, string(rebateBuff))
}
} else {
logger.Logger.Error("Get ActFPay data error:", err)
}
}
func PutAcFPayEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_FPAY_PREFIX)
logger.Logger.Trace("PutAcFPayEtcd")
count := len(ActFPayMap)
cur := 0
for name, p := range ActFPayMap {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_FPAY_PREFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutAcFPayEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutAcFPayEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
func CopyDBGameFreeField(src, dst *server.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
//}
if dst.Id == 10000001 {
println(dst.GetMatchTrueMan())
}
}
// 赛事奖励配置
type ActMatchRewardConfig struct {
RankRange []int32 //名次区间
Reward int32 //奖励数量
}
// 活动配置
type ActTicketConfig struct {
Id int32 //配置编号
Platform string //平台编号
MatchId int32 //比赛编号
StartTime int64 //开始时间
EndTime int64 //结束时间
Enable bool //是否开启
AutoAgree bool //自动同意
PlayerType int32 //玩家类型 0:受邀请的玩家
AchievType int32 //成绩类型 0:首日最好成绩
Rewards []*ActMatchRewardConfig //奖励配置
}
var ActTicketConfigData = make(map[string]*ActTicketConfig)
func LoadActTicketConfig() {
type ActTicketConfigMsg struct {
Tag int
Msg []*ActTicketConfig
}
logger.Logger.Trace("API_GetActTicketConfigData")
buff, err := webapi.API_GetActTicketConfigData(common.GetAppId())
if err == nil {
var data ActTicketConfigMsg
err = json.Unmarshal(buff, &data)
if err == nil && data.Tag == 0 {
for _, cfg := range data.Msg {
ActTicketConfigData[cfg.Platform] = cfg
}
} else {
logger.Logger.Error("Unmarshal ActTicketConfig config data error:", err, string(buff))
}
} else {
logger.Logger.Error("Get ActTicketConfig config data error:", err)
}
}
func PutActTicketEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_ACT_TICKET_PROFIX)
logger.Logger.Trace("PutActTicketEtcd")
count := len(ActTicketConfigData)
cur := 0
for name, p := range ActTicketConfigData {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_ACT_TICKET_PROFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutAcFPayEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutAcFPayEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}
// 比赛配置
type MatchConfig struct {
Id int32 //比赛id
Platform string //平台编号
Ver int32 //数据版本号
Name string //名称
Desc string //比赛说明
Turn int32 //显示排序
Enable bool //开启标记 false:未开启 true:开启
StartMatchType int32 //开赛类型 1:流水赛(人满即开) 2:定点赛(固定时间开赛)
GameFreeId int32 //游戏id 对应gamefreeid
Onumber int32 //最低开赛人数
Gnumber int32 //分组人数
NumberLimit int32 //最高报名数人数
Rot bool //是否使用机器人 false:不使用 true:使用
RobCnt []int32 //邀请机器人数量 5,8 => 5~8
SameIpLimit bool //同ip限制
GuestLimit bool //正式玩家限制 false:游客也可报名 true:只能正式玩家报名
PrizeWashLimit bool //奖金是否有打码要求 false:无 true:需要打码
VipLimit int32 //vip限制 二进制模式
PrizeLimit int32 //单日奖金发放限制 0:不限制 >0:发完停赛
ShowPrize int32 //给客户端展示的奖励限制
RobOccupyPrize bool //机器人是否占用奖励
SignupCost MatchSignupConfig //报名费
StartTime []MatchDateTimeConfig //开赛时间
MatchProcess []*MatchProcessConfig //赛程阶段
Reward []*MatchRewardConfig //奖励配置
}
// 赛程配置
type MatchProcessConfig struct {
Name string //赛程名称
Desc string //赛程描述
InitGrade int32 //初始积分
GradeDiscount int32 //积分折算 0.使用初始积分 1:使用上个赛程的积分 2:上一轮积分进行折算
MPPType int32 //赛段赛制类型 1:定局积分 2:打立出局 3:瑞士移位 4:定时积分
NumOfGames int32 //局数
BaseScore int32 //初始底分
Filter int32 //晋级人数
Params []int32 //具体规则参数 打立出局X,Y,Z 每X秒增加Y底分,低于Z分淘汰
PhaseFlag int32 //0:海选 1:预赛 2:淘汰赛 3:半决赛 4.决赛
}
// 比赛奖励配置
type MatchRewardConfig struct {
RankRange []int32 //名次区间
Reward int32 //奖励金币
}
// 比赛报名配置
type MatchSignupConfig struct {
SupportFreeTimes bool //是否支持免费
FreeTimes int32 //免费次数
SupportTicket bool //是否支持入场券
TicketCnt int32 //入场券数量
SupportCoin bool //是否支持金币报名
Coin int32 //所需金币
}
// 比赛时间配置
type MatchDateTimeConfig struct {
StartDate int32 //开始日期 如:20200801 0表示不限开始日期
EndDate int32 //结束日期 如:20200808 0表示不限结束日期
StartMini int32 //开始时间 如:1000 10点开赛 0表示不限开始时间
EndMini int32 //结束时间 如:1200 12点结束 0表示不限结束时间
}
var MatchConfigData = make(map[int32]*MatchConfig)
func LoadMatchConfig() {
type ActTicketConfigMsg struct {
Tag int
Msg []*MatchConfig
}
logger.Logger.Trace("API_GetMatchConfigData")
buff, err := webapi.API_GetMatchConfigData(common.GetAppId())
if err == nil {
var data ActTicketConfigMsg
err = json.Unmarshal(buff, &data)
if err == nil && data.Tag == 0 {
for _, cfg := range data.Msg {
MatchConfigData[cfg.Id] = cfg
}
} else {
logger.Logger.Error("Unmarshal ActTicketConfig config data error:", err, string(buff))
}
} else {
logger.Logger.Error("Get ActTicketConfig config data error:", err)
}
}
func PutMatchConfigEtcd() {
etcdCli.DelValueWithPrefix(etcd.ETCDKEY_MATCH_PROFIX)
logger.Logger.Trace("PutMatchConfigEtcd")
count := len(MatchConfigData)
cur := 0
for name, p := range MatchConfigData {
data, err := json.Marshal(p)
if err == nil {
_, err := etcdCli.PutValue(fmt.Sprintf("%v%v", etcd.ETCDKEY_MATCH_PROFIX, name), string(data))
if err != nil {
logger.Logger.Tracef("PutAcFPayEtcd err:%v data:%v", err, string(data))
}
} else {
logger.Logger.Errorf("PutAcFPayEtcd err:%v data:%v", err, string(data))
}
cur++
fmt.Printf("\r")
fmt.Printf("%d%%", int(float64(cur)/float64(count)*100))
}
}