活动信息接口增加返回title和desc

This commit is contained in:
CounterFire2023 2023-12-21 18:54:02 +08:00
parent bc17ea9f3a
commit bb3e8dabe8
8 changed files with 55 additions and 26 deletions

View File

@ -4,13 +4,18 @@
"name": "First Activity1",
"description": "This is the first test activity",
"tasks": [{
"task": "TwitterConnect",
"id": "TwitterConnect",
"title": "Connect Twitter",
"desc": "",
"params": {}
}, {
"task": "TwitterFollow",
"id": "TwitterFollow",
"title": "Follow Twitter",
"desc": "",
"params": {"time": 6, "failRate": 60}
}, {
"task": "UpdateScore",
"id": "UpdateScore",
"show": false,
"params": {"score": [100, 20]}
}],
"startTime": 1702628292366,

View File

@ -5,6 +5,7 @@ import { ActivityInfo } from "models/ActivityInfo";
import { ActivityUser } from "models/ActivityUser";
import { RedisClient } from "redis/RedisClient";
const MAX_LIMIT = 50
export default class ActivityController extends BaseController {
@role(ROLE_ANON)
@ -18,7 +19,15 @@ export default class ActivityController extends BaseController {
if (!activity) {
throw new ZError(12, 'activity not found')
}
return activity.toJson();
let tasks = []
for (let task of activity.tasks) {
if (task.show) {
tasks.push({id: task.id, title: task.title, desc: task.desc})
}
}
let result = activity.toJson()
result.tasks = tasks
return result;
}
/**
@ -42,16 +51,25 @@ export default class ActivityController extends BaseController {
return {}
}
@router('get /api/activity/leaderboard')
@router('get /api/activity/leaderboard/:activity/:page')
async inviteCode(req) {
let user = req.user;
let records = await new RedisClient().zrevrange(`${user.activity}:score`, 0, 9)
let { page, activity, limit } = req.params
page = parseInt(page || '0')
limit = parseInt(limit || MAX_LIMIT)
if (page < 0) {
page = 0
}
const start = page * limit
const end = start + limit - 1
let records = await new RedisClient().zrevrange(`${activity}:score`, start, end)
let results: any = []
for (let i = 0; i < records.length; i+=2) {
let id = records[i]
let score = parseInt(records[i + 1])
let user = await ActivityUser.findById(id)
results.push({
rank: start + i / 2 + 1,
address: user.address,
score
})

View File

@ -81,18 +81,6 @@ const parseNextTask = async (
return result
}
export default class TasksController extends BaseController {
@role(ROLE_ANON)
@router('get /api/tasks/list')
async taskList(req) {
const list: {id: string, name: string}[] = []
for (let [id, task] of allTasks) {
if (task.show) {
list.push({id, name: task.desc})
}
}
return list
}
@router('get /api/tasks/progress')
async taskProgress(req) {
@ -100,13 +88,25 @@ export default class TasksController extends BaseController {
let activity = req.activity;
if (!user.taskProgress || user.taskProgress.length === 0) {
for (let task of activity.tasks) {
if (allTasks.has(task.task)) {
user.taskProgress.push({id: task.task, status: 0})
if (allTasks.has(task.id)) {
user.taskProgress.push({id: task.id, status: TaskStatusEnum.NOT_START})
}
}
await user.save();
}
return user.taskProgress
let visibleTasks = new Set();
for (let task of activity.tasks) {
if (task.show) {
visibleTasks.add(task.id)
}
}
let taskProgress = [];
for (let task of user.taskProgress) {
if (visibleTasks.has(task.id)) {
taskProgress.push(task)
}
}
return taskProgress
}

View File

@ -8,7 +8,13 @@ import { BaseModule } from './Base'
@modelOptions({ schemaOptions: { _id: false }, options: { allowMixed: Severity.ALLOW }, })
export class TaskCfg {
@prop()
task: string
id: string
@prop()
title: string
@prop()
desc: string
@prop({default: true})
show: boolean
@prop({ type: mongoose.Schema.Types.Mixed })
params: any
}

View File

@ -7,7 +7,7 @@ export default class DiscordRole extends ITask {
static show: boolean = true
async execute(data: any) {
let task = this.params.user.taskProgress.find(t => t.id === this.constructor.name)
let cfg = this.params.activity.tasks.find(t => t.task === this.constructor.name)
let cfg = this.params.activity.tasks.find(t => t.id === this.constructor.name)
let time = cfg.params.time;
if (Date.now() - task.timeStart < time * 1000) {
throw new ZError(11, 'check discord role failed')

View File

@ -7,7 +7,7 @@ export default class TwitterFollow extends ITask {
static show: boolean = true
async execute(data: any) {
let task = this.params.user.taskProgress.find(t => t.id === this.constructor.name)
let cfg = this.params.activity.tasks.find(t => t.task === this.constructor.name)
let cfg = this.params.activity.tasks.find(t => t.id === this.constructor.name)
let time = cfg.params.time;
if (Date.now() - task.timeStart < time * 1000) {
throw new ZError(11, 'follow failed')

View File

@ -7,7 +7,7 @@ export default class TwitterRetweet extends ITask {
static show: boolean = true
async execute(data: any) {
let task = this.params.user.taskProgress.find(t => t.id === this.constructor.name)
let cfg = this.params.activity.tasks.find(t => t.task === this.constructor.name)
let cfg = this.params.activity.tasks.find(t => t.id === this.constructor.name)
let time = cfg.params.time;
if (Date.now() - task.timeStart < time * 1000) {
throw new ZError(11, 'retweet failed')

View File

@ -35,7 +35,7 @@ export default class UpdateScore extends ITask {
static auto: boolean = true
async execute(data: any) {
let task = this.params.user.taskProgress.find((t: TaskStatus) => t.id === this.constructor.name)
let cfg = this.params.activity.tasks.find((t: TaskCfg) => t.task === this.constructor.name)
let cfg = this.params.activity.tasks.find((t: TaskCfg) => t.id === this.constructor.name)
let scores = cfg.params.score;
task.status = TaskStatusEnum.SUCCESS
task.timeFinish = Date.now()