lt 6 months ago
parent
commit
41bd927fe4

+ 1 - 0
RO_Server_Trunk-branch_0.1.39/rocommon/service/yamlconfig.go

@@ -106,6 +106,7 @@ type configServerDB struct {
 	Password     string   `yaml:"password"`
 	DBIndex      int      `yaml:"dbindex"`
 	DBIndex2     int      `yaml:"dbindex2"`
+	DBIndex3     int      `yaml:"dbindex3"`
 	MysqlAddr    string   `yaml:"mysqladdr"`
 	RedisCluster int      `yaml:"cluster"`
 }

+ 33 - 0
RO_Server_Trunk-branch_0.1.39/roserver/baseserver/model/base_config.go

@@ -47,6 +47,8 @@ func BaseConfigInit(sConfig service.ConfigServerNode) {
 		//添加到热更新列表中
 		serverproto.CFGNameList["AdvertisingScreen"] = serverproto.AdvertisingScreenLoad
 		serverproto.CFGNameList["CombinedServiceCfg"] = serverproto.CombinedServiceCfgLoad
+		serverproto.CdkCfgLoad(path + "csv/")
+		convertCdkRewardCfg() //cdk
 
 	case SERVICE_NODE_TYPE_RANK: //rank
 		serverproto.CompetitionCfgLoad(path + "csv/")
@@ -3559,6 +3561,37 @@ func convertTowerWjCfg() {
 	}
 }
 
+type CdkRewardData struct {
+	Id         int32
+	RewardList []*serverproto.KeyValueType
+	Start      time.Time
+	End        time.Time
+	Total      int32
+}
+
+var ConvertCdkRewardMap map[string]*CdkRewardData //key 是code码
+
+func convertCdkRewardCfg() {
+	if ConvertCdkRewardMap == nil {
+		ConvertCdkRewardMap = make(map[string]*CdkRewardData, 0)
+	}
+	for _, val := range serverproto.CdkCfgLoader {
+		convertData := &CdkRewardData{
+			Id:         val.Id,
+			RewardList: []*serverproto.KeyValueType{},
+		}
+		loc := util.GetLoc()
+		StartTime, _ := time.ParseInLocation(util.DATE_FORMAT, val.StartTime, loc)
+		EndTime, _ := time.ParseInLocation(util.DATE_FORMAT, val.EndTime, loc)
+		convertData.Start = StartTime
+		convertData.End = EndTime
+		convertData.RewardList = Str2ResSliceList(val.Reward)
+		convertData.Total = val.Total
+		ConvertCdkRewardMap[val.Cdk] = convertData
+	}
+	//util.InfoF("cdk2 %v", ConvertCdkRewardMap)
+}
+
 type ConvertEvilBossData struct {
 	EvilLevel       int32
 	MaxFightingTime int32

+ 1 - 0
RO_Server_Trunk-branch_0.1.39/roserver/db/model/orm_helper.go

@@ -128,6 +128,7 @@ const (
 	RoleBTDataPrefix     = "role_bt_"
 	RoleBTBoliDataPrefix = "btboli"
 	RoleBTBaseDataPrefix = "base"
+	CdkNormal            = "cdk_normal" //非通码cdk
 )
 
 func ConfigInit() {

+ 11 - 0
RO_Server_Trunk-branch_0.1.39/roserver/gmweb/main.go

@@ -51,6 +51,16 @@ func main() {
 		}, sConfig)
 	}
 
+	msg.RedisCdk2 = service.NewNetRedisConnector(sConfig.Redis.RedisAddr,
+		sConfig.Redis.Password,
+		sConfig.Redis.DBIndex3,
+		sConfig.Redis.RedisCluster)
+	_, err := msg.RedisCdk2.RedisCli().Ping().Result()
+	if err != nil {
+		util.PanicF("New RedisConnector ping failed er=%v", err)
+		return
+	}
+
 	for _, concern := range sConfig.Node.Concern {
 		//建立需要链接的服务器,可以通过服务器发现etcd来处理(包含在了CreateConnector中)
 		baseserver.CreateConnector(baseserver.ServiceParam{
@@ -116,6 +126,7 @@ func main() {
 		r1.GET("/delpoint", msg.WebGMDelPoint) //潜能果实删除
 		//r1.GET("/delitemall", msg.WebGMDelItemAll) //道具删除
 		//r1.GET("/delequip", msg.WebGMDelEquip)     //装备删除
+		r1.GET("/getcdk", msg.GetCdk) //生成指定数量的非通码cdk
 
 		//服务器维护通知
 		r1.GET("/maintain", msg.WebGMProcessServerMaintain)

+ 97 - 44
RO_Server_Trunk-branch_0.1.39/roserver/gmweb/msg/msg.go

@@ -6,13 +6,18 @@ import (
 	"rocommon/util"
 	"roserver/baseserver"
 	"roserver/baseserver/model"
+	dbmodel "roserver/db/model"
 	gmmodel "roserver/gmweb/model"
 	"roserver/serverproto"
 	"runtime/debug"
 	"strconv"
+	"time"
 )
 
-//other service
+const RoleCdkInfo = "cdk_info_"
+const CdkTotal = "cdk_Total_"
+
+// other service
 func init() {
 	//serverproto.Handle_GMWEB_SSWebGMAddMailAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
 	//	msg := ev.Msg().(*serverproto.SSWebGMAddMailAck)
@@ -27,62 +32,110 @@ func init() {
 
 		//model2.GetMailUpdateMag().AttachMail2Update()
 
-		uuid := msg.Uuid
-		uidStr := strconv.FormatUint(uuid, 10)
-		zoneStr := strconv.Itoa(service.GetServiceConfig().Node.Zone)
-		urlPath := "?code=" + msg.GiftCode + "&uid=" + uidStr + "&serverid=" + zoneStr
-		go func() {
+		//uuid := msg.Uuid
+		//uidStr := strconv.FormatUint(uuid, 10)
+		//zoneStr := strconv.Itoa(service.GetServiceConfig().Node.Zone)
+		//urlPath := "?code=" + msg.GiftCode + "&uid=" + uidStr + "&serverid=" + zoneStr
+		go func(code string, uuid uint64) {
 			defer func() {
 				//打印奔溃信息
 				if err := recover(); err != nil {
 					util.InfoF("onError data=%v \n%s\n", err, string(debug.Stack()))
 				}
 			}()
+			uidStr := strconv.FormatUint(uuid, 10)
+			res := &serverproto.SCGiftRewardAck{
+				Uuid: uuid,
+			}
+			//非通码
+			if len(code) == length {
+				award, err := RedisCdk2.RedisCli().HGet(dbmodel.CdkNormal, code).Result()
+				if err != nil {
+					res.Error = 3
+					util.ErrorF("uid:%v cdk get is nil,code:%v error:%v", uuid, code, err)
+					gmmodel.SendSocial(res)
+				}
+				a := &serverproto.SCUseHeadFrameItemAck{
+					ItemList: make([]*serverproto.KeyValueType, 0),
+				}
+				err = model.GetDecodeMessage(a, award)
+				if err != nil {
+					res.Error = 3
+					util.ErrorF("uid:%v cdk unmarshall error,%v", uuid, err)
+					gmmodel.SendSocial(res)
+				}
+				_, err = RedisCdk2.RedisCli().HDel(dbmodel.CdkNormal, code).Result()
+				if err != nil {
+					res.Error = 3
+					util.ErrorF("uid:%v cdk del error,code:%v error:%v", uuid, code, err)
+					gmmodel.SendSocial(res)
+				}
+				util.ErrorF("uid:%v cdk get:%v", uuid, code)
+				res.RewardList = a.ItemList
+			} else {
+				//util.InfoF("aaaa:%v", model.ConvertCdkRewardMap)
+				if _, ok := model.ConvertCdkRewardMap[code]; !ok {
+					res.Error = 3
+					util.ErrorF("uid:%v cdk get config is nil,%v", uuid, model.ConvertCdkRewardMap)
+					gmmodel.SendSocial(res)
+					return
+				}
+				v := model.ConvertCdkRewardMap[code]
+				if v == nil {
+					util.ErrorF("uid:%v cdk get config is nil", uuid)
+					res.Error = 3
+					gmmodel.SendSocial(res)
+					return
+				}
+				now := time.Now()
+				if now.Before(v.Start) || now.After(v.End) {
+					res.Error = 2
+					gmmodel.SendSocial(res)
+					return
+				}
+				if v.Total > 0 {
+					ker := CdkTotal + strconv.Itoa(int(v.Id))
+					num, _ := service.GetRedis().Incr(ker).Result()
+					if num >= int64(v.Total) {
+						res.Error = 1
+						gmmodel.SendSocial(res)
+						return
+					}
+				}
 
-			tmpRequest := &rocommon.HTTPRequest{}
-			tmpRequest.ReqCodecName = "httpjson"
-			//tmpRequest.ReqMsg = OpenIdServeNode{
-			//	ServerId:   zoneId,
-			//	HeadId:     headId,
-			//	Level:      level, //默认1级
-			//	RecordTime: uint32(util.GetTimeSeconds()),
-			//}
-
-			tmpRequest.ResMsg = &gmmodel.GiftSt{}
-			parm := gmmodel.GetHttpNodeParam()
-			httpNode := baseserver.CreateHttpConnector(parm)
-			err := httpNode.(rocommon.HTTPConnector).Request("GET", urlPath, tmpRequest)
-			if err != nil {
-				util.InfoF("uid=%v http Request err=%v", uidStr, err)
-				ackMsg := &serverproto.SCGiftRewardAck{
-					Error: int32(serverproto.ErrorCode_ERROR_GIFT_CODE_USE_FAIL),
-					Uuid:  uuid,
+				key := RoleCdkInfo + strconv.FormatUint(uuid, 10)
+				field := strconv.FormatInt(int64(v.Id), 10)
+				b, err := service.GetRedis().HExists(key, field).Result()
+				if err != nil {
+					util.ErrorF("uid:%v cdk get redis err:%v", uuid, err)
+					res.Error = 3
+					gmmodel.SendSocial(res)
+					return
+				}
+				if b {
+					res.Error = 1
+					gmmodel.SendSocial(res)
+					return
+				}
+				res.RewardList = v.RewardList
+				_, er := service.GetRedis().HSet(key, field, "11").Result()
+				if er != nil {
+					util.ErrorF("uid:%v cdk set redis err:%v", uuid, err)
+					res.Error = 3
+					gmmodel.SendSocial(res)
+					return
 				}
-				gmmodel.SendSocial(ackMsg)
-				return
 			}
-
+			//this.GiftReward(res)
+			//util.InfoF("uid:%v cdk get reward:%v", this.GetUUid(), res.RewardList)
+			//this.ReplayGate(res, true)
 			//error
 			//1礼包吗已经使用
 			//2礼包吗已经过期
 			//3 没有找到礼包吗
-			util.InfoF("uid=%v CSGiftRewardReq msg=%v res=%v", uidStr, msg, tmpRequest.ResMsg)
-			ackMsg := &serverproto.SCGiftRewardAck{
-				Error: int32(tmpRequest.ResMsg.(*gmmodel.GiftSt).Error),
-				Uuid:  uuid,
-			}
-			if 0 == ackMsg.Error {
-				for _, data := range tmpRequest.ResMsg.(*gmmodel.GiftSt).Content {
-					itemId, _ := model.Str2Num(data.ItemId)
-					itemCount, _ := model.Str2Num(data.ItemCount)
-					ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{
-						Key:   int32(itemId),
-						Value: int32(itemCount),
-					})
-				}
-			}
-			gmmodel.SendSocial(ackMsg)
-		}()
+			util.InfoF("uid=%v CSGiftRewardReq msg=%v res=%v", uidStr, msg, res)
+			gmmodel.SendSocial(res)
+		}(msg.GiftCode, msg.Uuid)
 	})
 
 	serverproto.Handle_GMWEB_SSWebGMChatMsgNtf = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {

+ 85 - 0
RO_Server_Trunk-branch_0.1.39/roserver/gmweb/msg/web_gmmsg.go

@@ -3,7 +3,9 @@ package msg
 import (
 	"database/sql"
 	"encoding/base64"
+	"github.com/360EntSecGroup-Skylar/excelize"
 	"github.com/gin-gonic/gin"
+	"math/rand"
 	"net/http"
 	"rocommon"
 	"rocommon/service"
@@ -1061,6 +1063,89 @@ func WebGMDelItem(c *gin.Context) {
 	})
 }
 
+var RedisCdk2 service.RedisConnector
+
+func GetCdk(c *gin.Context) {
+	countStr := c.DefaultQuery("count", "")
+	awardStr := c.DefaultQuery("award", "")
+	if awardStr == "" {
+		c.JSON(http.StatusOK, "award error:"+awardStr)
+		return
+	}
+	count, e := strconv.Atoi(countStr)
+	if e != nil {
+		c.JSON(http.StatusOK, e)
+		return
+	}
+	var awardKV []*serverproto.KeyValueType
+	itemStrList := strings.Split(awardStr, ",")
+	for idx := 0; idx < len(itemStrList); idx++ {
+		k, v := model.Str2Res(itemStrList[idx])
+		if k <= 0 || v <= 0 {
+			continue
+		}
+		awardKV = append(awardKV, &serverproto.KeyValueType{Key: k, Value: v})
+	}
+	awardData := &serverproto.SCUseHeadFrameItemAck{}
+	awardData.ItemList = awardKV
+	err, a2 := model.GetEncodeMessage(awardData)
+	if err != nil {
+		c.JSON(http.StatusOK, err)
+		return
+	}
+	rand.Seed(time.Now().UnixNano())
+	f := excelize.NewFile()
+	sheetName := "Sheet1"
+	cdk := make(map[string]interface{}, 0)
+	for i := 0; i < count; i++ {
+		// 生成随机字符串
+		randomString := generateRandomString(length)
+		cdk[randomString] = a2
+		cellName, err := excelize.CoordinatesToCellName(1, i+1)
+		if err != nil {
+			c.JSON(http.StatusOK, err)
+			return
+		}
+
+		// 设置单元格的值
+		f.SetCellValue(sheetName, cellName, randomString)
+	}
+	util.InfoF("aaaa:%v", cdk)
+	_, err2 := RedisCdk2.RedisCli().HMSet(dbmodel.CdkNormal, cdk).Result()
+	if err2 != nil {
+		util.InfoF("aaaa3:%v", err2)
+		c.JSON(http.StatusOK, err2)
+		return
+	}
+	util.InfoF("aaaa2:%v", cdk)
+	// 保存文件
+	filePath := "cdkNormal.xlsx"
+	if err := f.SaveAs(filePath); err != nil {
+		c.JSON(http.StatusOK, err)
+		return
+	}
+	c.JSON(http.StatusOK, "cdk successful")
+}
+
+// 定义生成随机字符串的长度
+const length = 15
+
+func generateRandomString(length int) string {
+	// 定义可用的字符集(大写字母)
+	const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+
+	// 初始化一个字节切片来存储结果
+	result := make([]byte, length)
+
+	// 生成随机字符
+	for i := range result {
+		result[i] = charset[rand.Intn(len(charset))]
+	}
+
+	// 将字节切片转换为字符串并返回
+	return string(result)
+}
+
 // 删除背包内道具
 func WebGMDelPoint(c *gin.Context) {
 	uidStr := c.DefaultQuery("uid", "")