66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
import { ScoreRecord } from 'models/ScoreRecord'
|
|
import { RedisClient } from 'redis/RedisClient'
|
|
import { formatDate } from 'zutils/utils/date.util'
|
|
|
|
/**
|
|
* 更新排行榜
|
|
* @param param0
|
|
* user: 用户id
|
|
* score: 分数
|
|
* activity: 活动id
|
|
* scoreType: 分数类型
|
|
* scoreParams: 额外的参数
|
|
*/
|
|
export const updateRankScore = async ({
|
|
user,
|
|
score,
|
|
activity,
|
|
scoreType,
|
|
scoreParams,
|
|
}: {
|
|
user: string
|
|
score: number
|
|
activity: string
|
|
scoreType: string
|
|
scoreParams: any
|
|
}) => {
|
|
let record = new ScoreRecord({
|
|
user: user,
|
|
activity: activity,
|
|
score,
|
|
type: scoreType,
|
|
data: scoreParams,
|
|
})
|
|
await record.save()
|
|
const key = rankKey(activity)
|
|
await updateRank(key, score, user)
|
|
// add daily score
|
|
const dailyKey = rankKey(activity, new Date())
|
|
await updateRank(dailyKey, score, user)
|
|
}
|
|
|
|
/**
|
|
* 更新排行榜
|
|
* @param key
|
|
* @param score
|
|
* @param member
|
|
*/
|
|
const updateRank = async (key: string, score: number, member: string) => {
|
|
let scoreSaved = (await new RedisClient().zscore(key, member)) + ''
|
|
if (scoreSaved) {
|
|
scoreSaved = scoreSaved.substring(0, scoreSaved.indexOf('.'))
|
|
}
|
|
let scoreOld = parseInt(scoreSaved || '0')
|
|
score = score + scoreOld
|
|
const scoreToSave = score + 1 - Date.now() / 1000 / 10000000000
|
|
await new RedisClient().zadd(key, scoreToSave, member)
|
|
}
|
|
|
|
export const rankKey = (activity: string, date?: Date) => {
|
|
if (!date) {
|
|
return `${activity}:score`
|
|
}
|
|
const dateTag = formatDate(date)
|
|
return `${activity}:score:${dateTag}`
|
|
}
|