活动:限时排行榜
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { KeyName, KeyNameParam, RankParam, GuildRankParam, RoleRankInfo, GuildLeader, LineupParam, myIdInter, GeneralRankParam, ValueConfig, GuildRankInfo } from "../domain/rank";
|
||||
import { REDIS_RANK_TO_INFO, ROLE_SELECT, GUILD_SELECT, REDIS_KEY, REDIS_RANK_TO_EXTRA, HERO_SELECT, COMPOSE_FIELD_TYPE, KEY_TO_COMPOSE_FIELD, RANK_TYPE_TO_KEY, COUNTER } from "../consts";
|
||||
import { KeyName, KeyNameParam, RankParam, GuildRankParam, RoleRankInfo, GuildLeader, LineupParam, myIdInter, GeneralRankParam, ValueConfig, GuildRankInfo, RoleAndGuildRankInfo } from "../domain/rank";
|
||||
import { getInfoKeyByRedisKey, ROLE_SELECT, GUILD_SELECT, REDIS_KEY, HERO_SELECT, COMPOSE_FIELD_TYPE, KEY_TO_COMPOSE_FIELD, getRedisKeyByRankType, COUNTER, RANK_TYPE } from "../consts";
|
||||
import { redisClient, delKeys } from "./redisService";
|
||||
import { RoleType, RoleModel } from "../db/Role";
|
||||
import { GuildType, GuildModel } from "../db/Guild";
|
||||
@@ -9,11 +9,13 @@ import { PvpDefenseModel } from "../db/PvpDefense";
|
||||
import { gameData } from "../pubUtils/data";
|
||||
import { getSeconds, nowSeconds } from "../pubUtils/timeUtil";
|
||||
import { getWorldChannelSid } from "./chatChannelService";
|
||||
import { pinus } from "pinus";
|
||||
import { BackendSession, pinus } from "pinus";
|
||||
import { RankFirstModel, RankFirstType, RankFirstUpdateParam } from "../db/RankFirst";
|
||||
import { getRandSingleEelm } from "../pubUtils/util";
|
||||
import { RANK_FIRST_REWARD_STATUS } from '../consts';
|
||||
import { CounterModel } from "../db/Counter";
|
||||
import { ActivityTimeLimitRankModel } from "../db/ActivityTimeLimitRank";
|
||||
import { stringify } from "querystring";
|
||||
|
||||
|
||||
/**
|
||||
@@ -35,8 +37,9 @@ export class Rank {
|
||||
constructor(key: REDIS_KEY, keyParam: KeyNameParam, isUnion = false, limit = 200) {
|
||||
this.key = key;
|
||||
this.keyName = new KeyName(key, keyParam);
|
||||
this.infoKey = REDIS_RANK_TO_INFO.get(key);
|
||||
this.extraKeys = REDIS_RANK_TO_EXTRA.get(key) || [];
|
||||
let { infoKey, extraKey } = getInfoKeyByRedisKey(key);
|
||||
this.infoKey = infoKey;
|
||||
this.extraKeys = extraKey;
|
||||
this.isUnion = isUnion;
|
||||
this.limit = limit;
|
||||
this.setValueConfig(key);
|
||||
@@ -51,6 +54,7 @@ export class Rank {
|
||||
case REDIS_KEY.TOP_LINEUP_RANK:
|
||||
case REDIS_KEY.TOP_HERO_RANK:
|
||||
case REDIS_KEY.SUM_CE_RANK:
|
||||
case REDIS_KEY.SUM_CE_SNAPSHOT:
|
||||
case REDIS_KEY.HERO_RANK:
|
||||
this.valueConfig = [
|
||||
new ValueConfig(true, 'score', 0, false, false)
|
||||
@@ -653,6 +657,34 @@ export class Rank {
|
||||
return { myRank: newMyRank, ranks: newRanks }
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取排行榜原始数据
|
||||
* @param from
|
||||
* @param to
|
||||
*/
|
||||
public async getRankDataByRankWithoutDetail(from: number | string = '+inf', to: number | string = '-inf') {
|
||||
let key = this.keyName.getName();
|
||||
if (this.isUnion) {
|
||||
key = await this.generateUnionRank();
|
||||
}
|
||||
|
||||
const rankFromDb = await redisClient().zrevrangebyscoreAsync(key, from, to, "WITHSCORES");
|
||||
let ranks: { rank: number, myId: {roleId?: string, guildCode?: string, hid?: number}, scores: number[] }[] = [];
|
||||
|
||||
let num = 0;
|
||||
for (let ii = 0; ii < rankFromDb.length; ii += 2) {
|
||||
if (num >= this.limit) break;
|
||||
|
||||
const field = rankFromDb[ii];
|
||||
let myId = this.decodeFields(this.key, field);
|
||||
const scores = this.decodeScore(rankFromDb[ii + 1]);
|
||||
|
||||
ranks.push({ rank: num, myId, scores });
|
||||
num++;
|
||||
}
|
||||
return ranks
|
||||
}
|
||||
|
||||
public async getRankByRange(from: number | string = '+inf', to: number | string = '-inf') {
|
||||
|
||||
let ranks = new Array<RoleRankInfo | GuildRankInfo>();
|
||||
@@ -862,7 +894,7 @@ export class Rank {
|
||||
let serverId = this.keyName.serverId;
|
||||
let sid = await getWorldChannelSid(serverId);
|
||||
let dicRank = gameData.rank.find(({ id }) => {
|
||||
let redisKey = RANK_TYPE_TO_KEY.get(id);
|
||||
let redisKey = getRedisKeyByRankType(id);
|
||||
return redisKey == ts.key
|
||||
});
|
||||
// console.log('*******', dicRank);
|
||||
@@ -1043,7 +1075,7 @@ export async function getGeneralRank(role: RoleType & { rankReceived: number[] }
|
||||
let result: (GeneralRankParam & {general: number})[] = [];
|
||||
|
||||
for (let { id, general } of gameData.rank) {
|
||||
let redisKey = RANK_TYPE_TO_KEY.get(id);
|
||||
let redisKey = getRedisKeyByRankType(id);
|
||||
if (redisKey) {
|
||||
let received = rankReceived.filter(rewardId => {
|
||||
let dic = gameData.generalRankReward.get(rewardId);
|
||||
@@ -1087,4 +1119,59 @@ export async function getGeneralRank(role: RoleType & { rankReceived: number[] }
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function getRankInHandler(redisKey: REDIS_KEY, type: RANK_TYPE, keyParam: KeyNameParam, session: BackendSession) {
|
||||
|
||||
const roleId = session.get('roleId');
|
||||
const serverId = session.get('serverId');
|
||||
const guildCode = session.get('guildCode');
|
||||
|
||||
let r = new Rank(redisKey, keyParam);
|
||||
r.setGenerFieldsFun((obj => {
|
||||
let result = new RoleAndGuildRankInfo(obj.rank, obj.num);
|
||||
if(obj instanceof GuildRankInfo) {
|
||||
result.setGuildInfo(obj);
|
||||
}
|
||||
if(obj instanceof RoleRankInfo) {
|
||||
result.setUserInfo(obj);
|
||||
}
|
||||
return result
|
||||
}));
|
||||
|
||||
let { ranks, myRank } = await r.getRankListWithMyRank({ roleId, guildCode });
|
||||
if (!myRank) {
|
||||
let role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.RANK, true);
|
||||
if (type == RANK_TYPE.TOP_LINTUP) {
|
||||
myRank = await r.generMyRankWithRole(roleId, role.topLineupCe, 0, role);
|
||||
} else if (type == RANK_TYPE.TOP_HERO) {
|
||||
let hero = await HeroModel.getMyTopHero(roleId, HERO_SELECT.RANK_LINEUP);
|
||||
myRank = await r.generMyRankWithHero(roleId, hero.hid, hero.ce, 0, hero, role);
|
||||
} else if (type == RANK_TYPE.HERO_NUM) {
|
||||
myRank = await r.generMyRankWithRole(roleId, role.heroNum, role.heroNumUpdatedAt, role);
|
||||
} else if (type == RANK_TYPE.USER_LV) {
|
||||
myRank = await r.generMyRankWithRole(roleId, role.lv, role.updatedAt.getTime(), role);
|
||||
} else if (type == RANK_TYPE.SUM_CE) {
|
||||
myRank = await r.generMyRankWithRole(roleId, role.ce, role.updatedAt.getTime(), role);
|
||||
} else if (type == RANK_TYPE.TOWER) {
|
||||
myRank = await r.generMyRankWithRole(roleId, role.towerLv - 1, role.towerUpTime?.getTime() || 0, role);
|
||||
// } else if (type == RANK_TYPE.DUNGEON) {
|
||||
// myRank = await r.generMyRankWithRole(roleId, role.dungeonWarId, role.dungeonUpdatedAt, role);
|
||||
} else if (type == RANK_TYPE.MAIN) {
|
||||
myRank = await r.generMyRankWithRole(roleId, role.mainWarId, role.mainUpdatedAt, role);
|
||||
} else if (type == RANK_TYPE.MAIN_ELITE) {
|
||||
myRank = await r.generMyRankWithRole(roleId, role.mainEliteWarId, role.mainEliteUpdatedAt, role);
|
||||
} else if (type == RANK_TYPE.GUILD_LV) {
|
||||
if(role.hasGuild) {
|
||||
let guild = await GuildModel.findByCode(guildCode, serverId);
|
||||
myRank = await r.generMyRankWithGuild2(roleId, guild.lv, guild.activeWeekly, guild.lvUpdateTime, guild);
|
||||
}
|
||||
} else if (type == RANK_TYPE.GUILD_FUND) {
|
||||
if(role.hasGuild) {
|
||||
let limitRank = await ActivityTimeLimitRankModel.findByCode(serverId, keyParam.activityId, guildCode);
|
||||
myRank = await r.generMyRankWithGuild(guildCode, limitRank?.score||0, limitRank?.time);
|
||||
}
|
||||
}
|
||||
}
|
||||
return { ranks, myRank }
|
||||
}
|
||||
Reference in New Issue
Block a user