助力后给新用户一个锁住的箱子
This commit is contained in:
parent
a0ba5249fc
commit
4e48150c1e
@ -5,8 +5,7 @@
|
||||
"name": "Wooden Chest",
|
||||
"initScoreMin": 10,
|
||||
"initScoreMax": 50,
|
||||
"maxBonus": 10,
|
||||
"minBonus": 5,
|
||||
"bounsCfg": [5, 10],
|
||||
"maxBounsCount": 10
|
||||
},
|
||||
{
|
||||
@ -14,8 +13,7 @@
|
||||
"name": "Iron Chest",
|
||||
"initScoreMin": 20,
|
||||
"initScoreMax": 60,
|
||||
"maxBonus": 20,
|
||||
"minBonus": 10,
|
||||
"bounsCfg": [10, 20],
|
||||
"maxBounsCount": 15
|
||||
},
|
||||
{
|
||||
@ -23,8 +21,7 @@
|
||||
"name": "Bronze Chest",
|
||||
"initScoreMin": 30,
|
||||
"initScoreMax": 80,
|
||||
"maxBonus": 30,
|
||||
"minBonus": 15,
|
||||
"bounsCfg": [15,30],
|
||||
"maxBounsCount": 20
|
||||
},
|
||||
{
|
||||
@ -32,8 +29,7 @@
|
||||
"name": "Sliver Chest",
|
||||
"initScoreMin": 40,
|
||||
"initScoreMax": 100,
|
||||
"maxBonus": 40,
|
||||
"minBonus": 20,
|
||||
"bounsCfg": [20, 40],
|
||||
"maxBounsCount": 50
|
||||
}
|
||||
]
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { ZError, SyncLocker, ZRedisClient, BaseController, ROLE_ANON, role, router } from 'zutils'
|
||||
import { ActivityChest } from 'models/ActivityChest'
|
||||
import { ActivityChest, ChestStatusEnum } from 'models/ActivityChest'
|
||||
import { ActivityUser } from 'models/ActivityUser'
|
||||
import { mongoose } from '@typegoose/typegoose'
|
||||
import { rankKey, rankLevel, updateRankScore } from 'services/rank.svr'
|
||||
@ -12,6 +12,25 @@ const chestLevelMap = new Map()
|
||||
for (let cfg of chestCfg.chests) {
|
||||
chestLevelMap.set(cfg.level, cfg)
|
||||
}
|
||||
|
||||
const generateNewChest = (uid: string, activity: string, level = 1, status = ChestStatusEnum.LOCKED) => {
|
||||
let cfg = chestLevelMap.get(level)
|
||||
if (!cfg) {
|
||||
throw new ZError(11, 'chest cfg not found')
|
||||
}
|
||||
let scoreInit = Math.floor(Math.random() * (cfg.scoreMax - cfg.scoreMin + 1) + cfg.scoreMin)
|
||||
let chest = new ActivityChest({
|
||||
user: uid,
|
||||
activity: activity,
|
||||
level: level,
|
||||
maxBounsCount: cfg.maxBounsCount,
|
||||
bounsCfg: cfg.bounsCfg,
|
||||
scoreInit,
|
||||
status,
|
||||
})
|
||||
return chest
|
||||
}
|
||||
|
||||
/**
|
||||
* 宝箱相关接口
|
||||
*/
|
||||
@ -78,7 +97,7 @@ class BoxController extends BaseController {
|
||||
const session = await mongoose.startSession()
|
||||
session.startTransaction()
|
||||
try {
|
||||
// TODO:: 检查用户是否符合助力条件
|
||||
// TODO:: 待规则确定后, 检查用户是否符合助力条件
|
||||
const chest = await ActivityChest.findOne({ shareCode: code, activity: user.activity }).session(session)
|
||||
if (chest.bonusUsers.includes(uid)) {
|
||||
throw new ZError(10, 'user already enhanced')
|
||||
@ -86,10 +105,10 @@ class BoxController extends BaseController {
|
||||
if (chest.bonusUsers.length >= chest.maxBounsCount) {
|
||||
throw new ZError(12, 'enhanced times exceed')
|
||||
}
|
||||
if (chest.status === 9) {
|
||||
if (chest.status === ChestStatusEnum.OPENED) {
|
||||
throw new ZError(13, 'chest already opened')
|
||||
}
|
||||
if (chest.status === 0) {
|
||||
if (chest.status === ChestStatusEnum.LOCKED) {
|
||||
throw new ZError(14, 'chest is locked')
|
||||
}
|
||||
if (chest.user === uid) {
|
||||
@ -100,7 +119,12 @@ class BoxController extends BaseController {
|
||||
chest.bonusScores.push(score)
|
||||
chest.scoreBonus += score
|
||||
await chest.save({ session })
|
||||
// TODO:: 新用户给一个锁住的箱子
|
||||
const chestsForUser = await ActivityChest.find({ user: uid, activity: user.activity }).session(session)
|
||||
// 如果用户没有宝箱, 则说明用户是新用户, 生成一个宝箱
|
||||
if (chestsForUser.length === 0) {
|
||||
const newChest = generateNewChest(uid, user.activity, 1, ChestStatusEnum.LOCKED)
|
||||
await newChest.save({ session })
|
||||
}
|
||||
await session.commitTransaction()
|
||||
session.endSession()
|
||||
return {
|
||||
|
@ -5,6 +5,11 @@ import { BaseModule } from './Base'
|
||||
import { convert } from 'zutils/utils/number.util'
|
||||
const alphabet = '3fBCM8j17XNA9xYun4wmLWep2oHFlhPcgyEJskqOz6GK0UtV5ZRaDSvrTbidQI'
|
||||
|
||||
export enum ChestStatusEnum {
|
||||
LOCKED = 0,
|
||||
NORMAL = 1,
|
||||
OPENED = 9,
|
||||
}
|
||||
/**
|
||||
* 活动宝箱
|
||||
*/
|
||||
@ -33,14 +38,14 @@ class ActivityChestClass extends BaseModule {
|
||||
@prop()
|
||||
public shareCode: string
|
||||
// 0 锁定, 1 未开启 9 已开启
|
||||
@prop({ default: 0 })
|
||||
public status: number
|
||||
@prop({ enum: ChestStatusEnum, default: ChestStatusEnum.LOCKED })
|
||||
public status: ChestStatusEnum
|
||||
@prop()
|
||||
public user: string
|
||||
@prop()
|
||||
public activity: string
|
||||
// 品级
|
||||
@prop({ default: 0 })
|
||||
@prop({ default: 1 })
|
||||
public level: number
|
||||
// 最大助力次数
|
||||
@prop()
|
||||
|
Loading…
x
Reference in New Issue
Block a user