✨ feat(gvg): 便捷管理页面
This commit is contained in:
@@ -214,6 +214,7 @@ class Filter {
|
|||||||
'guild.gvgManageHandler.sendMail',
|
'guild.gvgManageHandler.sendMail',
|
||||||
'guild.gvgManageHandler.setGuildInfo',
|
'guild.gvgManageHandler.setGuildInfo',
|
||||||
'guild.gvgManageHandler.setLeagueInfo',
|
'guild.gvgManageHandler.setLeagueInfo',
|
||||||
|
'guild.gvgBattleHandler.setNotice',
|
||||||
].indexOf(route) != -1
|
].indexOf(route) != -1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,6 +276,7 @@ class Filter {
|
|||||||
}
|
}
|
||||||
case 'guild.gvgManageHandler.createLeague':
|
case 'guild.gvgManageHandler.createLeague':
|
||||||
case 'guild.gvgManageHandler.setLeagueInfo':
|
case 'guild.gvgManageHandler.setLeagueInfo':
|
||||||
|
case 'guild.gvgBattleHandler.setNotice':
|
||||||
{
|
{
|
||||||
let result = await checkGuildName(guildCode, serverId, msg.name, msg.notice);
|
let result = await checkGuildName(guildCode, serverId, msg.name, msg.notice);
|
||||||
if(!result) hasBlockWords = true;
|
if(!result) hasBlockWords = true;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import { gameData, getReviveGold } from '../../../pubUtils/data';
|
|||||||
import { getAllServerName } from '../../../services/redisService';
|
import { getAllServerName } from '../../../services/redisService';
|
||||||
import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
|
import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
|
||||||
import { SaveTeamParam, SaveTeamUpdateParam } from '../../../domain/gvgField/gvgDb';
|
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 { addRoleToAreaChannel, addRoleToAreaTeamChannel, addRoleToGVGCityChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel, leaveGVGCityTeamChannel } from '../../../services/chatChannelService';
|
||||||
import { nowSeconds } from '../../../pubUtils/timeUtil';
|
import { nowSeconds } from '../../../pubUtils/timeUtil';
|
||||||
import { GVGUserItemModel } from '../../../db/GVGUserItem';
|
import { GVGUserItemModel } from '../../../db/GVGUserItem';
|
||||||
@@ -27,7 +27,9 @@ import { LeagueRankInfo, RoleRankInfo } from '../../../domain/rank';
|
|||||||
import { addBattleEndRec } from '../../../services/gvg/gvgRecService';
|
import { addBattleEndRec } from '../../../services/gvg/gvgRecService';
|
||||||
import { RoleModel } from '../../../db/Role';
|
import { RoleModel } from '../../../db/Role';
|
||||||
import { EXTERIOR, GVG } from '../../../pubUtils/dicParam';
|
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) {
|
export default function (app: Application) {
|
||||||
new HandlerService(app, {});
|
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() {
|
async debugStartSchedule() {
|
||||||
let { countdownTime } = getGVGPeriodData();
|
let { countdownTime } = getGVGPeriodData();
|
||||||
pinus.app.rpc.guild.guildRemote.setPeriodTime.broadcast(nowSeconds(), countdownTime);
|
pinus.app.rpc.guild.guildRemote.setPeriodTime.broadcast(nowSeconds(), countdownTime);
|
||||||
|
|||||||
@@ -97,6 +97,8 @@ export class GVGHandler {
|
|||||||
let { configId, period, countdownTime } = getGVGPeriodData();
|
let { configId, period, countdownTime } = getGVGPeriodData();
|
||||||
let { startFightTime, endFightTime } = getFightTimeByPeriod(period);
|
let { startFightTime, endFightTime } = getFightTimeByPeriod(period);
|
||||||
|
|
||||||
|
let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode);
|
||||||
|
|
||||||
let groupKey = await getGroupKey(serverId);
|
let groupKey = await getGroupKey(serverId);
|
||||||
let cities = await getGVGCitiesInfo(configId, groupKey, myLeague);
|
let cities = await getGVGCitiesInfo(configId, groupKey, myLeague);
|
||||||
let vestiges = await getMyVestiges(serverId, roleId);
|
let vestiges = await getMyVestiges(serverId, roleId);
|
||||||
@@ -105,6 +107,8 @@ export class GVGHandler {
|
|||||||
|
|
||||||
return resResult(STATUS.SUCCESS, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
configId, period, countdownTime, startFightTime, endFightTime,
|
configId, period, countdownTime, startFightTime, endFightTime,
|
||||||
|
targetCities: leaguePrepare?.targetCities||[],
|
||||||
|
notice: leaguePrepare?.notice||'',
|
||||||
cities,
|
cities,
|
||||||
vestiges
|
vestiges
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1582,6 +1582,17 @@ export function checkRouteParam(route: string, msg: any) {
|
|||||||
if(!checkNumberArray(msg.areaIds)) return false;
|
if(!checkNumberArray(msg.areaIds)) return false;
|
||||||
break;
|
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":
|
case "order.orderHandler.applyOrder":
|
||||||
{
|
{
|
||||||
let { productID, payType, activityId, paramStr, useVoucher } = msg;
|
let { productID, payType, activityId, paramStr, useVoucher } = msg;
|
||||||
|
|||||||
@@ -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) {
|
export async function checkLeagueAuth(roleId: string, myLeague: GVGLeagueType, type: LEAGUE_MANAGE_TYPE) {
|
||||||
const auth = getMyAuth(myLeague, roleId);
|
const auth = getMyAuth(myLeague, roleId);
|
||||||
|
console.log('****', auth)
|
||||||
const needAuth = getAuthFromManageType(type);
|
const needAuth = getAuthFromManageType(type);
|
||||||
return needAuth.indexOf(auth) > -1
|
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.SET_INFO:
|
||||||
case LEAGUE_MANAGE_TYPE.SEND_MAIL:
|
case LEAGUE_MANAGE_TYPE.SEND_MAIL:
|
||||||
case LEAGUE_MANAGE_TYPE.UNLOCK_TECH:
|
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];
|
return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER];
|
||||||
case LEAGUE_MANAGE_TYPE.ACTIVATE_TECH:
|
case LEAGUE_MANAGE_TYPE.ACTIVATE_TECH:
|
||||||
return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER, LEAGUE_AUTH.MEMBER];
|
return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER, LEAGUE_AUTH.MEMBER];
|
||||||
|
|||||||
@@ -207,4 +207,6 @@ export const PUSH_ROUTE = {
|
|||||||
GVG_CITY_RANK_UPDATE: 'onGVGCityRankUpdate', // 城池积分排名
|
GVG_CITY_RANK_UPDATE: 'onGVGCityRankUpdate', // 城池积分排名
|
||||||
GVG_SPINE_ATTACKED: 'onSpinesAttacked', // 4.7 队伍在地图上受到攻击
|
GVG_SPINE_ATTACKED: 'onSpinesAttacked', // 4.7 队伍在地图上受到攻击
|
||||||
GVG_CONTRIBUTE_UPDATE: 'onGVGContributeUpdate', // 贡献更新
|
GVG_CONTRIBUTE_UPDATE: 'onGVGContributeUpdate', // 贡献更新
|
||||||
|
GVG_TARGET_CITY_UPDATE: 'onGVGTargetCitiesUpdate', // 目标城池更新
|
||||||
|
GVG_NOTICE_UPDATE: 'onGVGNoticeUpdate', // 管理信息更新
|
||||||
}
|
}
|
||||||
@@ -36,6 +36,8 @@ export enum LEAGUE_MANAGE_TYPE {
|
|||||||
SEND_MAIL = 10, // 发邮件
|
SEND_MAIL = 10, // 发邮件
|
||||||
UNLOCK_TECH = 11, // 解锁科技树
|
UNLOCK_TECH = 11, // 解锁科技树
|
||||||
ACTIVATE_TECH = 12, // 激活
|
ACTIVATE_TECH = 12, // 激活
|
||||||
|
SET_TARGET_CITY = 13, // 设定目标城池
|
||||||
|
SET_NOTICE = 14, // 设置管理通知
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum LEAGUE_JOB {
|
export enum LEAGUE_JOB {
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ export const STATUS = {
|
|||||||
GVG_BATTLE_TEAM_LOCK_ENTERY_CITY: { code: 21424, simStr: '正在有玩家挑战您,请稍后切换城池' },
|
GVG_BATTLE_TEAM_LOCK_ENTERY_CITY: { code: 21424, simStr: '正在有玩家挑战您,请稍后切换城池' },
|
||||||
GVG_POINT_TYPE_ERR: { code: 21425, simStr: '该积分点不可驻守' },
|
GVG_POINT_TYPE_ERR: { code: 21425, simStr: '该积分点不可驻守' },
|
||||||
GVG_ROBOT_DEFENSEING: { code: 21426, 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
|
// 通用 30000 - 30099
|
||||||
DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' },
|
DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' },
|
||||||
|
|||||||
@@ -86,6 +86,12 @@ export default class GVGLeaguePrepare extends BaseModel {
|
|||||||
@prop({ required: true, default: [], type: GuildActive, _id: false })
|
@prop({ required: true, default: [], type: GuildActive, _id: false })
|
||||||
guildActive: GuildActive[]; // 军团活跃
|
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) {
|
public static async initData(configId: number, groupKey: string, leagueCode: string, maxMemberCnt: number) {
|
||||||
const doc = new GVGLeaguePrepareModel();
|
const doc = new GVGLeaguePrepareModel();
|
||||||
const update = Object.assign(doc.toJSON(), { maxMemberCnt });
|
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();
|
const result: GVGLeaguePrepareType[] = await GVGLeaguePrepareModel.find({ configId, groupKey }).sort({ lv: -1 }).lean();
|
||||||
return result;
|
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);
|
export const GVGLeaguePrepareModel = getModelForClass(GVGLeaguePrepare);
|
||||||
|
|||||||
Reference in New Issue
Block a user