From 4e48150c1e5d955a9f0e449f34fcc4175657aebc Mon Sep 17 00:00:00 2001 From: CounterFire2023 <136581895+CounterFire2023@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:07:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A9=E5=8A=9B=E5=90=8E=E7=BB=99=E6=96=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=80=E4=B8=AA=E9=94=81=E4=BD=8F=E7=9A=84?= =?UTF-8?q?=E7=AE=B1=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configs/chest.json | 12 ++++------ src/controllers/chest.controller.ts | 34 ++++++++++++++++++++++++----- src/models/ActivityChest.ts | 11 +++++++--- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/configs/chest.json b/configs/chest.json index d8d5f17..ea780cb 100644 --- a/configs/chest.json +++ b/configs/chest.json @@ -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 } ] diff --git a/src/controllers/chest.controller.ts b/src/controllers/chest.controller.ts index 1fd711e..9a6a027 100644 --- a/src/controllers/chest.controller.ts +++ b/src/controllers/chest.controller.ts @@ -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 { diff --git a/src/models/ActivityChest.ts b/src/models/ActivityChest.ts index c507fb1..16f0075 100644 --- a/src/models/ActivityChest.ts +++ b/src/models/ActivityChest.ts @@ -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()