89 lines
2.8 KiB
TypeScript
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 }
|
|
}
|
|
}
|