diff --git a/game-server/app/servers/connector/filter/global.ts b/game-server/app/servers/connector/filter/global.ts index 9c32b9f72..62e062b57 100644 --- a/game-server/app/servers/connector/filter/global.ts +++ b/game-server/app/servers/connector/filter/global.ts @@ -214,6 +214,7 @@ class Filter { 'guild.gvgManageHandler.sendMail', 'guild.gvgManageHandler.setGuildInfo', 'guild.gvgManageHandler.setLeagueInfo', + 'guild.gvgBattleHandler.setNotice', ].indexOf(route) != -1 } @@ -275,6 +276,7 @@ class Filter { } case 'guild.gvgManageHandler.createLeague': case 'guild.gvgManageHandler.setLeagueInfo': + case 'guild.gvgBattleHandler.setNotice': { let result = await checkGuildName(guildCode, serverId, msg.name, msg.notice); if(!result) hasBlockWords = true; diff --git a/game-server/app/servers/guild/handler/gvgBattleHandler.ts b/game-server/app/servers/guild/handler/gvgBattleHandler.ts index 73f17c76b..905022be4 100644 --- a/game-server/app/servers/guild/handler/gvgBattleHandler.ts +++ b/game-server/app/servers/guild/handler/gvgBattleHandler.ts @@ -15,7 +15,7 @@ import { gameData, getReviveGold } from '../../../pubUtils/data'; import { getAllServerName } from '../../../services/redisService'; import { checkBattleHeroesByHid } from '../../../services/normalBattleService'; import { SaveTeamParam, SaveTeamUpdateParam } from '../../../domain/gvgField/gvgDb'; -import { GVG_AREA_TYPE, GVG_ATTACK_TYPE, GVG_ITEM, GVG_PERIOD, GVG_POINT_TYPE, GVG_REC_TYPE, ITEM_CHANGE_REASON, PUSH_ROUTE, REDIS_KEY, STATUS } from '../../../consts'; +import { GVG_AREA_TYPE, GVG_ATTACK_TYPE, GVG_ITEM, GVG_PERIOD, GVG_POINT_TYPE, GVG_REC_TYPE, ITEM_CHANGE_REASON, LEAGUE_MANAGE_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from '../../../consts'; import { addRoleToAreaChannel, addRoleToAreaTeamChannel, addRoleToGVGCityChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel, leaveGVGCityTeamChannel } from '../../../services/chatChannelService'; import { nowSeconds } from '../../../pubUtils/timeUtil'; import { GVGUserItemModel } from '../../../db/GVGUserItem'; @@ -27,7 +27,9 @@ import { LeagueRankInfo, RoleRankInfo } from '../../../domain/rank'; import { addBattleEndRec } from '../../../services/gvg/gvgRecService'; import { RoleModel } from '../../../db/Role'; import { EXTERIOR, GVG } from '../../../pubUtils/dicParam'; -import { sendMessageToGVGAreaByTeamWithSuc, sendMessageToUserWithSuc } from '../../../services/pushService'; +import { sendMessageToGuildWithSuc, sendMessageToGVGAreaByTeamWithSuc, sendMessageToUserWithSuc } from '../../../services/pushService'; +import { checkLeagueAuth } from '../../../services/gvg/gvgTeamService'; +import { GVGLeaguePrepareModel } from '../../../db/GVGLeaguePrepare'; export default function (app: Application) { new HandlerService(app, {}); @@ -715,6 +717,89 @@ export class GVGBattleHandler { }) } + // 设置目标城池 + async setTargetCity(msg: { cityId: number, isTarget: boolean }, session: BackendSession) { + + const guildCode = session.get('guildCode'); + const roleId = session.get('roleId'); + const { cityId, isTarget } = msg; + + let { configId, period } = getGVGPeriodData(); + if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); + + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + let dicCity = gameData.gvgCity.get(cityId); + if(!dicCity) return resResult(STATUS.GVG_CITY_NOT_FOUND); + + let targetCities: number[] = []; + // 权限 + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.SET_TARGET_CITY); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + if(isTarget) { + let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode); + targetCities = leaguePrepare?.targetCities||[]; + if(targetCities.indexOf(cityId) != -1) return resResult(STATUS.GVG_TARGET_CITY_HAS_SET); + if(targetCities.length >= 2) return resResult(STATUS.GVG_TARGET_CITY_CNT_MAX); + leaguePrepare = await GVGLeaguePrepareModel.setTargetCity(configId, myLeague.leagueCode, cityId); + targetCities = leaguePrepare?.targetCities||[]; + } else { + let leaguePrepare = await GVGLeaguePrepareModel.cancelTargetCity(configId, myLeague.leagueCode, cityId); + targetCities = leaguePrepare?.targetCities||[]; + } + // 发送消息 + for(let guildCode of myLeague.guildCodes) { + await sendMessageToGuildWithSuc(guildCode, PUSH_ROUTE.GVG_TARGET_CITY_UPDATE, { targetCities }); + } + + return resResult(STATUS.SUCCESS, { + configId, targetCities + }); + } + + // 设置管理信息 + async setNotice(msg: { notice: string }, session: BackendSession) { + + const guildCode = session.get('guildCode'); + const roleId = session.get('roleId'); + const { notice = '' } = msg; + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + let { configId, period } = getGVGPeriodData(); + if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); + // 权限 + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.SET_NOTICE); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + let leaguePrepare = await GVGLeaguePrepareModel.setNotice(configId, myLeague.leagueCode, notice); + if(!leaguePrepare) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + for(let guildCode of myLeague.guildCodes) { + await sendMessageToGuildWithSuc(guildCode, PUSH_ROUTE.GVG_TARGET_CITY_UPDATE, { notice: leaguePrepare.notice }); + } + return resResult(STATUS.SUCCESS, { + configId, notice: leaguePrepare.notice + }); + } + + // enterCity里返回的那个ranks + async getRankByCity(msg: { cityId: number }, session: BackendSession) { + const guildCode = session.get('guildCode'); + const serverId = session.get('serverId'); + const { cityId } = msg; + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + + let { configId } = getGVGPeriodData(); + const groupKey = await getGroupKey(serverId); + + const { ranks, myRank } = await getBattleRanksByCity(configId, groupKey, cityId, myLeague); + return resResult(STATUS.SUCCESS, { + cityId, ranks, myRank + }) + } + async debugStartSchedule() { let { countdownTime } = getGVGPeriodData(); pinus.app.rpc.guild.guildRemote.setPeriodTime.broadcast(nowSeconds(), countdownTime); diff --git a/game-server/app/servers/guild/handler/gvgHandler.ts b/game-server/app/servers/guild/handler/gvgHandler.ts index 64f9e4173..59acc144d 100644 --- a/game-server/app/servers/guild/handler/gvgHandler.ts +++ b/game-server/app/servers/guild/handler/gvgHandler.ts @@ -97,6 +97,8 @@ export class GVGHandler { let { configId, period, countdownTime } = getGVGPeriodData(); let { startFightTime, endFightTime } = getFightTimeByPeriod(period); + let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode); + let groupKey = await getGroupKey(serverId); let cities = await getGVGCitiesInfo(configId, groupKey, myLeague); let vestiges = await getMyVestiges(serverId, roleId); @@ -105,6 +107,8 @@ export class GVGHandler { return resResult(STATUS.SUCCESS, { configId, period, countdownTime, startFightTime, endFightTime, + targetCities: leaguePrepare?.targetCities||[], + notice: leaguePrepare?.notice||'', cities, vestiges }); diff --git a/game-server/app/services/checkParam.ts b/game-server/app/services/checkParam.ts index 4ccd6b448..024831add 100644 --- a/game-server/app/services/checkParam.ts +++ b/game-server/app/services/checkParam.ts @@ -1582,6 +1582,17 @@ export function checkRouteParam(route: string, msg: any) { if(!checkNumberArray(msg.areaIds)) return false; break; } + case "guild.gvgBattleHandler.setTargetCity": + { + if(!checkNaturalNumbers(msg.cityId)) return false; + if(!checkBoolean(msg.isTarget)) return false; + break; + } + case "guild.gvgBattleHandler.getAreaTeams": + { + if(!checkStringIfExist(msg.notice)) return false; + break; + } case "order.orderHandler.applyOrder": { let { productID, payType, activityId, paramStr, useVoucher } = msg; diff --git a/game-server/app/services/gvg/gvgTeamService.ts b/game-server/app/services/gvg/gvgTeamService.ts index 66e171f85..09a8c8b73 100644 --- a/game-server/app/services/gvg/gvgTeamService.ts +++ b/game-server/app/services/gvg/gvgTeamService.ts @@ -192,6 +192,7 @@ export async function checkGuildLeader(guildCode: string, roleId: string, guild? */ 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 } @@ -211,6 +212,8 @@ function getAuthFromManageType(type: LEAGUE_MANAGE_TYPE) { 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]; diff --git a/shared/consts/constModules/chatConst.ts b/shared/consts/constModules/chatConst.ts index 2268040b3..2e42e2440 100644 --- a/shared/consts/constModules/chatConst.ts +++ b/shared/consts/constModules/chatConst.ts @@ -207,4 +207,6 @@ export const PUSH_ROUTE = { GVG_CITY_RANK_UPDATE: 'onGVGCityRankUpdate', // 城池积分排名 GVG_SPINE_ATTACKED: 'onSpinesAttacked', // 4.7 队伍在地图上受到攻击 GVG_CONTRIBUTE_UPDATE: 'onGVGContributeUpdate', // 贡献更新 + GVG_TARGET_CITY_UPDATE: 'onGVGTargetCitiesUpdate', // 目标城池更新 + GVG_NOTICE_UPDATE: 'onGVGNoticeUpdate', // 管理信息更新 } \ No newline at end of file diff --git a/shared/consts/constModules/gvgConst.ts b/shared/consts/constModules/gvgConst.ts index 82b311402..b4c7de384 100644 --- a/shared/consts/constModules/gvgConst.ts +++ b/shared/consts/constModules/gvgConst.ts @@ -36,6 +36,8 @@ export enum LEAGUE_MANAGE_TYPE { SEND_MAIL = 10, // 发邮件 UNLOCK_TECH = 11, // 解锁科技树 ACTIVATE_TECH = 12, // 激活 + SET_TARGET_CITY = 13, // 设定目标城池 + SET_NOTICE = 14, // 设置管理通知 } export enum LEAGUE_JOB { diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 910a8d1c9..c06c0d642 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -392,6 +392,8 @@ export const STATUS = { GVG_BATTLE_TEAM_LOCK_ENTERY_CITY: { code: 21424, simStr: '正在有玩家挑战您,请稍后切换城池' }, GVG_POINT_TYPE_ERR: { code: 21425, simStr: '该积分点不可驻守' }, GVG_ROBOT_DEFENSEING: { code: 21426, simStr: '该守卫正在与其他玩家战斗' }, + GVG_TARGET_CITY_HAS_SET: { code: 21427, simStr: '这个城池已设为目标' }, + GVG_TARGET_CITY_CNT_MAX: { code: 21428, simStr: '目标城池数量已达上限' }, // 通用 30000 - 30099 DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' }, diff --git a/shared/db/GVGLeaguePrepare.ts b/shared/db/GVGLeaguePrepare.ts index ee141a33a..6ab75a66d 100644 --- a/shared/db/GVGLeaguePrepare.ts +++ b/shared/db/GVGLeaguePrepare.ts @@ -86,6 +86,12 @@ export default class GVGLeaguePrepare extends BaseModel { @prop({ required: true, default: [], type: GuildActive, _id: false }) guildActive: GuildActive[]; // 军团活跃 + @prop({ required: true, default: [], type: Number }) + targetCities: number[]; // 目标城池 + + @prop({ required: true, default: '' }) + notice: string; // 公告 + public static async initData(configId: number, groupKey: string, leagueCode: string, maxMemberCnt: number) { const doc = new GVGLeaguePrepareModel(); const update = Object.assign(doc.toJSON(), { maxMemberCnt }); @@ -166,6 +172,21 @@ export default class GVGLeaguePrepare extends BaseModel { const result: GVGLeaguePrepareType[] = await GVGLeaguePrepareModel.find({ configId, groupKey }).sort({ lv: -1 }).lean(); return result; } + + public static async setTargetCity(configId: number, leagueCode: string, cityId: number) { + const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $push: { targetCities: cityId } }, { new: true }).lean(); + return result; + } + + public static async cancelTargetCity(configId: number, leagueCode: string, cityId: number) { + const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $pull: { targetCities: cityId } }, { new: true }).lean(); + return result; + } + + public static async setNotice(configId: number, leagueCode: string, notice: string) { + const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $set: { notice } }, { new: true }).lean(); + return result; + } } export const GVGLeaguePrepareModel = getModelForClass(GVGLeaguePrepare);