Files
ZYZ/shared/db/ComBattleTeam.ts
2020-11-27 23:27:35 +08:00

177 lines
6.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import BaseModel from './BaseModel';
import { index, getModelForClass, prop } from '@typegoose/typegoose';
export class RoleStatus {
@prop({ required: true })
roleId: string;
@prop({ required: true })
roleName: string;
@prop({ required: true })
isCap: boolean;
@prop({ required: true, default: 0 })
totalDmg: number;
// 战斗状态 0-挑战中 1-挑战成功 2-挑战失败
@prop({ required: true, default: 0 })
battleStatus: number;
// 队伍中每个玩家的战斗编号
@prop({ required: false, default: '' })
battleCode: string;
// 玩家所用阵容
@prop({ required: false, type: Number, default: [] })
heroes: Array<number>;
// 阵亡武将
@prop({ required: false, default: [] })
killed: Array<number>;
// 是否情谊助阵
@prop({ required: false, default: false })
isFrd: boolean;
// 头像
@prop({ required: true, default: 19 })
headHid: number;
// 形象
@prop({ required: true, default: 19 })
sHid: number;
// 前五战力
@prop({ required: true, default: 0 })
topFiveCe: number;
// 主公等级
@prop({ required: true, default: 1 })
lv: number;
// 是否机器人
@prop({ required: true, default: false })
isRobot: boolean;
constructor(roleId: string, roleName: string, isCap: boolean, isFrd: boolean, headHid: number, sHid: number, topFiveCe: number, lv: number, heroes = [], isRobot = false) {
this.roleId = roleId;
this.roleName = roleName;
this.isCap = isCap;
this.totalDmg = 0;
this.isFrd = isFrd;
this.headHid = headHid;
this.sHid = sHid;
this.topFiveCe = topFiveCe;
this.lv = lv;
this.heroes = heroes;
this.killed = [];
this.isRobot = isRobot;
}
}
@index({ teamCode: 1 })
@index({ roleIds: 1 })
@index({ blueprtId: 1, status: 1, pub: 1})
export default class ComBattleTeam extends BaseModel {
// 队伍唯一编号
@prop({ required: true })
teamCode: string;
@prop({ required: true, type: String, default: [] })
roleIds: Array<string>
// 队伍是否开放加入
@prop({ required: true, default: true })
pub: boolean;
// 对应藏宝图 Id
@prop({ required: true })
blueprtId: number;
// 藏宝图品质
@prop({ required: true })
quality: number;
// 战斗状态 0未开始1已开始2胜利3失败4已领奖
@prop({ required: true, default: 0 })
status: number;
@prop({ required: true, type: RoleStatus, default: [] })
roleStatus: Array<RoleStatus>;
// 队长 roleId
@prop({ required: true })
capId: string;
// 战力限制
@prop({ required: true, default: 0 })
ceLimit: number;
public static async createTeam(teamData: {teamCode: string, roleIds: Array<string>, pub: boolean, blueprtId: number, quality: number, status: number, roleStatus: Array<RoleStatus>, capId: string, ceLimit: number}, lean = true) {
const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode: teamData.teamCode }, {$set :{...teamData}}, {upsert: true, new: true}).lean(lean);
return team;
}
public static async addRole(teamCode: string, roleStatus: RoleStatus, lean = true) {
const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode }, {$push: {roleIds: roleStatus.roleId, roleStatus}}, {upsert: true, new: true}).lean(lean);
return team;
}
public static async removeRole(teamCode: string, roleIdToRm: string, lean = true) {
const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode }, {$pull: {roleIds: roleIdToRm, roleStatus: {roleId: roleIdToRm}}}, {new: true}).lean(lean);
return team;
}
public static async removeTeam(teamCode: string, lean = true) {
const team = await ComBattleTeamModel.findOneAndDelete({ teamCode }).lean(lean);
return team;
}
public static async updateHeroes(teamCode: string, roleId: string, heroes: Array<number>, lean = true) {
const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode, 'roleStatus.roleId': roleId}, {$set: {'roleStatus.$.heroes': heroes}}, {new: true}).lean(lean);
return team;
}
public static async updateResult(teamCode: string, roleId: string, isSuccess: boolean, _lean = true) {
let team = await ComBattleTeamModel.findOne({teamCode}).select('status roleStatus');
if(!team) return;
if (isSuccess === true) {
team.status = 2;
team.roleStatus.forEach(st => {
if (st.battleStatus !== 2) {
st.battleStatus = 1;
}
})
} else if (isSuccess === false) {
let loseCnt = 1;
team.roleStatus.forEach(st => {
if (st.battleStatus === 2 && st.roleId !== roleId) {
loseCnt += 1;
} else if (st.roleId === roleId && !st.battleStatus) {
st.battleStatus = 2;
}
});
if (loseCnt === team.roleStatus.length) {
team.status = 3;
}
}
await team.save();
return team;
}
public static async getTeamByCapAndStatus(roleId: string, status: number, lean = true) {
const teams = await ComBattleTeamModel.find({capId: roleId, status}).lean(lean);
return teams;
}
public static async getTeamByBlueprt(blueprtIds: Array<number>, status: number, pub = true, limit = 50, lean = true) {
const teams = await ComBattleTeamModel.find({blueprtId: {$in: blueprtIds}, status, pub}).limit(limit).lean(lean);
return teams;
}
public static async getTeamByRoleAndTime(roleId: string, quality?: number, time?: Date, isAssist?: boolean, limitCnt = 50, lean = true) {
let query = {roleIds: roleId};
if (quality) {
query = Object.assign(query, {quality});
}
if (time) {
query = Object.assign(query, {createdAt: {$gte: time}});
}
if (isAssist) {
query = Object.assign(query, {capId: {$ne: roleId}});
}
const teams = await ComBattleTeamModel.find(query).limit(limitCnt).lean(lean);
return teams;
}
}
export const ComBattleTeamModel = getModelForClass(ComBattleTeam);