|
|
@@ -12,6 +12,8 @@ interface CDKData {
|
|
|
code : string, // json字符串
|
|
|
}
|
|
|
|
|
|
+let CDKCache:Map<string,number> = new Map()
|
|
|
+
|
|
|
const code:string[] = ["0","c","e","u","m",
|
|
|
"k","d","7","x","f",
|
|
|
"9","j","w","6","8",
|
|
|
@@ -51,7 +53,7 @@ function transNumber(num:number):[number,number,number]{
|
|
|
}
|
|
|
|
|
|
function calcNumber(first:number,second:number,third:number) {
|
|
|
- if (first == undefined || second == undefined || third == undefined) {
|
|
|
+ if (first === undefined || second === undefined || third === undefined) {
|
|
|
return -1
|
|
|
}
|
|
|
if (first > unit || second > unit || third > unit) {
|
|
|
@@ -86,7 +88,7 @@ function decodeCDK(code:string):[boolean,number,number] {
|
|
|
if (idx < 0 ) {
|
|
|
return [false,0,0]
|
|
|
}
|
|
|
- let batch = calcNumber(codeMap.get[code[7]],codeMap.get(code[5]),codeMap.get(code[6]))
|
|
|
+ let batch = calcNumber(codeMap.get(code[7]),codeMap.get(code[5]),codeMap.get(code[6]))
|
|
|
if (batch < 0) {
|
|
|
return [false,0,0]
|
|
|
}
|
|
|
@@ -118,10 +120,10 @@ class CDK {
|
|
|
return await pipeline.exec()
|
|
|
}
|
|
|
|
|
|
- async getCDK(ctx,batch:number){
|
|
|
+ async getCDK(ctx,batch:number){
|
|
|
const redisClient = ctx.redis.client;
|
|
|
let curBatch = await redisClient.get(redis_batch_incr)
|
|
|
- if (curBatch < batch) {
|
|
|
+ if (Number(curBatch) < batch) {
|
|
|
return ""
|
|
|
}
|
|
|
let batch_info_key = redis_cdk_batch + batch
|
|
|
@@ -136,13 +138,14 @@ class CDK {
|
|
|
})*/
|
|
|
let cdkdata : CDKData = {
|
|
|
batch:batch_info,
|
|
|
- code: JSON.stringify(ret)
|
|
|
+ code: ret
|
|
|
}
|
|
|
return JSON.stringify(cdkdata)
|
|
|
}
|
|
|
|
|
|
async getCDKItemList(ctx,code:string) {
|
|
|
- const redisClient = ctx.redis.client;
|
|
|
+ logger.info(`收到cdk is :${code}`)
|
|
|
+ const redisClient = ctx.redis.client
|
|
|
let [ok,batch,index] = decodeCDK(code)
|
|
|
if (!ok) {
|
|
|
return ""
|
|
|
@@ -152,15 +155,43 @@ class CDK {
|
|
|
if (batch_info_ret == undefined || batch_info_ret == null ) {
|
|
|
return ""
|
|
|
}
|
|
|
- let batch_info = batch_info_ret as CDKInfo
|
|
|
- return batch_info.itenList
|
|
|
+ return batch_info_ret
|
|
|
+ }
|
|
|
+
|
|
|
+ async useCDK(ctx,code:string) {
|
|
|
+ logger.info(` checkCDK 收到cdk is :${code}`)
|
|
|
+ let [ok,batch,index] = decodeCDK(code)
|
|
|
+ if (!ok) {
|
|
|
+ return "invalid code"
|
|
|
+ }
|
|
|
+ const redisClient = ctx.redis.client;
|
|
|
+ let cdk_hset_key = redis_cdk + batch
|
|
|
+ // 必须保持原子性,只能用eval
|
|
|
+ let evalStr = `
|
|
|
+ local cdk = redis.call('hget',KEYS[1],KEYS[2])
|
|
|
+ if not cdk then
|
|
|
+ return -1
|
|
|
+ end
|
|
|
+ redis.call('hdel',KEYS[1],KEYS[2])
|
|
|
+ return 0
|
|
|
+ `
|
|
|
+ let ret = await redisClient.eval(evalStr,2,cdk_hset_key,code)
|
|
|
+ if (ret == -1) {
|
|
|
+ return 'cdk not found'
|
|
|
+ }
|
|
|
+ return "success"
|
|
|
}
|
|
|
|
|
|
async checkCDK(ctx,code:string,serverId : number) {
|
|
|
+ logger.info(` checkCDK 收到cdk is :${code}`)
|
|
|
let [ok,batch,index] = decodeCDK(code)
|
|
|
if (!ok) {
|
|
|
return "invalid code"
|
|
|
}
|
|
|
+ let time = CDKCache.get(code)
|
|
|
+ if (time != undefined && time > Date.now()) {
|
|
|
+ return "invalid code"
|
|
|
+ }
|
|
|
const redisClient = ctx.redis.client;
|
|
|
// 先判断是否满足batch
|
|
|
let batch_info_key = redis_cdk_batch + batch
|
|
|
@@ -168,7 +199,8 @@ class CDK {
|
|
|
if (batch_info_ret == undefined || batch_info_ret == null ) {
|
|
|
return "batch not found"
|
|
|
}
|
|
|
- let batch_info = batch_info_ret as CDKInfo
|
|
|
+ let batch_info = JSON.parse(batch_info_ret) as CDKInfo
|
|
|
+
|
|
|
let jsonret = JSON.parse(batch_info.serverList)
|
|
|
let serverList = jsonret as number[]
|
|
|
let isServer = false
|
|
|
@@ -185,16 +217,16 @@ class CDK {
|
|
|
// 必须保持原子性,只能用eval
|
|
|
let evalStr = `
|
|
|
local cdk = redis.call('hget',KEYS[1],KEYS[2])
|
|
|
- if not ckd then
|
|
|
+ if not cdk then
|
|
|
return -1
|
|
|
end
|
|
|
- redis.call('hdel',KEYS[1],KEYS[2])
|
|
|
return 0
|
|
|
`
|
|
|
let ret = await redisClient.eval(evalStr,2,cdk_hset_key,code)
|
|
|
if (ret == -1) {
|
|
|
return 'cdk not found'
|
|
|
}
|
|
|
+ CDKCache.set(code,Date.now() + 2000)
|
|
|
return "success"
|
|
|
}
|
|
|
}
|