排行榜: 获取排行榜

This commit is contained in:
luying
2021-04-12 09:47:15 +08:00
parent 34e02dea89
commit 5dca7b304d
32 changed files with 1077 additions and 290 deletions
+17 -7
View File
@@ -2,7 +2,7 @@ import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose';
import Role, { RoleType } from './Role';
import { genCode } from '../pubUtils/util';
import { GUILD_STRUCTURE, GUILD_STATUS, GUILD_PER_PAGE, GUILD_SELECT } from '../consts';
import { GUILD_STRUCTURE, GUILD_STATUS, GUILD_PER_PAGE, GUILD_SELECT, RANK_TYPE, REDIS_KEY } from '../consts';
import { getCurWeekTime, nowSeconds } from '../pubUtils/timeUtil';
import { reduceCe } from '../pubUtils/util';
@@ -28,6 +28,9 @@ export default class Guild extends BaseModel {
@prop({ required: true, default: 1 })
lv: number;
@prop({ required: true, default: 1 })
lvUpdateTime: number;
@prop({ required: true, default: 1 })
memberCnt: number;
@@ -98,7 +101,7 @@ export default class Guild extends BaseModel {
public static async createGuild(params: { name: string, icon: number, notice: string }, role: RoleType, serverId: number) {
const doc = new GuildModel();
const update = Object.assign(doc.toJSON(), params, { leader: role._id, members: [role.roleId], guildCe: role.ce, serverId });
const update = Object.assign(doc.toJSON(), params, { leader: role._id, members: [role.roleId], guildCe: role.ce, serverId, lvUpdateTime: nowSeconds() });
delete update._id;
const code = genCode(6);
const result: GuildType = await GuildModel.findOneAndUpdate({ code }, update, { upsert: true, new: true })
@@ -132,12 +135,19 @@ export default class Guild extends BaseModel {
}
public static async getRank(serverId: number, page: number = 1) {
public static async getRank(type: string, serverId: number, page: number = 1) {
let sort = {}, condition = {};
switch(type) {
case REDIS_KEY.GUILD_LV_RANK:
sort = { lv: -1, lvUpdateTime: 1 }; break;
case REDIS_KEY.GUILD_ACTIVE_RANK:
sort = { activeWeekly: -1, activeUpdateTime: 1 }; condition = { activeWeekly: { $gt: 0 } }; break;
}
const guildList: GuildType[] = await GuildModel.find({ status: GUILD_STATUS.RUNNING, serverId }, {_id: 0})
.sort({ activeWeekly: -1, activeUpdateTime: -1 })
const guildList: GuildType[] = await GuildModel.find({ status: GUILD_STATUS.RUNNING, serverId, ...condition }, {_id: 0})
.sort(sort)
.limit(100).skip((page - 1) * 100)
.select('code icon name lv leader activeWeekly activeUpdateTime')
.select(GUILD_SELECT.RANK)
.populate('leader', {roleName: 1, title: 1, frame: 1, head: 1, spine: 1, lv: 1, _id: 0}, 'Role')
.lean({ virtuals: true });
return guildList;
@@ -189,7 +199,7 @@ export default class Guild extends BaseModel {
public static async upStructure(code: string, id: number, cost: number, select?: string) {
if (id == GUILD_STRUCTURE.ARMY_CENTER) {
const result: GuildType = await GuildModel.findOneAndUpdate({ code, 'structure.id': id, fund: { $gte: cost } }, { $inc: { 'structure.$.lv': 1, lv: 1, fund: -1 * cost }, $set: { isMemberMax: false } }, { new: true }).select(select).lean();
const result: GuildType = await GuildModel.findOneAndUpdate({ code, 'structure.id': id, fund: { $gte: cost } }, { $inc: { 'structure.$.lv': 1, lv: 1, fund: -1 * cost }, $set: { isMemberMax: false, lvUpdateTime: nowSeconds() } }, { new: true }).select(select).lean();
return result;
} else {
const result: GuildType = await GuildModel.findOneAndUpdate({ code, 'structure.id': id, fund: { $gte: cost } }, { $inc: { 'structure.$.lv': 1, fund: -1 * cost } }, { new: true }).select(select).lean();
+15 -2
View File
@@ -4,6 +4,7 @@ import Equip, { } from './Equip';
import { CounterModel } from './Counter';
import { COUNTER, EQUIP_TYPE } from '../consts';
import { reduceCe } from '../pubUtils/util';
import { nowSeconds } from '../pubUtils/timeUtil';
class CeAttrData {
@prop({ required: true })
@@ -90,6 +91,8 @@ export default class Hero extends BaseModel {
lv: number; // 武将等级
@prop({ required: true, default: 0, set: (val: number) => val, get: (val: number) => reduceCe(val) })
ce: number; // 武将战力
@prop({ required: false, set: (val: boolean) => val, get: () => true })
isReducedCe: boolean; // 如果战力没有缩过就会返回false,缩过了就会返回true
@prop({ required: true, default: 0 })
historyCe: number; // 武将历史最高战力
@prop({required: true, type: CeAttrData, default: [], _id: false })
@@ -190,7 +193,7 @@ export default class Hero extends BaseModel {
return hero;
}
public static async createHero(heroInfo: {roleId: string, serverId: number, roleName: string, hid: number, hName: string, star: number, quality: number, job: number, lv?: number, exp?: number, skins:Skin[]}, lean = true) {
public static async createHero(heroInfo: HeroUpdate, lean = true) {
const doc = new HeroModel();
const seqId = await CounterModel.getNewCounter(COUNTER.HID)||-1;
const update = Object.assign(doc.toJSON(), heroInfo, {seqId});
@@ -267,7 +270,17 @@ export default class Hero extends BaseModel {
return user;
}
public static async getRank(hid: number, serverId: number, select?: string, limit = 100) {
public static async getAllRank(serverId: number, select?: string, limit = 200) {
let result: HeroType[] = await HeroModel.find({serverId}, { _id: false} ).select(select).limit(limit).sort({ ce: -1, updatedAt: 1 }).lean({ getters: true });
return result;
}
public static async getMyTopHero(roleId: string, select?: string) {
let result: HeroType = await HeroModel.findOne({ roleId }, { _id: false} ).select(select).sort({ ce: -1, updatedAt: 1 }).lean({ getters: true });
return result;
}
public static async getRank(hid: number, serverId: number, select?: string, limit = 200) {
let result: HeroType[] = await HeroModel.find({serverId, hid}, { _id: false} ).select(select).limit(limit).lean({ getters: true });
return result;
}
+63 -6
View File
@@ -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() {