task-svr/src/tasks/ShareCode.ts
2024-04-10 15:25:24 +08:00

89 lines
2.8 KiB
TypeScript

import { ActivityUser, ActivityUserClass, TaskStatus, TaskStatusEnum } from 'models/ActivityUser'
import { ITask } from './base/ITask'
import { TaskCfg } from 'models/ActivityInfo'
import { updateRankScore } from 'services/rank.svr'
import { ActivityItem } from 'models/ActivityItem'
import { LotteryCache } from 'common/LotteryCache'
import { checkHadGacha } from 'services/chain.svr'
import { DocumentType } from '@typegoose/typegoose'
import { SCORE_INVITE_USER } from 'common/Constants'
const updateInviteScore = async (
user: DocumentType<ActivityUserClass>,
scores: number[],
items: any[],
level: number,
reason: string,
) => {
if (!user.inviteUser || scores.length <= level) {
return
}
let userSup = await ActivityUser.findById(user.inviteUser)
if (!userSup || !userSup.address) {
return
}
await updateRankScore({
user: userSup.id,
score: scores[level],
activity: user.activity,
scoreType: reason,
scoreParams: {
user: user.id,
level,
},
})
// 更新gacha拥有者抽奖次数, 这里写死, 等想到好的方式再处理
let record = await new LotteryCache().getData(userSup.id, userSup.activity)
record.share += 1
record.amount += 1
if (record.gacha === 0 && checkHadGacha(userSup.address)) {
record.gacha += 1
record.amount += 1
}
if (items.length > level) {
for (let key in items[level]) {
let amount = items[level][key]
await ActivityItem.insertOrUpdate({ user: userSup, activity: userSup.activity, item: key }, { $inc: { amount } })
}
}
await updateInviteScore(userSup, scores, items, level + 1, reason)
}
export default class ShareCode extends ITask {
static desc = 'update invite score'
static show: boolean = false
async execute(data: any) {
let { task } = data
let cfg = this.activity.tasks.find((t: TaskCfg) => t.id === task.id)
if (!this.user.inviteUser) {
throw new Error('not finished')
}
let scores = cfg.params.score
const items = cfg.params.inviteItems || []
task.status = TaskStatusEnum.SUCCESS
task.timeFinish = Date.now()
task.data = {}
await this.user.save()
// According to configuration, add score to user who invite current user
if (cfg.autoclaim) {
try {
await super.claimReward(task)
await updateInviteScore(this.user, scores, items, 0, task.task)
} catch (err) {
console.log(err)
}
}
return true
}
public async claimReward(task: TaskStatus) {
let { score } = await super.claimReward(task)
let cfg = this.activity.tasks.find((t: TaskCfg) => t.id === task.id)
let scores = cfg.params.score
const items = cfg.params.inviteItems || []
await updateInviteScore(this.user, scores, items, 0, SCORE_INVITE_USER)
return { score }
}
}