91 lines
2.6 KiB
TypeScript
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() },
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|