Files
ZYZ/shared/db/RougelikeScore.ts
2023-09-06 20:52:59 +08:00

66 lines
3.1 KiB
TypeScript

import BaseModel from './BaseModel';
import { getModelForClass, prop, DocumentType, index } from '@typegoose/typegoose';
import { getZeroPointD } from '../pubUtils/timeUtil';
import { SHOP_REFRESH_TYPE } from '../consts';
@index({ roleId: 1, refTime: 1 })
@index({ refTime: 1, receiveNum: 1 })
export default class RougelikeScore extends BaseModel {
@prop({ required: true })
roleId: string;
@prop({ required: true, default: new Date() })
refTime: Date; // 每周刷新奖励
@prop({ required: true, default: 0 })
score: number; // 积分
@prop({ required: true, type: Number, default: [], _id: false })
received: number[]; // 已领取的id
@prop({ required: true, default: 0 })
receiveNum: number; // 已领取的id
@prop({ required: true, default: 0 })
takeoutRewardCnt: number; // 额外奖励已领取的次数
public static async findByRoleId(roleId: string) {
let refTime = getZeroPointD(SHOP_REFRESH_TYPE.WEEKLY);
let result: RougelikeScoreType = await RougelikeScoreModel.findOne({ roleId, refTime }).lean();
return result;
}
public static async incScore(roleId: string, score: number) {
let refTime = getZeroPointD(SHOP_REFRESH_TYPE.WEEKLY);
let result: RougelikeScoreType = await RougelikeScoreModel.findOneAndUpdate({ roleId, refTime }, { $inc: { score }, $setOnInsert: { received: [], receiveNum: 0, takeoutRewardCnt: 0 } }, { new: true, upsert: true }).lean();
return result;
}
public static async receive(roleId: string, targetScore: number, index: number) {
let refTime = getZeroPointD(SHOP_REFRESH_TYPE.WEEKLY);
let result: RougelikeScoreType = await RougelikeScoreModel.findOneAndUpdate({ roleId, refTime, score: { $gte: targetScore } }, { $push: { received: index }, $inc: { receiveNum: 1 } }, { new: true }).lean();
return result;
}
public static async findByReceiveNum(refTime: Date, maxNum: number) {
let result: RougelikeScoreType[] = await RougelikeScoreModel.find({ refTime, receiveNum: { $lt: maxNum } }).lean();
return result;
}
public static async receiveAll(_ids: string[], maxNum: number) {
await RougelikeScoreModel.updateMany({ _id: { $in: _ids } }, { $set: { receiveNum: maxNum } });
}
public static async receiveTakeoutReward(roleId: string, maxNum: number) {
let refTime = getZeroPointD(SHOP_REFRESH_TYPE.WEEKLY);
await RougelikeScoreModel.findOneAndUpdate({ roleId, refTime }, { $setOnInsert: { score: 0, received: [], receiveNum: 0, takeoutRewardCnt: 0 } }, { upsert: true });
let result: RougelikeScoreType = await RougelikeScoreModel.findOneAndUpdate({ roleId, refTime, takeoutRewardCnt: { $lt: maxNum } }, { $inc: { takeoutRewardCnt: 1 } }, { new: true }).lean();
return result;
}
}
export const RougelikeScoreModel = getModelForClass(RougelikeScore);
export interface RougelikeScoreType extends Pick<DocumentType<RougelikeScore>, keyof RougelikeScore> { };
export type RougelikeScorePara = Partial<RougelikeScoreType>; // 将所有字段变成可选项