初始化项目

This commit is contained in:
皮蛋13361098506
2025-01-06 16:01:02 +08:00
commit 1b77f62820
575 changed files with 69193 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
package gameServerMgr
import (
. "Framework/managecenterModel"
)
var (
mAreaList = make([]*Area, 0)
)
// 解析大区信息
func ParseAreaInfo(areaList []*Area) {
mAreaList = areaList
}
// 根据服务器组id获取大区Id
func GetAreaIdByGroupId(groupId int32) (areaId int32) {
areaId = 0
//如果没有大区数据返回0
if mAreaList == nil || len(mAreaList) < 1 {
return
}
for _, area := range mAreaList {
if area.CheckServerIdIsInRange(groupId) {
areaId = area.AreaId
break
}
}
return
}
// 根据服务器组id获取大区对象数据
func GetAreaDBByGroupId(groupId int32) (areaDB *Area, exist bool) {
//如果没有大区数据,返回空
exist = false
if mAreaList == nil || len(mAreaList) < 1 {
return
}
for _, area := range mAreaList {
if area.CheckServerIdIsInRange(groupId) {
areaDB = area
exist = true
break
}
}
return
}
// 根据大区ID获取大区信息
func GetAreaDBbyAreaID(areaId int32) (areaDB *Area, exist bool) {
//如果没有大区数据,返回空
exist = false
if mAreaList == nil || len(mAreaList) < 1 {
return
}
for _, area := range mAreaList {
if area.AreaId == areaId {
areaDB = area
exist = true
break
}
}
return
}
// 获取所有大区信息
func GetAllAreaDB() []*Area {
tempList := mAreaList
return tempList
}

View File

@@ -0,0 +1,33 @@
package gameServerMgr
import (
"encoding/json"
. "Framework/managecenterModel"
)
var (
mChargeConfigMap = make(map[int32][]*ChargeConfig, 0)
)
//解析充值配置信息
func ParseChargeConfigInfo(partnerList []*Partner) {
tmpChargeConfigMap := make(map[int32][]*ChargeConfig, 0)
//循环解析所有合作商里面的充值配置信息
for _, partner := range partnerList {
var chargeConfigList []*ChargeConfig
if err := json.Unmarshal([]byte(partner.ChargeConfig), &chargeConfigList); err == nil {
tmpChargeConfigMap[partner.Id] = chargeConfigList
}
}
mChargeConfigMap = tmpChargeConfigMap
}
// 根据合作商Id获取合作商充值配置对象
func GetChargeConfigList(partnerId int32) (chargeConfigList []*ChargeConfig, exist bool) {
chargeConfigList, exist = mChargeConfigMap[partnerId]
return
}

View File

@@ -0,0 +1,433 @@
package gameServerMgr
import (
"encoding/json"
"fmt"
"math"
"sort"
"strconv"
. "Framework/managecenterModel"
"goutil/logUtil"
"goutil/securityUtil"
"goutil/webUtil"
)
type ChargeUtil struct{}
//获取Int32型的充值金额(充值金额必须大于1否则可能就会无效)
func (this *ChargeUtil) GetInt32ChargeMoney(money float32) int32 {
return int32(money)
}
//获取排好序的充值配置列表
func (this *ChargeUtil) GetOrderedChargeConfigList(partnerId int32, isMonthCard bool) (list []*ChargeConfig, exist bool) {
var tempList []*ChargeConfig
tempList, exist = GetChargeConfigList(partnerId)
//如果不存在,则返回空集合
if !exist {
return
}
//循环遍历集合,找出是月卡的数据
for _, item := range tempList {
if item.IsMonthCard == isMonthCard {
list = append(list, item)
}
}
return
}
// 生成充值订单号
// url:生成订单号的服务器地址
// productId:产品Id
// partnerId:合作商Id
// serverId:服务器Id
// userId:平台用户Id
// playerId:玩家Id
// mac:mac
// idfa:idfa
// ip:ip
// imei:imei
// extra:extra
// isMonthCard:是否月卡
// 返回值:
// 订单号
// 错误对象
func (this *ChargeUtil) GenerateOrderId(url, productId string, partnerId, serverId int32,
userId, playerId, mac, idfa, ip, imei, extra string,
isMonthCard bool) (orderId string, err error) {
if extra == "" {
extra = "FromGameServer"
}
// 定义请求参数
postDict := make(map[string]string)
postDict["ProductId"] = productId
postDict["PartnerId"] = fmt.Sprintf("%d", partnerId)
postDict["ServerId"] = fmt.Sprintf("%d", serverId)
postDict["UserId"] = userId
postDict["PlayerId"] = playerId
postDict["MAC"] = mac
postDict["IDFA"] = idfa
postDict["IP"] = ip
postDict["IMEI"] = imei
postDict["Extra"] = extra
postDict["IsMonthCard"] = strconv.FormatBool(isMonthCard)
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 30)
statusCode, returnBytes, err1 := webUtil.PostMapData(url, postDict, header, transport)
if err1 != nil {
logUtil.ErrorLog(fmt.Sprintf("生成充值订单号出错url:%s,错误信息为:%s", url, err1))
err = err1
return
}
if statusCode != 200 {
logUtil.ErrorLog(fmt.Sprintf("生成充值订单号出错url:%s,错误码为:%d", url, statusCode))
err = fmt.Errorf("生成充值订单号出错url:%s,错误码为:%d", url, statusCode)
return
}
orderId = string(returnBytes)
if orderId == "" {
err = fmt.Errorf("Order Is Empty")
return
}
return
}
//生成支付订单信息
func (this *ChargeUtil) GeneratePayOrderInfo(url string, partnerId int32, jsonBase64Data string) (returnObject ReturnObject, err error) {
//String requestParam = String.Format(@"PartnerId={0}&JsonBase64Data={1}", partnerId, jsonBase64Data);
postDict := make(map[string]string)
postDict["PartnerId"] = fmt.Sprintf("%d", partnerId)
postDict["JsonBase64Data"] = jsonBase64Data
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 30)
//通过POST方式请求数据
statusCode, returnBytes, err1 := webUtil.PostMapData(url, postDict, header, transport)
if err1 != nil {
logUtil.ErrorLog(fmt.Sprintf("生成支付订单信息错误:%s,错误信息为:%s", url, err1))
err = err1
return
}
if statusCode != 200 {
logUtil.ErrorLog(fmt.Sprintf("生成支付订单信息出错url:%s,错误码为:%d", url, statusCode))
err = fmt.Errorf("生成支付订单信息出错url:%s,错误码为:%d", url, statusCode)
return
}
err = json.Unmarshal(returnBytes, &returnObject)
return
//return JsonUtil.Deserialize<ReturnObject>(WebUtil.PostWebData(generateOrderIdUrl, requestParam, DataCompress.NotCompress));
}
// 获取充值配置列表
// partnerId合作商Id
// vipLv玩家VIP等级
// isMonthCard是否月卡
// filter过滤器
// 返回值:
// 充值配置列表
// 是否存在
// 错误对象
func (this *ChargeUtil) GetChargeConfigList(partnerId int32, vipLv byte, isMonthCard bool,
filter func(*ChargeConfig) bool) (chargeConfigList []*ChargeConfig, exists bool, err error) {
// 获取排好序的充值配置列表
var tmpList []*ChargeConfig
tmpList, exists, err = this.getSortedChargeConfigList(partnerId, isMonthCard)
if err != nil || !exists {
return
}
// 根据vip和filter进行筛选
for _, item := range tmpList {
if filter != nil {
if vipLv >= item.VipLv && filter(item) {
chargeConfigList = append(chargeConfigList, item)
}
} else {
if vipLv >= item.VipLv {
chargeConfigList = append(chargeConfigList, item)
}
}
}
// 判断是否有符合条件的数据
if len(chargeConfigList) == 0 {
exists = false
return
}
return
}
// 获取有序的充值配置列表
// partnerId合作商Id
// isMonthCard是否月卡
// 返回值:
// 充值配置列表
// 是否存在
// 错误对象
func (this *ChargeUtil) getSortedChargeConfigList(partnerId int32, isMonthCard bool) (chargeConfigList []*ChargeConfig, exists bool, err error) {
// 判断合作商是否存在
//var partnerObj *Partner
//partnerObj, exists = managecenterMgr.GetPartner(partnerId)
//if !exists {
//return
//}
// 反序列化充值配置
var tmpChargeConfigList []*ChargeConfig
tmpChargeConfigList, exists = GetChargeConfigList(partnerId)
if !exists {
return
}
//if err = json.Unmarshal([]byte(partnerObj.ChargeConfig), &tmpChargeConfigList); err != nil {
//return
//}
// 根据isMonthCard进行筛选
for _, item := range tmpChargeConfigList {
if item.IsMonthCard == isMonthCard {
chargeConfigList = append(chargeConfigList, item)
}
}
// 判断是否有符合条件的数据
if len(chargeConfigList) == 0 {
exists = false
return
}
// 按默认规则进行排序
sort.Slice(chargeConfigList, func(i, j int) bool {
return chargeConfigList[i].SortByChargePointAsc(chargeConfigList[j])
})
return
}
// 获取充值配置项
// partnerId合作商Id
// vipLv玩家VIP等级
// isMonthCard是否月卡
// money充值金额
// 返回值:
// 充值配置项
// 是否存在
// 错误对象
func (this *ChargeUtil) GetChargeConfigItem(partnerId int32, vipLv byte, isMonthCard bool, money float64) (chargeConfigItem *ChargeConfig, exists bool, err error) {
// 获取排好序的充值配置列表
var tmpList []*ChargeConfig
tmpList, exists, err = this.getSortedChargeConfigList(partnerId, isMonthCard)
if err != nil || !exists {
return
}
// 获取满足充值金额和VIP条件的最后一条数据
for _, item := range tmpList {
if vipLv >= item.VipLv && money >= item.ChargePoint {
chargeConfigItem = item
}
}
// 如果没有符合条件的,则选择第一条配置
if chargeConfigItem == nil {
chargeConfigItem = tmpList[0]
}
return
}
// 计算充值获得的游戏点数
// partnerId合作商Id
// vipLv玩家VIP等级
// isMonthCard是否月卡
// money充值金额
// 返回值:
// 充值获得的游戏点数
// 是否存在
// 错误对象
func (this *ChargeUtil) CalcChargeGamePoint(partnerId int32, vipLv byte, isMonthCard bool, money float64, productId string) (chargeGamePoint int, exists bool, err error) {
// 获取排好序的充值配置列表
chargeGamePoint = 0
tmpList := make([]*ChargeConfig, 0, 8)
tmpList, exists, err = this.getSortedChargeConfigList(partnerId, isMonthCard)
if err != nil || !exists {
return
}
var chargeConfigItem *ChargeConfig
if money > 0 {
// 获取满足充值金额和VIP条件的最后一条数据
for _, item := range tmpList {
if vipLv >= item.VipLv && money >= item.ChargePoint {
chargeConfigItem = item
}
}
// 如果找不到对应的档位,则选择最低金额档位
if chargeConfigItem == nil {
chargeConfigItem = tmpList[0]
}
// 计算充值对应的ProductId以及获得的游戏货币
if money == chargeConfigItem.ChargePoint {
chargeGamePoint = chargeConfigItem.GamePoint
} else {
chargeGamePoint = int(math.Ceil(money * chargeConfigItem.Ratio))
}
return
} else {
for _, item := range tmpList {
if item.ProductId == productId && item.VipLv <= vipLv {
chargeConfigItem = item
break
} else {
continue
}
}
if chargeConfigItem != nil {
chargeGamePoint = chargeConfigItem.GamePoint
return
}
}
return
}
// 计算充值获得的所有游戏点数
// partnerId合作商Id
// vipLv玩家VIP等级
// isMonthCard是否月卡
// money充值金额
// activityMoney活动金额
// isFirstCharge是否首充
// 返回值:
// 充值获得的游戏点数
// 充值赠送获得的游戏内货币数量
// 充值活动获得的游戏内货币数量
// 总的元宝数量
// 是否存在
// 错误对象
func (this *ChargeUtil) CalcChargeAllGamePoint(partnerId int32, vipLv byte, isMonthCard bool,
money, activityMoney float64, productId string, isFirstCharge bool) (
chargeGamePoint int, giveGamePoint int, activityGamePoint int, totalGamePoint int,
exists bool, err error) {
// 获取排好序的充值配置列表
tmpList := make([]*ChargeConfig, 0, 8)
tmpList, exists, err = this.getSortedChargeConfigList(partnerId, isMonthCard)
if err != nil || !exists {
return
}
var chargeConfigItem *ChargeConfig
if money > 0 {
// 获取满足充值金额和VIP条件的最后一条数据
for _, item := range tmpList {
if vipLv >= item.VipLv && money >= item.ChargePoint {
chargeConfigItem = item
}
}
// 如果找不到对应的档位,则选择最低金额档位
if chargeConfigItem == nil {
chargeConfigItem = tmpList[0]
}
// 计算充值对应的ProductId以及获得的游戏货币
if money == chargeConfigItem.ChargePoint {
chargeGamePoint = chargeConfigItem.GamePoint
if isFirstCharge {
giveGamePoint = chargeConfigItem.FirstGiveGamePoint
} else {
giveGamePoint = chargeConfigItem.GiveGamePoint
}
} else {
chargeGamePoint = int(math.Ceil(money * chargeConfigItem.Ratio))
if isFirstCharge {
giveGamePoint = chargeConfigItem.FirstGiveGamePoint
} else {
giveGamePoint = int(math.Ceil(money * chargeConfigItem.Ratio * chargeConfigItem.GiveRatio))
}
}
activityGamePoint = int(math.Ceil(activityMoney * chargeConfigItem.Ratio))
} else {
// 获取满足充值金额和VIP条件的最后一条数据
for _, item := range tmpList {
if vipLv >= item.VipLv && item.ProductId == productId {
chargeConfigItem = item
}
}
if chargeConfigItem != nil {
chargeGamePoint = chargeConfigItem.GamePoint
if isFirstCharge {
giveGamePoint = chargeConfigItem.FirstGiveGamePoint
} else {
giveGamePoint = chargeConfigItem.GiveGamePoint
}
activityGamePoint = int(math.Ceil(activityMoney * chargeConfigItem.Ratio))
}
}
// 计算总和
totalGamePoint = chargeGamePoint + giveGamePoint + activityGamePoint
return
}
// 验证充值签名
// partnerId:合作商Id
// serverId:区服Id
// playerId:玩家Id
// orderId:订单Id
// productId:产品Id
// deviceIdentifier:设备唯一标识
// sign:签名
// 返回值:
// bool:签名验证情况
func (this *ChargeUtil) CheckChargeSign(partnerId int32, serverId int32, playerId string, orderId string, productId string, deviceIdentifier string, sign string) bool {
partnerObj, exist := GetPartnerItem(partnerId)
if exist == false {
return false
}
rawString := fmt.Sprintf("%v%v%v%v%v%v%v", partnerId, serverId, playerId, orderId, productId, deviceIdentifier, partnerObj.LoginKey)
if securityUtil.Md5String(rawString, false) != sign {
return false
}
return true
}
// ------------------类型定义和业务逻辑的分隔符-------------------------
var (
ChargeUtilObj = new(ChargeUtil)
)

View File

@@ -0,0 +1,410 @@
package gameServerMgr
import (
"Framework/managecenterModel"
"goutil/stringUtil"
"testing"
)
func TestChargeUtil_GetChargeConfigList(t *testing.T) {
/*
渠道充值配置:[{"ProductId":"fzxh_00060","ChargePoint":6,"GamePoint":60,"Ratio":10,"GiveGamePoint":6,"FirstGiveGamePoint":60,"GiveRatio":0.1,"VipLv":0,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_00300","ChargePoint":30,"GamePoint":300,"Ratio":10,"GiveGamePoint":30,"FirstGiveGamePoint":300,"GiveRatio":0.1,"VipLv":0,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_00500","ChargePoint":50,"GamePoint":550,"Ratio":11,"GiveGamePoint":110,"FirstGiveGamePoint":550,"GiveRatio":0.2,"VipLv":1,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_00980","ChargePoint":98,"GamePoint":1470,"Ratio":15,"GiveGamePoint":441,"FirstGiveGamePoint":1470,"GiveRatio":0.3,"VipLv":5,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_restriction_18","ChargePoint":18,"GamePoint":90,"Ratio":5,"GiveGamePoint":0,"FirstGiveGamePoint":0,"GiveRatio":0,"VipLv":3,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":true},{"ProductId":"fzxh_restriction_50","ChargePoint":50,"GamePoint":300,"Ratio":6,"GiveGamePoint":0,"FirstGiveGamePoint":0,"GiveRatio":0,"VipLv":1,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":true}]
*/
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
var partnerId int32 = 1001
//激活器服务器获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
type VipRange struct {
MinVip byte
MaxVip byte
}
var isMonthCard = false
var maxVip byte = 20
vipMap := make(map[VipRange][]float64)
vipMap[VipRange{MinVip: 0, MaxVip: 0}] = []float64{6, 30}
vipMap[VipRange{MinVip: 1, MaxVip: 4}] = []float64{6, 30, 50}
vipMap[VipRange{MinVip: 5, MaxVip: maxVip}] = []float64{6, 30, 50, 98}
isExistsChargeConfig := func(configs []*managecenterModel.ChargeConfig, point float64) bool {
for _, item := range configs {
if item.ChargePoint == point {
return true
}
}
return false
}
//每个VIP等级都获取一遍充值档位
for vipRange, points := range vipMap {
for vip := vipRange.MinVip; vip <= vipRange.MaxVip; vip++ {
showChargeList, exists, error := ChargeUtilObj.GetChargeConfigList(partnerId, vip, isMonthCard, func(config *managecenterModel.ChargeConfig) bool {
if config.IfFirstShow == 1 && config.IfSecondShow == 1 {
return true
}
return false
})
if error != nil {
t.Fatalf("获取充值配置列表出现错误:%v", error)
}
if !exists {
t.Fatalf("PartnerId[%d],Vip[%d],IsMonthCard[%v],未找到充值配置列表", partnerId, vip, isMonthCard)
}
for _, point := range points {
if !isExistsChargeConfig(showChargeList, point) {
t.Fatalf("PartnerId[%d],Vip[%d],IsMonthCard[%v],金额[%f]未找到充值配置", partnerId, vip, isMonthCard, point)
}
}
}
}
}
// 测试生成订单号
func TestChargeUtil_GenerateOrderId(t *testing.T) {
var chargeServerUrl = "https://chargetest-xht.moqikaka.com/API/GenerateOrderId.ashx"
var serverGroupId int32 = 20001
var partnerId int32 = 1001
var productId = "fzxh_00060"
var userId = stringUtil.GetNewGUID()
var playerId = stringUtil.GetNewGUID()
var isMonthCard = true
//生成订单号
orderId, error := ChargeUtilObj.GenerateOrderId(
chargeServerUrl, productId, partnerId, serverGroupId, userId, playerId, "macmacmacmac", "idfa", "ip", "imei", "extra", isMonthCard)
if error != nil {
t.Fatalf("生成订单号[GenerateOrderId]出现错误:%v", error)
}
t.Logf("生成订单号[GenerateOrderId]:%s", orderId)
}
// 测试验证充值回调签名
func TestChargeUtil_CheckChargeSign(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
var partnerId int32 = 1001
var playerId = "04bade21-d7f7-4188-bc7c-8914c5330a23"
var orderId = "1001_20001_1590394423_2"
var productId = "fzxh_00060"
var deviceIdentifier = "deviceIdentifier"
//var loginKey = "a0482eaf-14e8-4a65-950e-864214f62da5"
//激活器服务器获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//充值服务器生成的签名
var targetSign = "02bd33319fc0f520a3e801f725973017"
//验证充值回调签名是否正确
if !ChargeUtilObj.CheckChargeSign(partnerId, serverGroupId, playerId, orderId, productId, deviceIdentifier, targetSign) {
t.Fatalf("验证充值回调签名失败!目标签名:%s", targetSign)
}
}
// 测试获取充值配置
func TestChargeUtil_GetChargeConfigItem(t *testing.T) {
/*
渠道充值配置:[{"ProductId":"fzxh_00060","ChargePoint":6,"GamePoint":60,"Ratio":10,"GiveGamePoint":6,"FirstGiveGamePoint":60,"GiveRatio":0.1,"VipLv":0,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_00300","ChargePoint":30,"GamePoint":300,"Ratio":10,"GiveGamePoint":30,"FirstGiveGamePoint":300,"GiveRatio":0.1,"VipLv":0,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_00500","ChargePoint":50,"GamePoint":550,"Ratio":11,"GiveGamePoint":110,"FirstGiveGamePoint":550,"GiveRatio":0.2,"VipLv":1,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_00980","ChargePoint":98,"GamePoint":1470,"Ratio":15,"GiveGamePoint":441,"FirstGiveGamePoint":1470,"GiveRatio":0.3,"VipLv":5,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_restriction_18","ChargePoint":18,"GamePoint":90,"Ratio":5,"GiveGamePoint":0,"FirstGiveGamePoint":0,"GiveRatio":0,"VipLv":3,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":true},{"ProductId":"fzxh_restriction_50","ChargePoint":50,"GamePoint":300,"Ratio":6,"GiveGamePoint":0,"FirstGiveGamePoint":0,"GiveRatio":0,"VipLv":1,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":true}]
*/
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
var partnerId int32 = 1001
var maxVip byte = 20
//激活器服务器获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
type VipRange struct {
MinVip byte
MaxVip byte
}
//#region 测试获取普通充值配置
isMonthCard := false
vipMap := make(map[VipRange][]float64)
vipMap[VipRange{MinVip: 0, MaxVip: 0}] = []float64{6, 30}
vipMap[VipRange{MinVip: 1, MaxVip: 4}] = []float64{6, 30, 50}
vipMap[VipRange{MinVip: 5, MaxVip: maxVip}] = []float64{6, 30, 50, 98}
//每个VIP等级都获取一遍充值档位
for vipRange, points := range vipMap {
for vip := vipRange.MinVip; vip <= vipRange.MaxVip; vip++ {
for _, point := range points {
//获取充值配置
chargeConfig, exists, error := ChargeUtilObj.GetChargeConfigItem(partnerId, vip, isMonthCard, point)
if error != nil {
t.Fatalf("普通充值,获取充值配置[GetChargeConfigItem]Vip[%d]Point[%f]获取充值档位出现错误:%v", vip, point, error)
}
if !exists {
t.Fatalf("普通充值,获取充值配置[GetChargeConfigItem]Vip[%d]Point[%f]未找到充值档位配置", vip, point)
}
if chargeConfig == nil {
t.Fatalf("普通充值,获取充值配置[GetChargeConfigItem]Vip[%d]Point[%f]找到的充值档位配置为nil", vip, point)
}
if chargeConfig.ChargePoint != point {
t.Fatalf("普通充值,获取充值配置[GetChargeConfigItem]Vip[%d]Point[%f]找到的充值档位ChargePoint[%f]错误", vip, point, chargeConfig.ChargePoint)
}
}
}
}
//#endregion
//#region 测试获取月卡充值配置
isMonthCard = true
vipMap = make(map[VipRange][]float64)
vipMap[VipRange{MinVip: 1, MaxVip: 1}] = []float64{50}
vipMap[VipRange{MinVip: 3, MaxVip: maxVip}] = []float64{18, 50}
//每个VIP等级都获取一遍充值档位
for vipRange, points := range vipMap {
for vip := vipRange.MinVip; vip <= vipRange.MaxVip; vip++ {
for _, point := range points {
//获取充值配置
chargeConfig, exists, error := ChargeUtilObj.GetChargeConfigItem(partnerId, vip, isMonthCard, point)
if error != nil {
t.Fatalf("月卡充值,获取充值配置[GetChargeConfigItem]Vip[%d]Point[%f]获取充值档位出现错误:%v", vip, point, error)
}
if !exists {
t.Fatalf("月卡充值,获取充值配置[GetChargeConfigItem]Vip[%d]Point[%f]未找到充值档位配置", vip, point)
}
if chargeConfig == nil {
t.Fatalf("月卡充值Vip[%d]Point[%f]找到的充值档位配置为nil", vip, point)
}
if chargeConfig.ChargePoint != point {
t.Fatalf("月卡充值,获取充值配置[GetChargeConfigItem]Vip[%d]Point[%f]找到的充值档位ChargePoint[%f]错误", vip, point, chargeConfig.ChargePoint)
}
}
}
}
//#endregion
}
// 测试计算充值获得的游戏货币
func TestChargeUtil_CalcChargeAllGamePoint(t *testing.T) {
/*
渠道充值配置:[{"ProductId":"fzxh_00060","ChargePoint":6,"GamePoint":60,"Ratio":10,"GiveGamePoint":6,"FirstGiveGamePoint":60,"GiveRatio":0.1,"VipLv":0,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_00300","ChargePoint":30,"GamePoint":300,"Ratio":10,"GiveGamePoint":30,"FirstGiveGamePoint":300,"GiveRatio":0.1,"VipLv":0,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_00500","ChargePoint":50,"GamePoint":550,"Ratio":11,"GiveGamePoint":110,"FirstGiveGamePoint":550,"GiveRatio":0.2,"VipLv":1,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_00980","ChargePoint":98,"GamePoint":1470,"Ratio":15,"GiveGamePoint":441,"FirstGiveGamePoint":1470,"GiveRatio":0.3,"VipLv":5,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":false},{"ProductId":"fzxh_restriction_18","ChargePoint":18,"GamePoint":90,"Ratio":5,"GiveGamePoint":0,"FirstGiveGamePoint":0,"GiveRatio":0,"VipLv":3,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":true},{"ProductId":"fzxh_restriction_50","ChargePoint":50,"GamePoint":300,"Ratio":6,"GiveGamePoint":0,"FirstGiveGamePoint":0,"GiveRatio":0,"VipLv":1,"IfFirstShow":1,"IfSecondShow":1,"IsMonthCard":true}]
*/
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
var partnerId int32 = 1001
//激活器服务器获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//输入订单信息
type OrderItem struct {
Vip byte
Money float64
ActivityMoney float64
ProductId string
IsFirstCharge bool
IsMonthCard bool
}
//计算结果
type GamePointResult struct {
ChargeGamePoint int
GiveGamePoint int
ActivityGamePoint int
TotalGamePoint int
}
testOrderMap := make(map[OrderItem]GamePointResult)
//#region 普通充值
testOrderMap[OrderItem{
Vip: 0,
Money: 6,
ActivityMoney: 1,
ProductId: "fzxh_00060",
IsFirstCharge: true,
IsMonthCard: false,
}] = GamePointResult{
ChargeGamePoint: 60, //GamePoint
GiveGamePoint: 60, //FirstGiveGamePoint
ActivityGamePoint: 10, //ActivityMoney*Ratio = 1*10
TotalGamePoint: 130,
} //首充6元,活动金额1元
testOrderMap[OrderItem{
Vip: 0,
Money: 6,
ActivityMoney: 1,
ProductId: "fzxh_00060",
IsFirstCharge: false,
IsMonthCard: false,
}] = GamePointResult{
ChargeGamePoint: 60, //GamePoint
GiveGamePoint: 6, //GiveGamePoint 6
ActivityGamePoint: 10, //ActivityMoney*Ratio = 1*10
TotalGamePoint: 76,
} //非首充6元,活动金额1元
testOrderMap[OrderItem{
Vip: 0,
Money: 0,
ActivityMoney: 1,
ProductId: "fzxh_00060",
IsFirstCharge: false,
IsMonthCard: false,
}] = GamePointResult{
ChargeGamePoint: 60, //Money*Ratio = 6*10
GiveGamePoint: 6, //GiveGamePoint 6
ActivityGamePoint: 10, //ActivityMoney*Ratio = 1*10
TotalGamePoint: 76,
} //无金额匹配6元,活动金额1元
testOrderMap[OrderItem{
Vip: 0,
Money: 10,
ActivityMoney: 3,
ProductId: "",
IsFirstCharge: false,
IsMonthCard: false,
}] = GamePointResult{
ChargeGamePoint: 100, //Money*Ratio = 10*10
GiveGamePoint: 10, //Money*Ratio*GiveRatio 10 * 10 * 0.1
ActivityGamePoint: 30, //ActivityMoney*Ratio = 3*10
TotalGamePoint: 140,
} //无对应档位配置,模糊匹配10元,活动金额1元,实际匹配到6元档位
testOrderMap[OrderItem{
Vip: 3,
Money: 98,
ActivityMoney: 3,
ProductId: "",
IsFirstCharge: false,
IsMonthCard: false,
}] = GamePointResult{
ChargeGamePoint: 1078, //Money*Ratio = 98*11
GiveGamePoint: 216, //Money*Ratio*GiveRatio 98 * 11 * 0.2 = 215.6
ActivityGamePoint: 33, //ActivityMoney*Ratio = 3*11
TotalGamePoint: 1327,
} //Vip限制,匹配98元,实际匹配到50档位,活动金额3元
//#endregion
for order, result := range testOrderMap {
//计算充值获得的游戏币
chargeGamePoint, giveGamePoint, activityGamePoint, totalGamePoint, exists, err := ChargeUtilObj.CalcChargeAllGamePoint(
partnerId, order.Vip, order.IsMonthCard, order.Money, order.ActivityMoney, order.ProductId, order.IsFirstCharge)
if err != nil {
t.Fatalf("普通充值,计算充值获得游戏币[CalcChargeAllGamePoint],金额[%f] error:%v", order.Money, err)
}
if !exists {
t.Fatalf("普通充值,计算充值获得游戏币[CalcChargeAllGamePoint],金额[%f]未找到充值配置:%v", order.Money, exists)
}
if chargeGamePoint != result.ChargeGamePoint {
t.Fatalf("普通充值,计算充值获得游戏币[CalcChargeAllGamePoint],ChargeGamePoint计算结果不正确,金额[%f],期望[%d],结果[%d]", order.Money, result.ChargeGamePoint, chargeGamePoint)
}
if giveGamePoint != result.GiveGamePoint {
t.Fatalf("普通充值,计算充值获得游戏币[CalcChargeAllGamePoint],GiveGamePoint计算结果不正确,金额[%f],期望[%d],结果[%d]", order.Money, result.GiveGamePoint, giveGamePoint)
}
if activityGamePoint != result.ActivityGamePoint {
t.Fatalf("普通充值,计算充值获得游戏币[CalcChargeAllGamePoint],ActivityGamePoint计算结果不正确,金额[%f],期望[%d],结果[%d]", order.Money, result.ActivityGamePoint, activityGamePoint)
}
if totalGamePoint != result.TotalGamePoint {
t.Fatalf("普通充值,计算充值获得游戏币[CalcChargeAllGamePoint],TotalGamePoint计算结果不正确,金额[%f],期望[%d],结果[%d]", order.Money, result.TotalGamePoint, totalGamePoint)
}
}
//#region 月卡充值
testOrderMap[OrderItem{
Vip: 3,
Money: 18,
ProductId: "fzxh_restriction_18",
IsMonthCard: true,
}] = GamePointResult{
ChargeGamePoint: 90, //GamePoint
} //18元月卡
testOrderMap[OrderItem{
Vip: 0,
Money: 50,
ProductId: "fzxh_restriction_50",
IsMonthCard: true,
}] = GamePointResult{
ChargeGamePoint: 250, //Money * Ratio = 50 * 5
} //VIP限制匹配50元月卡实际匹配到18元月卡
testOrderMap[OrderItem{
Vip: 1,
Money: 0,
ProductId: "fzxh_restriction_50",
IsMonthCard: true,
}] = GamePointResult{
ChargeGamePoint: 300, //GamePoint
} //无金额匹配50元月卡
testOrderMap[OrderItem{
Vip: 0,
Money: 0,
ProductId: "fzxh_restriction_50",
IsMonthCard: true,
}] = GamePointResult{
ChargeGamePoint: 0, //匹配不成功
} //VIP限制无金额匹配50元月卡
for order, result := range testOrderMap {
//计算充值获得的游戏币
chargeGamePoint, exists, err := ChargeUtilObj.CalcChargeGamePoint(
partnerId, order.Vip, order.IsMonthCard, order.Money, order.ProductId)
if err != nil {
t.Fatalf("月卡充值,计算充值获得游戏币[CalcChargeGamePoint],金额[%f] error:%v", order.Money, err)
}
if !exists {
t.Fatalf("月卡充值,计算充值获得游戏币[CalcChargeGamePoint],金额[%f]未找到充值配置:%v", order.Money, exists)
}
if chargeGamePoint != result.ChargeGamePoint {
t.Fatalf("月卡充值,计算充值获得游戏币[CalcChargeGamePoint],ChargeGamePoint计算结果不正确,金额[%f],期望[%d],结果[%d]", order.Money, result.ChargeGamePoint, chargeGamePoint)
}
}
//#endregion
}

View File

@@ -0,0 +1,15 @@
package gameServerMgr
import (
"fmt"
"testing"
)
func TestActive(t *testing.T) {
err := ActiveServer("https://managecenterapitest-xxx.79yougame.com/API/ServerActivate.ashx", 20002)
if err != nil {
fmt.Println("xxx")
}
CheckNewResourceVersion(1001, 20002, 100, "1584085505_769926880ac0ae89a31dcdfef5b94b1e")
}

View File

@@ -0,0 +1,131 @@
package gameServerMgr
import (
"encoding/json"
"fmt"
"strings"
. "Framework/managecenterModel"
"goutil/logUtil"
"goutil/securityUtil"
"goutil/webUtil"
)
// 登陆助手类
type LoginUtil struct{}
// 验证登陆信息
// partnerId:合作商Id
// userId:合作商用户Id
// loginInfo:登陆信息
// isIntranet:是否是内网true内网false外网
// 返回值:
// 成功与否
// 错误对象
func (this *LoginUtil) CheckLoginInfo(partnerId int32, userId, loginInfo string, isIntranet bool) (success bool, err error) {
// 验证用户合法性
loginItemList := strings.Split(loginInfo, "_")
if len(loginItemList) != 2 {
err = fmt.Errorf("CheckLoginInfo Failed. partnerId:%d, userId:%s, loginInfo:%s", partnerId, userId, loginInfo)
return
}
//将requestUrl地址进行拆分
requestDomainList := strings.Split(loginItemList[1], ";")
//请求的主域名
requestDomain := ""
if isIntranet || len(requestDomainList) == 1 {
requestDomain = requestDomainList[0]
} else {
requestDomain = requestDomainList[1]
}
//构造请求url
requestUrl := fmt.Sprintf("http://%s/API/CheckDynamicLoginKey.ashx", requestDomain)
// 定义请求参数
postDict := make(map[string]string)
postDict["UserId"] = userId
postDict["LoginKey"] = loginItemList[0]
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 30)
statusCode, returnBytes, err1 := webUtil.PostMapData(requestUrl, postDict, header, transport)
if err1 != nil {
err = fmt.Errorf("CheckLoginInfo Failed. partnerId:%d, userId:%s, loginInfo:%s, err:%s", partnerId, userId, loginInfo, err1)
return
}
if statusCode != 200 {
err = fmt.Errorf("CheckLoginInfo Failed. partnerId:%d, userId:%s, loginInfo:%s, statusCode:%d", partnerId, userId, loginInfo, statusCode)
return
}
// 解析返回值
returnObj := new(ReturnObject)
if err = json.Unmarshal(returnBytes, &returnObj); err != nil {
err = fmt.Errorf("CheckLoginInfo Failed. partnerId:%d, userId:%s, loginInfo:%s, err:%s", partnerId, userId, loginInfo, err)
return
}
// 判断返回状态是否为成功
if returnObj.Code != 0 {
logUtil.ErrorLog(fmt.Sprintf("CheckLoginInfo Failed. partnerId:%d, userId:%s, loginInfo:%s, Code:%d, Message:%s", partnerId, userId, loginInfo, returnObj.Code, returnObj.Message))
return
}
success = true
return
}
// 本地验证登陆信息
// partnerId:合作商Id
// userId:合作商用户Id
// loginInfo:登陆信息
// 返回值:
// 成功与否
// 错误对象
func CheckDynamicTokenLocal(partnerId int32, userId, loginInfo string) (success bool, err error) {
//1001直接返回true
if partnerId == 1001 {
return true, nil
}
//非1001渠道验证
if len(loginInfo) == 0 {
success = false
err = fmt.Errorf("Err:%s", "LoginInfo is null!")
return
}
// 验证用户合法性
loginItemList := strings.Split(loginInfo, "_")
if len(loginItemList) != 2 {
success = false
err = fmt.Errorf("CheckLoginInfo Failed. userId:%s, loginInfo:%s", userId, loginInfo)
return
}
//生成key
localSign := securityUtil.Md5String(userId+GetSysConfig().DynamicLoginKey+loginItemList[1], true)
//判断签名是佛正确
if localSign != loginItemList[0] {
success = false
err = fmt.Errorf("CheckLoginInfo Failed. Sign Check Failed! userId:%s,LocalSign:%s,loginInfo:%s", userId, localSign, loginInfo)
return
}
success = true
return
}
// ------------------类型定义和业务逻辑的分隔符-------------------------
var (
LoginUtilObj = new(LoginUtil)
)

View File

@@ -0,0 +1,155 @@
package gameServerMgr
import (
"crypto/tls"
"encoding/json"
"fmt"
"strconv"
. "Framework/managecenterModel"
"goutil/webUtil"
"goutil/zlibUtil"
)
// 区服激活地址后缀
const ActivateServer_URL_SUFFIX string = "/API/ServerActivate.ashx"
var (
mManageCenterServerAPIUrl string
mIsInit bool = true
)
// 解析从ManagecenterServer中获取的服务器相关数据
func ParseInfoFromManageCenterServer(serverGroupId int32, data string) {
var deserializedData map[string]interface{}
err := json.Unmarshal([]byte(data), &deserializedData)
if err != nil {
return
}
//解析服务器组
var serverGroup *ServerGroup
err = json.Unmarshal([]byte(deserializedData["ServerGroupInfo"].(string)), &serverGroup)
if err != nil {
return
}
//解析合作商
var partnerList []*Partner
err = json.Unmarshal([]byte(deserializedData["PartnerList"].(string)), &partnerList)
if err != nil {
return
}
//解析服务器列表
var serverList []*Server
err = json.Unmarshal([]byte(deserializedData["ServerList"].(string)), &serverList)
if err != nil {
return
}
//解析资源包
var resourceList []*ResourceVersion
err = json.Unmarshal([]byte(deserializedData["ResourceVersionList"].(string)), &resourceList)
if err != nil {
return
}
//解析大区
var areaList []*Area
err = json.Unmarshal([]byte(deserializedData["AreaList"].(string)), &areaList)
if err != nil {
return
}
//判断是否需要更新数据如果ServerGroupId不匹配则不解析数据
if serverGroupId != serverGroup.Id {
return
}
//缓存服务器组
ParseServerGroupInfo(serverGroup)
//缓存合作商
ParsePartnerInfo(partnerList)
//缓存合作商对应的充值配置
ParseChargeConfigInfo(partnerList)
//缓存服务器
ParseServerInfo(serverList)
//缓存资源包
ParseResourceVersionInfo(resourceList)
//缓存大区
ParseAreaInfo(areaList)
}
// 激活服务器
func ActiveServer(manageCenterServerAPIUrl string, serverGroupId int32) error {
if len(manageCenterServerAPIUrl) == 0 {
return fmt.Errorf("ManageCenterServerAPI地址不能为空")
}
mManageCenterServerAPIUrl = manageCenterServerAPIUrl
//定义参数
requestParamMap := make(map[string]string, 0)
requestParamMap["ServerGroupID"] = strconv.Itoa(int(serverGroupId))
//构造请求url
url := fmt.Sprintf("%s/%s", mManageCenterServerAPIUrl, ActivateServer_URL_SUFFIX)
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport.TLSClientConfig = &tls.Config{
InsecureSkipVerify: true, //关闭证书校验
}
transport = webUtil.GetTimeoutTransport(transport, 30)
statusCode, returnBytes, err := webUtil.PostMapData(url, requestParamMap, header, transport)
//statusCode, returnBytes, err := webUtil.PostMapData(url, requestParamMap, header, nil)
if err != nil {
return err
}
if statusCode != 200 {
return fmt.Errorf("StatusCode:%d", statusCode)
}
//解压缩
retBytes, err1 := zlibUtil.Decompress(returnBytes)
if err1 != nil {
return err1
}
// 解析返回值
returnObj := new(ReturnObject)
if err = json.Unmarshal(retBytes, &returnObj); err != nil {
return err
}
// 判断返回状态是否为成功
if returnObj.Code != 0 {
return fmt.Errorf("code:%d,Message:%s", returnObj.Code, returnObj.Message)
}
//解析得到的数据
ParseInfoFromManageCenterServer(serverGroupId, returnObj.Data.(string))
//获取白名单
GetWhiteListFromManageCenterServer()
//如果是初始化,则开启白名单刷新线程。避免游戏客户端刷新数据的时候重复开启线程
if mIsInit {
//启动白名单数据刷新线程
StartRefreshWhiteListTread()
//启动刷新MC系统配置
StartRefreshSysConfigTread()
//初始化修改为fasle
mIsInit = false
}
return nil
}

View File

@@ -0,0 +1,374 @@
package gameServerMgr
import (
"testing"
"time"
"goutil/timeUtil"
"goutil/typeUtil"
)
func TestActiveServer(t *testing.T) {
var managecenterUrl = "https://managecenterapitest-ds3.7qule.com/"
var serverGroupId int32 = 1000
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
}
func TestGetServerGroup(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//#region测试获取服务器组
serverGroup := GetServerGroup()
if serverGroup == nil {
t.Fatalf("获取服务器组[GetServerGroup]失败serverGroup = nil")
}
if serverGroup.Id != serverGroupId {
t.Fatalf("获取服务器组[GetServerGroup]失败,期望[%d],结果[%d]", serverGroupId, serverGroup.Id)
}
//#endregion
}
func TestGetDbConfig(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//#region测试获取服务器组
serverGroup := GetServerGroup()
if serverGroup == nil {
t.Fatalf("获取服务器组[GetServerGroup]失败serverGroup = nil")
}
if serverGroup.Id != serverGroupId {
t.Fatalf("获取服务器组[GetServerGroup]失败,期望[%d],结果[%d]", serverGroupId, serverGroup.Id)
}
//#endregion
//#region 测试获取数据库配置
/*
{
"GameDB": "DataSource=10.1.0.4;port=3306;UserId=admin;Password=MOQIkaka$#@!1234;Database=h5xh_player_master;Allow Zero Datetime=true;charset=utf8;pooling=true;MinimumPoolSize=20;maximumpoolsize=200;command timeout=60;",
"LogDB": "DataSource=10.1.0.4;port=3306;UserId=admin;Password=MOQIkaka$#@!1234;Database=h5xh_log_master;Allow Zero Datetime=true;charset=utf8;pooling=true;MinimumPoolSize=20;maximumpoolsize=200;command timeout=60;",
"GameModelDB": "DataSource=10.1.0.4;port=3306;UserId=admin;Password=MOQIkaka$#@!1234;Database=h5xh_model_master;Allow Zero Datetime=true;charset=utf8;pooling=true;MinimumPoolSize=10;maximumpoolsize=10;command timeout=60;"
}
*/
gameDb := "DataSource=10.1.0.4;port=3306;UserId=admin;Password=MOQIkaka$#@!1234;Database=h5xh_player_master;Allow Zero Datetime=true;charset=utf8;pooling=true;MinimumPoolSize=20;maximumpoolsize=200;command timeout=60;"
logDb := "DataSource=10.1.0.4;port=3306;UserId=admin;Password=MOQIkaka$#@!1234;Database=h5xh_log_master;Allow Zero Datetime=true;charset=utf8;pooling=true;MinimumPoolSize=20;maximumpoolsize=200;command timeout=60;"
modelDb := "DataSource=10.1.0.4;port=3306;UserId=admin;Password=MOQIkaka$#@!1234;Database=h5xh_model_master;Allow Zero Datetime=true;charset=utf8;pooling=true;MinimumPoolSize=10;maximumpoolsize=10;command timeout=60;"
dbConfig, err := serverGroup.GetDBConfig()
if err != nil {
t.Fatalf("获取服务器数据库配置[GetDBConfig]失败:%v", error)
}
if dbConfig.GameDB != gameDb {
t.Fatalf("获取服务器数据库配置[GetDBConfig]失败,GameDB,期望[%s],结果[%s]", gameDb, dbConfig.GameDB)
}
if dbConfig.LogDB != logDb {
t.Fatalf("获取服务器数据库配置[GetDBConfig]失败,LogDB,期望[%s],结果[%s]", logDb, dbConfig.LogDB)
}
if dbConfig.GameModelDB != modelDb {
t.Fatalf("获取服务器数据库配置[GetDBConfig]失败,GameModelDB,期望[%s],结果[%s]", modelDb, dbConfig.GameModelDB)
}
//#endregion
}
func TestGetServerItem(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var partnerId int32 = 1001
var serverGroupId int32 = 20001
var serverId = serverGroupId
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//#region测试获取服务器
serverItem, exists := GetServerItem(partnerId, serverId)
if !exists || serverItem == nil {
t.Fatalf("获取服务器[GetServerItem][%d]失败,PartnerId[%d],服务器不存在!", partnerId, serverId)
}
if serverItem.Id != serverId {
t.Fatalf("获取服务器[GetServerItem]失败,期望[%d],结果[%d]", serverId, serverItem.Id)
}
//#endregion
}
func TestGetServerName(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var partnerId int32 = 1001
var serverGroupId int32 = 20001
var serverId = serverGroupId
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//测试获取服务器名称
var expectServerName = "开发测试服"
serverName := GetServerName(partnerId, serverId)
if serverName != expectServerName {
t.Fatalf("获取服务器名称[GetServerName]失败,期望[%s],结果[%s]", expectServerName, serverName)
}
}
func TestIfServerExists(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var partnerId int32 = 1001
var serverGroupId int32 = 20001
var serverId = serverGroupId
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//测试服务器是否存在
if !IfServerExists(partnerId, serverId) {
t.Fatalf("判断服务器是否存在[IfServerExists]失败,PartnerId[%d],服务器[%d]不存在", partnerId, serverId)
}
}
func TestGetPartnerServerPairString(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//获取合作商、服务器的组合字符串
expectStr := "1001_20001|6666001_20001|"
partnerServerPairStr := GetPartnerServerPairString()
if expectStr != partnerServerPairStr {
t.Fatalf("获取合作商、服务器的组合字符串[GetPartnerServerPairString]失败,期望[%s],结果[%s]", expectStr, partnerServerPairStr)
}
}
func TestGetLoginKey(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var partnerId int32 = 1001
var serverGroupId int32 = 20001
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//#region测试获取登录密钥
var expectStr = "a0482eaf-14e8-4a65-950e-864214f62da5"
loginKey, exists := GetLoginKey(partnerId)
if !exists {
t.Fatalf("获取登录密钥[GetLoginKey]失败,未找到渠道[%d]配置", partnerId)
}
if expectStr != loginKey {
t.Fatalf("获取登录密钥[GetLoginKey]失败,期望[%s],结果[%s]", expectStr, loginKey)
}
//#endregion
}
func TestGetServerOpenDate(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//测试获取开服日期 2020/4/21 20:19:56
expectOpenDate := time.Date(2020, 4, 21, 20, 19, 56, 0, time.Local)
openTimeTick := GetServerOpenDate()
openDate, _ := typeUtil.DateTime(openTimeTick)
if openDate != expectOpenDate {
t.Fatalf("获取服务器开服日期[GetServerOpenDate]失败,期望[%s],结果[%s]", timeUtil.ToDateTimeString(expectOpenDate), timeUtil.ToDateTimeString(openDate))
}
}
func TestServerOpenDays(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//测试获取服务器开服天数
now := time.Now()
nowDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local)
expectOpenDate := time.Date(2020, 4, 21, 0, 0, 0, 0, time.Local)
expectOpenDays := int32(nowDate.Sub(expectOpenDate).Hours()/24) + 1
openDays := ServerOpenDays()
if expectOpenDays != openDays {
t.Fatalf("获取服务器开服天数[ServerOpenDays]失败,期望[%d],结果[%d]", expectOpenDays, openDays)
}
}
func TestCheckMaintainStatus(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var serverGroupId int32 = 20001
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//测试服务器维护检查
expectMsg := "维护中"
maintainMessage, isMaintaining := CheckMaintainStatus()
if isMaintaining && expectMsg != maintainMessage {
t.Fatalf("服务器维护检查[CheckMaintainStatus]失败,期望维护消息[%s],结果维护消息[%s]", expectMsg, maintainMessage)
}
}
func TestCheckNewGameVersion(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var partnerId int32 = 1001
var serverGroupId int32 = 20001
var serverId = serverGroupId
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//#region 测试检查是否有新版本
var gameVersionId int32 = 55 //老版本
var expectGameVersionUrl = "testUrl" //已配置的游戏版本地址IOS用
gameVersionUrl, exist := CheckNewGameVersion(partnerId, serverId, gameVersionId)
if !exist {
t.Fatalf("检查是否有新版本[CheckNewGameVersion]失败,未找到渠道[%d]配置或检查版本[%d]失败", partnerId, gameVersionId)
} else if gameVersionUrl != expectGameVersionUrl {
t.Fatalf("检查是否有新版本[CheckNewGameVersion]失败,期望版本地址[%s],结果版本地址[%s]", expectGameVersionUrl, gameVersionUrl)
}
gameVersionId = 100 //当前版本
_, exist = CheckNewGameVersion(partnerId, serverId, gameVersionId)
if exist {
t.Fatalf("检查是否有新版本[CheckNewGameVersion]失败,渠道[%d],版本[%d]不应有更新", partnerId, gameVersionId)
}
//#endregion
}
func TestCheckNewResourceVersion(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var partnerId int32 = 1001
var serverGroupId int32 = 20001
var serverId = serverGroupId
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//#region 测试检查新资源版本
partnerId = 6666001
var gameVersionId int32 = 100
resourceVersionName := "1587372891_9eab40313feec913cace0adf0fe05341" //非最新资源版本号
_, exist := CheckNewResourceVersion(partnerId, serverId, gameVersionId, resourceVersionName)
if !exist {
t.Fatalf("检查新资源版本[CheckNewResourceVersion]失败,渠道[%d],服务器[%d],游戏版本Id[%d],资源版本号[%s],应有更新!", partnerId, serverId, gameVersionId, resourceVersionName)
}
gameVersionId = 100
resourceVersionName = "1587374043_cee48a8611276d3e3450782a1585c1a3" //最新资源版本号
_, exist = CheckNewResourceVersion(partnerId, serverId, gameVersionId, resourceVersionName)
if exist {
t.Fatalf("检查新资源版本[CheckNewResourceVersion]失败,渠道[%d],服务器[%d],游戏版本Id[%d],资源版本号[%s],不应有更新!", partnerId, serverId, gameVersionId, resourceVersionName)
}
gameVersionId = 123456 //不存在的游戏版本
resourceVersionName = "1587374043_cee48a8611276d3e3450782a1585c1a3"
_, exist = CheckNewResourceVersion(partnerId, serverId, gameVersionId, resourceVersionName)
if exist {
t.Fatalf("检查新资源版本[CheckNewResourceVersion]失败,渠道[%d],服务器[%d],游戏版本Id[%d],资源版本号[%s],不应有更新!", partnerId, serverId, gameVersionId, resourceVersionName)
}
//#endregion
}
func TestIsInWhiteList(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var partnerId int32 = 1001
var serverGroupId int32 = 20001
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//测试白名单
partnerId = 1001
var userId = "446bfd6ccccd4229aa295686f9e5855b" //已配置的白名单用户Id
if !IsInWhiteList(partnerId, userId) {
t.Fatalf("检查是否用户在白名单中[IsInWhiteList]失败,渠道[%d],UserId[%s]", partnerId, userId)
}
}
// 测试获取服务器组
func TestGetOtherConfigInfo(t *testing.T) {
var managecenterUrl = "http://managecenterapitest-xxx.79yougame.com/"
var partnerId int32 = 1001
var serverGroupId int32 = 20001
//激活器服务器,获取mc配置
error := ActiveServer(managecenterUrl, serverGroupId)
if error != nil {
t.Fatalf("激活服务器出现错误:%v", error)
}
//#region测试获取其他配置
var configKey = "AppKey"
var expectConfigValue = "a0482eaf-14e8-4a65-950e-864214f62da5" //已配置的配置值
configValue, exist, error := GetOtherConfigInfo(partnerId, configKey)
if error != nil {
t.Fatalf("获取渠道其他配置[GetOtherConfigInfo]失败,渠道[%d],ConfigKey[%s]", partnerId, configKey)
}
if !exist {
t.Fatalf("获取渠道其他配置[GetOtherConfigInfo]失败,渠道[%d],ConfigKey[%s],渠道或配置不存在!", partnerId, configKey)
}
if configValue != expectConfigValue {
t.Fatalf("获取渠道其他配置[GetOtherConfigInfo]失败,期望[%s],结果[%s]", expectConfigValue, configValue)
}
//#endregion
}

View File

@@ -0,0 +1,60 @@
package gameServerMgr
import (
. "Framework/managecenterModel"
)
var (
mPartnerMap = make(map[int32]*Partner, 0)
)
//解析合作商信息
func ParsePartnerInfo(partnerList []*Partner) {
tmpPartnerMap := make(map[int32]*Partner, 0)
//循环解析所有合作商信息
for _, partner := range partnerList {
tmpPartnerMap[partner.Id] = partner
}
mPartnerMap = tmpPartnerMap
}
//根据渠道id获取渠道对象
func GetPartnerItem(partnerId int32) (partner *Partner, exist bool) {
//判断渠道是否存在
partner, exist = mPartnerMap[partnerId]
return
}
//获取渠道的登录加密key
func GetLoginKey(partnerId int32) (loginKey string, exist bool) {
partnerObj, exist := mPartnerMap[partnerId]
if !exist {
return
}
loginKey = partnerObj.LoginKey
return
}
//根据渠道和key获取其他配置
func GetOtherConfigInfo(partnerId int32, configKey string) (configValue string, exist bool, err error) {
partnerObj, exist := GetPartnerItem(partnerId)
if !exist {
return
}
var otherConfigMap map[string]string
otherConfigMap, err = partnerObj.ResolveOtherConfig()
if err != nil {
return
}
configValue, exist = otherConfigMap[configKey]
return
}

View File

@@ -0,0 +1,57 @@
package gameServerMgr
import (
. "Framework/managecenterModel"
)
var (
mResourceVersionLit = make([]*ResourceVersion, 0)
)
// 解析资源版本信息
func ParseResourceVersionInfo(resourceVersionList []*ResourceVersion) {
mResourceVersionLit = resourceVersionList
}
//返回所有的资源包列表
func GetResourceVersionList() (resourceVersionList []*ResourceVersion) {
resourceVersionList = mResourceVersionLit
return
}
//检测资源
func CheckNewResourceVersion(partnerId, serverId, gameVersionId int32, resourceVersionName string) (availableResourceVersionMap map[string]interface{}, exist bool) {
_, exist = GetServerItem(partnerId, serverId)
if !exist {
return
}
//获取服务所在大区Id
areaId := GetAreaIdByGroupId(serverId)
//获取大区的资源列表
var tempResourceVersionList []*ResourceVersion
for _, resourceVerion := range mResourceVersionLit {
if resourceVerion.AreaID == areaId {
tempResourceVersionList = append(tempResourceVersionList, resourceVerion)
}
}
//获取服务器
serverGroup := GetServerGroup()
//获取资源版本列表
availableResourceVersionMap = GetAvailableResource(tempResourceVersionList, partnerId, gameVersionId, resourceVersionName, OfficialOrTest(serverGroup.OfficialOrTest))
//检测是否有新资源
if len(availableResourceVersionMap) != 0 && availableResourceVersionMap["IsNewResource"] == true {
exist = true
return
}
exist = false
return
}

View File

@@ -0,0 +1,166 @@
package gameServerMgr
import (
"fmt"
. "Framework/managecenterModel"
)
var (
mServerMap = make(map[int32][]*Server, 0)
)
//合作商、服务器组合列表
type PartnerServer struct {
//合作商Id
mPartnerId int32
//服务器Id
mServerId int32
}
//解析服务器信息
func ParseServerInfo(serverList []*Server) {
tempServerMap := make(map[int32][]*Server, 0)
for _, server := range serverList {
_, exist := tempServerMap[server.PartnerId]
if !exist {
tempServerMap[server.PartnerId] = make([]*Server, 0)
}
tempServerMap[server.PartnerId] = append(tempServerMap[server.PartnerId], server)
}
mServerMap = tempServerMap
}
//获取服务器对象
func GetServerItem(partnerId, serverId int32) (server *Server, exist bool) {
serverList, existServer := mServerMap[partnerId]
if !existServer {
return
}
for _, serverItem := range serverList {
if serverItem.Id == serverId {
server = serverItem
exist = true
break
}
}
return
}
//判断服务器是否存在
func IfServerExists(partnerId, serverId int32) (exists bool) {
_, exists = GetPartnerItem(partnerId)
if !exists {
return
}
_, exists = GetServerItem(partnerId, serverId)
if !exists {
return
}
return
}
//获取服务器名称
func GetServerName(partnerId, serverId int32) (serverName string) {
_, existPartner := GetPartnerItem(partnerId)
if !existPartner {
return
}
server, existServer := GetServerItem(partnerId, serverId)
if !existServer {
return
}
serverName = server.Name
return
}
//检测是否有游戏版本更新
func CheckNewGameVersion(partnerId, serverId, gameVersionId int32) (gameVersionUrl string, exist bool) {
server, existServer := GetServerItem(partnerId, serverId)
if !existServer {
exist = existServer
return
}
if gameVersionId < server.MinGameVersionId {
partner, existPartner := GetPartnerItem(partnerId)
if !existPartner {
exist = existPartner
return
}
exist = true
gameVersionUrl = partner.GameVersionUrl
}
return
}
//获取合作商、服务器的组合字符串
//字符串格式PartnerId_ServerId|PartnerId_ServerId|
func GetPartnerServerPairString() (partnerServerPair string) {
for _, ps := range GetPartnerServerPairList() {
partnerServerPair += fmt.Sprintf("%d_%d|", ps.mPartnerId, ps.mServerId)
}
return
}
//获取合作商、服务器的组合列表
func GetPartnerServerPairList() (partnerServerList []*PartnerServer) {
for key := range mServerMap {
for _, server := range mServerMap[key] {
if server.GroupId == GetServerGroup().Id {
var ps *PartnerServer = &PartnerServer{server.PartnerId, server.Id}
partnerServerList = append(partnerServerList, ps)
}
}
}
return
}
// // 获取合作商、服务器的组合字符串
// // serverGroupId服务器组Id
// // 返回值
// // 合作商、服务器的组合字符串
// func (this *ManageCenterUtil) GetPartnerServerPairString(serverGroupId int32) string {
// var buf bytes.Buffer
// serverList := managecenterMgr.GetServerList(serverGroupId)
// for _, item := range serverList {
// buf.WriteString(fmt.Sprintf("%d_%d|", item.PartnerId, item.Id))
// }
// return buf.String()
// }
// // 是否是有效的合作商、服务器组合
// // partnerId合作商Id
// // serverId服务器Id
// // parnterServerPairString合作商、服务器的组合字符串,格式为:PartnerId_ServerId|PartnerId_ServerId|
// // 返回值
// // 是否有效
// func (this *ManageCenterUtil) IfValidPartnerServerPair(partnerId, serverId int32, parnterServerPairString string) bool {
// if parnterServerPairString == "" {
// return false
// }
// partnerServerPairStringList := strings.Split(parnterServerPairString, "|")
// if len(partnerServerPairStringList) == 0 {
// return false
// }
// // 获得玩家的合作商、服务器组合字符串
// partnerServerPair := fmt.Sprintf("%d_%d", partnerId, serverId)
// // 遍历寻找
// for _, item := range partnerServerPairStringList {
// if item == partnerServerPair {
// return true
// }
// }
// return false
// }

View File

@@ -0,0 +1,79 @@
package gameServerMgr
import (
"time"
. "Framework/managecenterModel"
"goutil/timeUtil"
"goutil/typeUtil"
)
var (
mServerGroupObj *ServerGroup
)
//解析服务器组信息
func ParseServerGroupInfo(serverGroupObj *ServerGroup) {
mServerGroupObj = serverGroupObj
}
//获取服务器组对象
func GetServerGroup() (serverGroupObj *ServerGroup) {
serverGroupObj = mServerGroupObj
return
}
//检查服务器是否在维护
func CheckMaintainStatus() (maintainMessage string, isMaintaining bool) {
serverGroupObj := GetServerGroup()
nowTick := time.Now().Unix()
if serverGroupObj.GroupState == int32(Con_GroupState_Maintain) || (serverGroupObj.MaintainBeginTimeTick <= nowTick && nowTick <= serverGroupObj.MaintainBeginTimeTick+int64(60*serverGroupObj.MaintainMinutes)) {
maintainMessage = serverGroupObj.MaintainMessage
isMaintaining = true
return
}
return
}
//获取服务器维护开始时间时间戳
func GetMaintainBeginTime() (maintainBeginTimeTick int64) {
serverGroupObj := GetServerGroup()
maintainBeginTimeTick = serverGroupObj.MaintainBeginTimeTick
return
}
//获取服务器维护持续时间 单位分钟
func GetMaintainMinutes() (maintainMinutes int32) {
serverGroupObj := GetServerGroup()
maintainMinutes = serverGroupObj.MaintainMinutes
return
}
//获取服务器开服日期 时间戳
func GetServerOpenDate() (openTimeTick int64) {
serverGroupObj := GetServerGroup()
openTimeTick = serverGroupObj.OpenTimeTick
return
}
//当前服务器已开服天数(开服第几天)
//当前开服天数 计算公式:(当前日期 - 开服日期)的总天数 + 1
func ServerOpenDays() (days int32) {
serverGroupObj := GetServerGroup()
if serverGroupObj.IsOpen() == false {
return 0
}
//(当前日期 - 开服日期)的总天数 + 1
openTimeTick := serverGroupObj.OpenTimeTick
openDate, _ := typeUtil.DateTime(openTimeTick)
days = int32(timeUtil.SubDay(time.Now(), openDate) + 1)
return
}

View File

@@ -0,0 +1,57 @@
package gameServerMgr
import (
"encoding/json"
"fmt"
"strconv"
. "Framework/managecenterModel"
"goutil/logUtil"
"goutil/webUtil"
)
//修改区服注册人数
func UpdateRegisterCount(serverGroupId, registerCount int32) (err error, success bool) {
success = false
//定义参数
requestParamMap := make(map[string]string, 0)
requestParamMap["ServerGroupId"] = strconv.Itoa(int(serverGroupId))
requestParamMap["Registrations"] = strconv.Itoa(int(registerCount))
//构造请求url
url := fmt.Sprintf("%s/%s", mManageCenterServerAPIUrl, "/API/RegistrationUpdate.ashx")
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 30)
statusCode, returnBytes, err := webUtil.PostMapData(url, requestParamMap, header, transport)
//statusCode, returnBytes, err := webUtil.PostMapData(url, requestParamMap, header, nil)
if err != nil {
return
}
if statusCode != 200 {
err = fmt.Errorf("StatusCode:%d", statusCode)
return
}
// 解析返回值
returnObj := new(ReturnObject)
if err = json.Unmarshal(returnBytes, &returnObj); err != nil {
logUtil.ErrorLog(fmt.Sprintf("更新区服注册人数出错,反序列化返回值出错,错误信息为:%s, str:%s", err, string(returnBytes)))
return
}
// 判断返回状态是否为成功
if returnObj.Code != 0 {
err = fmt.Errorf("更新区服注册人数出错,返回状态:%d信息为%s", returnObj.Code, returnObj.Message)
logUtil.ErrorLog(fmt.Sprintf("更新区服注册人数出错,返回状态:%d信息为%s", returnObj.Code, returnObj.Message))
return
}
success = true
return
}

View File

@@ -0,0 +1,105 @@
package gameServerMgr
import (
"encoding/json"
"errors"
"fmt"
"time"
"Framework/goroutineMgr"
. "Framework/managecenterModel"
"goutil/logUtil"
"goutil/webUtil"
)
const SYSCONF_URL_SUFFIX string = "/API/SysConfig.ashx"
var (
mSysConfig *SysConfig
)
// 获取MC系统配置
func GetSysConfigFromManageCenterServer() error {
//定义参数
requestParamMap := make(map[string]string, 0)
requestParamMap["IsResultCompressed"] = "false"
//构造url
url := fmt.Sprintf("%s/%s", mManageCenterServerAPIUrl, SYSCONF_URL_SUFFIX)
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 30)
statusCode, returnBytes, err := webUtil.PostMapData(url, requestParamMap, header, transport)
//statusCode, returnBytes, err := webUtil.PostMapData(url, requestParamMap, header, nil)
if err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取MC系统配置出错url:%s,错误信息为:%s", url, err))
return err
}
if statusCode != 200 {
logUtil.ErrorLog(fmt.Sprintf("获取MC系统配置出错url:%s,错误码为:%d", url, statusCode))
return err
}
// 解析返回值
returnObj := new(ReturnObject)
if err = json.Unmarshal(returnBytes, &returnObj); err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取MC系统配置出错反序列化返回值出错错误信息为%s, str:%s", err, string(returnBytes)))
return err
}
// 判断返回状态是否为成功
if returnObj.Code != 0 {
// 数据没有变化,所以没有获取到新的数据,不能算错误。
if returnObj.Code == 47 || returnObj.Message == "DataNotChanged" {
return nil
} else {
msg := fmt.Sprintf("获取MC系统配置出错返回状态%d信息为%s", returnObj.Code, returnObj.Message)
logUtil.ErrorLog(msg)
return errors.New(msg)
}
}
// 解析Data
var tmpSysConfig *SysConfig
if data, ok := returnObj.Data.(string); !ok {
msg := "获取MC系统配置出错返回的数据不是string类型"
logUtil.ErrorLog(msg)
return errors.New(msg)
} else {
if err = json.Unmarshal([]byte(data), &tmpSysConfig); err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取MC系统配置出错出错反序列化数据出错错误信息为%s", err))
return err
}
}
// 赋值给最终的sysconfig
mSysConfig = tmpSysConfig
return nil
}
// 定时刷新MC系统配置
func StartRefreshSysConfigTread() {
// 定时刷新数据
go func() {
goroutineName := "gameServerMgr.StartRefreshSysConfigTread"
goroutineMgr.Monitor(goroutineName)
defer goroutineMgr.ReleaseMonitor(goroutineName)
for {
// 每30秒刷新一次
time.Sleep(30 * time.Second)
// MC系统配置
GetSysConfigFromManageCenterServer()
}
}()
}
// 获取系统配置
func GetSysConfig() *SysConfig {
return mSysConfig
}

View File

@@ -0,0 +1,124 @@
package gameServerMgr
import (
"encoding/json"
"errors"
"fmt"
"time"
"Framework/goroutineMgr"
. "Framework/managecenterModel"
"goutil/logUtil"
"goutil/webUtil"
)
const URL_SUFFIX string = "/API/UserWhiteList.ashx"
var (
mUserWhiteListMap = make(map[int32]map[string]*WhiteList, 0)
mHashValue string
)
// 获取白名单
func GetWhiteListFromManageCenterServer() error {
//定义参数
requestParamMap := make(map[string]string, 0)
requestParamMap["HashValue"] = mHashValue
//构造url
url := fmt.Sprintf("%s/%s", mManageCenterServerAPIUrl, URL_SUFFIX)
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 30)
statusCode, returnBytes, err := webUtil.PostMapData(url, requestParamMap, header, transport)
//statusCode, returnBytes, err := webUtil.PostMapData(url, requestParamMap, header, nil)
if err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取白名单列表出错url:%s,错误信息为:%s", url, err))
return err
}
if statusCode != 200 {
logUtil.ErrorLog(fmt.Sprintf("获取白名单列表出错url:%s,错误码为:%d", url, statusCode))
return err
}
// 解析返回值
returnObj := new(ReturnObject)
if err = json.Unmarshal(returnBytes, &returnObj); err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取白名单列表出错,反序列化返回值出错,错误信息为:%s, str:%s", err, string(returnBytes)))
return err
}
// 判断返回状态是否为成功
if returnObj.Code != 0 {
// 数据没有变化,所以没有获取到新的数据,不能算错误。
if returnObj.Code == 47 || returnObj.Message == "DataNotChanged" {
return nil
} else {
msg := fmt.Sprintf("获取白名单列表出错,返回状态:%d信息为%s", returnObj.Code, returnObj.Message)
logUtil.ErrorLog(msg)
return errors.New(msg)
}
}
// 解析Data
var tmpWhiteList []*WhiteList
if data, ok := returnObj.Data.(string); !ok {
msg := "获取白名单列表出错返回的数据不是string类型"
logUtil.ErrorLog(msg)
return errors.New(msg)
} else {
if err = json.Unmarshal([]byte(data), &tmpWhiteList); err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取白名单列表出错,反序列化数据出错,错误信息为:%s", err))
return err
}
}
tmpWhiteListMap := make(map[int32]map[string]*WhiteList, 64)
for _, item := range tmpWhiteList {
if _, exist := tmpWhiteListMap[item.PartnerId]; !exist {
tmpWhiteListMap[item.PartnerId] = make(map[string]*WhiteList, 8)
}
tmpWhiteListMap[item.PartnerId][item.UserId] = item
}
// 赋值给最终的whiteListMap
mUserWhiteListMap = tmpWhiteListMap
mHashValue = returnObj.HashValue
return nil
}
// 判断用户是否在白名单里面
// partnerId: 合作商ID
// userId: userId
func IsInWhiteList(partnerId int32, userId string) bool {
subWhiteListMap, exist := mUserWhiteListMap[partnerId]
if !exist {
return false
}
_, exist = subWhiteListMap[userId]
return exist
}
// 定时刷新白名单
func StartRefreshWhiteListTread() {
// 定时刷新数据
go func() {
goroutineName := "gameServerMgr.StartRefreshWhiteListTread"
goroutineMgr.Monitor(goroutineName)
defer goroutineMgr.ReleaseMonitor(goroutineName)
for {
// 每30秒刷新一次
time.Sleep(30 * time.Second)
// 刷新白名单
GetWhiteListFromManageCenterServer()
}
}()
}