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 activity: DocumentType constructor({ user, activity, }: { user: DocumentType activity: DocumentType }) { // do nothing this.user = user this.activity = activity } abstract execute(data: any): Promise 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() }, ) } } } }