feat(gvg): 征战中原排行榜奖励

This commit is contained in:
luying
2023-02-17 10:58:46 +08:00
parent fc2a86ad81
commit eb772484c2
21 changed files with 678 additions and 100 deletions
+96 -14
View File
@@ -1,4 +1,4 @@
import { KeyName, KeyNameParam, RankParam, GuildRankParam, RoleRankInfo, LineupParam, myIdInter, GeneralRankParam, ValueConfig, GuildRankInfo, RoleAndGuildRankInfo } from "../domain/rank";
import { KeyName, KeyNameParam, RankParam, GuildRankParam, RoleRankInfo, LineupParam, myIdInter, GeneralRankParam, ValueConfig, GuildRankInfo, RoleAndGuildRankInfo, LeagueRankParam, LeagueRankInfo } from "../domain/rank";
import { getInfoKeyByRedisKey, ROLE_SELECT, GUILD_SELECT, REDIS_KEY, HERO_SELECT, COMPOSE_FIELD_TYPE, KEY_TO_COMPOSE_FIELD, getRedisKeyByRankType, COUNTER, RANK_TYPE, PUSH_ROUTE } from "../consts";
import { redisClient, delKeys, saveLadderDefCeByData } from "./redisService";
import { RoleType, RoleModel } from "../db/Role";
@@ -16,7 +16,10 @@ import { ActivityTimeLimitRankModel } from "../db/ActivityTimeLimitRank";
import { sendMessageToServerWithSuc } from "./pushService";
import { LadderMatchModel } from "../db/LadderMatch";
import { completeRanks } from "./ladderService";
import { GVGVestigeRankModel } from "../db/GVGVestigeRank";
import { GVGVestigeSumRankModel } from "../db/GVGVestigeSumRank";
import { GVGLeagueModel, GVGLeagueType } from "../db/GVGLeague";
import { GVGVestigeLeagueRankModel } from "../db/GVGVestigeLeagueRank";
import { getDayKeyInfo } from "./gvg/gvgFightService";
/**
@@ -111,7 +114,7 @@ export class Rank {
* 返回字段修改
* @param obj
*/
private async generFields(obj: GuildRankInfo | RoleRankInfo) {
private async generFields(obj: GuildRankInfo | RoleRankInfo | LeagueRankInfo) {
return obj;
}
@@ -119,7 +122,7 @@ export class Rank {
* 从外部设置返回字段
* @param cb
*/
public setGenerFieldsFun(cb: (obj: GuildRankInfo | RoleRankInfo) => any) {
public setGenerFieldsFun(cb: (obj: GuildRankInfo | RoleRankInfo | LeagueRankInfo) => any) {
this.generFields = cb;
}
@@ -189,6 +192,22 @@ export class Rank {
return newScore;
}
public async setRankWithLeagueInfo(leagueCode: string, score: number, timestamp: number, league?: GVGLeagueType, isInc = false) {
return await this.setRankWithLeagueInfoArrParam(leagueCode, [score, timestamp], league, isInc);
}
public async setRankWithLeagueInfoArrParam(leagueCode: string, scores: number[], league?: GVGLeagueType, isInc = false) {
for (let infoKey of [this.infoKey, ...this.extraKeys]) {
const hasCurUser = await redisClient().hexistsAsync(infoKey, leagueCode);
if (!hasCurUser) {
await this.generParamAndSet(infoKey, { leagueCode }, { league });
}
}
let newScore = await this.setRank({ leagueCode }, scores, isInc);
return newScore;
}
/**
* 根据武将表设置更新排行榜&玩家信息
* @param roleId 玩家id
@@ -211,7 +230,7 @@ export class Rank {
/**
* 将玩家信息按顺序组成 如:roleId:hid
* @param {{ string }} key redis key
* @param {{ roleId?: string; guildCode?: string; hid?: number }} param 玩家信息
* @param {{ roleId?: string; guildCode?: string; hid?: number; leagueCode?: string }} param 玩家信息
*/
private composeFields(key: REDIS_KEY, param: myIdInter) {
let type = KEY_TO_COMPOSE_FIELD.get(key);
@@ -222,6 +241,8 @@ export class Rank {
return param.guildCode;
} else if (type == COMPOSE_FIELD_TYPE.ROLE_HERO) {
return `${param.roleId}:${param.hid}`;
} else if (type == COMPOSE_FIELD_TYPE.LEAGUE) {
return `${param.leagueCode}`;
} else {
return '';
}
@@ -243,6 +264,8 @@ export class Rank {
return { guildCode: arr[0] };
} else if (type == COMPOSE_FIELD_TYPE.ROLE_HERO) {
return { roleId: arr[0], hid: parseInt(arr[1]) };
} else if (type == COMPOSE_FIELD_TYPE.LEAGUE) {
return { leagueCode: arr[0] };
} else {
return {};
}
@@ -254,9 +277,9 @@ export class Rank {
* @param fields 玩家id
* @param db 数据库内的数据
*/
public async generParamAndSet(infoKey: string, fields: myIdInter, db: { role?: RoleType, guild?: GuildType, hero?: HeroUpdate }) {
let { roleId, guildCode, hid } = fields;
let { role, guild, hero } = db;
public async generParamAndSet(infoKey: string, fields: myIdInter, db: { role?: RoleType, guild?: GuildType, hero?: HeroUpdate, league?: GVGLeagueType }) {
let { roleId, guildCode, hid, leagueCode } = fields;
let { role, guild, hero, league } = db;
if (infoKey == REDIS_KEY.USER_INFO) {
if (!role) {
@@ -272,6 +295,13 @@ export class Rank {
}
let param = new GuildRankParam(guild);
await this.setUserInfo(infoKey, { guildCode }, param);
} else if (infoKey == REDIS_KEY.LEAGUE_INFO) {
if (!league) {
league = await GVGLeagueModel.findByCode(leagueCode);
if(!league) return;
}
let param = new LeagueRankParam(league);
await this.setUserInfo(infoKey, { leagueCode }, param);
} else if (infoKey == REDIS_KEY.TOP_LINEUP_INFO) {
if (!role) {
role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.RANK, true);
@@ -345,7 +375,7 @@ export class Rank {
* @param myId
* @param param
*/
private async setUserInfo(infoKey: REDIS_KEY, myId: myIdInter, param: RankParam | GuildRankParam | LineupParam[]) {
private async setUserInfo(infoKey: REDIS_KEY, myId: myIdInter, param: RankParam | GuildRankParam | LineupParam[] | LeagueRankParam) {
let field = this.composeFields(infoKey, myId);
let value = JSON.stringify(param);
return await redisClient().hsetAsync(infoKey, field, value);
@@ -532,6 +562,29 @@ export class Rank {
return await this.generFields(param);
}
public async generMyRankWithLeague(leagueCode: string, score: number, time: number, league?: GVGLeagueType) {
// 如果没有信息,更新玩家信息
let param: LeagueRankInfo;
let hasCurUser = await redisClient().hexistsAsync(this.infoKey, leagueCode);
if (!hasCurUser) {
if (!league) {
league = await GVGLeagueModel.findByCode(leagueCode);
if(!league) return null
}
param = new LeagueRankInfo(league);
param.setInfo(0, { leagueCode }, score, time);
} else {
const info = await redisClient().hgetAsync(this.infoKey, leagueCode);
if(!info) return null
const leagueInfo = JSON.parse(info);
param = new LeagueRankInfo(leagueInfo);
param.setInfo(0, { leagueCode }, score, time);
}
return await this.generFields(param);
}
public async generMyRankWithHero(roleId: string, hid: number, score: number, time: number, hero?: HeroType, role?: RoleType) {
// 如果没有信息,更新玩家信息
let param: RoleRankInfo;
@@ -558,7 +611,7 @@ export class Rank {
return await this.generFields(param);
}
private async setExInfoToParam(extraKey: string, param: RoleRankInfo | GuildRankInfo, myId: myIdInter, db: { role?: RoleType, guild?: GuildType, hero?: HeroType }) {
private async setExInfoToParam(extraKey: string, param: RoleRankInfo | GuildRankInfo | LeagueRankInfo, myId: myIdInter, db: { role?: RoleType, guild?: GuildType, hero?: HeroType }) {
let { role, guild, hero } = db;
if (extraKey == REDIS_KEY.TOP_LINEUP_INFO) {
@@ -668,7 +721,6 @@ export class Rank {
public async getRankListWithMyRank(myId: myIdInter, isReverse = true) {
let ranks = await this.getRankByRange('+inf', '-inf', isReverse);
console.log('#### ranks', ranks);
let newRanks = [], newMyRank: any;
let myRank = ranks.find(cur => {
return cur.isMyInfo(myId);
@@ -738,7 +790,7 @@ export class Rank {
public async getRankByRange(max: number | string = '+inf', min: number | string = '-inf', isReverse = true) {
let raws = await this.getRankByRangeRaw(max, min, isReverse);
let ranks = new Array<RoleRankInfo | GuildRankInfo>();
let ranks = new Array<RoleRankInfo | GuildRankInfo | LeagueRankInfo>();
let l = 1;
for (let { field, scores } of raws) {
let param = await this.getParam(l, field, scores);
@@ -756,7 +808,7 @@ export class Rank {
const userInfo = JSON.parse(info);
if(!userInfo) return null;
let param: RoleRankInfo | GuildRankInfo;
let param: RoleRankInfo | GuildRankInfo | LeagueRankInfo;
if (this.infoKey == REDIS_KEY.USER_INFO) {
if (this.key != REDIS_KEY.LADDER && this.key != REDIS_KEY.GVG_VESTIGE_MEMBER && nowSeconds() - userInfo.updatedAt > 2 * 30 * 24 * 60 * 60) {
return null;
@@ -771,6 +823,10 @@ export class Rank {
param = new GuildRankInfo(userInfo);
param.setInfo(rank, myId, scores[0], scores[1]);
}
} else if (this.infoKey == REDIS_KEY.LEAGUE_INFO) {
param = new LeagueRankInfo(userInfo);
param.setInfo(rank, myId, scores[0], scores[1]);
}
for (let extraKey of this.extraKeys) {
@@ -781,7 +837,7 @@ export class Rank {
public async getRankByRank(start: number, end: number) {
let ranks = new Array<RoleRankInfo | GuildRankInfo>();
let ranks = new Array<RoleRankInfo | GuildRankInfo | LeagueRankInfo>();
let key = this.keyName.getName();
if (this.isUnion) {
key = await this.generateUnionRank();
@@ -1125,6 +1181,32 @@ export async function setRankRedisFromDb(type: string, args?: { serverId?: numbe
await r.setRankWithRoleInfo(rank.roleId, rank.rank, 0, role);
await saveLadderDefCeByData(rank.roleId, rank);
}
} else if (type == REDIS_KEY.GVG_VESTIGE_MEMBER_ALL) {
let ranks = await GVGVestigeSumRankModel.findRank();
for(let { _id: { groupId, serverType }, arr, roleIds } of ranks) {
let roles = await RoleModel.findByRoleIds(roleIds, ROLE_SELECT.RANK);
let r = new Rank(type, { groupId, serverType, day: getDayKeyInfo() });
r.setIsInit(true);
for(let { roleId, score, updatedAt } of arr) {
let role = roles.find(cur => cur.roleId == roleId);
if(role) {
await r.setRankWithRoleInfo(roleId, score, updatedAt.getTime(), role);
}
}
}
} else if (type == REDIS_KEY.GVG_VESTIGE_LEAGUE) {
let ranks = await GVGVestigeLeagueRankModel.findRank();
for(let { _id: { groupId, serverType }, arr, leagueCodes } of ranks) {
let leagues = await GVGLeagueModel.findByCodes(leagueCodes);
let r = new Rank(type, { groupId, serverType, day: getDayKeyInfo() });
r.setIsInit(true);
for(let { leagueCode, score, updatedAt } of arr) {
let league = leagues.find(cur => cur.leagueCode == leagueCode);
if(league) {
await r.setRankWithLeagueInfo(leagueCode, score, updatedAt.getTime(), league);
}
}
}
}
}