import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; import { nowSeconds } from '../pubUtils/timeUtil'; class Rank { @prop({ required: true }) roleId: string; @prop({ required: true }) score: number; @prop({ required: true }) time: number; } class LastRecord { @prop({ required: true, default: 0 }) warId: number; @prop({ required: true}) roleIds: Array; } @index({ guildCode: 1 }) export default class BossScript extends BaseModel { @prop({ required: true }) guildCode: string; @prop({ required: true }) warId: number; @prop({ required: true }) bossHp: number; @prop({ required: true, type: Rank, default:[]}) ranks:Array; @prop({ required: true }) time: number; @prop({ required: true, default: 0}) num: number; @prop({ required: true, default:[]}) roleIdRecords: Array; //记录提示过胜利boss关的玩家 @prop({ required: true }) winWarId: number; //记录上一次通关的关卡 @prop({ required: true }) winTime: number; //记录上一次通关的时间 @prop({ required: true, default: 0}) winNum: number; @prop({ required: true, type: Rank, default:[]}) recordRanks:Array; @prop({ required: true, default: false }) winSettled: boolean; //胜利是否结算过 public static async findBossScript(guildCode: string, lean = true) { const bossScript: BossScriptType = await BossScriptModel.findOne({ guildCode }).lean(lean); return bossScript; } public static async openBossScript(guildCode: string, bossHp: number, warId: number, lean = true) { const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode },{ranks:[], time: nowSeconds(), bossHp, warId, $inc: { recordNum: 1 }}, {new: true, upsert: true}).lean(lean); return bossScript; } //记录玩家boss通关后首次查看boss关卡 public static async recordRoleIdWhenCheck(guildCode: string, roleId: string, lean = true) { const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $push:{ roleIdRecords: roleId } }).lean(lean); return bossScript; } public static async pushRecordRanks(guildCode: string, recordRank: Rank, lean = true) { const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $push:{ recordRanks: recordRank } }).lean(lean); return bossScript; } public static async pushRanks(guildCode: string, rank: Rank, lean = true) { const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $push:{ recordRanks: rank } }).lean(lean); return bossScript; } public static async updateBossScript(guildCode: string, update:BossScriptTypeParam, lean = true) { const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $set:update }).lean(lean); return bossScript; } public static async updateBossHp(guildCode: string, hp: number, roleId: string, lean = true) { const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode, 'ranks.roleId': roleId, bossHp: { $gt: 0 } }, { $inc: { bossHp: - hp ,'ranks.$.score': hp}, }).lean(lean); return bossScript; } } export const BossScriptModel = getModelForClass(BossScript); export interface BossScriptType extends Pick, keyof BossScript> {}; export type BossScriptTypeParam = Partial; // 将所有字段变成可选项