diff --git a/game-server/app/servers/guild/handler/guildHandler.ts b/game-server/app/servers/guild/handler/guildHandler.ts index 2a0221563..b5efc15d4 100644 --- a/game-server/app/servers/guild/handler/guildHandler.ts +++ b/game-server/app/servers/guild/handler/guildHandler.ts @@ -283,7 +283,7 @@ export class GuildHandler { } let result = await getMyGuildInfo(roleId, sid, userGuild, guild, serverId, session); - let gvg = await getGVGInfoInGuild(guild); + let gvg = await getGVGInfoInGuild(roleId, guild); return resResult(STATUS.SUCCESS, { ...result, gvg }); } diff --git a/game-server/app/services/gvg/gvgService.ts b/game-server/app/services/gvg/gvgService.ts index 2af1d0ca3..7ddf4fdd0 100644 --- a/game-server/app/services/gvg/gvgService.ts +++ b/game-server/app/services/gvg/gvgService.ts @@ -2,7 +2,7 @@ import { pinus } from "pinus"; import { GVGConfigModel, GVGConfigType } from "../../db/GVGConfig"; import { getTimeFun, getZeroPoint, getZeroPointOfTime, nowSeconds, WEEK_TO_SECOND } from "../../pubUtils/timeUtil"; import { getAllServerCreateTime, getServerCreateTime } from "../redisService"; -import { GVG_PERIOD, GVG_SERVER_TYPE, SHOP_REFRESH_TYPE } from "../../consts"; +import { GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_JOB, SHOP_REFRESH_TYPE } from "../../consts"; import { GVGLeagueModel, GVGLeagueType } from "../../db/GVGLeague"; import { GVGLeaguePrepareModel } from "../../db/GVGLeaguePrepare"; import { GVGServerGroupModel } from "../../db/GVGServerGroup"; @@ -12,6 +12,17 @@ import { GVG } from "../../pubUtils/dicParam"; import { ServerlistModel } from "../../db/Serverlist"; import { GuildModel, GuildType } from "../../db/Guild"; import { checkHasCities } from "./gvgBattleService"; +import { GVGLeagueApplyModel } from "../../db/GVGLeagueApply"; +import { GVGMainData, LeagueContributeInfo } from "../../domain/gvgField/returnData"; +import { Contribute, GVGUserDataModel, GVGUserDataType } from "../../db/GVGUserData"; +import { GVGUserItemModel } from "../../db/GVGUserItem"; +import { GVGUserTaskModel } from "../../db/GVGUserTask"; +import { getMyAuth } from "./gvgTeamService"; +import { pick } from "underscore"; +import { calFighterContribute, calProducerContribute } from "./gvgPrepareService"; +import { calVestigeLeagueBoxRewards } from "./gvgFightService"; +import { GVGVestigeLeagueRankModel } from "../../db/GVGVestigeLeagueRank"; +import { GVGVestigeSumRankModel } from "../../db/GVGVestigeSumRank"; // 定时器相关 export async function createNewGVGConfig() { @@ -187,15 +198,28 @@ export async function getServersByGroupId(groupId: number) { }).map(obj => obj.serverId); } -export async function getGVGInfoInGuild(guild: GuildType) { +export async function getGVGInfoInGuild(roleId: string, guild: GuildType) { let hasLeague = !!guild.leagueCode; let serverId = guild.serverId; let { configId, period, countdownTime } = getGVGPeriodData(); let type = await getGVGServerType(serverId); - return { - hasLeague, - configId, period, countdownTime, - type + + if(hasLeague) { + return { + hasLeague, + configId, period, countdownTime, + type, + applyCnt: await getApplyCnt(guild.leagueCode), + ...await getMainData(roleId, guild.leagueCode, configId, period, countdownTime, type), + leagueDetailRank: await getLeagueRankBox(configId, guild.leagueCode, roleId), + } + } else { + return { + hasLeague, + configId, period, countdownTime, + type, + invitationCnt: await getInviteCnt(guild.code) + } } } @@ -209,4 +233,63 @@ export async function calLeagueCe(league: GVGLeagueType) { export async function checkGVGPeriod(p : GVG_PERIOD) { let { period } = getGVGPeriodData(); return period == p; +} + +// —————— 红点相关 —————— // +// 邀请 +export async function getInviteCnt(guildCode: string) { + let invitation = await GVGLeagueApplyModel.findInviteFromGuildWithoutPopulate(guildCode); + return invitation.length +} + +// 申请 +export async function getApplyCnt(leagueCode: string) { + let applies = await GVGLeagueApplyModel.findApplyFromLeagueWithoutPopulate(leagueCode); + return applies.length +} + +export async function getMainData(roleId: string, leagueCode: string, configId: number, period: number, countdownTime: number, serverType: number) { + let data = new GVGMainData(configId, period, countdownTime, serverType); + + let league = await GVGLeagueModel.findByCode(leagueCode); + if(league) { + data.setLeague(league, {}); + + let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, league.leagueCode); + data.setLeagueParpare(leaguePrepare); + data.setTechQueue(leaguePrepare.techQueue); + + let userData = await GVGUserDataModel.findByRole(configId, league.leagueCode, roleId); + let items = await GVGUserItemModel.findByRole(configId, league.leagueCode, roleId); + let tasks = await GVGUserTaskModel.findByRole(configId, league.leagueCode, roleId); + data.setPlayerInfo(userData, getMyAuth(league, roleId), undefined, undefined, items, tasks); + data.setLeagueCe(await calLeagueCe(league)); + data.setConstribute(await getContribute(userData)); + } + + let myInfo = pick(data.myInfo, ['auth', 'items', 'tasks', 'receivedLv']); + return { ...pick(data, ['guildCnt', 'leagueLv', 'techQueue', 'constribute']), myInfo } +} + +export async function getContribute(myUserData: GVGUserDataType) { + const { contribute = new Contribute(), box = [] } = myUserData||{}; + + const result: LeagueContributeInfo[] = []; + for(let curJob of [LEAGUE_JOB.PRODUCER, LEAGUE_JOB.FIGHTER]) { + let sumContribute = curJob == LEAGUE_JOB.PRODUCER? calProducerContribute(contribute): calFighterContribute(contribute); + let boxReceived = box.filter(boxId => { + let dicBox = gameData.gvgContributeBox.get(boxId); + return dicBox.job == curJob; + }); + let disObj = new LeagueContributeInfo(curJob, sumContribute, boxReceived); + result.push(disObj) + } + return result; +} + +export async function getLeagueRankBox(configId: number, leagueCode: string, roleId: string) { + let canReceiveLeagueRanks = await GVGVestigeLeagueRankModel.getCanReceiveRanks(configId, leagueCode); + let canReceivePlayerRanks = await GVGVestigeSumRankModel.getCanReceiveRanks(configId, roleId); + let { canReceiveBox } = calVestigeLeagueBoxRewards(canReceiveLeagueRanks, canReceivePlayerRanks); + return { canReceiveBox } } \ No newline at end of file diff --git a/shared/db/GVGLeagueApply.ts b/shared/db/GVGLeagueApply.ts index 9c72afd2c..6b9930f71 100644 --- a/shared/db/GVGLeagueApply.ts +++ b/shared/db/GVGLeagueApply.ts @@ -41,6 +41,11 @@ export default class GVGLeagueApply extends BaseModel { return result; } + public static async findApplyFromLeagueWithoutPopulate(leagueCode: string) { + const result: GVGLeagueApplyType[] = await GVGLeagueApplyModel.find({ leagueCode, type: GVG_APPLY_TYPE.APPLY }).select('_id').lean(); + return result; + } + public static async findApplyFromLeague(leagueCode: string) { const result: GVGLeagueApplyType[] = await GVGLeagueApplyModel.find({ leagueCode, type: GVG_APPLY_TYPE.APPLY }) .select({ _id: 0, guild: 1, guildCode: 1 }) @@ -63,6 +68,11 @@ export default class GVGLeagueApply extends BaseModel { return result; } + public static async findInviteFromGuildWithoutPopulate(guildCode: string) { + const result: GVGLeagueApplyType[] = await GVGLeagueApplyModel.find({ guildCode, type: GVG_APPLY_TYPE.INVITE }).select('_id').lean(); + return result; + } + public static async findInviteFromGuild(guildCode: string) { const result: GVGLeagueApplyType[] = await GVGLeagueApplyModel.find({ guildCode, type: GVG_APPLY_TYPE.INVITE }) .select({ _id: 0, guild: 1, guildCode: 1 }) diff --git a/shared/db/GVGUserItem.ts b/shared/db/GVGUserItem.ts index 1013ade5d..bba3f386c 100644 --- a/shared/db/GVGUserItem.ts +++ b/shared/db/GVGUserItem.ts @@ -25,7 +25,7 @@ export default class GVGUserItem extends BaseModel { expireTime: number; public static async findByRole(configId: number, leagueCode: string, roleId: string) { - const result: GVGUserItemType[] = await GVGUserItemModel.find({ configId, leagueCode, roleId, expireTime: { $gte: nowSeconds() } }, { _id: 0, id: 1, count: 1 }).lean(); + const result: GVGUserItemType[] = await GVGUserItemModel.find({ configId, leagueCode, roleId, expireTime: { $gte: nowSeconds() }, count: { $gt: 0 } }, { _id: 0, id: 1, count: 1 }).lean(); return result; } diff --git a/shared/domain/gvgField/returnData.ts b/shared/domain/gvgField/returnData.ts index 0ce97a4b6..79c472e99 100644 --- a/shared/domain/gvgField/returnData.ts +++ b/shared/domain/gvgField/returnData.ts @@ -1,6 +1,6 @@ import { RoleType } from "../../db/Role"; import { GVGLeagueType } from "../../db/GVGLeague"; -import { GVGLeaguePrepareType } from "../../db/GVGLeaguePrepare"; +import { GVGLeaguePrepareType, Tech } from "../../db/GVGLeaguePrepare"; import { GVGUserDataType } from "../../db/GVGUserData"; import { GuildType } from "../../db/Guild"; import { GVGLeagueFarmType } from "../../db/GVGLeagueFarm"; @@ -82,9 +82,11 @@ export class GVGMainData { // 内政相关 resources: LeagueResource = new LeagueResource(); // 联盟的物资 activeTech: number[] = []; // 已激活了的科技树的id + techQueue: Tech[]; maxMemberCnt: number; // 进入备战期总玩家人数 producerCnt: number; // 贤臣人数 fighterCnt: number; // 猛将人数 + constribute: LeagueContributeInfo[]; sumTime: number = 0; // 今日贡献结算时间 10位时间戳 @@ -147,6 +149,14 @@ export class GVGMainData { setCities(cities: number[]) { this.cities = cities; } + + setTechQueue(techQueue: Tech[]) { + this.techQueue = techQueue; + } + + setConstribute(constribute: LeagueContributeInfo[]) { + this.constribute = constribute; + } } export class LeagueListInfo {