排行榜:先做一点假数据
This commit is contained in:
@@ -169,23 +169,19 @@ export async function getCityActivityRank(guildCode: string, serverId: number, c
|
||||
export async function getRaceActivityRank(guildCode: string, serverId: number) {
|
||||
let guildKey = REDIS_KEY.RACE_ACTIVITY;
|
||||
|
||||
let obj = getRaceActivityObj();
|
||||
let guildRankResult = await getUnionRank(guildKey, serverId, guildCode);
|
||||
let guildRankResult = await getUnionRank(guildKey, serverId, guildCode, 6);
|
||||
let guildRank = new Array<SimpleGuildRankWithTimeParam>();
|
||||
for(let { rank, code, name, num } of guildRankResult.ranks) {
|
||||
let _obj = await obj.getWoodenHorse(code, serverId);
|
||||
let param = new SimpleGuildRankWithTimeParam(rank, code, name, _obj);
|
||||
for(let { rank, code, name, num, time } of guildRankResult.ranks) {
|
||||
let param = new SimpleGuildRankWithTimeParam(rank, code, name, { distance: num/1000, time: time * 1000, startTime: 0, durability: 0 });
|
||||
guildRank.push(param);
|
||||
}
|
||||
let myGuildRank: SimpleGuildRankWithTimeParam;
|
||||
if(guildRankResult.myRank) {
|
||||
let { rank, code, name, num } = guildRankResult.myRank;
|
||||
let _obj = await obj.getWoodenHorse(code, serverId);
|
||||
myGuildRank = new SimpleGuildRankWithTimeParam(rank, code, name, _obj);
|
||||
let { rank, code, name, num, time } = guildRankResult.myRank;
|
||||
myGuildRank = new SimpleGuildRankWithTimeParam(rank, code, name, { distance: num/1000, time: time * 1000, startTime: 0, durability: 0 });
|
||||
} else {
|
||||
let guild = await GuildModel.findByCode(guildCode, serverId, 'name');
|
||||
let _obj = await obj.getWoodenHorse(guildCode, serverId);
|
||||
myGuildRank = new SimpleGuildRankWithTimeParam(0, guildCode, guild?.name, _obj);
|
||||
myGuildRank = new SimpleGuildRankWithTimeParam(0, guildCode, guild?.name, { distance: 0, time: 0, startTime: 0, durability: 0 });
|
||||
}
|
||||
return { guildRank, myGuildRank }
|
||||
}
|
||||
@@ -581,7 +577,7 @@ export async function calWoodenHorseAndSend(serverId: number) {
|
||||
console.log('calWoodenHorseAndSend');
|
||||
let guildKey = REDIS_KEY.RACE_ACTIVITY;
|
||||
let obj = getRaceActivityObj();
|
||||
let { ranks } = await getUnionRank(guildKey, serverId, '');
|
||||
let { ranks } = await getUnionRank(guildKey, serverId, '', 6);
|
||||
let map = new Map<number, WoodenHorse[]>();
|
||||
|
||||
let guildRank = new Array<SimpleGuildRankWithTimeParam>();
|
||||
|
||||
@@ -155,12 +155,12 @@ export async function redisUserInfoAdd(key: string, roleId: string, params: Rank
|
||||
* @param isAtom 是否是原子性的更新
|
||||
* @param limit
|
||||
*/
|
||||
export async function setRank(key: string, serverId: number, myId: string, score: number, timestamp: number, params: RankParam|GuildRankParam, isAtom = false, limit = 100) {
|
||||
export async function setRank(key: string, serverId: number, myId: string, score: number, timestamp: number, params: RankParam|GuildRankParam, isAtom = false, timelen = 10, limit = 100) {
|
||||
|
||||
// 更新分数
|
||||
let newScore = score;
|
||||
if(isAtom) {
|
||||
newScore = await updateRankAtom(key, serverId, myId, score, timestamp);
|
||||
newScore = await updateRankAtom(key, serverId, myId, score, timestamp, true, timelen);
|
||||
} else {
|
||||
const _score = encodeScoreWithTime(score, timestamp);
|
||||
await redisClient().zaddAsync(getKeyName(key, serverId), _score, myId);
|
||||
@@ -177,11 +177,23 @@ export async function setRank(key: string, serverId: number, myId: string, score
|
||||
return parseInt(newScore.toString());
|
||||
}
|
||||
|
||||
export async function setRankWithoutUserInfo(key: string, serverId: number, myId: string, score: number, timestamp: number, isAtom = false, isInc = true, limit = 100) {
|
||||
export async function setRankWithoutUserInfo(key: string, serverId: number, myId: string, score: number, timestamp: number, isAtom = false, isInc = true, timelen=10, limit = 100) {
|
||||
|
||||
let infoKey = REDIS_RANK_TO_INFO.get(key)||REDIS_KEY.USER_INFO;
|
||||
// 如果没有信息,更新玩家信息
|
||||
const hasCurUser = await redisClient().hexistsAsync(infoKey, myId);
|
||||
if(!hasCurUser) {
|
||||
let guild = await GuildModel.findByCode(myId, serverId);
|
||||
|
||||
let leader = <RoleType>guild.leader;
|
||||
let guildRankParam = new GuildRankParam(guild.icon, guild.name, guild.lv, leader);
|
||||
await redisUserInfoAdd(infoKey, myId, guildRankParam);
|
||||
}
|
||||
|
||||
// 更新分数
|
||||
let newScore = score;
|
||||
if(isAtom) {
|
||||
newScore = await updateRankAtom(key, serverId, myId, score, timestamp, isInc);
|
||||
newScore = await updateRankAtom(key, serverId, myId, score, timestamp, isInc, timelen);
|
||||
} else {
|
||||
const _score = encodeScoreWithTime(score, timestamp);
|
||||
await redisClient().zaddAsync(getKeyName(key, serverId), _score, myId);
|
||||
@@ -238,13 +250,20 @@ function encodeScoreWithTime(score: number, timestamp: number): number {
|
||||
return score * pow + pow - 1 - Math.floor(timestamp/1000)
|
||||
}
|
||||
|
||||
function decodeScoreWithTime(num: string): number {
|
||||
let timelen = 10;
|
||||
function decodeScoreWithTime(num: string, timelen: number = 10): number {
|
||||
let pow = Math.pow(10, timelen + 1);
|
||||
let _num = parseInt(num);
|
||||
return Math.floor(_num/pow);
|
||||
}
|
||||
|
||||
function decodeTime(num: string, timelen: number = 10): number {
|
||||
let pow = Math.pow(10, timelen + 1);
|
||||
let _num = parseInt(num);
|
||||
let time = _num % pow;
|
||||
console.log(pow, time, _num);
|
||||
return pow - time;
|
||||
}
|
||||
|
||||
// 从排行榜中移除
|
||||
export async function removeFromRank(key: string, serverId: number, myId: string) {
|
||||
await redisClient().zremAsync(getKeyName(key, serverId), myId);
|
||||
@@ -578,13 +597,13 @@ function redisClient() {
|
||||
* @param score 得分
|
||||
* @param time 事件
|
||||
*/
|
||||
async function updateRankAtom(key: string, serverId: number, field: string, score: number, timestamp: number, isInc = true) {
|
||||
async function updateRankAtom(key: string, serverId: number, field: string, score: number, timestamp: number, isInc = true, timelen = 10) {
|
||||
let originKey = getKeyName(key, serverId);
|
||||
let timeKey = getKeyName(key, serverId, 'time');
|
||||
|
||||
let timelen = 10;
|
||||
let pow = Math.pow(10, timelen + 1);
|
||||
let newScore = 0;
|
||||
console.log('********', isInc, field, score, pow - 1 - Math.floor(timestamp/1000));
|
||||
if(isInc) {
|
||||
newScore = await redisClient().zincrbyAsync(originKey, score, field);
|
||||
} else {
|
||||
@@ -634,10 +653,11 @@ export async function getUnionRank(key: string, serverId: number, roleId: string
|
||||
|
||||
for(let ii = 0; ii < rankFromDb.length; ii+=2) {
|
||||
const _roleId = rankFromDb[ii];
|
||||
const _score = decodeScoreWithTime(rankFromDb[ii + 1]);
|
||||
const _score = decodeScoreWithTime(rankFromDb[ii + 1], timelen);
|
||||
const _time = decodeTime(rankFromDb[ii + 1], timelen);
|
||||
const info = await redisClient().hgetAsync(infoKey, _roleId);
|
||||
const _userInfo = JSON.parse(info);
|
||||
const tmp = {..._userInfo, num: _score, rank: Math.floor(ii/2)+1};
|
||||
const tmp = {..._userInfo, num: _score, time: _time, rank: Math.floor(ii/2)+1};
|
||||
if(infoKey == REDIS_KEY.USER_INFO) {
|
||||
tmp["roleId"] = _roleId;
|
||||
} else if(infoKey == REDIS_KEY.GUILD_INFO) {
|
||||
|
||||
Reference in New Issue
Block a user