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, 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 } } }