2024-05-11 10:35:33 +08:00

91 lines
2.6 KiB
TypeScript

import { ActivityInfoClass, TaskCfg } from 'models/ActivityInfo'
import { ActivityItem } from 'models/ActivityItem'
import { ActivityUserClass } from 'models/ActivityUser'
import { DocumentType } from '@typegoose/typegoose'
import { queryInGameInfo } from 'services/game.svr'
import { ZError } from 'zutils'
import { updateRankScore } from 'services/ingame.rank.svr'
import { formatDate } from 'utils/utcdate.util'
import { InGameTaskRecord } from 'models/InGameTaskRecord'
import { InGameStats } from 'models/InGameStats'
export abstract class ITask {
static desc: string
static key: string
static show: boolean = true
static auto: boolean = false
user: DocumentType<ActivityUserClass>
activity: DocumentType<ActivityInfoClass>
constructor({
user,
activity,
}: {
user: DocumentType<ActivityUserClass>
activity: DocumentType<ActivityInfoClass>
}) {
// do nothing
this.user = user
this.activity = activity
}
abstract execute(data: any): Promise<boolean>
public async claimReward(cfg: any) {
const user = this.user
let gameData = await queryInGameInfo(user.googleId, '0')
if (!(await this.check(cfg, gameData))) {
throw new ZError(50, 'not match condition')
}
const dateTag = formatDate(new Date())
let score = cfg.score
if (score > 0) {
await updateRankScore({
user: user.id,
score: score,
scoreType: 'ingame_task',
scoreParams: {
date: dateTag,
taskId: cfg.id,
boost: user.boost,
},
})
}
let ticket = 0
if (cfg.ticket > 0 && Date.now() >= this.activity.drawTime) {
let canGet = false
if (cfg.tickettasks) {
let records = await InGameTaskRecord.find({ user: user.id, dateTag, task: { $in: cfg.tickettasks } })
if (records.length === cfg.tickettasks.length) {
canGet = true
}
} else {
canGet = true
}
if (canGet) {
ticket = cfg.ticket
await InGameStats.updateOne({ user: user.id }, { $inc: { ticket } })
}
}
return { score, ticket }
}
public async check(cfg: any, gameData: any) {
const subCfg = cfg.cfg
const val = parseInt(gameData[subCfg.key] || '0')
return val >= subCfg.amount
}
public async claimItem(cfg: TaskCfg) {
if (cfg.params.items) {
for (let key in cfg.params.items) {
let amount = cfg.params.items[key]
await ActivityItem.insertOrUpdate(
{ user: this.user.id, activity: this.user.activity, item: key },
{ $inc: { amount }, last: Date.now() },
)
}
}
}
}