diff --git a/game-server/app/servers/chat/remote/guildRemote.ts b/game-server/app/servers/chat/remote/guildRemote.ts index a8654d47b..0d22c54e6 100644 --- a/game-server/app/servers/chat/remote/guildRemote.ts +++ b/game-server/app/servers/chat/remote/guildRemote.ts @@ -7,6 +7,7 @@ import { GuildRecType } from '../../../db/GuildRec'; import { leaveGuildChannel, groupRoomId } from '../../../services/chatService'; import { GuildRankParams, WoodenHorse, Event } from '../../../domain/battleField/guildActivity'; import { MailParam } from '../../../domain/roleField/mail'; +import { pick } from 'underscore'; export default function (app: Application) { new HandlerService(app, {}); @@ -27,7 +28,7 @@ export class GuildRemote { private DEMOTION = 'onDemotion'; private PROMOTION = 'onPromotion'; private GUILD_REC_ADD = 'onGuildRecAdd'; - private GUILD_BOSS_OPEN = 'onGuildBossOpen'; + private GUILD_BOSS_OPEN = 'onGuildBossStatus'; private GATE_ACT_RANK = 'onGuildGateRankUpdate'; // 军团活动排行榜 private CITY_ACT_RANK = 'onGuildCityRankUpdate'; // 军团活动排行榜 private GUILD_GATE_ACT_HP = 'onGuildGateHpUpdate'; // 军团活动蛮夷入侵排行榜 @@ -284,8 +285,8 @@ export class GuildRemote { * @param bossHp * @param status */ - public async pushBossOpen(guildCode: string, warId: number, bossHp: number, status: number) { - this.pushMessage(guildCode, this.GUILD_BOSS_OPEN, { guildCode, warId, bossHp, status }); + public async pushBossStatus(guildCode: string, result: any) { + this.pushMessage(guildCode, this.GUILD_BOSS_OPEN, pick(result, ['status', 'bossInfo', 'leaderOpenCnt'])); } /** diff --git a/game-server/app/servers/guild/handler/guildBossHandler.ts b/game-server/app/servers/guild/handler/guildBossHandler.ts index 1bffca38f..dabdc2c71 100644 --- a/game-server/app/servers/guild/handler/guildBossHandler.ts +++ b/game-server/app/servers/guild/handler/guildBossHandler.ts @@ -1,17 +1,17 @@ import { Application, BackendSession, pinus, HandlerService, } from 'pinus'; import { resResult, genCode, getRandSingleEelm } from '../../../pubUtils/util'; -import { STATUS, TASK_TYPE } from '../../../consts'; +import { AUCTION_SOURCE, DEBUG_MAGIC_WORD, MAIL_TYPE, STATUS, TASK_TYPE } from '../../../consts'; import { BossInstanceModel } from '../../../db/BossInstance'; import { BattleRecordModel } from '../../../db/BattleRecord'; import { nowSeconds, getZeroPoint } from '../../../pubUtils/timeUtil'; -import { getBossInstanceInfo, checkBossResult, checkBossBattleMemberExists, pushBossHpMessage, addBossInstance, refreshUserGuildOfBoss, refreshGuildOfBoss, getRanks } from '../../../services/guildBossService'; +import { getBossInstanceInfo, checkBossBattleMemberExists, pushBossHpMessage, addBossInstance, refreshUserGuildOfBoss, refreshGuildOfBoss, getRanks, getBossInstanceInfoByData } from '../../../services/guildBossService'; import { findWhere } from 'underscore' import { GUILD_STRUCTURE, GUILD_BOSS_STATUS, GUILD_POINT_WAYS } from '../../../consts/constModules/guildConst'; import { DATA_NAME } from '../../../consts/dataName'; import { UserGuildModel } from '../../../db/UserGuild'; import { addActive } from '../../../services/guildService'; import { GuildModel } from '../../../db/Guild'; -import { gameData, getBossByLv } from '../../../pubUtils/data'; +import { gameData, getAuctionRewardByPoolId, getBossByLv } from '../../../pubUtils/data'; import { lockData } from '../../../services/redLockService'; import { pushGuildBossSucMsg, getGuildChannelSid } from '../../../services/chatService'; import { checkTask } from '../../../services/taskService'; @@ -20,6 +20,8 @@ import { addItems, handleCost } from '../../../services/rewardService'; import * as dicParam from '../../../pubUtils/dicParam'; import { getGoldObject } from '../../../pubUtils/itemUtils'; import { RoleModel } from '../../../db/Role'; +import { sendMailToGuildByContent } from '../../../services/mailService'; +import { genAuction } from '../../../services/auctionService'; export default function (app: Application) { new HandlerService(app, {}); @@ -32,10 +34,8 @@ export class GuildHandler { // 获得boss关卡 async getBossInstance(msg: guildInter & {}, session: BackendSession) { - const roleId: string = session.get('roleId'); let { myUserGuild: userGuild } = msg; - const { guildCode: code } = userGuild; - let result = await getBossInstanceInfo(code, roleId, userGuild); + let result = await getBossInstanceInfo(userGuild); return resResult(STATUS.SUCCESS, result); } @@ -78,17 +78,16 @@ export class GuildHandler { res.releaseCallback(); return resResult(STATUS.GUILD_SCRIPT_IS_OPENED_TODAY); } - leaderOpenCnt = (await refreshGuildOfBoss(guild, 1)).leaderOpenCnt; - let { myChallengeCnt } = await refreshUserGuildOfBoss(userGuild); + await refreshGuildOfBoss(guild, 1); - await BossInstanceModel.openBossInstance(code, bossHp, warId, bossBase.bossLevel); + bossInstance = await BossInstanceModel.openBossInstance(code, bossHp, warId, bossBase.bossLevel); res.releaseCallback(); - let result = { warId, ranks: [], myRank: {}, bossHp, status: 3, bossLv: bossBase.bossLevel, leaderOpenCnt }; - + + let result = await getBossInstanceInfoByData(bossInstance, userGuild, guild); let chatSid = await getGuildChannelSid(code); - pinus.app.rpc.chat.guildRemote.pushBossOpen.toServer(chatSid, code, warId, bossHp, result.status); + pinus.app.rpc.chat.guildRemote.pushBossStatus.toServer(chatSid, code, result ); - return resResult(STATUS.SUCCESS, {...result, leaderOpenCnt, myChallengeCnt}); + return resResult(STATUS.SUCCESS, result); } async battleBoss(msg: guildInter & {}, session: BackendSession) { @@ -139,15 +138,41 @@ export class GuildHandler { } //记录伤害 let bossInstance = await BossInstanceModel.updateBossHp(bossCode, damage, roleId); - if(!bossInstance) bossInstance = await BossInstanceModel.findByCode(bossCode); - if(!bossInstance) return resResult(STATUS.GUILD_SCRIPT_NOT_OPENED) - await BattleRecordModel.incBossDamage(battleCode, damage, bossInstance?.bossHp); - if (bossInstance.bossHp <= 0) {//进入结算 - let flag = await checkBossResult(bossCode, guildCode, serverId, DATA_NAME.BOSS_SCRIPT, roleId, damage); - if (!flag) { - return resResult(STATUS.WRONG_PARMS); + if(!bossInstance) { // 如果已经被扣成负的了 + return resResult(STATUS.SUCCESS, { bossHp: 0 }); + } + + if (bossInstance.bossHp <= damage) {//进入结算 + + let res:any = await lockData(serverId, DATA_NAME.BOSS_SCRIPT, guildCode);//加锁 + if (!!res.err) + return resResult(STATUS.SUCCESS, { bossHp: 0 }); + bossInstance = await BossInstanceModel.clearBoss(bossCode, bossInstance.bossHp, roleId); + if (!bossInstance) return resResult(STATUS.SUCCESS, { bossHp: 0 }); + + let { warId, bossLv } = bossInstance;//锁定关卡信息 + + await pushBossHpMessage(guildCode, serverId, 0, true); + // 击杀奖励&伤害奖励 + let dicBossBase = gameData.bossBaseByBossLv.get(bossLv); + let dicWar = gameData.war.get(warId); + await sendMailToGuildByContent(MAIL_TYPE.GUILD_BOSS_REWARD, roleId, { + params: [`${dicWar.gk_name}`], goods: dicBossBase.killReward + }); + + // 加入拍卖行 + if(dicBossBase) { + let rewards = getAuctionRewardByPoolId(dicBossBase.rewards); + await genAuction(guildCode, AUCTION_SOURCE.BOSS, bossCode, serverId, rewards); } + + let result = await getBossInstanceInfoByData(bossInstance, userGuild); + let chatSid = await getGuildChannelSid(guildCode); + pinus.app.rpc.chat.guildRemote.pushBossStatus.toServer(chatSid, guildCode, result ); + pushGuildBossSucMsg(roleId, roleName, guildCode, bossInstance); + + res.releaseCallback();//解锁 return resResult(STATUS.SUCCESS, { bossHp: 0 }); } else { pushBossHpMessage(guildCode, serverId, bossInstance.bossHp); @@ -182,10 +207,9 @@ export class GuildHandler { // 任务 await checkTask(roleId, sid, TASK_TYPE.GUILD_BOSS, 1, true, {}); - let { warId, ranks, bossHp, bossLv, status, encourageCnt } = bossInstance; - let rankInfo = getRanks(ranks, roleId); + let result = await getBossInstanceInfoByData(bossInstance, userGuild); - return resResult(STATUS.SUCCESS, { warId, ...rankInfo, bossHp, status, bossLv, encourageCnt, encourageMax: dicBossBase.encourageSum, battleGoods }); + return resResult(STATUS.SUCCESS, { ...result, battleGoods }); } async encourage(msg: guildInter & { count: number }, session: BackendSession) { @@ -227,11 +251,27 @@ export class GuildHandler { } - async debugAddBattleTimes(msg: {}, session: BackendSession) { + async debugAddBattleTimes(msg: { magicWord: string }, session: BackendSession) { + const { magicWord } = msg; + if (magicWord !== DEBUG_MAGIC_WORD) { + return resResult(STATUS.TOKEN_ERR); + } const roleId: string = session.get('roleId'); await UserGuildModel.updateInfo(roleId, { bossChallengeCnt: 0 }, {}); return resResult(STATUS.SUCCESS); } + + async debugAddOpenTimes(msg: { magicWord: string }, session: BackendSession) { + const { magicWord } = msg; + if (magicWord !== DEBUG_MAGIC_WORD) { + return resResult(STATUS.TOKEN_ERR); + } + const guildCode: string = session.get('guildCode'); + await GuildModel.updateInfo(guildCode, { openBossCnt: 0 }, {}); + + return resResult(STATUS.SUCCESS); + + } } \ No newline at end of file diff --git a/game-server/app/services/connectorService.ts b/game-server/app/services/connectorService.ts index 381728458..f95cdaedb 100644 --- a/game-server/app/services/connectorService.ts +++ b/game-server/app/services/connectorService.ts @@ -117,7 +117,7 @@ async function getModuleData(type: string, data: { role: RoleType, session: Fron } case 'boss': if (hasGuild) { - return await getBossInstanceInfo(guildCode, roleId, userGuild, guild); + return await getBossInstanceInfo(userGuild, guild); } return null; case 'wishPool': diff --git a/game-server/app/services/guildBossService.ts b/game-server/app/services/guildBossService.ts index 78849a86e..4d731a570 100644 --- a/game-server/app/services/guildBossService.ts +++ b/game-server/app/services/guildBossService.ts @@ -20,21 +20,30 @@ import { nowSeconds } from '../pubUtils/timeUtil'; * @param bossInstance * @param roleId */ -export async function getBossInstanceInfo(guildCode: string, roleId:string, userGuild: UserGuildType, guild?: GuildType) { - let bossInstance = await BossInstanceModel.findBossInstance(guildCode); - if(!guild) guild = await GuildModel.findByCode(guildCode, null, 'code refOpenBossTime openBossCnt'); +export async function getBossInstanceInfo(userGuild: UserGuildType, guild?: GuildType) { + let bossInstance = await BossInstanceModel.findBossInstance(userGuild.guildCode); + + if(!bossInstance) { + bossInstance = await BossInstanceModel.findLastOverBossInstance(userGuild.guildCode); + } + return await getBossInstanceInfoByData(bossInstance, userGuild, guild); +} + +export async function getBossInstanceInfoByData(bossInstance: BossInstanceType, userGuild: UserGuildType, guild?: GuildType) { + if(!guild) guild = await GuildModel.findByCode(userGuild.guildCode, null, 'code refOpenBossTime openBossCnt'); let refObj = await getRefBossCnt(guild, userGuild); // 刷新次数 - let showParamObj = await getLastBossInstance(guildCode, roleId); + let status = bossInstance? bossInstance.status: GUILD_BOSS_STATUS.WAIT_OPEN; + if(status == GUILD_BOSS_STATUS.CLEAR) status = GUILD_BOSS_STATUS.WAIT_OPEN; + let bossInfo = null; + if(bossInstance) { - let { warId, ranks, bossHp, bossLv, status, encourageCnt } = bossInstance; + let { warId, ranks, bossHp, bossLv, encourageCnt } = bossInstance; let dicBossBase = gameData.bossBaseByBossLv.get(bossLv); - let rankInfo = getRanks(ranks, roleId); - // 此处showParamObj一定要放在最前 - return { ...showParamObj, warId, ...rankInfo, bossHp, status, bossLv, encourageCnt, encourageMax: dicBossBase.encourageSum,...refObj }; - } else { - return { ...showParamObj, ...refObj }; + let rankInfo = getRanks(ranks, userGuild.roleId); + bossInfo = { warId, ...rankInfo, bossHp, bossLv, encourageCnt, encourageMax: dicBossBase.encourageSum }; } + return { status, bossInfo, ...refObj } } async function getRefBossCnt(guild: GuildType, userGuild: UserGuildType) { @@ -83,68 +92,6 @@ export function getRanks(ranks: {roleId: string; score: number; time: number; jo return { ranks: lastRanks, myRank } } -export async function getLastBossInstance(guildCode: string, roleId: string) { - - let lastBossInstance = await BossInstanceModel.findLastOverBossInstance(guildCode); - if(lastBossInstance) { - if(lastBossInstance.roleIdRecords.indexOf(roleId) == -1) { - await BossInstanceModel.recordRoleIdWhenCheck(lastBossInstance.code, roleId); - let { warId } = lastBossInstance; - return { status: GUILD_BOSS_STATUS.CLEAR, showParam: { winWarId: lastBossInstance.warId, winBossLv: lastBossInstance.bossLv }, warId } - } else { - return { status: GUILD_BOSS_STATUS.WAIT_OPEN } - } - } else { - return { status: GUILD_BOSS_STATUS.WAIT_OPEN } - } -} - -/** - * 结算战斗 - * @param code - * @param serverId - * @param dataName - * @param damage - * @param roleId - */ -export async function checkBossResult(bossCode: string, guildCode: string, serverId: number, dataName: string, roleId: string, damage: number) { - let res:any = await lockData(serverId, dataName, guildCode);//加锁 - if (!!res.err) - return true; - let {status, ranks, warId, bossHp, bossLv } = await BossInstanceModel.findByCode(bossCode);//锁定关卡信息 - if (status == GUILD_BOSS_STATUS.CLEAR) { // 已经被打败了 - res.releaseCallback();//解锁 - await BossInstanceModel.recordRoleIdWhenCheck(bossCode, roleId); - return true; - } - let index = findIndex(ranks, {roleId}); - if (index == -1) { // 没有调用过battleBoss - res.releaseCallback();//解锁 - return false; - } - ranks[index].score += bossHp; // 可能会把hp扣成负的,然后排行榜多加了,这里矫正回来 - if (bossHp > damage) {//检查造成的伤害是否会让boss死亡 - res.releaseCallback();//解锁 - return true; - } - await BossInstanceModel.updateBossInstance(bossCode, { bossHp: 0, status: GUILD_BOSS_STATUS.CLEAR, ranks, roleIdRecords:[roleId], killTime: nowSeconds()}, ); - await pushBossHpMessage(guildCode, serverId, 0, true); - res.releaseCallback();//数据修改解锁 - // 击杀奖励&伤害奖励 - let dicBossBase = gameData.bossBaseByBossLv.get(bossLv); - let dicWar = gameData.war.get(warId); - await sendMailToGuildByContent(MAIL_TYPE.GUILD_BOSS_REWARD, roleId, { - params: [`${dicWar.gk_name}`], goods: dicBossBase.killReward - }); - - // 加入拍卖行 - if(dicBossBase) { - let rewards = getAuctionRewardByPoolId(dicBossBase.rewards); - await genAuction(guildCode, AUCTION_SOURCE.BOSS, bossCode, serverId, rewards); - } - - return true; -} /** * 获得排名区间奖励 * @param rankLv diff --git a/game-server/package-lock.json b/game-server/package-lock.json index eb3077139..f73d18350 100644 --- a/game-server/package-lock.json +++ b/game-server/package-lock.json @@ -213,6 +213,12 @@ "resolved": "https://registry.npm.taobao.org/@types/underscore/download/@types/underscore-1.10.24.tgz", "integrity": "sha1-3t4ATe7Ts/mcTbC9ue4hyuJb790=" }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -255,6 +261,12 @@ "urllib": "^2.21.1" } }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz", @@ -274,6 +286,16 @@ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -407,6 +429,12 @@ "callsite": "1.0.0" } }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, "bl": { "version": "1.2.2", "resolved": "https://registry.npm.taobao.org/bl/download/bl-1.2.2.tgz?cache=0&sync_timestamp=1584503263385&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbl%2Fdownload%2Fbl-1.2.2.tgz", @@ -435,6 +463,21 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "bson": { "version": "1.1.5", "resolved": "https://registry.npm.taobao.org/bson/download/bson-1.1.5.tgz?cache=0&sync_timestamp=1597069108497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbson%2Fdownload%2Fbson-1.1.5.tgz", @@ -548,6 +591,22 @@ "random-to": "0.0.2" } }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -942,6 +1001,12 @@ "is-symbol": "^1.0.2" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1003,6 +1068,15 @@ "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-2.0.0.tgz", "integrity": "sha1-e0Fa66In1XWFHgpbDGQNdlZAP7o=" }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", @@ -1012,6 +1086,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flatted": { "version": "2.0.2", "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-2.0.2.tgz", @@ -1065,6 +1145,13 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "ftp": { "version": "0.3.10", "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", @@ -1196,11 +1283,26 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz?cache=0&sync_timestamp=1588086905523&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.4.tgz", "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=" }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1245,6 +1347,12 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "hoek": { "version": "6.1.3", "resolved": "https://registry.npm.taobao.org/hoek/download/hoek-6.1.3.tgz", @@ -1355,6 +1463,15 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-callable": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", @@ -1370,11 +1487,26 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=" }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -1384,6 +1516,18 @@ "define-properties": "^1.1.3" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", @@ -1519,6 +1663,42 @@ "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336097104&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz", "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=" }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "log4js": { "version": "6.3.0", "resolved": "https://registry.npm.taobao.org/log4js/download/log4js-6.3.0.tgz?cache=0&sync_timestamp=1590367779968&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flog4js%2Fdownload%2Flog4js-6.3.0.tgz", @@ -1616,6 +1796,198 @@ "minimist": "^1.2.5" } }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, "moment": { "version": "2.29.1", "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz?cache=0&sync_timestamp=1601983423917&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.29.1.tgz", @@ -1798,6 +2170,12 @@ "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591700047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz", "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=" }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, "needle": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", @@ -1874,6 +2252,12 @@ "osenv": "^0.1.4" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "npm-bundled": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", @@ -2098,6 +2482,12 @@ "through": "~2.3" } }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, "pinus": { "version": "1.4.9", "resolved": "https://registry.npm.taobao.org/pinus/download/pinus-1.4.9.tgz", @@ -2354,6 +2744,15 @@ "resolved": "https://registry.npmjs.org/random-to/-/random-to-0.0.2.tgz", "integrity": "sha1-RoO58lfPuWSqPXsyPgCKIMboWnY=" }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "raw-body": { "version": "2.4.1", "resolved": "https://registry.nlark.com/raw-body/download/raw-body-2.4.1.tgz", @@ -2405,6 +2804,15 @@ } } }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "redis": { "version": "3.0.2", "resolved": "https://registry.npm.taobao.org/redis/download/redis-3.0.2.tgz?cache=0&sync_timestamp=1581290711215&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fredis%2Fdownload%2Fredis-3.0.2.tgz", @@ -2561,6 +2969,15 @@ "resolved": "https://registry.npmjs.org/sequin/-/sequin-0.1.1.tgz", "integrity": "sha1-XC04nWajg3NOqvvEXt6ywcsb5wE=" }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -2920,6 +3337,15 @@ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", @@ -3188,6 +3614,12 @@ "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz", "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=" }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz", @@ -3310,6 +3742,32 @@ "decamelize": "^1.2.0" } }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", @@ -3319,6 +3777,12 @@ "version": "3.1.1", "resolved": "https://registry.npm.taobao.org/yn/download/yn-3.1.1.tgz", "integrity": "sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A=" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/game-server/package.json b/game-server/package.json index 9e184f921..e771800fa 100644 --- a/game-server/package.json +++ b/game-server/package.json @@ -59,7 +59,7 @@ }, "devDependencies": { "@types/node-schedule": "^1.3.1", - "mocha": "^8.3.2", + "mocha": "^8.4.0", "mocha-parallel-tests": "^2.3.0", "tslint": "^5.9.1", "typescript": "^3.9.7" diff --git a/shared/consts/constModules/guildConst.ts b/shared/consts/constModules/guildConst.ts index 23d5c44f7..7190d084c 100644 --- a/shared/consts/constModules/guildConst.ts +++ b/shared/consts/constModules/guildConst.ts @@ -218,11 +218,10 @@ export enum GUILD_REC_TYPE { IMPEACH = 11, // 弹劾 roleName roleName } -//1:等待团长开启,2:boss已通关,3:开启中 export enum GUILD_BOSS_STATUS { - WAIT_OPEN = 1, - CLEAR = 2, - OPEN = 3,//开启中 + WAIT_OPEN = 0, // 等待开启 + OPEN = 1, // 开启中 + CLEAR = 2 // 已挑战完成 } export const GUILD_REPORT_NUM = 40; diff --git a/shared/db/BossInstance.ts b/shared/db/BossInstance.ts index e57bb85f5..df7be3b73 100644 --- a/shared/db/BossInstance.ts +++ b/shared/db/BossInstance.ts @@ -44,9 +44,6 @@ export default class BossInstance extends BaseModel { @prop({ required: true, default: 0 }) encourageCnt: number; // 鼓舞次数 - @prop({ required: true, default:[], type: String, _id: false}) - roleIdRecords: Array; //记录提示过胜利boss关的玩家 - @prop({ required: true, default: GUILD_BOSS_STATUS.OPEN }) status: GUILD_BOSS_STATUS; // 状态 1:等待团长开启,2:今日已开启,且boss通关,3:开启中 @@ -74,12 +71,6 @@ export default class BossInstance extends BaseModel { return bossInstance; } - //记录玩家boss通关后首次查看boss关卡 - public static async recordRoleIdWhenCheck(code: string, roleId: string, lean = true) { - const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code }, { $push:{ roleIdRecords: roleId } }, { new: true }).lean(lean); - return bossInstance; - } - public static async pushRecordRanks(code: string, recordRank: Rank, lean = true) { const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code }, { $push:{ recordRanks: recordRank } }, { new: true }).lean(lean); return bossInstance; @@ -95,11 +86,15 @@ export default class BossInstance extends BaseModel { return bossInstance; } - public static async updateBossHp(code: string, hp: number, roleId: string, lean = true) { - const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code, 'ranks.roleId': roleId, bossHp: { $gte: hp } }, { $inc: { bossHp: - hp ,'ranks.$.score': hp}, }, { new: true }).lean(lean); + public static async updateBossHp(code: string, hp: number, roleId: string) { + let bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code, 'ranks.roleId': roleId, bossHp: { $gt: 0 } }, { $inc: { bossHp: - hp ,'ranks.$.score': hp}, }, { new: true }).lean(); return bossInstance; } + public static async clearBoss(code: string, bossHp: number, roleId: string) { + let bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code, 'ranks.roleId': roleId }, { $set: { bossHp: 0, killTime: nowSeconds(), status: GUILD_BOSS_STATUS.CLEAR }, $inc: { 'ranks.$.score': bossHp}, }, { new: true }).lean(); + return bossInstance; + } public static async updateRank(code: string, roleId: string, lean = true) { const bossInstance: BossInstanceType = await BossInstanceModel.findOneAndUpdate({ code, 'ranks.roleId': roleId }, { $set:{ 'ranks.$.time': nowSeconds() } }, { new: true }).lean(lean); return bossInstance;