格式化score返回

This commit is contained in:
CounterFire2023 2024-04-15 17:13:09 +08:00
parent ea8dae5ae7
commit 95e6f81713
8 changed files with 45 additions and 33 deletions

View File

@ -59,3 +59,5 @@ export const SCORE_ENHANCE_CHEST_GIFT = 'enhance_chest_gift'
// google reCaptcha最小分数 // google reCaptcha最小分数
export const RECAPTCHA_MIN_SCORE = 0.5 export const RECAPTCHA_MIN_SCORE = 0.5
// 排行榜分数缩放系数
export const RANK_SCORE_SCALE = 100

View File

@ -7,3 +7,13 @@ export const isObjectIdString = (str: string) => {
export const isValidShareCode = (str: string) => { export const isValidShareCode = (str: string) => {
return /^[3fBCM8j17XNA9xYun4wmLWep2oHFlhPcgyEJskqOz6GK0UtV5ZRaDSvrTbidQI]{10}$/.test(str) return /^[3fBCM8j17XNA9xYun4wmLWep2oHFlhPcgyEJskqOz6GK0UtV5ZRaDSvrTbidQI]{10}$/.test(str)
} }
export const formatNumShow = (num: number) => {
if (num >= 10) {
return num.toString()
} else if (num === 0) {
return '0'
} else {
return num.toFixed(1)
}
}

View File

@ -4,8 +4,9 @@ import { rankKey, rankLevel } from 'services/rank.svr'
import { BaseController, ROLE_ANON, SyncLocker, ZError, ZRedisClient, role, router } from 'zutils' import { BaseController, ROLE_ANON, SyncLocker, ZError, ZRedisClient, role, router } from 'zutils'
import { ScoreRecord } from 'models/ScoreRecord' import { ScoreRecord } from 'models/ScoreRecord'
import { formatAddress } from 'zutils/utils/chain.util' import { formatAddress } from 'zutils/utils/chain.util'
import { isValidShareCode } from 'common/Utils' import { formatNumShow, isValidShareCode } from 'common/Utils'
import { checkReCaptcha } from 'services/google.svr' import { checkReCaptcha } from 'services/google.svr'
import { RANK_SCORE_SCALE } from 'common/Constants'
const MAX_LIMIT = 100 const MAX_LIMIT = 100
export default class ActivityController extends BaseController { export default class ActivityController extends BaseController {
@ -93,15 +94,15 @@ export default class ActivityController extends BaseController {
for (let u of users) { for (let u of users) {
const totalScore = await new ZRedisClient().zscore(totalKey, u.id) const totalScore = await new ZRedisClient().zscore(totalKey, u.id)
const inviteScore = await new ZRedisClient().zscore(keyInvite, `${user.id}_${u.id}`) const inviteScore = await new ZRedisClient().zscore(keyInvite, `${user.id}_${u.id}`)
const score = totalScore ? parseInt(totalScore + '') : 0 const score = totalScore ? parseInt(totalScore + '') / RANK_SCORE_SCALE : 0
const scoreInvite = inviteScore ? parseInt(inviteScore + '') / 100 : 0 const scoreInvite = inviteScore ? parseInt(inviteScore + '') / RANK_SCORE_SCALE : 0
results.push({ results.push({
// user: u.id, // user: u.id,
level: rankLevel(score), level: rankLevel(score),
nickname: u.twitterName || u.discordName || formatAddress(u.address), nickname: u.twitterName || u.discordName || formatAddress(u.address),
avatar: u.twitterAvatar || '', avatar: u.twitterAvatar || '',
score, score: formatNumShow(score),
scoreInvite, scoreInvite: formatNumShow(scoreInvite),
}) })
} }
return results return results
@ -116,7 +117,7 @@ export default class ActivityController extends BaseController {
const records = await ScoreRecord.find({ user: user.id, activity: user.activity }) const records = await ScoreRecord.find({ user: user.id, activity: user.activity })
return records.map(record => { return records.map(record => {
return { return {
score: record.score, score: formatNumShow(record.score),
type: record.type, type: record.type,
//@ts-ignore //@ts-ignore
time: record.createdAt.getTime(), time: record.createdAt.getTime(),
@ -138,16 +139,8 @@ export default class ActivityController extends BaseController {
// const yesterdayKey = rankKey(activity, yesterday()) // const yesterdayKey = rankKey(activity, yesterday())
for (let i = 0; i < records.length; i += 2) { for (let i = 0; i < records.length; i += 2) {
const id = records[i] const id = records[i]
let score = parseInt(records[i + 1]) let score = formatNumShow(parseInt(records[i + 1]) / RANK_SCORE_SCALE)
const user = await ActivityUser.findById(id) const user = await ActivityUser.findById(id)
// let invite = ''
// if (user?.inviteUser) {
// const inviteUser = await ActivityUser.findById(user.inviteUser)
// if (inviteUser) {
// invite = inviteUser.address
// }
// }
// const yesterdayScore = await new ZRedisClient().zscore(yesterdayKey, id)
const rank = start + i / 2 + 1 const rank = start + i / 2 + 1
results.push({ results.push({
rank, rank,

View File

@ -14,7 +14,7 @@ import {
SCORE_OPEN_CHEST, SCORE_OPEN_CHEST,
} from 'common/Constants' } from 'common/Constants'
import { formatAddress } from 'zutils/utils/chain.util' import { formatAddress } from 'zutils/utils/chain.util'
import { isObjectIdString, isValidShareCode } from 'common/Utils' import { formatNumShow, isObjectIdString, isValidShareCode } from 'common/Utils'
import { checkReCaptcha } from 'services/google.svr' import { checkReCaptcha } from 'services/google.svr'
import { GeneralScription } from 'models/chain/GeneralScription' import { GeneralScription } from 'models/chain/GeneralScription'
import { ChestEnhanceRecord } from 'models/ChestEnhanceRecord' import { ChestEnhanceRecord } from 'models/ChestEnhanceRecord'
@ -89,7 +89,7 @@ class BoxController extends BaseController {
result.push({ result.push({
nickname: u?.twitterName || u?.discordName || u?.address ? formatAddress(u.address) : 'unknown', nickname: u?.twitterName || u?.discordName || u?.address ? formatAddress(u.address) : 'unknown',
avatar: u?.twitterAvatar || '', avatar: u?.twitterAvatar || '',
score: score, score: formatNumShow(score),
// @ts-ignore // @ts-ignore
time: records[i].createdAt.getTime(), time: records[i].createdAt.getTime(),
}) })
@ -114,7 +114,7 @@ class BoxController extends BaseController {
result.push({ result.push({
nickname: u?.twitterName || u?.discordName || u?.address ? formatAddress(u.address) : 'unknown', nickname: u?.twitterName || u?.discordName || u?.address ? formatAddress(u.address) : 'unknown',
avatar: u?.twitterAvatar || '', avatar: u?.twitterAvatar || '',
score: score, score: formatNumShow(score),
// @ts-ignore // @ts-ignore
time: records[i].createdAt.getTime(), time: records[i].createdAt.getTime(),
}) })
@ -345,7 +345,7 @@ class BoxController extends BaseController {
}) })
await chest.save() await chest.save()
return { score, items } return { score: formatNumShow(score), items }
} }
/** /**
@ -360,7 +360,7 @@ class BoxController extends BaseController {
return records.map(record => { return records.map(record => {
return { return {
chest: record.data.chestId, chest: record.data.chestId,
score: record.score, score: formatNumShow(record.score),
level: record.data.level, level: record.data.level,
// @ts-ignore // @ts-ignore
time: record.createdAt.getTime(), time: record.createdAt.getTime(),

View File

@ -1,17 +1,17 @@
import { MANUAL_OPEN_GAME, RESET_STEP, SCORE_GAME_STEP } from 'common/Constants' import { MANUAL_OPEN_GAME, SCORE_GAME_STEP } from 'common/Constants'
import { ActivityGame } from 'models/ActivityGame' import { ActivityGame } from 'models/ActivityGame'
import { DAILY_SIGN, SIGN_SEQ, SIGN_TOTAL, TicketRecord, USE_TICKET } from 'models/TicketRecord' import { DAILY_SIGN, SIGN_SEQ, SIGN_TOTAL, TicketRecord, USE_TICKET } from 'models/TicketRecord'
import { queryCheckInList } from 'services/chain.svr' import { queryCheckInList } from 'services/chain.svr'
import { checkInToday, seqSignCfg, seqSignScore, totalSignCfg, totalSignScore } from 'services/sign.svr' import { checkInToday, seqSignCfg, seqSignScore, totalSignCfg, totalSignScore } from 'services/sign.svr'
import { ZError, SyncLocker, BaseController, router } from 'zutils' import { ZError, SyncLocker, BaseController, router } from 'zutils'
import { formatDate } from 'utils/utcdate.util' import { formatDate } from 'utils/utcdate.util'
import { generateChestLevel, generateNewChest, generateStepReward } from 'services/game.svr' import { generateStepReward } from 'services/game.svr'
import { ChestStatusEnum } from 'models/ActivityChest'
import { updateRankScore } from 'services/rank.svr' import { updateRankScore } from 'services/rank.svr'
import { ExploreRecord } from 'models/ExploreRecord' import { ExploreRecord } from 'models/ExploreRecord'
import { isObjectId } from 'zutils/utils/string.util' import { isObjectId } from 'zutils/utils/string.util'
import { GeneralScription } from 'models/chain/GeneralScription' import { GeneralScription } from 'models/chain/GeneralScription'
import { CheckIn } from 'models/chain/CheckIn' import { CheckIn } from 'models/chain/CheckIn'
import { formatNumShow } from 'common/Utils'
/** /**
* *
@ -386,6 +386,6 @@ class GameController extends BaseController {
} }
await ticketRecord.save() await ticketRecord.save()
return { score, chests: chests.map(chest => chest.toJson()) } return { score: formatNumShow(score), chests: chests.map(chest => chest.toJson()) }
} }
} }

View File

@ -11,8 +11,14 @@ import { checkParamsNeeded } from 'zutils/utils/net.util'
import { aesDecrypt } from 'zutils/utils/security.util' import { aesDecrypt } from 'zutils/utils/security.util'
import { base58ToHex } from 'zutils/utils/string.util' import { base58ToHex } from 'zutils/utils/string.util'
import { ActivityGame } from 'models/ActivityGame' import { ActivityGame } from 'models/ActivityGame'
import { MAX_ENHANCE_COUNT_ADV, MAX_ENHANCE_COUNT_BASE, SCORE_INVITE_USER, SCORE_SOCIAL_TASK } from 'common/Constants' import {
import { isObjectIdString } from 'common/Utils' MAX_ENHANCE_COUNT_ADV,
MAX_ENHANCE_COUNT_BASE,
RANK_SCORE_SCALE,
SCORE_INVITE_USER,
SCORE_SOCIAL_TASK,
} from 'common/Constants'
import { formatNumShow, isObjectIdString } from 'common/Utils'
import { ChestEnhanceRecord } from 'models/ChestEnhanceRecord' import { ChestEnhanceRecord } from 'models/ChestEnhanceRecord'
const LOGIN_TIP = 'This signature is just to verify your identity' const LOGIN_TIP = 'This signature is just to verify your identity'
@ -138,13 +144,13 @@ class SignController extends BaseController {
twitterAvatar: user.twitterAvatar, twitterAvatar: user.twitterAvatar,
discordId: user.discordId, discordId: user.discordId,
discordName: user.discordName, discordName: user.discordName,
scoreToday: todayScore ? parseInt(todayScore + '') : 0, scoreToday: formatNumShow(todayScore ? parseInt(todayScore + '') / RANK_SCORE_SCALE : 0),
scoreTotal: totalScore ? parseInt(totalScore + '') : 0, scoreTotal: formatNumShow(totalScore ? parseInt(totalScore + '') / RANK_SCORE_SCALE : 0),
rankTotal: totalRank ? totalRank : '-', rankTotal: totalRank ? totalRank : '-',
invite, invite,
inviteCount: records.length, inviteCount: records.length,
inviteScore, inviteScore,
scoreSocial, scoreSocial: formatNumShow(scoreSocial),
code: user.inviteCode, code: user.inviteCode,
mapopen: gameRecord.status, mapopen: gameRecord.status,
enhanceCount, enhanceCount,

View File

@ -7,6 +7,7 @@ import { GeneralScription } from 'models/chain/GeneralScription'
import { BASE_TASK_TICKET } from 'common/Constants' import { BASE_TASK_TICKET } from 'common/Constants'
import { BASE_TASK_REWARD, SIGN_SEQ, TicketRecord } from 'models/TicketRecord' import { BASE_TASK_REWARD, SIGN_SEQ, TicketRecord } from 'models/TicketRecord'
import { ActivityGame } from 'models/ActivityGame' import { ActivityGame } from 'models/ActivityGame'
import { formatNumShow } from 'common/Utils'
const fs = require('fs') const fs = require('fs')
const prod = process.env.NODE_ENV === 'production' const prod = process.env.NODE_ENV === 'production'
@ -230,6 +231,6 @@ export default class TasksController extends BaseController {
await ActivityGame.updateOne({ user: user.id, activity: user.activity }, { $inc: { tickets: ticket } }) await ActivityGame.updateOne({ user: user.id, activity: user.activity }, { $inc: { tickets: ticket } })
await ticketRecord.save() await ticketRecord.save()
} }
return { status: currentTask.status, score, ticket } return { status: currentTask.status, score: formatNumShow(score), ticket }
} }
} }

View File

@ -1,4 +1,4 @@
import { INVITE_REBATE, INVITE_REBATE_LEVEL, SCORE_INVITE_REBATE } from 'common/Constants' import { INVITE_REBATE, INVITE_REBATE_LEVEL, RANK_SCORE_SCALE, SCORE_INVITE_REBATE } from 'common/Constants'
import { ActivityUser } from 'models/ActivityUser' import { ActivityUser } from 'models/ActivityUser'
import { ScoreRecord } from 'models/ScoreRecord' import { ScoreRecord } from 'models/ScoreRecord'
import { ZRedisClient } from 'zutils' import { ZRedisClient } from 'zutils'
@ -49,7 +49,7 @@ export const updateRankScore = async ({
const score1 = score * INVITE_REBATE const score1 = score * INVITE_REBATE
let scoreParams1 = Object.assign({ fromUser: user }, scoreParams) let scoreParams1 = Object.assign({ fromUser: user }, scoreParams)
const keyInvite = `${activity}:invite` const keyInvite = `${activity}:invite`
await updateRankInvite(keyInvite, parseInt(score1 * 100 + ''), `${userMod.inviteUser}_${user}`) await updateRankInvite(keyInvite, parseInt(score1 * RANK_SCORE_SCALE + ''), `${userMod.inviteUser}_${user}`)
await updateRankScore({ await updateRankScore({
user: userMod.inviteUser, user: userMod.inviteUser,
score: score1, score: score1,
@ -74,7 +74,7 @@ const updateRank = async (key: string, score: number, member: string) => {
scoreSaved = scoreSaved.substring(0, scoreSaved.indexOf('.')) scoreSaved = scoreSaved.substring(0, scoreSaved.indexOf('.'))
} }
let scoreOld = parseInt(scoreSaved || '0') let scoreOld = parseInt(scoreSaved || '0')
score = score + scoreOld score = score * RANK_SCORE_SCALE + scoreOld
const scoreToSave = score + 1 - Date.now() / 1000 / 10000000000 const scoreToSave = score + 1 - Date.now() / 1000 / 10000000000
await new ZRedisClient().zadd(key, scoreToSave, member) await new ZRedisClient().zadd(key, scoreToSave, member)
} }