Files
ZYZ/game-server/app/services/gvg/gvgTeamService.ts

265 lines
10 KiB
TypeScript

// 和gvg组建期相关的方法
import { pinus } from "pinus";
import { GUILD_AUTH, GVG_APPLY_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_AUTH, LEAGUE_MANAGE_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "../../consts";
import { GuildModel, GuildType } from "../../db/Guild";
import { GVGCityModel } from "../../db/GVGCity";
import { GVGCityAreaPointModel } from "../../db/GVGCityAreaPoint";
import { GVGLeagueModel, GVGLeagueType, GVGLeagueUpdate } from "../../db/GVGLeague";
import { GVGLeagueApplyModel, GVGLeagueApplyType } from "../../db/GVGLeagueApply";
import { GVGLeaguePrepareModel, GVGLeaguePrepareType } from "../../db/GVGLeaguePrepare";
import { GVGTeamModel } from "../../db/GVGTeam";
import { RoleType } from "../../db/Role";
import { UserGuildModel } from "../../db/UserGuild";
import { LeagueGuildInfo, LeagueListInfo } from "../../domain/gvgField/returnData";
import { LeagueLeader } from "../../domain/rank";
import { GVG } from "../../pubUtils/dicParam";
import { getZeroPointD } from "../../pubUtils/timeUtil";
import { resResult } from "../../pubUtils/util";
import { updateUserInfo } from "../redisService";
import { getGVGBattleData } from "../memoryCache/gvgBattleData";
import { guildJoinLeagueRecord } from "./gvgRecService";
import { calLeagueCe, getCurPeriod, getGroupKey, getGVGConfig, getGVGPeriodData, getGVGServerType } from "./gvgService";
/**
* 自动创建联军
* @param guildCode 创建联军的那个军团
* @returns GVGLeagueType
*/
export async function autoCreateLeague(guildCode: string) {
let guild = await GuildModel.findByCode(guildCode, null, '+members +serverId');
if(!guild || guild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return;
let { configId, period } = getGVGPeriodData();
if(period == GVG_PERIOD.PREPARE) {
let league = await createLeague(guild, {});
let groupKey = await getGroupKey(guild.serverId);
await GVGLeaguePrepareModel.initData(configId, groupKey, league.leagueCode, guild.memberCnt);
return league;
}
}
/**
* 创建联军
* @param guild 创建联军的那个军团
* @param params 联军的一些初始数据
* @returns
*/
export async function createLeague(guild: GuildType, params: GVGLeagueUpdate) {
let serverType = await getGVGServerType(guild.serverId);
params.type = serverType;
params.serverId = guild.serverId;
const league = await GVGLeagueModel.createLeague(guild, params);
await GuildModel.joinLeague(guild.code, league.leagueCode);
return league;
}
/**
* 获取在联军中的职位
* @param league
* @param roleId
* @returns
*/
export function getMyAuth(league: GVGLeagueType, roleId: string) {
let members = league.members;
let member = members.find(cur => cur.roleId == roleId);
return member?.auth?? LEAGUE_AUTH.MEMBER;
}
/**
* 加入联军的当天如果是在准备期,这天不能去参加内政
* @param roleId
* @returns
*/
export async function checkCanPrepare(roleId: string) {
let userGuild = await UserGuildModel.getMyGuild(roleId, 'createdAt');
let today = getZeroPointD();
return userGuild.createdAt < today;
}
/**
* 是否可以选择职能,如果选择的人数超过了就不可以选
* @param myJob
* @param league
* @returns
*/
export function checkCanChooseJob(myJob: number, league: GVGLeaguePrepareType) {
if(myJob > 0) return false;
if(!league) return false;
let { producerCnt, fighterCnt, maxMemberCnt } = league;
return producerCnt + fighterCnt <= maxMemberCnt;
}
/**
* 获取申请数据
* @param apply 本条申请原数据
* @param serverNames 全服务器的名字from redis
* @param invitations 本联军向其他军团发出的邀请
* @returns
*/
export function getLeagueApplyData(apply: GVGLeagueApplyType, serverNames: any, invitations: GVGLeagueApplyType[] ) {
let data = new LeagueGuildInfo(<GuildType>apply.guild, serverNames);
let hasInvited = !!invitations.find(cur => cur.guildCode == apply.guildCode);
data.setHasInvited(hasInvited);
return data;
}
/**
* 获取邀请数据
* @param invite 本条邀请原数据
* @param serverNames 全服务器的名字from redis
* @param applies 本军团向其他联军发出的申请
* @returns
*/
export async function getLeagueInviteData(invite: GVGLeagueApplyType, serverNames: any, applies: GVGLeagueApplyType[]) {
let data = new LeagueListInfo(<GVGLeagueType>invite.league, serverNames);
let hasApply = !!applies.find(cur => cur.leagueCode == invite.guildCode);
data.setHasApply(hasApply);
data.setLeagueCe(await calLeagueCe(<GVGLeagueType>invite.league))
return data;
}
/**
* 联军加入军团
* @param myLeague
* @param targetGuildCode
* @returns
*/
export async function joinGuildToLeague(league: GVGLeagueType, targetGuildCode: string) {
const hasApply = await GVGLeagueApplyModel.checkApply(league.leagueCode, targetGuildCode, GVG_APPLY_TYPE.ALL);
if(!hasApply) {
return resResult(STATUS.GUILD_NOT_APPLY);
}
if(league.guildCnt >= GVG.GVG_LEAGUE_COMPOSE) {
return resResult(STATUS.LEAGUE_IS_GUILD_MAX);
}
let hisLeague = await GVGLeagueModel.findLeagueByGuild(targetGuildCode);
if(hisLeague) {
await GVGLeagueApplyModel.deleteApply(targetGuildCode, league.leagueCode);
return resResult(STATUS.TARGET_GUILD_HAS_LEAGUE);
}
const targetGuild = await GuildModel.findByCode(targetGuildCode, null, '+members');
if(!targetGuild) return resResult(STATUS.TARGET_GUILD_NOT_FOUND);
if(targetGuild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return resResult(STATUS.GUILD_LV_NOT_ENOUGH);
league = await GVGLeagueModel.joinGuild(league.leagueCode, targetGuild);
await GuildModel.joinLeague(targetGuildCode, league.leagueCode);
guildJoinLeagueRecord(league.leagueCode, targetGuild.name);
return resResult(STATUS.SUCCESS, league);
}
/**
* 检查是否可以进行组建联军等操作
* @param serverId
* @param serverType
* @returns
*/
export async function checkCanManage(serverId: number, serverType?: number) {
if(!serverType) serverType = await getGVGServerType(serverId);
if(serverType != GVG_SERVER_TYPE.MULTI) return resResult(STATUS.GVG_TEAM_SERVER_TYPE_ERR);
let { period } = getGVGPeriodData();
if(period != GVG_PERIOD.TEAM) return resResult(STATUS.GVG_NOT_TEAM_PERIOD);
return resResult(STATUS.SUCCESS);
}
/**
* 一些操作只能由军团的团长才能操作
* @param guildCode
* @param roleId
* @param guild
* @returns
*/
export async function checkGuildLeader(guildCode: string, roleId: string, guild?: GuildType) {
if(!guild) guild = await GuildModel.findByCode(guildCode, null, '+members +serverId');
if(!guild) return resResult(STATUS.GVG_HAS_NO_AUTH);
if(guild.lv < GVG.GVG_ARMY_LEAGUE_TIME) return resResult(STATUS.GUILD_LV_NOT_ENOUGH);
const userGuild = await UserGuildModel.getMyGuild(roleId, 'auth');
if(!userGuild || userGuild.auth != GUILD_AUTH.LEADER) return resResult(STATUS.GVG_HAS_NO_AUTH);
return resResult(STATUS.SUCCESS);
}
/**
* 检查联军的操作
* @param roleId
* @param myLeague
* @param type
* @returns
*/
export async function checkLeagueAuth(roleId: string, myLeague: GVGLeagueType, type: LEAGUE_MANAGE_TYPE) {
const auth = getMyAuth(myLeague, roleId);
console.log('****', auth)
const needAuth = getAuthFromManageType(type);
return needAuth.indexOf(auth) > -1
}
function getAuthFromManageType(type: LEAGUE_MANAGE_TYPE) {
switch(type) {
case LEAGUE_MANAGE_TYPE.HANDLE_APPLY:
case LEAGUE_MANAGE_TYPE.INVITE:
case LEAGUE_MANAGE_TYPE.KICK:
case LEAGUE_MANAGE_TYPE.DISSMISS:
case LEAGUE_MANAGE_TYPE.ABDICATE:
case LEAGUE_MANAGE_TYPE.RERUIT:
return [LEAGUE_AUTH.LEADER];
case LEAGUE_MANAGE_TYPE.QUIT:
case LEAGUE_MANAGE_TYPE.BE_ABDICATED:
return [LEAGUE_AUTH.SUB_LEADER];
case LEAGUE_MANAGE_TYPE.SET_INFO:
case LEAGUE_MANAGE_TYPE.SEND_MAIL:
case LEAGUE_MANAGE_TYPE.UNLOCK_TECH:
case LEAGUE_MANAGE_TYPE.SET_TARGET_CITY:
case LEAGUE_MANAGE_TYPE.SET_NOTICE:
return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER];
case LEAGUE_MANAGE_TYPE.ACTIVATE_TECH:
return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER, LEAGUE_AUTH.MEMBER];
}
}
export async function memberJoinGuildToLeague(guild: GuildType, role: RoleType) {
if(!guild.leagueCode) return;
await GVGLeagueModel.joinMember(guild.leagueCode, role.roleId, guild.code);
}
export async function memberQuitGuildToLeague(guild: GuildType, role: RoleType) {
if(!guild.leagueCode) return;
await GVGLeagueModel.quitMember(guild.leagueCode, role.roleId);
}
export async function guildDismissToLeague(guild: GuildType) {
if(!guild.leagueCode) return;
await GVGLeagueModel.quitGuild(guild.leagueCode, guild);
}
export async function guildAbdicateToLeague(guild: GuildType, fromRoleId: string, toRole: RoleType) {
if(!guild.leagueCode) return;
await GVGLeagueModel.abdicateGuild(guild.leagueCode, fromRoleId, toRole.roleId, toRole._id);
await updateUserInfo(REDIS_KEY.LEAGUE_INFO, guild.leagueCode, [{ field: 'leader', value: new LeagueLeader(toRole) }]);
}
export async function updateGVGBattleLeagueInfo(serverId: number, leagueCode: string, info: { leagueName?: string, icon?: number }) {
await GVGTeamModel.updateLeagueName(leagueCode, info.leagueName);
await GVGCityModel.updateLeagueInfo(leagueCode, info.leagueName, info.icon);
await GVGCityAreaPointModel.updateLeagueName(leagueCode, info.leagueName)
if(info.leagueName) await pinus.app.rpc.guild.guildRemote.updateLeagueNameMem.broadcast(serverId, leagueCode, info.leagueName);
}
export async function updateLeagueNameMem(serverId: number, leagueCode: string, leagueName: string ) {
let groupKey = await getGroupKey(serverId);
let teamObj = getGVGBattleData(groupKey);
teamObj.updateLeagueInfo(leagueCode, leagueName);
}
export async function updateGVGBattleRoleInfo(serverId: number, roleId: string, info: { roleName?: string, lv?: number }) {
await GVGTeamModel.updateRoleInfo(roleId, info);
await pinus.app.rpc.guild.guildRemote.updateTeamRoleInfoMem.broadcast(serverId, roleId, info);
}
export async function updateTeamRoleInfoMem(serverId: number, roleId: string, info: { roleName?: string, lv?: number } ) {
let groupKey = await getGroupKey(serverId);
let teamObj = getGVGBattleData(groupKey);
teamObj.updateRoleInfo(roleId, info);
}