96 lines
3.1 KiB
TypeScript
96 lines
3.1 KiB
TypeScript
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
|
|
}
|
|
}
|
|
}
|