task-svr/src/tasks/DailyCheckIn.ts
2024-03-22 19:51:51 +08:00

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