feat(gvg): 添加红点

This commit is contained in:
luying
2023-02-18 22:19:00 +08:00
parent 4b73763e27
commit bfaaba13e0
5 changed files with 112 additions and 9 deletions

View File

@@ -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 });
}

View File

@@ -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 }
}

View File

@@ -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 })

View File

@@ -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;
}

View File

@@ -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 {