feat(gvg): 玩家驻扎排行榜

This commit is contained in:
luying
2023-02-02 20:29:33 +08:00
parent 92191cbcca
commit fc2a86ad81
16 changed files with 190 additions and 61 deletions

View File

@@ -255,6 +255,8 @@ export enum REDIS_KEY {
LADDER = 'ladder', // 名将擂台
LADDER_DEFCE = 'ladderDefCe', // 名将擂台的防守战力
GA_HISTORY_CITY = 'gaHisCity', // 诸侯混战打开过的城池页面
GVG_VESTIGE_MEMBER = 'vestigeUsr', // 玩家一个遗迹的积分
GVG_VESTIGE_MEMBER_ALL = 'vestigeUsrAll', // 玩家所有遗迹积分
}
// 各排行榜对应hash的key
@@ -305,6 +307,10 @@ export function getInfoKeyByRedisKey(redisKey: REDIS_KEY) {
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
case REDIS_KEY.TOP_LINE_SNAPSHOT: // 战力限时排行榜的快照
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
case REDIS_KEY.GVG_VESTIGE_MEMBER: // 单遗迹玩家排行榜
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
case REDIS_KEY.GVG_VESTIGE_MEMBER_ALL: // 全遗迹玩家排行榜
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
default:
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
}
@@ -399,6 +405,7 @@ export const KEY_TO_COMPOSE_FIELD = new Map([
[REDIS_KEY.SUM_CE_SNAPSHOT, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.TOP_LINE_SNAPSHOT, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.LADDER, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.GVG_VESTIGE_MEMBER, COMPOSE_FIELD_TYPE.ROLE],
]);

View File

@@ -28,7 +28,7 @@ export default class GVGLeagueApply extends BaseModel {
}
public static async checkApply(leagueCode: string, guildCode: string, type: GVG_APPLY_TYPE) {
console.log('####', leagueCode, guildCode, type)
// console.log('####', leagueCode, guildCode, type)
const result = await GVGLeagueApplyModel.exists({ guildCode, leagueCode,
type: type == GVG_APPLY_TYPE.ALL? { $in: [GVG_APPLY_TYPE.APPLY, GVG_APPLY_TYPE.INVITE] }: type
});

View File

@@ -16,6 +16,9 @@ export default class GVGVestigeLock extends BaseModel {
@prop({ required: true })
groupId: number; // 战区id
@prop({ required: true })
serverType: number; // 1-单服 2-跨服
@prop({ required: true })
vestigeId: number; // 遗迹id
@@ -31,26 +34,26 @@ export default class GVGVestigeLock extends BaseModel {
@prop({ required: true })
defenseRoleId: string; // 防守玩家
public static async chooseOppLock(groupId: number, vestigeId: number, rank: number, configId: number, attackRoleId: string, defenseRoleId: string ) {
public static async chooseOppLock(groupId: number, serverType: number, vestigeId: number, rank: number, configId: number, attackRoleId: string, defenseRoleId: string ) {
let day = getZeroPoint();
await GVGVestigeLockModel.findOneAndUpdate({ day, groupId, vestigeId, rank }, { $setOnInsert: { configId, unlockTime: 0 } }, { upsert: true });
await GVGVestigeLockModel.findOneAndUpdate({ day, groupId, serverType, vestigeId, rank }, { $setOnInsert: { configId, unlockTime: 0 } }, { upsert: true });
let result: GVGVestigeLockType = await GVGVestigeLockModel.findOneAndUpdate({
day, groupId, vestigeId, rank, unlockTime: { $lt: Date.now() }
}, { $set: { unlockTime: Date.now() + GVG.GVG_VESTIGE_PREPARE_COUNTDOWN * 1000, attackRoleId, defenseRoleId } }, { new: true }).lean();
return result;
}
public static async checkBattleLock(groupId: number, vestigeId: number, rank: number, attackRoleId: string) {
public static async checkBattleLock(groupId: number, serverType: number, vestigeId: number, rank: number, attackRoleId: string) {
let day = getZeroPoint();
let result: GVGVestigeLockType = await GVGVestigeLockModel.findOneAndUpdate({
day, groupId, vestigeId, rank, attackRoleId, unlockTime: { $gt: Date.now() }
day, groupId, serverType, vestigeId, rank, attackRoleId, unlockTime: { $gt: Date.now() }
}, { $set: { unlockTime: Date.now() + GVG.GVG_VESTIGE_BATTLE_COUNTDOWN * 1000 } }, { new: true }).lean();
return result;
}
public static async releaseLock(groupId: number, vestigeId: number, rank: number) {
public static async releaseLock(groupId: number, serverType: number, vestigeId: number, rank: number) {
let day = getZeroPoint();
let result: GVGVestigeLockType = await GVGVestigeLockModel.findOneAndUpdate({ day, groupId, vestigeId, rank }, { $set: { unlockTime: 0 } }, { new: true }).lean();
let result: GVGVestigeLockType = await GVGVestigeLockModel.findOneAndUpdate({ day, groupId, serverType, vestigeId, rank }, { $set: { unlockTime: 0 } }, { new: true }).lean();
return result;
}
}

View File

@@ -14,7 +14,7 @@ export class Lineup {
ce: number; // 战力
}
@index({ day: 1, groupId: 1, vestigeId: 1, rank: 1 })
@index({ day: 1, groupId: 1, serverType: 1, vestigeId: 1, rank: 1 })
@index({ roleId: 1 })
export default class GVGVestigeRank extends BaseModel {
@@ -31,10 +31,10 @@ export default class GVGVestigeRank extends BaseModel {
vestigeId: number; // 遗迹id
@prop({ required: true })
roleId: string; // 玩家
serverType: number; // 1-单服 2-跨服
@prop({ ref: 'Role', type: mongoose.Schema.Types.ObjectId })
role: Ref<Role>;
@prop({ required: true })
roleId: string; // 玩家
@prop({ required: true, default: 0 })
rank: number; // 排名
@@ -75,10 +75,10 @@ export default class GVGVestigeRank extends BaseModel {
return result;
}
public static async initRank(configId: number, vestigeId: number, groupId: number, role: RoleType, oppRanks: number[]) {
public static async initRank(configId: number, vestigeId: number, groupId: number, serverType: number, role: RoleType, oppRanks: number[]) {
let today = getZeroPoint();
let doc = new GVGVestigeRankModel();
let update = Object.assign(doc.toJSON(), { role: role._id, configId, groupId, oppRanks });
let update = Object.assign(doc.toJSON(), { role: role._id, configId, groupId, serverType, oppRanks });
let result: GVGVestigeRankType = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: role.roleId }, { $setOnInsert: update }, { new: true, upsert: true }).lean();
return result;
}
@@ -89,10 +89,9 @@ export default class GVGVestigeRank extends BaseModel {
return result;
}
public static async findByRanks(groupId: number, vestigeId: number, ranks: number[]) {
public static async findByRanks(groupId: number, serverType: number, vestigeId: number, ranks: number[]) {
let today = getZeroPoint();
let result: GVGVestigeRankType[] = await GVGVestigeRankModel.find({ day: today, vestigeId, groupId, rank: { $in: ranks } })
.populate('role', 'roleId roleName head frame spine heads frames spines title lv guildName serverId updatedAt')
let result: GVGVestigeRankType[] = await GVGVestigeRankModel.find({ day: today, vestigeId, groupId, serverType, rank: { $in: ranks } })
.lean();
return result;
}
@@ -142,6 +141,24 @@ export default class GVGVestigeRank extends BaseModel {
return result;
}
public static async findRank(): Promise<{ _id: { groupId: number, vestigeId: number, serverType: number }, arr: { roleId: string, rank: number }[], roleIds: string[] }[]> {
let today = getZeroPoint();
let ranks = await GVGVestigeRankModel.aggregate([
{ $match: { day: today } },
{ $group: {
_id: { groupId: "$groupId", vestigeId: "$vestigeId", serverType: "$serverType" },
arr: { $push: { roleId: "$roleId", rank: "$rank" } }, roleIds: { $addToSet: "$roleId" }
}},
]);
return ranks;
}
public static async findRankByVestige(groupId: number, serverType: number, vestigeId: number) {
let today = getZeroPoint();
let result: GVGVestigeRankType[] = await GVGVestigeRankModel.find({ day: today, vestigeId, groupId, serverType }).sort({ rank: 1 }).select('roleId rank lineup').lean();
return result;
}
}
export const GVGVestigeRankModel = getModelForClass(GVGVestigeRank);

View File

@@ -35,6 +35,9 @@ export default class GVGVestigeRec extends BaseModel {
@prop({ required: true })
groupId: number; // 战区id
@prop({ required: true })
serverType: number; // 战区id
@prop({ required: true })
vestigeId: number; // 遗迹id
@@ -62,10 +65,10 @@ export default class GVGVestigeRec extends BaseModel {
@prop({ required: true, default: false })
hasRpl: boolean; // 是否存在对应录像
public static async createRec(configId: number, vestigeId: number, groupId: number, warId: number, attackInfo: OppPlayerInfo, defenseInfo: OppPlayerInfo, leagueGoods: LeagueGood[]) {
public static async createRec(configId: number, vestigeId: number, groupId: number, serverType: number, warId: number, attackInfo: OppPlayerInfo, defenseInfo: OppPlayerInfo, leagueGoods: LeagueGood[]) {
const battleCode = genCode(10);
const result: GVGVestigeRecType = await GVGVestigeRecModel.findOneAndUpdate({ battleCode }, {
$set: { configId, vestigeId, groupId, attackRoleId: attackInfo.roleId, defenseRoleId: defenseInfo.roleId, warId, checkTime: Date.now(), attackInfo, defenseInfo, leagueGoods }
$set: { configId, vestigeId, groupId, serverType, attackRoleId: attackInfo.roleId, defenseRoleId: defenseInfo.roleId, warId, checkTime: Date.now(), attackInfo, defenseInfo, leagueGoods }
}, { new: true, upsert: true }).lean();
return result;
}

View File

@@ -32,7 +32,7 @@ export default class HiddenData extends BaseModel {
}
public static async findNextData(now: number) {
console.log('####', now)
// console.log('####', now)
let result: HiddenDataModelType = await HiddenDataModel.findOne({ refTime: { $gt: now } }).sort({ refTime: 1 });
return result;
}

View File

@@ -77,7 +77,7 @@ export default class TowerRecord extends BaseModel {
// 跳过当前层
public static async skipTower(roleId: string, fromLv: number, curLv: number, warStatus: WarStatus[]) {
console.log('######## skipTower', roleId, fromLv, curLv)
// console.log('######## skipTower', roleId, fromLv, curLv)
await TowerRecordModel.findOneAndUpdate({ roleId, lv: fromLv }, { $set: { passed: true } }, { new: true });

View File

@@ -10,6 +10,7 @@ import { EXTERIOR, GVG } from "../../pubUtils/dicParam";
import { DicWarJson } from "../../pubUtils/dictionary/DicWarJson";
import { gameData } from "../../pubUtils/data";
import { HeroType } from "../../db/Hero";
import { RoleRankInfo } from "../rank";
class LeagueLeaderInfo {
name: string; // 盟主名
@@ -520,4 +521,43 @@ export class GVGVestigeOppLineup {
this.heroes.push(obj);
}
}
}
export class VestigeRank {
rank: number;
roleId: string;
roleName: string;
guildName: string;
serverName: string;
lv: number;
head: number;
frame: number;
lineupCe: number;
score: number;
setByRankParam(obj: RoleRankInfo, serverName: string, lineupCe: number, score: number) {
this.rank = obj.rank;
this.roleId = obj.roleId;
this.roleName = obj.roleName;
this.guildName = obj.guildName;
this.serverName = serverName;
this.lv = obj.lv;
this.head = obj.head;
this.frame = obj.frame;
this.lineupCe = lineupCe;
this.score = score;
}
setByRole(role: RoleType, serverName: string) {
this.rank = 0;
this.roleId = role.roleId;
this.roleName = role.roleName;
this.guildName = role.guildName;
this.serverName = serverName;
this.lv = role.lv;
this.head = role.head;
this.frame = role.frame;
this.lineupCe = 0;
this.score = 0;
}
}

View File

@@ -301,6 +301,9 @@ export class KeyName {
seasonNum?: number;
activityId?: number;
index?: number; // 军团活动第几期
vestigeId?: number;
groupId?: number;
serverType?: number;
constructor(key: string, param: KeyNameParam) {
this.key = key;
@@ -311,6 +314,9 @@ export class KeyName {
if(param.seasonNum) this.seasonNum = param.seasonNum;
if(param.activityId) this.activityId = param.activityId;
if(param.index) this.index = param.index;
if(param.vestigeId) this.vestigeId = param.vestigeId;
if(param.groupId) this.groupId = param.groupId;
if(param.serverType) this.serverType = param.serverType;
}
public getName() {
@@ -343,6 +349,10 @@ export class KeyName {
case REDIS_KEY.SUM_CE_SNAPSHOT:
case REDIS_KEY.TOP_LINE_SNAPSHOT:
return `${this.key}:${this.serverId}:${this.activityId}`;
case REDIS_KEY.GVG_VESTIGE_MEMBER:
return `${this.key}:${this.groupId}:${this.serverType}:${this.vestigeId}`;
case REDIS_KEY.GVG_VESTIGE_MEMBER_ALL:
return `${this.key}:${this.groupId}`;
default:
return this.key;
}