diff --git a/game-server/app/servers/role/handler/rankHandler.ts b/game-server/app/servers/role/handler/rankHandler.ts index 03afd6dd9..e21eeb3b3 100644 --- a/game-server/app/servers/role/handler/rankHandler.ts +++ b/game-server/app/servers/role/handler/rankHandler.ts @@ -1,6 +1,6 @@ import { Application, BackendSession, HandlerService, pinus, } from "pinus"; import { resResult } from "../../../pubUtils/util"; -import { STATUS, getRedisKeyByRankType, ROLE_SELECT, RANK_TYPE, HERO_SELECT, GUILD_SELECT, RANK_FIRST_REWARD_STATUS, ITEM_CHANGE_REASON } from "../../../consts"; +import { STATUS, getRedisKeyByRankType, ROLE_SELECT, RANK_TYPE, HERO_SELECT, GUILD_SELECT, RANK_FIRST_REWARD_STATUS, ITEM_CHANGE_REASON, REDIS_KEY } from "../../../consts"; import Role from "../../../db/Role"; import { UserGuildModel } from "../../../db/UserGuild"; import { GuildModel } from "../../../db/Guild"; @@ -9,6 +9,8 @@ import { gameData } from "../../../pubUtils/data"; import { addItems } from "../../../services/role/rewardService"; import { RewardInter } from "../../../pubUtils/interface"; import { RankFirstType } from "../../../db/RankFirst"; +import Hero from "../../../db/Hero"; +import { LineupParam, RoleAndGuildRankInfo, RoleRankInfo } from "../../../domain/rank"; export default function (app: Application) { new HandlerService(app, {}); @@ -49,13 +51,52 @@ export class RoleHandler { async getRank(msg: { type: number }, session: BackendSession) { let roleId = session.get('roleId'); let serverId = session.get('serverId'); - let guildCode = session.get('guildCode'); let { type } = msg; let redisKey = getRedisKeyByRankType(type); if (!redisKey) return resResult(STATUS.WRONG_PARMS); - let result = await getRankInHandler(redisKey, type, { serverId }, session); - return resResult(STATUS.SUCCESS, { type, ...result }); + + if(redisKey == REDIS_KEY.TOP_HERO_RANK) { + let heroRanks = await Hero.findByServerIdAndSortByCe(serverId); + + let r = new Rank(REDIS_KEY.TOP_HERO_RANK, { serverId }); + let ranks: RoleAndGuildRankInfo[] = [], myRank: RoleAndGuildRankInfo; + for(let rank = 1; rank <= heroRanks.length; rank++) { + let hero = heroRanks[rank - 1]; + let result = new RoleAndGuildRankInfo(rank, hero.ce); + let param = await r.getParam(rank, hero.roleId, [hero.ce]); + if(!param) { + let role = await Role.findByRoleId(hero.roleId, ROLE_SELECT.RANK); + await r.generParamAndSet(REDIS_KEY.USER_INFO, { roleId: hero.roleId }, { role }); + param = await r.getParam(rank, hero.roleId, [hero.ce]); + } + + param.setTopLine([new LineupParam(hero)]); + result.setUserInfo(param); + ranks.push(result); + if(!myRank && param.roleId == roleId) myRank = result; + } + if(!myRank) { + let myHeroes = await Hero.findAndSortByCe(roleId); + let myHero = myHeroes[0]; + let result = new RoleAndGuildRankInfo(0, myHero.ce); + let param = await r.getParam(0, roleId, [myHero.ce]); + if(!param) { + let role = await Role.findByRoleId(roleId, ROLE_SELECT.RANK); + await r.generParamAndSet(REDIS_KEY.USER_INFO, { roleId }, { role }); + param = await r.getParam(0, roleId, [myHero.ce]); + } + + param.setTopLine([new LineupParam(myHero)]); + result.setUserInfo(param); + myRank = result; + } + return resResult(STATUS.SUCCESS, { type, myRank, ranks }); + } else { + let result = await getRankInHandler(redisKey, type, { serverId }, session); + return resResult(STATUS.SUCCESS, { type, ...result }); + } + } // 查看活跃排行榜 @@ -87,18 +128,45 @@ export class RoleHandler { // 查看单个武将排行榜 async getHeroRank(msg: { type: number, hid: number }, session: BackendSession) { - let serverId = session.get('serverId') + let serverId = session.get('serverId'); + let roleId = session.get('roleId'); let { type, hid } = msg; let redisKey = getRedisKeyByRankType(type); if (!redisKey) return resResult(STATUS.WRONG_PARMS); - let r = new Rank(redisKey, { serverId, hid }); - let ranks = await r.getRankByRange(200, 0); + let heroRanks = await Hero.findByServerIdAndHidAndSortByCe(serverId, hid); - return resResult(STATUS.SUCCESS, { - type, hid, ranks - }); + let r = new Rank(redisKey, { serverId }); + let ranks: RoleRankInfo[] = [], myRank: RoleRankInfo; + for(let rank = 1; rank <= heroRanks.length; rank++) { + let hero = heroRanks[rank - 1]; + let param = await r.getParam(rank, hero.roleId, [hero.ce]); + if(!param) { + let role = await Role.findByRoleId(hero.roleId, ROLE_SELECT.RANK); + await r.generParamAndSet(REDIS_KEY.USER_INFO, { roleId: hero.roleId }, { role }); + param = await r.getParam(rank, hero.roleId, [hero.ce]); + } + + param.setSingleHero([new LineupParam(hero)]); + ranks.push(param); + if(!myRank && param.roleId == roleId) myRank = param; + } + if(!myRank) { + let myHero = await Hero.findByHidAndRole(hid, roleId); + let param = await r.getParam(0, roleId, [myHero?.ce||0]); + if(!param) { + let role = await Role.findByRoleId(roleId, ROLE_SELECT.RANK); + await r.generParamAndSet(REDIS_KEY.USER_INFO, { roleId }, { role }); + param = await r.getParam(0, roleId, [myHero?.ce||0]); + } + + if(myHero) { + param.setSingleHero([new LineupParam(myHero)]); + } + myRank = param; + } + return resResult(STATUS.SUCCESS, { type, hid, myRank, ranks }); } async receiveReward(msg: { type: number, id: number }, session: BackendSession) { diff --git a/game-server/app/services/playerCeService.ts b/game-server/app/services/playerCeService.ts index b4da986ae..c4b9203d5 100644 --- a/game-server/app/services/playerCeService.ts +++ b/game-server/app/services/playerCeService.ts @@ -495,13 +495,13 @@ async function updateRank(roleId: string, serverId: number, topLineupCe: number, await r.setRankWithRoleInfo(roleId, topLineupCe, 0, role); // 最强武将 - for(let { hid, ce } of pushHeros) { - let r2 = new Rank(REDIS_KEY.TOP_HERO_RANK, { serverId }); - await r2.setRankWithHeroInfo(roleId, hid, ce, 0); + // for(let { hid, ce } of pushHeros) { + // let r2 = new Rank(REDIS_KEY.TOP_HERO_RANK, { serverId }); + // await r2.setRankWithHeroInfo(roleId, hid, ce, 0); - let r4 = new Rank(REDIS_KEY.HERO_RANK, { serverId, hid }); - await r4.setRankWithHeroInfo(roleId, hid, ce, 0); - } + // let r4 = new Rank(REDIS_KEY.HERO_RANK, { serverId, hid }); + // await r4.setRankWithHeroInfo(roleId, hid, ce, 0); + // } // 总战力 let r3 = new Rank(REDIS_KEY.SUM_CE_RANK, { serverId }); diff --git a/game-server/app/services/rankService.ts b/game-server/app/services/rankService.ts index 15ad022fb..97daf6ee8 100644 --- a/game-server/app/services/rankService.ts +++ b/game-server/app/services/rankService.ts @@ -1119,14 +1119,14 @@ export async function setRankRedisFromDb(type: string, args?: { serverId?: numbe // console.log(roleId); await r.setRankWithRoleInfo(role.roleId, role.topLineupCe, role.updatedAt.getTime(), role); } - } else if (type == REDIS_KEY.TOP_HERO_RANK) { - let serverId = args.serverId; - let ranks = await Hero.getAllRank(serverId, HERO_SELECT.RANK_LINEUP); - let r = new Rank(type, { serverId }); - r.setIsInit(true); - for (let hero of ranks) { - await r.setRankWithHeroInfo(hero.roleId, hero.hid, hero.ce, hero.updatedAt.getTime(), hero); - } + // } else if (type == REDIS_KEY.TOP_HERO_RANK) { + // let serverId = args.serverId; + // let ranks = await Hero.getAllRank(serverId, HERO_SELECT.RANK_LINEUP); + // let r = new Rank(type, { serverId }); + // r.setIsInit(true); + // for (let hero of ranks) { + // await r.setRankWithHeroInfo(hero.roleId, hero.hid, hero.ce, hero.updatedAt.getTime(), hero); + // } } else if (type == REDIS_KEY.HERO_NUM_RANK) { let serverId = args.serverId; let ranks = await Role.getRank('heroNum', serverId, ROLE_SELECT.RANK); @@ -1175,17 +1175,17 @@ export async function setRankRedisFromDb(type: string, args?: { serverId?: numbe for (let role of ranks) { await r.setRankWithRoleInfo(role.roleId, role.mainEliteWarId, role.mainEliteUpdatedAt, role); } - } else if (type == REDIS_KEY.HERO_RANK) { - let serverId = args.serverId; + // } else if (type == REDIS_KEY.HERO_RANK) { + // let serverId = args.serverId; - for (let [hid] of gameData.recruit) { - let ranks = await Hero.getRank(hid, serverId, HERO_SELECT.RANK_LINEUP); - let r = new Rank(type, { serverId, hid }); - r.setIsInit(true); - for (let hero of ranks) { - await r.setRankWithHeroInfo(hero.roleId, hid, hero.ce, hero.updatedAt.getTime(), hero); - } - } + // for (let [hid] of gameData.recruit) { + // let ranks = await Hero.getRank(hid, serverId, HERO_SELECT.RANK_LINEUP); + // let r = new Rank(type, { serverId, hid }); + // r.setIsInit(true); + // for (let hero of ranks) { + // await r.setRankWithHeroInfo(hero.roleId, hid, hero.ce, hero.updatedAt.getTime(), hero); + // } + // } } else if (type == REDIS_KEY.LADDER) { let serverId = args.serverId; let ranks = await LadderMatchModel.findAll(serverId); diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 344ddfe2b..c38241b85 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -281,8 +281,10 @@ export function getInfoKeyByRedisKey(redisKey: REDIS_KEY) { return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] }; case REDIS_KEY.TOP_LINEUP_RANK: // 最强阵容排行 return { infoKey: REDIS_KEY.USER_INFO, extraKey: [REDIS_KEY.TOP_LINEUP_INFO] }; + // case REDIS_KEY.TOP_HERO_RANK: // 最强武将排行 + // return { infoKey: REDIS_KEY.USER_INFO, extraKey: [REDIS_KEY.HERO_INFO] }; case REDIS_KEY.TOP_HERO_RANK: // 最强武将排行 - return { infoKey: REDIS_KEY.USER_INFO, extraKey: [REDIS_KEY.HERO_INFO] }; + return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] }; case REDIS_KEY.HERO_NUM_RANK: // 武将数量排行 return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] }; case REDIS_KEY.USER_LV: // 主公等级排行榜 @@ -295,8 +297,10 @@ export function getInfoKeyByRedisKey(redisKey: REDIS_KEY) { return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] }; case REDIS_KEY.MAIN_ELITE_RANK: // 精英通关排名 return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] }; + // case REDIS_KEY.HERO_RANK: // 武将排行榜 + // return { infoKey: REDIS_KEY.USER_INFO, extraKey: [REDIS_KEY.HERO_INFO] }; case REDIS_KEY.HERO_RANK: // 武将排行榜 - return { infoKey: REDIS_KEY.USER_INFO, extraKey: [REDIS_KEY.HERO_INFO] }; + return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] }; case REDIS_KEY.GUILD_ACTIVE_RANK: // 公会周活跃排行榜 return { infoKey: REDIS_KEY.GUILD_INFO, extraKey: [] }; diff --git a/shared/db/Hero.ts b/shared/db/Hero.ts index 4f24675a2..8d198b63c 100644 --- a/shared/db/Hero.ts +++ b/shared/db/Hero.ts @@ -101,6 +101,8 @@ export class EPlace { @index({ seqId: 1 }) @index({ roleId: 1, hid: 1 }) @index({ roleId: 1, ce: -1 }) +@index({ serverId: 1, ce: -1 }) +@index({ serverId: 1, hid: 1, ce: -1 }) export default class Hero extends BaseModel { @prop({ required: true }) @@ -188,6 +190,16 @@ export default class Hero extends BaseModel { return heroes } + public static async findByServerIdAndSortByCe(serverId: number) { + const heroes: HeroType[] = await HeroROModel.find({ serverId }).sort({ ce: -1 }).select('hid skinId star colorStar lv quality job roleId ce').limit(200).lean(); + return heroes + } + + public static async findByServerIdAndHidAndSortByCe(serverId: number, hid: number) { + const heroes: HeroType[] = await HeroROModel.find({ serverId, hid }).sort({ ce: -1 }).select('hid skinId star colorStar lv quality job roleId ce').limit(200).lean(); + return heroes + } + public static async findBySeqIdRange(seqIds: Array, roleId: string, lean = true) { const hero: HeroType[] = await HeroROModel.find({ seqId: { $in: seqIds }, roleId }).lean(lean); return hero;