增加定时添加奖励的脚本
This commit is contained in:
parent
304640079e
commit
d608384ca3
@ -20,6 +20,7 @@
|
||||
"taskid": "ts-node -r tsconfig-paths/register src/generateTaskId.ts",
|
||||
"token": "ts-node -r tsconfig-paths/register src/generateToken.ts",
|
||||
"ingame": "ts-node -r tsconfig-paths/register src/fixIngame.ts",
|
||||
"reward": "ts-node -r tsconfig-paths/register src/rewardSchedule.ts",
|
||||
"testdraw": "ts-node -r tsconfig-paths/register src/testdraw.ts",
|
||||
"test:watch": "jest --watch",
|
||||
"test": "jest"
|
||||
|
@ -3,7 +3,6 @@ import { SyncLocker } from 'common/SyncLocker'
|
||||
import { formatNumShow } from 'common/Utils'
|
||||
import logger from 'logger/logger'
|
||||
import { join } from 'path'
|
||||
import { ActivityInfo } from 'models/ActivityInfo'
|
||||
import { ActivityUser } from 'models/ActivityUser'
|
||||
import { DrawRecord } from 'models/DrawRecord'
|
||||
import { InGameScoreRecord } from 'models/InGameScoreRecord'
|
||||
@ -186,7 +185,7 @@ class InGameController extends BaseController {
|
||||
let position: number[] = []
|
||||
const dateTag = formatDate(new Date())
|
||||
for (let i = 0; i < step; i++) {
|
||||
let reward = await drawOnce(user.inWhiteList)
|
||||
let reward = await drawOnce(user.id, user.inWhiteList)
|
||||
let record = new DrawRecord({
|
||||
user: user.id,
|
||||
score: 0,
|
||||
|
20
src/models/RewardRecrd.ts
Normal file
20
src/models/RewardRecrd.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose'
|
||||
import { dbconn } from 'decorators/dbconn'
|
||||
import { BaseModule } from './Base'
|
||||
|
||||
@dbconn()
|
||||
@index({ type: 1 }, { unique: false })
|
||||
@modelOptions({
|
||||
schemaOptions: { collection: 'reward_add_record', timestamps: true },
|
||||
})
|
||||
class RewardRecordClass extends BaseModule {
|
||||
@prop({ required: true })
|
||||
public type: number
|
||||
|
||||
@prop()
|
||||
public user: string
|
||||
@prop()
|
||||
public drawTime: number
|
||||
}
|
||||
|
||||
export const RewardRecord = getModelForClass(RewardRecordClass, { existingConnection: RewardRecordClass['db'] })
|
32
src/rewardSchedule.ts
Normal file
32
src/rewardSchedule.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import * as dotenv from 'dotenv'
|
||||
const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development'
|
||||
dotenv.config({ path: envFile })
|
||||
import logger from 'logger/logger'
|
||||
import { ZRedisClient } from 'zutils'
|
||||
import * as schedule from 'node-schedule'
|
||||
|
||||
const REDIS_KEY = `draw_1`
|
||||
import { RewardRecord } from 'models/RewardRecrd'
|
||||
|
||||
const addRewards = async (type: number) => {
|
||||
logger.info('schedule add rewards for type: ', type)
|
||||
try {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
let record = new RewardRecord({ type })
|
||||
await record.save()
|
||||
new ZRedisClient().pub.sadd(REDIS_KEY, record.id)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
;(async () => {
|
||||
let opts = { url: process.env.REDIS }
|
||||
new ZRedisClient(opts)
|
||||
logger.info('REDIS Connected')
|
||||
schedule.scheduleJob('0 0 0 * * *', async () => {
|
||||
await addRewards(1)
|
||||
})
|
||||
addRewards(1)
|
||||
})()
|
@ -3,6 +3,8 @@ import { ActivityChest, ActivityChestClass, ChestStatusEnum } from 'models/Activ
|
||||
import { ZError, ZRedisClient } from 'zutils'
|
||||
import { DocumentType } from '@typegoose/typegoose'
|
||||
import { timeoutFetch } from 'zutils/utils/net.util'
|
||||
import { RewardRecord } from 'models/RewardRecrd'
|
||||
import logger from 'logger/logger'
|
||||
|
||||
export const drawCfgs = require('../../configs/draw_cfg.json')
|
||||
// 处理draw_cfg.json中的probability, 计算出每个奖励的概率区间
|
||||
@ -160,7 +162,7 @@ export const queryInGameInfo = async (openId: string, channel: string) => {
|
||||
* 根据drawCfgs中设定的probability, 抽取指定的奖励
|
||||
* 如果抽到的type为1或2, 则从redis中spop一个值, 如果该值为空, 则再次调用本方法, 直到抽到奖励位置
|
||||
* */
|
||||
export const drawOnce = async (hasWhite: boolean) => {
|
||||
export const drawOnce = async (userId: string, hasWhite: boolean) => {
|
||||
let random = Math.random() * probability
|
||||
let reward
|
||||
for (let i = 0; i < drawCfgs.length; i++) {
|
||||
@ -172,14 +174,22 @@ export const drawOnce = async (hasWhite: boolean) => {
|
||||
}
|
||||
}
|
||||
if (!reward) {
|
||||
return drawOnce(hasWhite)
|
||||
return drawOnce(userId, hasWhite)
|
||||
}
|
||||
if (reward.type === 1 || reward.type === 2) {
|
||||
const redisKey = `draw_${reward.type}`
|
||||
const itemId = await new ZRedisClient().spop(redisKey)
|
||||
if (!itemId) {
|
||||
return drawOnce(hasWhite)
|
||||
return drawOnce(userId, hasWhite)
|
||||
}
|
||||
// double check if the record is exist
|
||||
let record = await RewardRecord.findById(itemId)
|
||||
if (!record) {
|
||||
logger.info('record not found: ', itemId)
|
||||
return drawOnce(userId, hasWhite)
|
||||
}
|
||||
record.user = userId
|
||||
await record.save()
|
||||
reward.id = itemId
|
||||
}
|
||||
return reward
|
||||
|
@ -9,19 +9,19 @@ import { drawOnce } from 'services/game.svr'
|
||||
import { ZRedisClient } from 'zutils'
|
||||
;(async () => {
|
||||
try {
|
||||
let opts = { url: process.env.REDIS }
|
||||
new ZRedisClient(opts)
|
||||
let resultMap = new Map()
|
||||
const total = 10000
|
||||
for (let i = 0; i < total; i++) {
|
||||
let reward = await drawOnce(false)
|
||||
// console.log(reward)
|
||||
resultMap.set(reward.amount, (resultMap.get(reward.amount) || 0) + 1)
|
||||
}
|
||||
for (let [key, value] of resultMap) {
|
||||
console.log(key, value, parseFloat(value) / parseFloat(total + ''))
|
||||
}
|
||||
process.exit(0)
|
||||
// let opts = { url: process.env.REDIS }
|
||||
// new ZRedisClient(opts)
|
||||
// let resultMap = new Map()
|
||||
// const total = 10000
|
||||
// for (let i = 0; i < total; i++) {
|
||||
// let reward = await drawOnce(false)
|
||||
// // console.log(reward)
|
||||
// resultMap.set(reward.amount, (resultMap.get(reward.amount) || 0) + 1)
|
||||
// }
|
||||
// for (let [key, value] of resultMap) {
|
||||
// console.log(key, value, parseFloat(value) / parseFloat(total + ''))
|
||||
// }
|
||||
// process.exit(0)
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user