import { ITask } from './base/ITask' import { ZError } from 'zutils' import { TaskStatus, TaskStatusEnum } from 'models/ActivityUser' import { TaskCfg, TaskTypeEnum } from 'models/ActivityInfo' import { queryCheckInList, queryCheckInSeq } from 'services/chain.svr' import { updateRankScore } from 'services/rank.svr' import { LotteryCache } from 'common/LotteryCache' /** * 检查每日签到 * days * limit: 如果该值大于0, 则days表示一共签到几天 * 否则days表示连续几天签到 */ export default class DailyCheckIn extends ITask { static desc = 'daily checkin' static show: boolean = true async execute(data: any) { const { address } = this.user const { task } = data let cfg = this.activity.tasks.find((t: TaskCfg) => t.id === task.id) const days = cfg.params.days || 1 const limit = cfg.params.limit || 0 const res = cfg.type === TaskTypeEnum.DAILY ? await queryCheckInList(address, days - 1, limit) : await queryCheckInSeq(address) if ( // @ts-ignore (cfg.type === TaskTypeEnum.DAILY && task.status === TaskStatusEnum.RUNNING && res.length >= days) || // @ts-ignore (cfg.type === TaskTypeEnum.ONCE && task.status === TaskStatusEnum.RUNNING && res.count >= days) ) { task.status = TaskStatusEnum.SUCCESS task.timeFinish = Date.now() task.data = res try { await this.user.save() } catch (err) { throw new ZError(100, 'save daily checkin failed') } if (cfg.autoclaim) { try { await this.claimReward(task) } catch (err) { console.log(err) } } } return true } public async claimReward(task: TaskStatus) { // 增加连续签到奖励分 // 请求前7天的签到记录, 往前查找连续签到的记录, let cfg = this.activity.tasks.find((t: TaskCfg) => t.id === task.id) if (cfg.type === TaskTypeEnum.DAILY) { const res = await queryCheckInList(this.user.address, 1, 0) const [taskId, dateTag] = task.id.split(':') let list: { day: string; time: number; count: number }[] = res const countCfg = cfg.params.score.length let count = list.length > 0 ? list[0].count : 0 let seq = count % countCfg let score = cfg.params.score[seq] || 0 + cfg.score const user = this.user if (user.boost > 1 && Date.now() < user.boostExpire.getTime()) { score = Math.floor(score * user.boost) } await updateRankScore({ user: this.user.id, score: score, activity: this.user.activity, scoreType: cfg.task, scoreParams: { taskId: task.id, date: dateTag, bouns: score, boost: user.boost, }, }) await this.claimItem(cfg) } else { await super.claimReward(task) } // 更新gacha拥有者抽奖次数, 这里写死, 等想到好的方式再处理 let record = await new LotteryCache().getData(this.user.id, this.user.activity) if (record.daily === 0) { record.daily += 1 record.amount += 1 } } }