排行榜: 获取排行榜
This commit is contained in:
+63
-6
@@ -160,6 +160,8 @@ export default class Role extends BaseModel {
|
||||
topLineup: Array<TopHero>; // 总战力
|
||||
@prop({ required: true, default: 100 })
|
||||
tili: number; // 体力值
|
||||
@prop({ required: false, set: (val: boolean) => val, get: () => true })
|
||||
isReducedCe: boolean; // 如果战力没有缩过就会返回false,缩过了就会返回true
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
vLv: number; // VIP 等级
|
||||
@@ -264,6 +266,26 @@ export default class Role extends BaseModel {
|
||||
recFrdApplyCnt: number; // 玩家收取好友申请数量
|
||||
@prop({ required: true, default: 0 })
|
||||
updatedMailAt: number;
|
||||
|
||||
// 排行相关
|
||||
@prop({ required: true, default: 0 })
|
||||
heroNum: number; // 武将数量
|
||||
@prop({ required: true, default: 0 })
|
||||
heroNumUpdatedAt: number; // 武将数量更新时间
|
||||
@prop({ required: true, default: 0 })
|
||||
dungeonWarId: number; // 秘境通关关卡
|
||||
@prop({ required: true, default: 0 })
|
||||
dungeonUpdatedAt: number; // 秘境通关时间
|
||||
@prop({ required: true, default: 0 })
|
||||
mainWarId: number; // 主线通关关卡
|
||||
@prop({ required: true, default: 0 })
|
||||
mainUpdatedAt: number; // 秘境通关时间
|
||||
@prop({ required: true, default: 0 })
|
||||
mainEliteWarId: number; // 精英通关关卡
|
||||
@prop({ required: true, default: 0 })
|
||||
mainEliteUpdatedAt: number; // 精英通关时间
|
||||
|
||||
|
||||
public static async findAllByUid(uid: number, getters = false, virtuals = true) {
|
||||
const role: RoleType[] = await RoleModel.find({ 'userInfo.uid': uid }).select('roleId roleName serverId head frame spine lv updatedAt').lean({ getters, virtuals});
|
||||
return role;
|
||||
@@ -436,13 +458,31 @@ export default class Role extends BaseModel {
|
||||
}
|
||||
|
||||
// 获取排行榜
|
||||
public static async getRank(type: string, serverId: number, fields: string[], page = 1, limit = 100) {
|
||||
public static async getRank(type: string, serverId: number, select?: string, page = 1, limit = 200) {
|
||||
let sortBy = {};
|
||||
if(type == 'tower') {
|
||||
sortBy['towerLv'] = -1;
|
||||
sortBy['towerUpTime'] = 1;
|
||||
let condition = {};
|
||||
switch(type) {
|
||||
case 'tower':
|
||||
sortBy = { towerLv: -1, towerUpTime: 1 }; condition = { towerLv: { $gt: 0 } }; break;
|
||||
case 'topLineup':
|
||||
sortBy = { topLineupCe: -1, updatedAt: 1 }; condition = { topLineupCe: { $gt: 0 } }; break;
|
||||
case 'heroNum':
|
||||
sortBy = { heroNum: -1, heroNumUpdatedAt: 1 }; condition = { heroNum: { $gt: 0 } }; break;
|
||||
case 'lv':
|
||||
sortBy = { lv: -1, updatedAt: 1 }; condition = { lv: { $gt: 0 } }; break;
|
||||
case 'ce':
|
||||
sortBy = { ce: -1, updatedAt: 1 }; condition = { ce: { $gt: 0 } }; break;
|
||||
case 'dungeon':
|
||||
sortBy = { dungeonWarId: -1, dungeonUpdatedAt: 1 }; condition = { dungeonWarId: { $gt: 0 } }; break;
|
||||
case 'main':
|
||||
sortBy = { mainWarId: -1, mainUpdatedAt: 1 }; condition = { mainWarId: { $gt: 0 } }; break;
|
||||
case 'mainElite':
|
||||
sortBy = { mainEliteWarId: -1, mainEliteUpdatedAt: 1 }; condition = { mainEliteWarId: { $gt: 0 } }; break;
|
||||
default:
|
||||
sortBy = {}; break;
|
||||
}
|
||||
const ranks: RoleType[] = await RoleModel.find({serverId}).select(fields.join(' ')).sort(sortBy).limit(limit).skip((page - 1) * limit).lean({ virtuals: true });
|
||||
|
||||
const ranks: RoleType[] = await RoleModel.find({serverId, ...condition}).select(select).sort(sortBy).limit(limit).skip((page - 1) * limit).lean({ virtuals: true, getters: true });
|
||||
return ranks;
|
||||
}
|
||||
|
||||
@@ -453,7 +493,7 @@ export default class Role extends BaseModel {
|
||||
let dungeonHeroes = role && role.dungeonHeroes;
|
||||
let hasHero = dungeonHeroes&&dungeonHeroes.find(cur => cur.battleId == battleId);
|
||||
if(!dungeonHeroes || !hasHero) {
|
||||
role = await RoleModel.findOneAndUpdate({roleId}, {$push:{dungeonHeroes: {battleId, heroes}}})
|
||||
role = await RoleModel.findOneAndUpdate({roleId}, {$push:{dungeonHeroes: {battleId, heroes}}, $set: { dungeonWarId: battleId, dungeonUpdatedAt: nowSeconds() }});
|
||||
}
|
||||
return role;
|
||||
}
|
||||
@@ -471,6 +511,22 @@ export default class Role extends BaseModel {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async incRoleInfo(roleId: string, inc: RoleInc, set: RoleUpdate, getters = false, virtuals = true) {
|
||||
delete set._id;
|
||||
let result: RoleType = await RoleModel.findOneAndUpdate({roleId}, {$inc: inc, $set: set}, {new: true}).lean({ getters, virtuals });
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async updateMainWarId(roleId: string, mainWarId: number, mainUpdatedAt: number, getters = false, virtuals = true) {
|
||||
let result: RoleType = await RoleModel.findOneAndUpdate({roleId, mainWarId: { $lt: mainWarId }}, {$set:{mainWarId, mainUpdatedAt}}, {new: true}).lean({ getters, virtuals });
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async updateMainEliteWarId(roleId: string, mailEliteWarId: number, mainEliteUpdatedAt: number, getters = false, virtuals = true) {
|
||||
let result: RoleType = await RoleModel.findOneAndUpdate({roleId, mailEliteWarId: { $lt: mailEliteWarId }}, {$set:{mailEliteWarId, mainEliteUpdatedAt}}, {new: true}).lean({ getters, virtuals });
|
||||
return result;
|
||||
}
|
||||
|
||||
// 记录加入公会
|
||||
public static async joinGuild(roleId: string, guildCode: string, guildName: string) {
|
||||
const result = await RoleModel.findOneAndUpdate({ roleId, hasGuild: false }, { hasGuild: true, guildCode, guildName }, { new: true }).lean();
|
||||
@@ -576,6 +632,7 @@ export const RoleModel = getModelForClass(Role);
|
||||
|
||||
export interface RoleType extends Pick<DocumentType<Role>, keyof Role>{};
|
||||
export type RoleUpdate = Partial<RoleType>; // 将所有字段变成可选项
|
||||
export type RoleInc = Partial<Pick<DocumentType<Role>, 'heroNum'|'blockCnt'|'friendCnt'|'gold'|'coin'>>;
|
||||
|
||||
// 初始化
|
||||
function getInitialTeraph() {
|
||||
|
||||
Reference in New Issue
Block a user