diff --git a/initdatas/activity_info.json b/initdatas/activity_info.json index 7a4e360..b8f3d5b 100644 --- a/initdatas/activity_info.json +++ b/initdatas/activity_info.json @@ -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, diff --git a/src/controllers/activity.controller.ts b/src/controllers/activity.controller.ts index 6dfc7e8..c43139d 100644 --- a/src/controllers/activity.controller.ts +++ b/src/controllers/activity.controller.ts @@ -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 }) diff --git a/src/controllers/tasks.controller.ts b/src/controllers/tasks.controller.ts index 479491d..1561f80 100644 --- a/src/controllers/tasks.controller.ts +++ b/src/controllers/tasks.controller.ts @@ -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 } diff --git a/src/models/ActivityInfo.ts b/src/models/ActivityInfo.ts index bdb39f6..c55cf7d 100644 --- a/src/models/ActivityInfo.ts +++ b/src/models/ActivityInfo.ts @@ -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 } diff --git a/src/tasks/DiscordRole.ts b/src/tasks/DiscordRole.ts index eeb51eb..17b6280 100644 --- a/src/tasks/DiscordRole.ts +++ b/src/tasks/DiscordRole.ts @@ -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') diff --git a/src/tasks/TwitterFollow.ts b/src/tasks/TwitterFollow.ts index b57852d..d4b04e4 100644 --- a/src/tasks/TwitterFollow.ts +++ b/src/tasks/TwitterFollow.ts @@ -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') diff --git a/src/tasks/TwitterRetweet.ts b/src/tasks/TwitterRetweet.ts index 9b5c63a..2100393 100644 --- a/src/tasks/TwitterRetweet.ts +++ b/src/tasks/TwitterRetweet.ts @@ -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') diff --git a/src/tasks/UpdateScore.ts b/src/tasks/UpdateScore.ts index 90008bc..bea86a8 100644 --- a/src/tasks/UpdateScore.ts +++ b/src/tasks/UpdateScore.ts @@ -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()