diff --git a/src/controllers/admin.controller.ts b/src/controllers/admin.controller.ts index 6d5f0de..3fd1ba1 100644 --- a/src/controllers/admin.controller.ts +++ b/src/controllers/admin.controller.ts @@ -1,7 +1,23 @@ import { ActivityUser } from 'models/ActivityUser' -import { BaseController, ZError, router } from 'zutils' +import { BaseController, ROLE_ANON, ZError, ZRedisClient, role, router } from 'zutils' import { toEIP55 } from 'zutils/utils/chain.util' import { createSigner } from 'fast-jwt' +import { + INGAME_SCORE_KEY, + SCORE_SOCIAL_TASK, + MAX_ENHANCE_COUNT_ADV, + MAX_ENHANCE_COUNT_BASE, + RANK_SCORE_SCALE, +} from 'common/Constants' +import { formatNumShow } from 'common/Utils' +import { ActivityGame } from 'models/ActivityGame' +import { ChestEnhanceRecord } from 'models/ChestEnhanceRecord' +import { InGameStats } from 'models/InGameStats' +import { ScoreRecord } from 'models/ScoreRecord' +import { rankKey } from 'services/rank.svr' +import { formatDate } from 'utils/utcdate.util' +import { InGameTaskRecord } from 'models/InGameTaskRecord' +import { ActivityChest } from 'models/ActivityChest' const sourceList = require('../../configs/admins.json') const adminSet = new Set() @@ -9,6 +25,12 @@ for (let o of sourceList) { adminSet.add(o.toLowerCase()) } +const taskList = require('../../configs/ingame_tasks.json') +const taskMap = new Map() +for (let o of taskList) { + taskMap.set(o.id, o) +} + /** * 一些简单的管理接口 */ @@ -41,4 +63,166 @@ class AdminController extends BaseController { }) return { token } } + + @router('post /api/g3y357zt67qryz3v6d6/query_user') + async queryUserList(req, res) { + const user = req.user + if (!adminSet.has(user.address.toLowerCase())) { + throw new ZError(10, 'not admin') + } + let { key, keyid } = req.params + let records = [] + if (keyid) { + records = await ActivityUser.find({ + $or: [{ twitterId: keyid }, { googleId: keyid }, { emailId: keyid }, { clientId: keyid }, { discordId: keyid }], + }) + } else if (key) { + records = await ActivityUser.find({ $text: { $search: key } }) + } + return records.map(o => { + return { + id: o.id, + address: o.address, + twitterName: o.twitterName, + discordName: o.discordName, + googleName: o.googleName, + googleEmail: o.googleEmail, + email: o.email, + clientMail: o.clientMail, + clientPlat: o.clientPlat, + createdAt: o.createdAt.getTime(), + } + }) + } + + @router('post /api/g3y357zt67qryz3v6d6/user_info') + async queryOneUser(req, res) { + const admin = req.user + if (!adminSet.has(admin.address.toLowerCase())) { + throw new ZError(10, 'not admin') + } + let { uid, address } = req.params + let user + if (uid) { + user = await ActivityUser.findById(uid) + } else if (address) { + address = toEIP55(address) + user = await ActivityUser.findOne({ address }) + } + if (!user) { + throw new ZError(11, 'user not found') + } + uid = user.id + const ACTIVITY = 'uaw_activity' + const todayKey = rankKey(ACTIVITY, new Date()) + const todayScore = await new ZRedisClient().zscore(todayKey, uid) + const totalKey = rankKey(ACTIVITY) + const totalScore = await new ZRedisClient().zscore(totalKey, uid) + const totalRank = await new ZRedisClient().zrevrank(totalKey, uid) + const rankGame = await new ZRedisClient().zrevrank(INGAME_SCORE_KEY, uid) + let invite = '' + if (user.inviteUser) { + const inviteUser = await ActivityUser.findById(user.inviteUser) + if (inviteUser) { + invite = inviteUser.address.toLowerCase() + } + } + const records = await ActivityUser.find({ inviteUser: user.id }) + const gameRecord = await ActivityGame.insertOrUpdate({ user: user.id, activity: ACTIVITY }, {}) + let inviteScore = 0 + const recordSocial = await ScoreRecord.find({ user: user.id, activity: ACTIVITY, type: SCORE_SOCIAL_TASK }) + let scoreSocial = recordSocial.reduce((acc, record) => acc + record.score, 0) + const userMax = user.twitterId && user.discordId ? MAX_ENHANCE_COUNT_ADV : MAX_ENHANCE_COUNT_BASE + const dateTag = formatDate(new Date()) + const userCurrent = await ChestEnhanceRecord.countDocuments({ user: user.id, activity: ACTIVITY, dateTag }) + let enhanceCount = userMax - userCurrent + if (enhanceCount < 0) { + enhanceCount = 0 + } + const ingameStat = await InGameStats.insertOrUpdate({ user: user.id }, {}) + const ingameRecords = await InGameTaskRecord.find({ user: user.id }) + let tickets = 0 + let scoreGTask = 0 + for (let record of ingameRecords) { + tickets += record.ticket + scoreGTask += record.score + } + let result = { + uid: user.id, + address: user.address.toLowerCase(), + boost: user.boost || 1, + boostExpire: user.boostExpire, + twitterId: user.twitterId, + twitterName: user.twitterName, + twitterAvatar: user.twitterAvatar, + discordId: user.discordId, + discordName: user.discordName, + scoreToday: formatNumShow(todayScore ? parseInt(todayScore + '') / RANK_SCORE_SCALE : 0), + scoreTotal: formatNumShow(totalScore ? parseInt(totalScore + '') / RANK_SCORE_SCALE : 0), + rankTotal: totalRank != undefined ? totalRank : '-', + rankGame: rankGame !== undefined ? rankGame : '-', + invite, + inviteCount: records.length, + inviteScore, + scoreSocial: formatNumShow(scoreSocial), + code: user.inviteCode, + mapopen: gameRecord.status, + enhanceCount, + inWhiteList: user.inWhiteList ? 1 : 0, + googleId: user.googleId, + googleMail: user.googleEmail, + gameScore: ingameStat.score, + gameTicket: ingameStat.ticket, + emailId: user.emailId, + email: user.email, + gameId: user.gameId(), + gameMail: user.gameMail(), + gamePlat: user.clientPlat, + createdAt: user.createdAt.getTime(), + tickets, + scoreGTask, + } + return result + } + + @router('post /api/g3y357zt67qryz3v6d6/ingame_records') + async queryInGameHistory(req, res) { + const admin = req.user + if (!adminSet.has(admin.address.toLowerCase())) { + throw new ZError(10, 'not admin') + } + const { uid } = req.params + if (!uid) { + throw new ZError(12, 'uid required') + } + const ingameRecords = await InGameTaskRecord.find({ user: uid }) + let tasks: any[] = [] + for (let o of ingameRecords) { + let task = taskMap.get(o.task) + if (task) { + tasks.push({ + task: task.task, + score: o.score, + ticket: o.ticket, + dateTag: o.dateTag, + // @ts-ignore + time: o.createdAt.getTime(), + }) + } + } + return tasks + } + @router('post /api/g3y357zt67qryz3v6d6/chests') + async queryChests(req, res) { + const admin = req.user + if (!adminSet.has(admin.address.toLowerCase())) { + throw new ZError(10, 'not admin') + } + const { uid } = req.params + if (!uid) { + throw new ZError(12, 'uid required') + } + const records = await ActivityChest.find({ user: uid }) + return records + } }