活动信息接口增加返回title和desc
This commit is contained in:
parent
bc17ea9f3a
commit
bb3e8dabe8
@ -4,13 +4,18 @@
|
|||||||
"name": "First Activity1",
|
"name": "First Activity1",
|
||||||
"description": "This is the first test activity",
|
"description": "This is the first test activity",
|
||||||
"tasks": [{
|
"tasks": [{
|
||||||
"task": "TwitterConnect",
|
"id": "TwitterConnect",
|
||||||
|
"title": "Connect Twitter",
|
||||||
|
"desc": "",
|
||||||
"params": {}
|
"params": {}
|
||||||
}, {
|
}, {
|
||||||
"task": "TwitterFollow",
|
"id": "TwitterFollow",
|
||||||
|
"title": "Follow Twitter",
|
||||||
|
"desc": "",
|
||||||
"params": {"time": 6, "failRate": 60}
|
"params": {"time": 6, "failRate": 60}
|
||||||
}, {
|
}, {
|
||||||
"task": "UpdateScore",
|
"id": "UpdateScore",
|
||||||
|
"show": false,
|
||||||
"params": {"score": [100, 20]}
|
"params": {"score": [100, 20]}
|
||||||
}],
|
}],
|
||||||
"startTime": 1702628292366,
|
"startTime": 1702628292366,
|
||||||
|
@ -5,6 +5,7 @@ import { ActivityInfo } from "models/ActivityInfo";
|
|||||||
import { ActivityUser } from "models/ActivityUser";
|
import { ActivityUser } from "models/ActivityUser";
|
||||||
import { RedisClient } from "redis/RedisClient";
|
import { RedisClient } from "redis/RedisClient";
|
||||||
|
|
||||||
|
const MAX_LIMIT = 50
|
||||||
export default class ActivityController extends BaseController {
|
export default class ActivityController extends BaseController {
|
||||||
|
|
||||||
@role(ROLE_ANON)
|
@role(ROLE_ANON)
|
||||||
@ -18,7 +19,15 @@ export default class ActivityController extends BaseController {
|
|||||||
if (!activity) {
|
if (!activity) {
|
||||||
throw new ZError(12, 'activity not found')
|
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 {}
|
return {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@router('get /api/activity/leaderboard')
|
@router('get /api/activity/leaderboard/:activity/:page')
|
||||||
async inviteCode(req) {
|
async inviteCode(req) {
|
||||||
let user = req.user;
|
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 = []
|
let results: any = []
|
||||||
for (let i = 0; i < records.length; i+=2) {
|
for (let i = 0; i < records.length; i+=2) {
|
||||||
let id = records[i]
|
let id = records[i]
|
||||||
let score = parseInt(records[i + 1])
|
let score = parseInt(records[i + 1])
|
||||||
let user = await ActivityUser.findById(id)
|
let user = await ActivityUser.findById(id)
|
||||||
results.push({
|
results.push({
|
||||||
|
rank: start + i / 2 + 1,
|
||||||
address: user.address,
|
address: user.address,
|
||||||
score
|
score
|
||||||
})
|
})
|
||||||
|
@ -82,31 +82,31 @@ const parseNextTask = async (
|
|||||||
}
|
}
|
||||||
export default class TasksController extends BaseController {
|
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')
|
@router('get /api/tasks/progress')
|
||||||
async taskProgress(req) {
|
async taskProgress(req) {
|
||||||
let user = req.user;
|
let user = req.user;
|
||||||
let activity = req.activity;
|
let activity = req.activity;
|
||||||
if (!user.taskProgress || user.taskProgress.length === 0) {
|
if (!user.taskProgress || user.taskProgress.length === 0) {
|
||||||
for (let task of activity.tasks) {
|
for (let task of activity.tasks) {
|
||||||
if (allTasks.has(task.task)) {
|
if (allTasks.has(task.id)) {
|
||||||
user.taskProgress.push({id: task.task, status: 0})
|
user.taskProgress.push({id: task.id, status: TaskStatusEnum.NOT_START})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await user.save();
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,7 +8,13 @@ import { BaseModule } from './Base'
|
|||||||
@modelOptions({ schemaOptions: { _id: false }, options: { allowMixed: Severity.ALLOW }, })
|
@modelOptions({ schemaOptions: { _id: false }, options: { allowMixed: Severity.ALLOW }, })
|
||||||
export class TaskCfg {
|
export class TaskCfg {
|
||||||
@prop()
|
@prop()
|
||||||
task: string
|
id: string
|
||||||
|
@prop()
|
||||||
|
title: string
|
||||||
|
@prop()
|
||||||
|
desc: string
|
||||||
|
@prop({default: true})
|
||||||
|
show: boolean
|
||||||
@prop({ type: mongoose.Schema.Types.Mixed })
|
@prop({ type: mongoose.Schema.Types.Mixed })
|
||||||
params: any
|
params: any
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ export default class DiscordRole extends ITask {
|
|||||||
static show: boolean = true
|
static show: boolean = true
|
||||||
async execute(data: any) {
|
async execute(data: any) {
|
||||||
let task = this.params.user.taskProgress.find(t => t.id === this.constructor.name)
|
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;
|
let time = cfg.params.time;
|
||||||
if (Date.now() - task.timeStart < time * 1000) {
|
if (Date.now() - task.timeStart < time * 1000) {
|
||||||
throw new ZError(11, 'check discord role failed')
|
throw new ZError(11, 'check discord role failed')
|
||||||
|
@ -7,7 +7,7 @@ export default class TwitterFollow extends ITask {
|
|||||||
static show: boolean = true
|
static show: boolean = true
|
||||||
async execute(data: any) {
|
async execute(data: any) {
|
||||||
let task = this.params.user.taskProgress.find(t => t.id === this.constructor.name)
|
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;
|
let time = cfg.params.time;
|
||||||
if (Date.now() - task.timeStart < time * 1000) {
|
if (Date.now() - task.timeStart < time * 1000) {
|
||||||
throw new ZError(11, 'follow failed')
|
throw new ZError(11, 'follow failed')
|
||||||
|
@ -7,7 +7,7 @@ export default class TwitterRetweet extends ITask {
|
|||||||
static show: boolean = true
|
static show: boolean = true
|
||||||
async execute(data: any) {
|
async execute(data: any) {
|
||||||
let task = this.params.user.taskProgress.find(t => t.id === this.constructor.name)
|
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;
|
let time = cfg.params.time;
|
||||||
if (Date.now() - task.timeStart < time * 1000) {
|
if (Date.now() - task.timeStart < time * 1000) {
|
||||||
throw new ZError(11, 'retweet failed')
|
throw new ZError(11, 'retweet failed')
|
||||||
|
@ -35,7 +35,7 @@ export default class UpdateScore extends ITask {
|
|||||||
static auto: boolean = true
|
static auto: boolean = true
|
||||||
async execute(data: any) {
|
async execute(data: any) {
|
||||||
let task = this.params.user.taskProgress.find((t: TaskStatus) => t.id === this.constructor.name)
|
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;
|
let scores = cfg.params.score;
|
||||||
task.status = TaskStatusEnum.SUCCESS
|
task.status = TaskStatusEnum.SUCCESS
|
||||||
task.timeFinish = Date.now()
|
task.timeFinish = Date.now()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user