军团活动:粮草先行部分计算逻辑
This commit is contained in:
@@ -579,14 +579,13 @@ async function updateRankAtom(key: string, serverId: number, field: string, scor
|
||||
return newScore;
|
||||
}
|
||||
|
||||
async function generateUnionRank(key: string, serverId: number) {
|
||||
async function generateUnionRank(key: string, serverId: number, timelen = 10) {
|
||||
let unionKey = getKeyName(key, serverId, 'union'); // 联合的key
|
||||
let existsKey = await redisClient().existsAsync(unionKey);
|
||||
if(!existsKey) {
|
||||
let originKey = getKeyName(key, serverId);
|
||||
let timeKey = getKeyName(key, serverId, 'time');
|
||||
|
||||
let timelen = 10;
|
||||
let pow = Math.pow(10, timelen + 1);
|
||||
await redisClient().zunionstoreAsync(unionKey, 2, originKey, timeKey, 'WEIGHTS', pow, 1);
|
||||
await redisClient().expireAsync(unionKey, 10); // 10秒更新一次
|
||||
@@ -600,7 +599,7 @@ async function generateUnionRank(key: string, serverId: number) {
|
||||
* @param serverId 区服id
|
||||
* @param roleId 自己的id
|
||||
*/
|
||||
export async function getUnionRank(key: string, serverId: number, roleId: string, limit = 100) {
|
||||
export async function getUnionRank(key: string, serverId: number, roleId: string, timelen = 10, limit = 100) {
|
||||
|
||||
let ranks = [], myRank = null;
|
||||
let unionKey = await generateUnionRank(key, serverId);
|
||||
@@ -627,6 +626,38 @@ export async function getUnionRank(key: string, serverId: number, roleId: string
|
||||
return {ranks, myRank}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取(分两个zset的)排行的一段排名内的数据
|
||||
* @param key 配置在REDIS_KEY中的key
|
||||
* @param serverId 区服id
|
||||
* @param startRank 开始排名
|
||||
* @param endRank 结束排名
|
||||
*/
|
||||
export async function getUnionRankRange(key: string, serverId: number, startRank: number, endRank: number) {
|
||||
let ranks = [];
|
||||
|
||||
let unionKey = await generateUnionRank(key, serverId);
|
||||
const rankFromDb = await redisClient().zrevrangeAsync(unionKey, startRank - 1, endRank - 1, "WITHSCORES");
|
||||
|
||||
let _key = key.split(':')[0];
|
||||
let infoKey = REDIS_RANK_TO_INFO.get(_key)||REDIS_KEY.USER_INFO;
|
||||
|
||||
for(let ii = 0; ii < rankFromDb.length; ii+=2) {
|
||||
const _roleId = rankFromDb[ii];
|
||||
const _score = decodeScoreWithTime(rankFromDb[ii + 1]);
|
||||
const info = await redisClient().hgetAsync(infoKey, _roleId);
|
||||
const _userInfo = JSON.parse(info);
|
||||
const tmp = {..._userInfo, num: _score, rank: Math.floor(ii/2)+1};
|
||||
if(infoKey == REDIS_KEY.USER_INFO) {
|
||||
tmp["roleId"] = _roleId;
|
||||
} else if(infoKey == REDIS_KEY.GUILD_INFO) {
|
||||
tmp["code"] = _roleId;
|
||||
}
|
||||
ranks.push(tmp);
|
||||
}
|
||||
return ranks
|
||||
}
|
||||
|
||||
// 获取我的排名
|
||||
export async function getMyUnionRank(key: string, serverId: number, roleId: string) {
|
||||
let unionKey = await generateUnionRank(key, serverId);
|
||||
|
||||
Reference in New Issue
Block a user