This commit is contained in:
xy
2026-03-13 01:38:40 +00:00
parent e6e4f88257
commit 28855885cd
311 changed files with 89544 additions and 94350 deletions
+358 -357
View File
@@ -1,357 +1,358 @@
import { Application, BackendSession, pinus } from 'pinus';
import { getRandSingleEelm, isTimestamp, resResult } from '../../../pubUtils/util';
import { STATUS } from '../../../consts/statusCode';
import { GMMailModel, GMMailType } from '../../../db/GMMail';
import { ACTIVITY_TYPE, GM_MAIL_STATUS, GM_MAIL_TYPE, MAIL_TIME_TYPE, MEMORY_LOG_TYPE, PUSH_ROUTE, SURVEY_SELECT } from '../../../consts';
import { ActivityModel } from '../../../db/Activity';
import { ActivityGroupModel } from '../../../db/ActivityGroup';
import { ActivityGroupTypeModel } from '../../../db/ActivityGroupType';
import { getPastTime, getTimeFunM, nowSeconds } from '../../../pubUtils/timeUtil';
import moment = require('moment');
import { sendUngotDividend } from '../../../services/auctionService';
import { taflush } from '../../../services/sdkService';
import { ActivityInRemote } from '../../../domain/activityField/activityField';
import { pushCurrentTime } from '../../../services/auctionService';
import { SurveyModel, SurveyUpdate } from '../../../db/Survery';
import { compaireMailGoods, getSurvey } from '../../../services/gmService';
import { sendMessageToAllWithSuc } from '../../../services/pushService';
import { sendMailByContent, sendMailsByGmMail } from '../../../services/mailService';
import { saveMemory } from '../../../services/log/memoryLogService';
import { getGVGConfigFromRemote } from '../../../services/gvg/gvgService';
import { ServerGroupModel } from '../../../db/ServerGroup';
import { isNumber } from 'underscore';
import { group } from 'console';
import { GVGConfigModel } from '../../../db/GVGConfig';
import { ServerlistModel } from '../../../db/Serverlist';
import { getPvpTimeFromRemote } from '../../../services/pvpService';
let timer: NodeJS.Timer;
export default function (app: Application) {
return new GmHandler(app);
}
export class GmHandler {
constructor(private app: Application) {
}
async sendSingleMail(msg: { id: string, isPass: boolean }, session: BackendSession) {
const uid: number = session.get('uid')
let { id, isPass } = msg;
let gmmail = await GMMailModel.getGmMailByIdAndType(id, GM_MAIL_TYPE.SINGLE, true);
if(!gmmail) return resResult(STATUS.GM_MAIL_NOT_FOUND);
return await this.sendMail(gmmail, isPass, uid);
}
async sendSingleMailTxt(msg: { id: string, isPass: boolean }, session: BackendSession) {
const uid: number = session.get('uid')
let { id, isPass } = msg;
let gmmail = await GMMailModel.getGmMailByIdAndType(id, GM_MAIL_TYPE.SINGLE, false);
if(!gmmail) return resResult(STATUS.GM_MAIL_NOT_FOUND);
return await this.sendMail(gmmail, isPass, uid);
}
async sendServerMail(msg: { id: string, isPass: boolean }, session: BackendSession) {
const uid: number = session.get('uid')
let { id, isPass } = msg;
let gmmail = await GMMailModel.getGmMailByIdAndType(id, GM_MAIL_TYPE.SERVER, true);
if(!gmmail) return resResult(STATUS.GM_MAIL_NOT_FOUND);
return await this.sendMail(gmmail, isPass, uid);
}
async sendServerMailTxt(msg: { id: string, isPass: boolean }, session: BackendSession) {
const uid: number = session.get('uid')
let { id, isPass } = msg;
let gmmail = await GMMailModel.getGmMailByIdAndType(id, GM_MAIL_TYPE.SERVER, false);
if(!gmmail) return resResult(STATUS.GM_MAIL_NOT_FOUND);
return await this.sendMail(gmmail, isPass, uid);
}
//对接gm后台,下发邮件
async sendMail(gmmail: GMMailType, isPass: boolean, uid: number) {
let id = gmmail._id;
let { receivers, mailType, status, hasGoods, goods } = gmmail;
if(status != GM_MAIL_STATUS.CREATE) {
return resResult(STATUS.GM_MAIL_HAS_SENT);
}
if(isPass) {
let gmmailArr: GMMailType[] = [];
if(mailType == GM_MAIL_TYPE.SINGLE && hasGoods && (!goods || goods.length == 0)) {
for(let receiver of receivers) {
let index = gmmailArr.findIndex(gmmail => compaireMailGoods(gmmail, receiver));
if(index == -1) {
gmmailArr.push({...gmmail, receivers: [receiver], goods: receiver.rewards, hasGoods: receiver?receiver.rewards.length > 0: false });
} else {
gmmailArr[index].receivers.push(receiver);
}
}
} else {
gmmailArr.push(gmmail);
}
await sendMailsByGmMail(gmmailArr);
}
await GMMailModel.updateMailById(id, { status: isPass? GM_MAIL_STATUS.PASS: GM_MAIL_STATUS.NOT_PASS, viewAt: new Date(), viewBy: uid }, uid);
return resResult(STATUS.SUCCESS);
}
async reloadResource(msg: {}, session: BackendSession) {
try {
let activityServers = this.app.getServersByType('activity');
for (let { id } of activityServers) {
await this.app.rpc.activity.activityRemote.reloadResources.toServer(id);
}
let battleServers = this.app.getServersByType('battle');
for (let { id } of battleServers) {
await this.app.rpc.battle.battleRemote.reloadResources.toServer(id);
}
let comBattleServers = this.app.getServersByType('comBattle');
for (let { id } of comBattleServers) {
await this.app.rpc.comBattle.comBattleRemote.reloadResources.toServer(id);
}
let chatServers = this.app.getServersByType('chat');
for (let { id } of chatServers) {
await this.app.rpc.chat.chatRemote.reloadResources.toServer(id);
}
let connectServers = this.app.getServersByType('connector');
for (let { id } of connectServers) {
await this.app.rpc.connector.connectorRemote.reloadResources.toServer(id);
}
let guildServers = this.app.getServersByType('guild');
for (let { id } of guildServers) {
await this.app.rpc.guild.guildRemote.reloadResources.toServer(id);
}
let roleServers = this.app.getServersByType('role');
for (let { id } of roleServers) {
await this.app.rpc.role.roleRemote.reloadResources.toServer(id);
}
let systimerServers = this.app.getServersByType('systimer');
for (let { id } of systimerServers) {
await this.app.rpc.systimer.systimerRemote.reloadResources.toServer(id);
}
let orderServers = this.app.getServersByType('order');
for (let { id } of orderServers) {
await this.app.rpc.order.orderRemote.reloadResources.toServer(id);
}
return resResult(STATUS.SUCCESS, {
isOK: true
});
} catch (e) {
return resResult(STATUS.SUCCESS, {
isOK: false,
err: e.stack
});
}
}
async updateActivity(msg: { aids: number[] }, session: BackendSession) {
let { aids }= msg;
let activities = await ActivityModel.findActivityByIds(aids);
let activityServers = pinus.app.getServersByType('activity');
for(let server of activityServers) {
pinus.app.rpc.activity.activityRemote.updateActivities.toServer(server.id, activities.map(activity => new ActivityInRemote(activity)));
}
let timeLimitRanks = activities.filter(cur => cur.type == ACTIVITY_TYPE.TIME_LIMIT_RANK);
if(timeLimitRanks.length > 0) {
pinus.app.rpc.systimer.systimerRemote.updateTimeLimitRank.broadcast(timeLimitRanks);
}
let groupShops = activities.filter(cur => cur.type == ACTIVITY_TYPE.GROUP_SHOP);
if(groupShops.length > 0) {
pinus.app.rpc.systimer.systimerRemote.initSumSchedule.broadcast();
}
let signIns = activities.filter(cur => cur.type == ACTIVITY_TYPE.COMMON_SIGN_IN);
if(signIns.length > 0) {
pinus.app.rpc.systimer.systimerRemote.initVipSignInMailSchedule.broadcast();
}
return resResult(STATUS.SUCCESS, {
activity: activities
});
}
async deleteActivity(msg: { activityId: number}, session: BackendSession) {
const { activityId } = msg;
let activityServers = pinus.app.getServersByType('activity');
for(let server of activityServers) {
pinus.app.rpc.activity.activityRemote.deleteActivities.toServer(server.id, [activityId]);
}
return resResult(STATUS.SUCCESS);
}
async updateActivityGroup(msg: { groupId: number, serverIds: number[], activityIds: number[] }, session: BackendSession) {
const uid = session.get('uid');
let { groupId, serverIds, activityIds } = msg;
pinus.app.rpc.activity.activityRemote.saveActivitiesToGroup.broadcast(groupId, activityIds);
pinus.app.rpc.activity.activityRemote.saveGroupToServer.broadcast([groupId], serverIds);
return resResult(STATUS.SUCCESS);
}
/**
* 开启军团活动到拍卖行debug
* @param msg
* @param session
*/
async setGuildActivityDebug(msg: { aid: number, day: number, startActivity: number, endActivity: number, startGuildAuction: number, endGuildAuction: number, startWorldAuction: number, endWorldAuction: number, startNextDay: number }, session: BackendSession) {
let { aid, day, startActivity = 0, endActivity = 0, startGuildAuction = 0, endGuildAuction = 0, startWorldAuction = 0, endWorldAuction = 0, startNextDay = 0 } = msg;
if(timer) {
clearTimeout(timer);
}
const uid = session.get('uid');
if(aid == undefined || day == undefined ) {
return resResult(STATUS.WRONG_PARMS);
}
if(aid == 0) {
day = new Date().getDay();
}
// 设置字典
let now = new Date();
let startTimes = await pinus.app.rpc.guild.guildActivityRemote.setDicGuildActivity.broadcast(now.getTime(), aid, startActivity, endActivity);
await pinus.app.rpc.systimer.systimerRemote.setDicGuildActivity.broadcast(now.getTime(), aid, startActivity, endActivity);
await pinus.app.rpc.connector.connectorRemote.setDicGuildActivity.broadcast(now.getTime(), aid, startActivity, endActivity);
await pinus.app.rpc.guild.guildActivityRemote.setDicAuctionTime.broadcast(startTimes[0], endActivity, startGuildAuction, endGuildAuction, startWorldAuction, endWorldAuction);
await pinus.app.rpc.connector.connectorRemote.setDicAuctionTime.broadcast(startTimes[0], endActivity, startGuildAuction, endGuildAuction, startWorldAuction, endWorldAuction);
await pinus.app.rpc.systimer.systimerRemote.setDicAuctionTime.broadcast(startTimes[0], endActivity, startGuildAuction, endGuildAuction, startWorldAuction, endWorldAuction);
await pinus.app.rpc.guild.guildActivityRemote.setDay.broadcast(day);
await pinus.app.rpc.systimer.systimerRemote.setDay.broadcast(day);
await pinus.app.rpc.connector.connectorRemote.setDay.broadcast(day);
await pinus.app.rpc.guild.guildActivityRemote.guildActivityEnd.broadcast(aid);
await pinus.app.rpc.guild.guildActivityRemote.clearActivityObj.broadcast();
// 开启定时器
await pinus.app.rpc.systimer.systimerRemote.setAuctionSchedule.broadcast();
await pinus.app.rpc.systimer.systimerRemote.setGuildActivitySchedule.broadcast();
// 向客户端发送时间
let time = <number>getTimeFunM().getTimeWithWeek(day, 20, 0, 0) - startActivity * 1000;
pinus.app.rpc.guild.guildActivityRemote.setCurrentTime.broadcast(time);
await pushCurrentTime(time);
timer = setTimeout(async () => {
let time = <number>getTimeFunM().getAfterDayWithHour(0);
pinus.app.rpc.guild.guildActivityRemote.setCurrentTime.broadcast(time);
await pushCurrentTime(time);
let guilds = pinus.app.getServersByType('guild');
let guild = getRandSingleEelm(guilds);
await pinus.app.rpc.guild.guildActivityRemote.sendUngotDividend.toServer(guild.id);
}, startActivity * 1000 + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000 + endWorldAuction * 1000 + startNextDay * 1000)
return resResult(STATUS.SUCCESS, {
startActivity: startTimes[0],
endActivity: startTimes[0] + endActivity * 1000,
startGuildAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000,
endGuildAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000,
startWorldAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000,
endWorldAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000 + endWorldAuction * 1000,
startNextDay: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000 + endWorldAuction * 1000 + startNextDay * 1000,
});
}
async cancelGuildActivityDebug(msg: { }, session: BackendSession) {
// 设置字典
let now = new Date();
if(timer) {
clearTimeout(timer);
}
await pinus.app.rpc.guild.guildRemote.reloadResources.broadcast();
await pinus.app.rpc.systimer.systimerRemote.reloadResources.broadcast();
await pinus.app.rpc.guild.guildActivityRemote.setDay.broadcast(null);
await pinus.app.rpc.systimer.systimerRemote.setDay.broadcast(null);
await pinus.app.rpc.connector.connectorRemote.setDay.broadcast(null);
// 开启定时器
await pinus.app.rpc.systimer.systimerRemote.setAuctionSchedule.broadcast();
await pinus.app.rpc.systimer.systimerRemote.setGuildActivitySchedule.broadcast();
await pinus.app.rpc.guild.guildActivityRemote.clearActivityObj.broadcast();
// 向客户端发送时间
pinus.app.rpc.guild.guildActivityRemote.setCurrentTime.broadcast(now.getTime());
await pushCurrentTime(now.getTime());
return resResult(STATUS.SUCCESS);
}
async taflus() {
taflush();
pinus.app.rpc.activity.activityRemote.taflush.broadcast();
pinus.app.rpc.battle.battleRemote.taflush.broadcast();
pinus.app.rpc.chat.chatRemote.taflush.broadcast();
pinus.app.rpc.connector.connectorRemote.taflush.broadcast();
pinus.app.rpc.guild.guildRemote.taflush.broadcast();
pinus.app.rpc.order.orderRemote.taflush.broadcast();
pinus.app.rpc.role.roleRemote.taflush.broadcast();
pinus.app.rpc.systimer.systimerRemote.taflush.broadcast();
return resResult(STATUS.SUCCESS);
}
async updateSurvey(msg: { code: string, surveyId: string, beginTim: number, endTime: number, isEnable: boolean, surveyLink: string, surveyName: string, roleIndex: number, goods: string, mailContent: string }, session: BackendSession) {
let update: SurveyUpdate = msg;
if(msg.goods) {
let reward = JSON.parse(msg.goods);
update.reward = reward;
}
let origin = await SurveyModel.findByCode(msg.code);
let result = await SurveyModel.updateSurvey(msg.code, update, SURVEY_SELECT.FIND);
if(!result) return resResult(STATUS.WRONG_PARMS);
if(origin && origin.isEnable != result.isEnable) {
await sendMessageToAllWithSuc(PUSH_ROUTE.UPDATE_SURVEY, { survey: result });
}
return resResult(STATUS.SUCCESS);
}
async deleteSurvey(msg: { code: string }, session: BackendSession) {
let { code } = msg;
await SurveyModel.deleteSurvey(code);
await sendMessageToAllWithSuc(PUSH_ROUTE.DELETE_SURVEY, { code });
return resResult(STATUS.SUCCESS);
}
async saveMemoryLog(msg: { memoryLogType: MEMORY_LOG_TYPE }, session: BackendSession) {
const { memoryLogType } = msg;
await saveMemory(memoryLogType);
return resResult(STATUS.SUCCESS);
}
async updateGVGServerGroup(msg: { serverId: number[], groupId: number }, session: BackendSession) {
const { serverId: serverIds, groupId } = msg;
if(!isNumber(groupId)) return resResult(STATUS.WRONG_PARMS);
for(let serverId of serverIds) {
if(!isNumber(serverId)) return resResult(STATUS.WRONG_PARMS);
}
let { scheduleTime } = await getGVGConfigFromRemote();
let { seasonNum, seasonEndTime } = await getPvpTimeFromRemote();
for(let serverId of serverIds) {
await ServerGroupModel.updateByServerId(serverId, groupId, scheduleTime, seasonNum == 0? getPastTime(): seasonEndTime);
}
try {
await pinus.app.rpc.guild.guildRemote.setServerGroup.broadcast();
await pinus.app.rpc.chat.chatRemote.setServerGroup.broadcast();
await pinus.app.rpc.connector.connectorRemote.setServerGroup.broadcast();
await pinus.app.rpc.gm.gmRemote.setServerGroup.broadcast();
await pinus.app.rpc.systimer.systimerRemote.setServerGroup.broadcast();
await pinus.app.rpc.battle.battleRemote.setServerGroup.broadcast();
} catch(e) {
console.log('remote未初始完');
}
return resResult(STATUS.SUCCESS);
}
async updateGVGConfig(msg: { configId: number, teamTime: number, prepareTime: number, battleTime: number, scheduleTime: number }, session: BackendSession) {
const { configId, teamTime, prepareTime, battleTime, scheduleTime } = msg;
if(!isNumber(configId) || !isTimestamp(teamTime) || !isTimestamp(prepareTime) || !isTimestamp(battleTime) || !isTimestamp(scheduleTime)) {
return resResult(STATUS.WRONG_PARMS);
}
if(teamTime > prepareTime || prepareTime > battleTime || battleTime > scheduleTime) {
return resResult(STATUS.GM_GVG_TIME_ERR);
}
const config = await GVGConfigModel.updateConfig(configId, teamTime, prepareTime, battleTime, scheduleTime);
await pinus.app.rpc.guild.guildRemote.setGVGConfig.broadcast(config);
await pinus.app.rpc.systimer.systimerRemote.initGVGConfigSchedule.broadcast();
return resResult(STATUS.SUCCESS);
}
}
import { Application, BackendSession, pinus } from 'pinus';
import { getRandSingleEelm, isTimestamp, resResult } from '@pubUtils/util';
import { STATUS } from '@consts/statusCode';
import { GMMailModel, GMMailType } from '@db/GMMail';
import { ACTIVITY_TYPE, GM_MAIL_STATUS, GM_MAIL_TYPE, MAIL_TIME_TYPE, MEMORY_LOG_TYPE, PUSH_ROUTE, SURVEY_SELECT } from '../../../consts';
import { ActivityModel } from '@db/Activity';
import { ActivityGroupModel } from '@db/ActivityGroup';
import { ActivityGroupTypeModel } from '@db/ActivityGroupType';
import { getPastTime, getTimeFunM, nowSeconds } from '@pubUtils/timeUtil';
import moment = require('moment');
import { sendUngotDividend } from '../../../services/auctionService';
import { taflush } from '../../../services/sdkService';
import { ActivityInRemote } from '@domain/activityField/activityField';
import { pushCurrentTime } from '../../../services/auctionService';
import { SurveyModel, SurveyUpdate } from '@db/Survery';
import { compaireMailGoods, getSurvey } from '../../../services/gmService';
import { sendMessageToAllWithSuc } from '../../../services/pushService';
import { sendMailByContent, sendMailsByGmMail } from '../../../services/mailService';
import { saveMemory } from '../../../services/log/memoryLogService';
import { getGVGConfigFromRemote } from '../../../services/gvg/gvgService';
import { ServerGroupModel } from '@db/ServerGroup';
import { isNumber } from 'underscore';
import { group } from 'console';
import { GVGConfigModel } from '@db/GVGConfig';
import { ServerlistModel } from '@db/Serverlist';
import { getPvpTimeFromRemote } from '../../../services/pvpService';
let timer: NodeJS.Timer;
export default function (app: Application) {
return new GmHandler(app);
}
export class GmHandler {
constructor(private app: Application) {
}
async sendSingleMail(msg: { id: string, isPass: boolean }, session: BackendSession) {
const uid: number = session.get('uid')
let { id, isPass } = msg;
let gmmail = await GMMailModel.getGmMailByIdAndType(id, GM_MAIL_TYPE.SINGLE, true);
if(!gmmail) return resResult(STATUS.GM_MAIL_NOT_FOUND);
return await this.sendMail(gmmail, isPass, uid);
}
async sendSingleMailTxt(msg: { id: string, isPass: boolean }, session: BackendSession) {
const uid: number = session.get('uid')
let { id, isPass } = msg;
let gmmail = await GMMailModel.getGmMailByIdAndType(id, GM_MAIL_TYPE.SINGLE, false);
if(!gmmail) return resResult(STATUS.GM_MAIL_NOT_FOUND);
return await this.sendMail(gmmail, isPass, uid);
}
async sendServerMail(msg: { id: string, isPass: boolean }, session: BackendSession) {
const uid: number = session.get('uid')
let { id, isPass } = msg;
let gmmail = await GMMailModel.getGmMailByIdAndType(id, GM_MAIL_TYPE.SERVER, true);
if(!gmmail) return resResult(STATUS.GM_MAIL_NOT_FOUND);
return await this.sendMail(gmmail, isPass, uid);
}
async sendServerMailTxt(msg: { id: string, isPass: boolean }, session: BackendSession) {
const uid: number = session.get('uid')
let { id, isPass } = msg;
let gmmail = await GMMailModel.getGmMailByIdAndType(id, GM_MAIL_TYPE.SERVER, false);
if(!gmmail) return resResult(STATUS.GM_MAIL_NOT_FOUND);
return await this.sendMail(gmmail, isPass, uid);
}
//对接gm后台,下发邮件
async sendMail(gmmail: GMMailType, isPass: boolean, uid: number) {
let id = gmmail._id;
let { receivers, mailType, status, hasGoods, goods } = gmmail;
if(status != GM_MAIL_STATUS.CREATE) {
return resResult(STATUS.GM_MAIL_HAS_SENT);
}
if(isPass) {
let gmmailArr: GMMailType[] = [];
if(mailType == GM_MAIL_TYPE.SINGLE && hasGoods && (!goods || goods.length == 0)) {
for(let receiver of receivers) {
let index = gmmailArr.findIndex(gmmail => compaireMailGoods(gmmail, receiver));
if(index == -1) {
gmmailArr.push({...gmmail, receivers: [receiver], goods: receiver.rewards, hasGoods: receiver?receiver.rewards.length > 0: false });
} else {
gmmailArr[index].receivers.push(receiver);
}
}
} else {
gmmailArr.push(gmmail);
}
await sendMailsByGmMail(gmmailArr);
}
await GMMailModel.updateMailById(id, { status: isPass? GM_MAIL_STATUS.PASS: GM_MAIL_STATUS.NOT_PASS, viewAt: new Date(), viewBy: uid }, uid);
return resResult(STATUS.SUCCESS);
}
async reloadResource(msg: {}, session: BackendSession) {
try {
let activityServers = this.app.getServersByType('activity');
for (let { id } of activityServers) {
await this.app.rpc.activity.activityRemote.reloadResources.toServer(id);
}
let battleServers = this.app.getServersByType('battle');
for (let { id } of battleServers) {
await this.app.rpc.battle.battleRemote.reloadResources.toServer(id);
}
let comBattleServers = this.app.getServersByType('comBattle');
for (let { id } of comBattleServers) {
await this.app.rpc.comBattle.comBattleRemote.reloadResources.toServer(id);
}
let chatServers = this.app.getServersByType('chat');
for (let { id } of chatServers) {
await this.app.rpc.chat.chatRemote.reloadResources.toServer(id);
}
let connectServers = this.app.getServersByType('connector');
for (let { id } of connectServers) {
await this.app.rpc.connector.connectorRemote.reloadResources.toServer(id);
}
let guildServers = this.app.getServersByType('guild');
for (let { id } of guildServers) {
await this.app.rpc.guild.guildRemote.reloadResources.toServer(id);
}
let roleServers = this.app.getServersByType('role');
for (let { id } of roleServers) {
await this.app.rpc.role.roleRemote.reloadResources.toServer(id);
}
let systimerServers = this.app.getServersByType('systimer');
for (let { id } of systimerServers) {
await this.app.rpc.systimer.systimerRemote.reloadResources.toServer(id);
}
let orderServers = this.app.getServersByType('order');
for (let { id } of orderServers) {
await this.app.rpc.order.orderRemote.reloadResources.toServer(id);
}
return resResult(STATUS.SUCCESS, {
isOK: true
});
} catch (e) {
return resResult(STATUS.SUCCESS, {
isOK: false,
err: e.stack
});
}
}
async updateActivity(msg: { aids: number[] }, session: BackendSession) {
let { aids }= msg;
let activities = await ActivityModel.findActivityByIds(aids);
let activityServers = pinus.app.getServersByType('activity');
for(let server of activityServers) {
pinus.app.rpc.activity.activityRemote.updateActivities.toServer(server.id, activities.map(activity => new ActivityInRemote(activity)));
}
let timeLimitRanks = activities.filter(cur => cur.type == ACTIVITY_TYPE.TIME_LIMIT_RANK);
if(timeLimitRanks.length > 0) {
pinus.app.rpc.systimer.systimerRemote.updateTimeLimitRank.broadcast(timeLimitRanks);
}
let groupShops = activities.filter(cur => cur.type == ACTIVITY_TYPE.GROUP_SHOP);
if(groupShops.length > 0) {
pinus.app.rpc.systimer.systimerRemote.initSumSchedule.broadcast();
}
let signIns = activities.filter(cur => cur.type == ACTIVITY_TYPE.COMMON_SIGN_IN);
if(signIns.length > 0) {
pinus.app.rpc.systimer.systimerRemote.initVipSignInMailSchedule.broadcast();
}
return resResult(STATUS.SUCCESS, {
activity: activities
});
}
async deleteActivity(msg: { activityId: number}, session: BackendSession) {
const { activityId } = msg;
let activityServers = pinus.app.getServersByType('activity');
for(let server of activityServers) {
pinus.app.rpc.activity.activityRemote.deleteActivities.toServer(server.id, [activityId]);
}
return resResult(STATUS.SUCCESS);
}
async updateActivityGroup(msg: { groupId: number, serverIds: number[], activityIds: number[] }, session: BackendSession) {
const uid = session.get('uid');
let { groupId, serverIds, activityIds } = msg;
pinus.app.rpc.activity.activityRemote.saveActivitiesToGroup.broadcast(groupId, activityIds);
pinus.app.rpc.activity.activityRemote.saveGroupToServer.broadcast([groupId], serverIds);
return resResult(STATUS.SUCCESS);
}
/**
* 开启军团活动到拍卖行debug
* @param msg
* @param session
*/
async setGuildActivityDebug(msg: { aid: number, day: number, startActivity: number, endActivity: number, startGuildAuction: number, endGuildAuction: number, startWorldAuction: number, endWorldAuction: number, startNextDay: number }, session: BackendSession) {
let { aid, day, startActivity = 0, endActivity = 0, startGuildAuction = 0, endGuildAuction = 0, startWorldAuction = 0, endWorldAuction = 0, startNextDay = 0 } = msg;
if(timer) {
clearTimeout(timer);
}
const uid = session.get('uid');
if(aid == undefined || day == undefined ) {
return resResult(STATUS.WRONG_PARMS);
}
if(aid == 0) {
day = new Date().getDay();
}
// 设置字典
let now = new Date();
let startTimes = await pinus.app.rpc.guild.guildActivityRemote.setDicGuildActivity.broadcast(now.getTime(), aid, startActivity, endActivity);
await pinus.app.rpc.systimer.systimerRemote.setDicGuildActivity.broadcast(now.getTime(), aid, startActivity, endActivity);
await pinus.app.rpc.connector.connectorRemote.setDicGuildActivity.broadcast(now.getTime(), aid, startActivity, endActivity);
await pinus.app.rpc.guild.guildActivityRemote.setDicAuctionTime.broadcast(startTimes[0], endActivity, startGuildAuction, endGuildAuction, startWorldAuction, endWorldAuction);
await pinus.app.rpc.connector.connectorRemote.setDicAuctionTime.broadcast(startTimes[0], endActivity, startGuildAuction, endGuildAuction, startWorldAuction, endWorldAuction);
await pinus.app.rpc.systimer.systimerRemote.setDicAuctionTime.broadcast(startTimes[0], endActivity, startGuildAuction, endGuildAuction, startWorldAuction, endWorldAuction);
await pinus.app.rpc.guild.guildActivityRemote.setDay.broadcast(day);
await pinus.app.rpc.systimer.systimerRemote.setDay.broadcast(day);
await pinus.app.rpc.connector.connectorRemote.setDay.broadcast(day);
await pinus.app.rpc.guild.guildActivityRemote.guildActivityEnd.broadcast(aid);
await pinus.app.rpc.guild.guildActivityRemote.clearActivityObj.broadcast();
// 开启定时器
await pinus.app.rpc.systimer.systimerRemote.setAuctionSchedule.broadcast();
await pinus.app.rpc.systimer.systimerRemote.setGuildActivitySchedule.broadcast();
// 向客户端发送时间
let time = <number>getTimeFunM().getTimeWithWeek(day, 20, 0, 0) - startActivity * 1000;
pinus.app.rpc.guild.guildActivityRemote.setCurrentTime.broadcast(time);
await pushCurrentTime(time);
timer = setTimeout(async () => {
let time = <number>getTimeFunM().getAfterDayWithHour(0);
pinus.app.rpc.guild.guildActivityRemote.setCurrentTime.broadcast(time);
await pushCurrentTime(time);
let guilds = pinus.app.getServersByType('guild');
let guild = getRandSingleEelm(guilds);
await pinus.app.rpc.guild.guildActivityRemote.sendUngotDividend.toServer(guild.id);
}, startActivity * 1000 + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000 + endWorldAuction * 1000 + startNextDay * 1000)
return resResult(STATUS.SUCCESS, {
startActivity: startTimes[0],
endActivity: startTimes[0] + endActivity * 1000,
startGuildAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000,
endGuildAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000,
startWorldAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000,
endWorldAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000 + endWorldAuction * 1000,
startNextDay: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000 + endWorldAuction * 1000 + startNextDay * 1000,
});
}
async cancelGuildActivityDebug(msg: { }, session: BackendSession) {
// 设置字典
let now = new Date();
if(timer) {
clearTimeout(timer);
}
await pinus.app.rpc.guild.guildRemote.reloadResources.broadcast();
await pinus.app.rpc.systimer.systimerRemote.reloadResources.broadcast();
await pinus.app.rpc.guild.guildActivityRemote.setDay.broadcast(null);
await pinus.app.rpc.systimer.systimerRemote.setDay.broadcast(null);
await pinus.app.rpc.connector.connectorRemote.setDay.broadcast(null);
// 开启定时器
await pinus.app.rpc.systimer.systimerRemote.setAuctionSchedule.broadcast();
await pinus.app.rpc.systimer.systimerRemote.setGuildActivitySchedule.broadcast();
await pinus.app.rpc.guild.guildActivityRemote.clearActivityObj.broadcast();
// 向客户端发送时间
pinus.app.rpc.guild.guildActivityRemote.setCurrentTime.broadcast(now.getTime());
await pushCurrentTime(now.getTime());
return resResult(STATUS.SUCCESS);
}
async taflus() {
taflush();
pinus.app.rpc.activity.activityRemote.taflush.broadcast();
pinus.app.rpc.battle.battleRemote.taflush.broadcast();
pinus.app.rpc.chat.chatRemote.taflush.broadcast();
pinus.app.rpc.connector.connectorRemote.taflush.broadcast();
pinus.app.rpc.guild.guildRemote.taflush.broadcast();
pinus.app.rpc.order.orderRemote.taflush.broadcast();
pinus.app.rpc.role.roleRemote.taflush.broadcast();
pinus.app.rpc.systimer.systimerRemote.taflush.broadcast();
return resResult(STATUS.SUCCESS);
}
async updateSurvey(msg: { code: string, surveyId: string, beginTim: number, endTime: number, isEnable: boolean, surveyLink: string, surveyName: string, roleIndex: number, goods: string, mailContent: string }, session: BackendSession) {
let update: SurveyUpdate = msg;
if(msg.goods) {
let reward = JSON.parse(msg.goods);
update.reward = reward;
}
let origin = await SurveyModel.findByCode(msg.code);
let result = await SurveyModel.updateSurvey(msg.code, update, SURVEY_SELECT.FIND);
if(!result) return resResult(STATUS.WRONG_PARMS);
if(origin && origin.isEnable != result.isEnable) {
await sendMessageToAllWithSuc(PUSH_ROUTE.UPDATE_SURVEY, { survey: result });
}
return resResult(STATUS.SUCCESS);
}
async deleteSurvey(msg: { code: string }, session: BackendSession) {
let { code } = msg;
await SurveyModel.deleteSurvey(code);
await sendMessageToAllWithSuc(PUSH_ROUTE.DELETE_SURVEY, { code });
return resResult(STATUS.SUCCESS);
}
async saveMemoryLog(msg: { memoryLogType: MEMORY_LOG_TYPE }, session: BackendSession) {
const { memoryLogType } = msg;
await saveMemory(memoryLogType);
return resResult(STATUS.SUCCESS);
}
async updateGVGServerGroup(msg: { serverId: number[], groupId: number }, session: BackendSession) {
const { serverId: serverIds, groupId } = msg;
if(!isNumber(groupId)) return resResult(STATUS.WRONG_PARMS);
for(let serverId of serverIds) {
if(!isNumber(serverId)) return resResult(STATUS.WRONG_PARMS);
}
let { scheduleTime } = await getGVGConfigFromRemote();
let { seasonNum, seasonEndTime } = await getPvpTimeFromRemote();
for(let serverId of serverIds) {
await ServerGroupModel.updateByServerId(serverId, groupId, scheduleTime, seasonNum == 0? getPastTime(): seasonEndTime);
}
try {
await pinus.app.rpc.guild.guildRemote.setServerGroup.broadcast();
await pinus.app.rpc.chat.chatRemote.setServerGroup.broadcast();
await pinus.app.rpc.connector.connectorRemote.setServerGroup.broadcast();
await pinus.app.rpc.gm.gmRemote.setServerGroup.broadcast();
await pinus.app.rpc.systimer.systimerRemote.setServerGroup.broadcast();
await pinus.app.rpc.battle.battleRemote.setServerGroup.broadcast();
} catch(e) {
console.log('remote未初始完');
}
return resResult(STATUS.SUCCESS);
}
async updateGVGConfig(msg: { configId: number, teamTime: number, prepareTime: number, battleTime: number, scheduleTime: number }, session: BackendSession) {
const { configId, teamTime, prepareTime, battleTime, scheduleTime } = msg;
if(!isNumber(configId) || !isTimestamp(teamTime) || !isTimestamp(prepareTime) || !isTimestamp(battleTime) || !isTimestamp(scheduleTime)) {
return resResult(STATUS.WRONG_PARMS);
}
if(teamTime > prepareTime || prepareTime > battleTime || battleTime > scheduleTime) {
return resResult(STATUS.GM_GVG_TIME_ERR);
}
const config = await GVGConfigModel.updateConfig(configId, teamTime, prepareTime, battleTime, scheduleTime);
await pinus.app.rpc.guild.guildRemote.setGVGConfig.broadcast(config);
await pinus.app.rpc.systimer.systimerRemote.initGVGConfigSchedule.broadcast();
return resResult(STATUS.SUCCESS);
}
}
@@ -1,182 +1,183 @@
import { Application, BackendSession, pinus } from 'pinus';
import { genCode, getRandSingleEelm, resResult } from '../../../pubUtils/util';
import { STATUS } from '../../../consts/statusCode';
import { ORDER_STATE, PAY_TYPE } from '../../../consts';
import _ = require('underscore');
import { dicRMB } from '../../../pubUtils/dictionary/DicRMB';
import { getActivityById } from '../../../services/activity/activityService';
import { UserOrderModel } from '../../../db/UserOrder';
import { settleOrder, settleOrderAli, settleOrderFromHandler, settleOrderWx } from '../../../services/orderService';
import { getActivityProducts, getParamStr } from '../../../services/gmService';
import { ActivityGroupModel } from '../../../db/ActivityGroup';
import { Receiver } from '../../../db/GMMail';
import { getRoleOnlineInfo } from '../../../services/redisService';
import { RoleModel } from '../../../db/Role';
export interface Cascader {
value: number|string;
label: number|string;
children?: Cascader[];
}
export default function (app: Application) {
return new GmOrderHandler(app);
}
export class GmOrderHandler {
constructor(private app: Application) {
}
async getActivitiesCanBuy(msg: { serverId: number }, session: BackendSession) {
const { serverId } = msg;
let groups = await ActivityGroupModel.findByServerId(serverId);
let result: Cascader[] = [];
for (let groupData of groups) {
let activities: Cascader[] = [];
for (let activityId of groupData.activities) {
let activityData = await getActivityById(activityId);
if(!activityData) continue;
let products = getActivityProducts(activityData);
if(products) {
let children = products.filter(cur => !!cur);
if(children.length > 0) {
activities.push({
value: activityData.activityId,
label: activityData.name,
children
});
}
}
}
if(activities.length > 0) {
result.push({
value: groupData.groupId,
label: groupData.groupName,
children: activities
});
}
}
return resResult(STATUS.SUCCESS, result);
}
/**
* @description 虚拟充值
* @param {BackendSession} session
* @memberof orderHandler
*/
async applyOrder(msg: { serverId: number, activityId: (number|string)[], receiver: Receiver[] }, session: BackendSession) {
const { activityId: activityIds, receiver } = msg;
let activityId = <number>activityIds[1];
let productID = <string>activityIds[2];
let payType = PAY_TYPE.TEST
//如果有特殊情况,activityId可为0
if (!productID || !_.isString(productID)) {
return resResult(STATUS.WRONG_PARMS);
}
//商品价格信息
let productInfo = dicRMB.get(productID)
if (!productInfo) {
console.log('productID', productID)
return resResult(STATUS.NO_PRODUCT_ID);
}
let price = productInfo.price;//价格
let productType = productInfo.type;//类型
let message = productInfo.message;//商品信息
let localOrderID = genCode(32);//本地订单号
let orderID = '';//平台订单号
let sdkOrderInfo = null;//客户端需要的平台订单信息
let activityData = await getActivityById(activityId);
if (!activityData) return resResult(STATUS.ACTIVITY_MISSING);
let results = [];
for(let { roleId, serverId } of receiver) {
let role = await RoleModel.findByRoleId(roleId);
if(!role && role.serverId != serverId) {
results.push(resResult(STATUS.ROLE_NOT_FOUND));
continue;
}
let paramStr = await getParamStr(activityData, productID, role);
let orderInfo = await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, paramStr, message, false, 0);
//订单成功
if(!orderInfo) {
results.push(resResult(STATUS.NO_ORDER));
continue;
}
let onlineUser = await getRoleOnlineInfo(roleId);
let result = await settleOrder(orderInfo, serverId, onlineUser?.sid);
orderInfo = await UserOrderModel.success(roleId, localOrderID, JSON.stringify(result));
console.log(`测试支付完成!!!!!!!!!!!!! serverId:${serverId}, productID:${productID}, productType:${productType}, roleId:${roleId}, localOrderID:${localOrderID}, payType:${payType}`)
results.push(resResult(STATUS.SUCCESS));
}
let findResultErrCode = results.find(cur => cur.code != 0);
if(!findResultErrCode) {
return resResult(STATUS.SUCCESS);
} else {
return findResultErrCode;
}
}
/**
* @description 补单
* @param {BackendSession} session
* @memberof orderHandler
*/
async reCallOrder(msg: { localOrderID: string }, session: BackendSession) {
let sid = session.get('sid');
const { localOrderID } = msg;
if (!localOrderID || !_.isString(localOrderID)) {
return resResult(STATUS.WRONG_PARMS);
}
let orderInfo = await UserOrderModel.findOrder(localOrderID);
if (!orderInfo) {
return resResult(STATUS.NO_ORDER);
}
if(orderInfo.state == ORDER_STATE.RESULT_SUCCESS) {
return resResult(STATUS.DUPLICATE_ORDER);
}
//商品价格信息
let productInfo = dicRMB.get(orderInfo.productID)
if (!productInfo) {
console.log(orderInfo.productID)
return resResult(STATUS.NO_PRODUCT_ID);
}
let order = await UserOrderModel.findOrder(localOrderID);
let result = await settleOrder(order, order.serverId, sid);
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, '', JSON.stringify(result));
orderInfo = await UserOrderModel.findOrder(localOrderID);
//订单成功
console.log('结算完成', localOrderID)
let res: any = {};
try {
res = orderInfo.rewardResult? JSON.parse(orderInfo.rewardResult): {};
} catch(e) {
console.log('order rewardResult', e);
}
if(res.code && res.code != 0) {
return resResult(STATUS.APPLY_ORDER_ERROR);
}
return resResult(STATUS.SUCCESS, {
...res,
price: orderInfo.price,
state: orderInfo.state,
localOrderID: orderInfo.localOrderID
});
}
}
import { Application, BackendSession, pinus } from 'pinus';
import { genCode, getRandSingleEelm, resResult } from '@pubUtils/util';
import { STATUS } from '@consts/statusCode';
import { ORDER_STATE, PAY_TYPE } from '../../../consts';
import _ = require('underscore');
import { dicRMB } from '@pubUtils/dictionary/DicRMB';
import { getActivityById } from '../../../services/activity/activityService';
import { UserOrderModel } from '@db/UserOrder';
import { settleOrder, settleOrderAli, settleOrderFromHandler, settleOrderWx } from '../../../services/orderService';
import { getActivityProducts, getParamStr } from '../../../services/gmService';
import { ActivityGroupModel } from '@db/ActivityGroup';
import { Receiver } from '@db/GMMail';
import { getRoleOnlineInfo } from '../../../services/redisService';
import { RoleModel } from '@db/Role';
export interface Cascader {
value: number|string;
label: number|string;
children?: Cascader[];
}
export default function (app: Application) {
return new GmOrderHandler(app);
}
export class GmOrderHandler {
constructor(private app: Application) {
}
async getActivitiesCanBuy(msg: { serverId: number }, session: BackendSession) {
const { serverId } = msg;
let groups = await ActivityGroupModel.findByServerId(serverId);
let result: Cascader[] = [];
for (let groupData of groups) {
let activities: Cascader[] = [];
for (let activityId of groupData.activities) {
let activityData = await getActivityById(activityId);
if(!activityData) continue;
let products = getActivityProducts(activityData);
if(products) {
let children = products.filter(cur => !!cur);
if(children.length > 0) {
activities.push({
value: activityData.activityId,
label: activityData.name,
children
});
}
}
}
if(activities.length > 0) {
result.push({
value: groupData.groupId,
label: groupData.groupName,
children: activities
});
}
}
return resResult(STATUS.SUCCESS, result);
}
/**
* @description 虚拟充值
* @param {BackendSession} session
* @memberof orderHandler
*/
async applyOrder(msg: { serverId: number, activityId: (number|string)[], receiver: Receiver[] }, session: BackendSession) {
const { activityId: activityIds, receiver } = msg;
let activityId = <number>activityIds[1];
let productID = <string>activityIds[2];
let payType = PAY_TYPE.TEST
//如果有特殊情况,activityId可为0
if (!productID || !_.isString(productID)) {
return resResult(STATUS.WRONG_PARMS);
}
//商品价格信息
let productInfo = dicRMB.get(productID)
if (!productInfo) {
console.log('productID', productID)
return resResult(STATUS.NO_PRODUCT_ID);
}
let price = productInfo.price;//价格
let productType = productInfo.type;//类型
let message = productInfo.message;//商品信息
let localOrderID = genCode(32);//本地订单号
let orderID = '';//平台订单号
let sdkOrderInfo = null;//客户端需要的平台订单信息
let activityData = await getActivityById(activityId);
if (!activityData) return resResult(STATUS.ACTIVITY_MISSING);
let results = [];
for(let { roleId, serverId } of receiver) {
let role = await RoleModel.findByRoleId(roleId);
if(!role && role.serverId != serverId) {
results.push(resResult(STATUS.ROLE_NOT_FOUND));
continue;
}
let paramStr = await getParamStr(activityData, productID, role);
let orderInfo = await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, paramStr, message, false, 0);
//订单成功
if(!orderInfo) {
results.push(resResult(STATUS.NO_ORDER));
continue;
}
let onlineUser = await getRoleOnlineInfo(roleId);
let result = await settleOrder(orderInfo, serverId, onlineUser?.sid);
orderInfo = await UserOrderModel.success(roleId, localOrderID, JSON.stringify(result));
console.log(`测试支付完成!!!!!!!!!!!!! serverId:${serverId}, productID:${productID}, productType:${productType}, roleId:${roleId}, localOrderID:${localOrderID}, payType:${payType}`)
results.push(resResult(STATUS.SUCCESS));
}
let findResultErrCode = results.find(cur => cur.code != 0);
if(!findResultErrCode) {
return resResult(STATUS.SUCCESS);
} else {
return findResultErrCode;
}
}
/**
* @description 补单
* @param {BackendSession} session
* @memberof orderHandler
*/
async reCallOrder(msg: { localOrderID: string }, session: BackendSession) {
let sid = session.get('sid');
const { localOrderID } = msg;
if (!localOrderID || !_.isString(localOrderID)) {
return resResult(STATUS.WRONG_PARMS);
}
let orderInfo = await UserOrderModel.findOrder(localOrderID);
if (!orderInfo) {
return resResult(STATUS.NO_ORDER);
}
if(orderInfo.state == ORDER_STATE.RESULT_SUCCESS) {
return resResult(STATUS.DUPLICATE_ORDER);
}
//商品价格信息
let productInfo = dicRMB.get(orderInfo.productID)
if (!productInfo) {
console.log(orderInfo.productID)
return resResult(STATUS.NO_PRODUCT_ID);
}
let order = await UserOrderModel.findOrder(localOrderID);
let result = await settleOrder(order, order.serverId, sid);
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, '', JSON.stringify(result));
orderInfo = await UserOrderModel.findOrder(localOrderID);
//订单成功
console.log('结算完成', localOrderID)
let res: any = {};
try {
res = orderInfo.rewardResult? JSON.parse(orderInfo.rewardResult): {};
} catch(e) {
console.log('order rewardResult', e);
}
if(res.code && res.code != 0) {
return resResult(STATUS.APPLY_ORDER_ERROR);
}
return resResult(STATUS.SUCCESS, {
...res,
price: orderInfo.price,
state: orderInfo.state,
localOrderID: orderInfo.localOrderID
});
}
}
@@ -1,437 +1,438 @@
import { Application, BackendSession, pinus } from 'pinus';
import { resResult } from '../../../pubUtils/util';
import { STATUS } from '../../../consts/statusCode';
import { getRoleOnlineInfo, redisClient, updateUserInfo } from '../../../services/redisService';
import { addItems } from '../../../services/role/rewardService';
import { RewardInter } from '../../../pubUtils/interface';
import { gameData, getExpByLv, getHeroExpByLv, getHeroLvByExp, getLvByExp, getEquipByJobClassAndEPlace } from '../../../pubUtils/data';
import { RoleModel, RoleType, WarStar } from '../../../db/Role';
import { BLOCK_TYPE, DEFAULT_HEROES, GUILD_AUTH, GUILD_DISMISS_WAY, GUILD_JOB, GUILD_MASTER_CHANGE_WAY, GUILD_STATUS, GUILD_STRUCTURE, HERO_SYSTEM_TYPE, ITEM_CHANGE_REASON, MAIL_TYPE, MEMORY_LOG_TYPE, PUSH_ROUTE, REDIS_KEY, TA_EVENT, WAR_TYPE } from '../../../consts';
import { GuildFormParam, SetHeroParam } from '../../../domain/backEndField/params';
import { GuildModel, GuildUpdateParam } from '../../../db/Guild';
import { Rank } from '../../../services/rankService';
import { UserGuildModel } from '../../../db/UserGuild';
import { UserGuildApplyModel } from '../../../db/UserGuildApply';
import { reportTAEvent } from '../../../services/sdkService';
import { sendMailByContent } from '../../../services/mailService';
import { GuildLeader } from '../../../domain/rank';
import { HeroModel } from '../../../db/Hero';
import { SkinModel } from '../../../db/Skin';
import { PvpDefenseModel } from '../../../db/PvpDefense';
import { createHeroes } from '../../../services/role/createHero';
import { calculateCeWithHero, calculateCeWithRole } from '../../../services/playerCeService';
import { pushChangeGuildLeader, pushGuildDismiss, pushGuildInfoUpdate } from '../../../services/guildService';
import { sendMessageToUserWithSuc } from '../../../services/pushService';
import { RScriptRecordModel } from '../../../db/RScriptRecord';
import { DicWar } from '../../../pubUtils/dictionary/DicWar';
import { SchoolModel } from '../../../db/School';
import { JewelModel } from '../../../db/Jewel';
import { RoleCeModel } from '../../../db/RoleCe';
import { setTrainLv } from '../../../services/gmService';
import { ArtifactModel } from '../../../db/Artifact';
import { roleLeave } from '../../../services/redisService';
import { KeyName } from '../../../domain/rank';
import { LadderMatchModel } from '../../../db/LadderMatch';
let timer: NodeJS.Timer;
export default function (app: Application) {
return new GmRoleHandler(app);
}
export class GmRoleHandler {
constructor(private app: Application) {
}
async addItems(msg: { roleId: string, roleName: string, serverId: number, values: { reward: RewardInter[], heroes: number[], lv: number, expInc: number, fixedIpLocation: string }}, session: BackendSession) {
let { roleId, roleName, serverId, values } = msg;
let { reward, heroes, lv, expInc = 0, fixedIpLocation } = values;
let connect = await getRoleOnlineInfo(roleId);
let sid = connect.isOnline?connect.sid: null;
if(reward &&reward.length > 0) {
await addItems(roleId, roleName, sid, values.reward, ITEM_CHANGE_REASON.DEBUG);
}
if(heroes && heroes.length > 0) {
await createHeroes(roleId, roleName, sid, serverId, heroes.map(hid => { return { hid, count: 1 }}))
}
if(lv && lv > 0) {
let exp = getExpByLv(lv - 1)?.sum||0;
exp += expInc;
let newLv = getLvByExp(exp);
let role = await RoleModel.updateRoleInfo(roleId, { lv: newLv, exp })
let r = new Rank(REDIS_KEY.USER_LV, { serverId: serverId });
await r.setRankWithRoleInfo(roleId, newLv, Date.now(), role);
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.PLAYER_EXP_CHANGE, {
isLvUp: false, lv: newLv, exp
}, sid);
}
if(fixedIpLocation != undefined) {
await RoleModel.updateRoleInfo(roleId, { fixedIpLocation })
}
return resResult(STATUS.SUCCESS);
}
async handleBlock(msg: { roleId: string, blockType: BLOCK_TYPE, blockReason: string }, session: BackendSession) {
let { roleId, blockType, blockReason } = msg;
if(roleId == undefined || blockType == undefined || blockReason == undefined) return resResult(STATUS.WRONG_PARMS);
let role = await RoleModel.updateRoleInfo(roleId, { blockType, blockReason });
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
let { isOnline, sid } = await getRoleOnlineInfo(roleId);
if(isOnline) {
await this.app.rpc.connector.connectorRemote.setOtherUserSession.toServer(sid,[{ roleId, blockType }]);
if(blockType == BLOCK_TYPE.BLOCK) { // 踢走
await this.app.rpc.connector.connectorRemote.remoteLogin.toServer(sid, roleId, STATUS.BLOCKED);
await roleLeave(roleId);
}
}
return resResult(STATUS.SUCCESS);
}
async setHero(msg: { roleId: string, hid: number, param: SetHeroParam }, session: BackendSession) {
let { roleId, hid } = msg;
let param = new SetHeroParam(msg.param);
if(!param.checkParams()) return resResult(STATUS.WRONG_PARMS);
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if(!hero) return resResult(STATUS.HERO_NOT_FIND);
let { sid } = await getRoleOnlineInfo(roleId);
if(param.lv && param.lv > 0) {
let exp = getHeroExpByLv(param.lv - 1)||0;
exp += (param.expInc||0);
let newLv = getHeroLvByExp(exp);
param.lv = newLv;
param['exp'] = exp;
}
await calculateCeWithHero(HERO_SYSTEM_TYPE.INIT, roleId, hero.serverId, sid, hid, {...hero, ...param});
// if(param.job > 0) {
// await calculateCe(HERO_SYSTEM_TYPE.STAGEUP, roleId, hero.serverId, sid, param, {}, { hid });
// hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.STAGEUP, sid, roleId, hero, { job: param.job, jobStage: 0 });
// }
// if (hero.star != param.star) {
// await calAllHeroCe(HERO_SYSTEM_TYPE.STAR, sid, roleId, {}, [hid, 1]); // 升星可能影响到百家学院全局加成
// }
return resResult(STATUS.SUCCESS);
}
/**
* 升级英雄装备至限制内的最高级
*
* @param {{ roleId: string, hid: number }} msg
* @param {BackendSession} session
* @return {*}
* @memberof GmRoleHandler
*/
async upgradeHeroEPlace(msg: { roleId: string, hid: number }, session: BackendSession) {
let { roleId, hid } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
/*
* 通过
* dic_zyz_equipQuality.json
* dic_zyz_equipStar.json
* dic_zyz_equipStrength.json
* dic_zyz_artifactQuality.json
* 配置文件得出:
* maxLevel: 100
* maxQuality: 5 (金)
* maxStar: 12
*
* 限制:
* 装备等级不能超过hero等级
* maxQuality限制等级最大值: 金 最大lv 100
*
* 装备信息:
* dic_zyz_equip.json
*/
const MAX_STAR = 12;
const MAX_QUALITY = 5;
// EPLACE_ID 分别代表4个部位
const EPLACE_IDS = [1, 2, 3, 4];
// 装备升级、升星、升品(注意升级限制)
// 装备未满 - 补全 - 并升至满级
let doNotGetEPlaceIds = new Set(EPLACE_IDS);
hero.ePlace.forEach((ePlaceItem) => {
doNotGetEPlaceIds.delete(ePlaceItem.id);
// 该装备已拥有 - 升级、品、星
// 升级 - 最大等级100
ePlaceItem.lv = hero.lv; // 英雄等级肯定小于MAX_LV
// 升品 - 金
ePlaceItem.quality = MAX_QUALITY;
ePlaceItem.qualityStage = 0;
// 生星 - 最高12
ePlaceItem.star = MAX_STAR;
ePlaceItem.starStage = 0;
});
// 装备补全
let dicHero = gameData.hero.get(hero.skinId);
doNotGetEPlaceIds.forEach((ePlaceId) => {
let dicEquip = getEquipByJobClassAndEPlace(dicHero?.jobClass, ePlaceId);
if (dicEquip) {
hero.ePlace.push({
lv: hero.lv,
quality: MAX_QUALITY,
qualityStage: 0,
star: MAX_STAR,
starStage: 0,
jewel: 0,
id: ePlaceId,
equipId: dicEquip.id,
stones: [
{
id: 1,
stone: 0
},
{
id: 2,
stone: 0
},
{
id: 3,
stone: 0
}
]
})
}
})
// 更新装备信息
await HeroModel.updateHeroInfo(roleId, hid, { ePlace: hero.ePlace });
// 获取战力重算需要的数据
let role = await RoleModel.findByRoleId(roleId);
let schools = await SchoolModel.findByRoleId(roleId);
let jewels = await JewelModel.findbyRole(roleId);
let heroes = await HeroModel.findByRole(roleId);
let skins = await SkinModel.findbyRole(roleId);
let artifacts = await ArtifactModel.findbyRole(roleId);
// 所有战力重算
await calculateCeWithRole(HERO_SYSTEM_TYPE.RE_CAL, roleId, role.serverId, null, {}, { role, schools, jewels, heroes, skins, artifacts });
// 获取更新装备的英雄
hero = await HeroModel.findByHidAndRole(hid, roleId);
// 返回强化,升星,升品后的hero数据
return resResult(STATUS.SUCCESS, { curHero: hero });
}
async deleteHero(msg: { roleId: string, hid: number }, session: BackendSession) {
let { roleId, hid } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
await HeroModel.deleteHero(roleId, hid);
await SkinModel.deleteByHero(roleId, hid);
let role = await RoleModel.findByRoleId(roleId);
await PvpDefenseModel.deleteHero(roleId, hid);
await RoleCeModel.deleteHero(roleId, hid);
await RoleModel.updateRoleInfo(roleId, { topLineup: role.topLineup.filter(cur => cur.hid != hid), topLineupCe: role.topLineupCe - hero.ce, ce: role.ce - hero.ce });
await JewelModel.updateMany({ hid }, { $set: { hid: 0}});
return resResult(STATUS.SUCCESS);
}
async updateGuild(msg: GuildFormParam, session: BackendSession ) {
const uid = session.get('uid');
let params = new GuildFormParam(msg);
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
let guild = await GuildModel.findByCode(params.code, null, '+members');
let structure = guild.structure||[];
let updateParams: GuildUpdateParam = { code: params.code };
if(params.name && guild.name != params.name) updateParams.name = params.name;
if(params.fund != undefined && guild.fund != params.fund) updateParams.fund = params.fund;
if(params.notice && guild.notice != params.notice) updateParams.notice = params.notice;
if(params.lv && guild.lv != params.lv) updateParams.lv = params.lv;
for(let id = GUILD_STRUCTURE.START; id < GUILD_STRUCTURE.END; id ++) {
let curStructure = structure.find(cur => cur.id == id);
let lv = params.lv;
switch(id) {
case GUILD_STRUCTURE.ARMY_CENTER:
lv = params.lv; break;
case GUILD_STRUCTURE.EQUIP_PRODUCE:
lv = params.equipProduce; break;
case GUILD_STRUCTURE.BOSS:
lv = params.boss; break;
case GUILD_STRUCTURE.TRAIN:
lv = params.train; break;
case GUILD_STRUCTURE.DONATE:
lv = params.donate; break;
case GUILD_STRUCTURE.WISH_POOL:
lv = params.wishPool; break;
case GUILD_STRUCTURE.STORE:
lv = params.store; break;
}
if(curStructure) {
curStructure.lv = lv;
} else {
structure.push({ id, lv });
}
}
updateParams.structure = structure;
await pushGuildInfoUpdate(params.code, updateParams);
// 设置玩家名
if(updateParams.name != undefined || updateParams.lv != undefined) {
let arr = [];
if(updateParams.name != undefined) {
arr.push({ field: 'name', value: updateParams.name });
for(let roleId of guild.members) {
await updateUserInfo(REDIS_KEY.USER_INFO, roleId, [{ field: 'guildName', value: updateParams.name }]);
}
}
if(updateParams.lv != undefined) arr.push({ field: 'lv', value: updateParams.lv });
await updateUserInfo(REDIS_KEY.GUILD_INFO, params.code, arr);
}
if (updateParams.lv != undefined) {
let r = new Rank(REDIS_KEY.GUILD_LV_RANK, { serverId: guild.serverId });
await r.setRankWithGuildInfo2(guild.code, updateParams.lv, guild.activeWeekly, guild.lvUpdateTime, guild);
}
guild = await GuildModel.updateInfo(params.code, updateParams);
if(params.trainLv) {
await setTrainLv(params.code, params.trainLv);
}
return resResult(STATUS.SUCCESS);
}
async dismissGuild(msg: { code: string }, session: BackendSession) {
const { code } = msg;
let guild = await GuildModel.findByCode(code, null, '+serverId');
if(!guild) return resResult(STATUS.GUILD_NOT_FOUND);
if(guild.status == GUILD_STATUS.DISMISSED) return resResult(STATUS.GUILD_DELETE_ERROR);
let serverId = guild.serverId;
guild = await GuildModel.dismiss(code, serverId);
if (!guild) return resResult(STATUS.GUILD_DELETE_ERROR);
await UserGuildModel.dismiss(code);
const { members } = guild;
await RoleModel.dissmissGuild(members);
await UserGuildApplyModel.deleteApplyByGuild(code);
await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast(members.map(roleId => { return { roleId, userGuild: null } })); // 更新session
// 删除channel
await pushGuildDismiss(code);
let r = new Rank(REDIS_KEY.GUILD_ACTIVE_RANK, { serverId });
await r.removeFromRank({ guildCode: code });
let r2 = new Rank(REDIS_KEY.GUILD_LV_RANK, { serverId });
await r2.removeFromRank({ guildCode: code });
let leader = <RoleType>guild.leader;
reportTAEvent(leader.roleId, TA_EVENT.GUILD_DISMISS, { name: guild.name, way: GUILD_DISMISS_WAY.BACKEND });
return resResult(STATUS.SUCCESS, { code, status: guild.status });
}
async setGuildLeader(msg: { code: string, roleId: string }, session: BackendSession) {
const { code, roleId } = msg;
let guild = await GuildModel.findByCode(code, null, '+serverId');
if(!guild) return resResult(STATUS.GUILD_NOT_FOUND);
if(guild.status == GUILD_STATUS.DISMISSED) return resResult(STATUS.GUILD_DELETE_ERROR);
let role = await RoleModel.findByRoleId(roleId);
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
let userGuild = await UserGuildModel.getMyGuild(roleId);
if(!userGuild || userGuild.guildCode != code) return resResult(STATUS.GUILD_KICK_ERROR);
if(userGuild.auth == GUILD_AUTH.LEADER) return resResult(STATUS.GUILD_USER_IS_LEADER);
let leader = <RoleType>guild.leader;
// 交换
let oldLeaderUserGuild = await UserGuildModel.updateInfo(leader.roleId, { auth: GUILD_AUTH.MEMBER, job: GUILD_JOB.SHIBING }, {}, 'auth'); // 团长撤
await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast([{ roleId: leader.roleId, userGuild: oldLeaderUserGuild }]); // 更新session
let newLeaderUserGuild = await UserGuildModel.updateInfo(roleId, { auth: GUILD_AUTH.LEADER, job: GUILD_JOB.DAJIANGJUN }, {}, 'auth'); // 最高功勋人升
await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast([{ roleId: roleId, userGuild: newLeaderUserGuild }]); // 更新session
let managerCntInc = userGuild.auth == GUILD_AUTH.MANAGER ? -1 : 0; // 管理人数
guild = await GuildModel.updateInfo(code, { leader: role._id }, { managerCnt: managerCntInc }, 'managerCnt name'); // 如果有转让团长设置leader
// 添加动态
await pushChangeGuildLeader(code, guild.managerCnt, role, leader.roleId);
await sendMailByContent(MAIL_TYPE.GUILD_BE_IMPEACH, leader.roleId, { params: [guild.name] });
await sendMailByContent(MAIL_TYPE.GUILD_BE_SET_LEADER, roleId, { params: [guild.name] });
await updateUserInfo(REDIS_KEY.GUILD_INFO, code, [{ field: 'leader', value: new GuildLeader(role) }]);
reportTAEvent(roleId, TA_EVENT.GUILD_MASTER_CHANGE, { way: GUILD_MASTER_CHANGE_WAY.BACKEND, change_id_after: roleId })
return resResult(STATUS.SUCCESS, { code });
}
async skipEpilogue(msg: { roleId: string, roleName: string }, session: BackendSession) {
const { roleId, roleName } = msg;
let role = await RoleModel.findByRoleId(roleId);
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
if(role.hasInit) return resResult(STATUS.ROLE_HAS_INIT);
let checkName = await RoleModel.checkName(roleName, role.serverId);
if (checkName) return resResult(STATUS.NAME_HAS_USED);
let warStars: WarStar[] = [];
let insertParams: DicWar[] = [];
let exp = 0;
for(let i = 101; i <= 103; i++) {
let dicWar = gameData.war.get(i);
insertParams.push(dicWar);
warStars.push({ id: dicWar.war_id, warType: dicWar.warType, star: 0, stars: [] });
exp += dicWar.kingExp;
}
let lv = getLvByExp(exp);
await RScriptRecordModel.deleteByWarType(roleId, WAR_TYPE.NORMAL);
await RScriptRecordModel.insertScripts(roleId, insertParams);
let onlineUser = await getRoleOnlineInfo(roleId);
await createHeroes(roleId, roleName, onlineUser?.sid, role.serverId, DEFAULT_HEROES.map(hid => ({hid, count: 1})), { roleName, hasInit: true, title: role.title, teraphs: role.teraphs, lv, exp, warStar: warStars });
return resResult(STATUS.SUCCESS);
}
async reCalCe(msg: { roleId: string }, session: BackendSession) {
const { roleId } = msg;
let role = await RoleModel.findByRoleId(roleId);
let schools = await SchoolModel.findByRoleId(roleId);
let jewels = await JewelModel.findbyRole(roleId);
let heroes = await HeroModel.findByRole(roleId);
let skins = await SkinModel.findbyRole(roleId);
let artifacts = await ArtifactModel.findbyRole(roleId);
await calculateCeWithRole(HERO_SYSTEM_TYPE.RE_CAL, roleId, role.serverId, null, {}, { role, schools, jewels, heroes, skins, artifacts });
return resResult(STATUS.SUCCESS);
}
async clearRank(msg: { roleId: string }, session: BackendSession) {
let { roleId } = msg;
let role = await RoleModel.findByRoleId(roleId);
if(!role) return resResult(STATUS.WRONG_PARMS);
if(role.blockType != 2) return resResult(STATUS.GM_CANNOT_CLEAR_RANK)
let { serverId } = role;
await redisClient().zremAsync(new KeyName(REDIS_KEY.TOWER_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.LADDER, { serverId }).getName(), roleId);
await LadderMatchModel.updateByRoleId(roleId, { rank: 0 });
await redisClient().zremAsync(new KeyName(REDIS_KEY.TOP_LINEUP_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.TOP_HERO_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.HERO_NUM_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.SUM_CE_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.USER_LV, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.MAIN_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.MAIN_ELITE_RANK, { serverId }).getName(), roleId);
let keys = await redisClient().keysAsync(REDIS_KEY.PVP_RANK);
for(let key of keys) await redisClient().zremAsync(key, roleId);
return resResult(STATUS.SUCCESS);
}
}
import { Application, BackendSession, pinus } from 'pinus';
import { resResult } from '@pubUtils/util';
import { STATUS } from '@consts/statusCode';
import { getRoleOnlineInfo, redisClient, updateUserInfo } from '../../../services/redisService';
import { addItems } from '../../../services/role/rewardService';
import { RewardInter } from '@pubUtils/interface';
import { gameData, getExpByLv, getHeroExpByLv, getHeroLvByExp, getLvByExp, getEquipByJobClassAndEPlace } from '@pubUtils/data';
import { RoleModel, RoleType, WarStar } from '@db/Role';
import { BLOCK_TYPE, DEFAULT_HEROES, GUILD_AUTH, GUILD_DISMISS_WAY, GUILD_JOB, GUILD_MASTER_CHANGE_WAY, GUILD_STATUS, GUILD_STRUCTURE, HERO_SYSTEM_TYPE, ITEM_CHANGE_REASON, MAIL_TYPE, MEMORY_LOG_TYPE, PUSH_ROUTE, REDIS_KEY, TA_EVENT, WAR_TYPE } from '../../../consts';
import { GuildFormParam, SetHeroParam } from '@domain/backEndField/params';
import { GuildModel, GuildUpdateParam } from '@db/Guild';
import { Rank } from '../../../services/rankService';
import { UserGuildModel } from '@db/UserGuild';
import { UserGuildApplyModel } from '@db/UserGuildApply';
import { reportTAEvent } from '../../../services/sdkService';
import { sendMailByContent } from '../../../services/mailService';
import { GuildLeader } from '@domain/rank';
import { HeroModel } from '@db/Hero';
import { SkinModel } from '@db/Skin';
import { PvpDefenseModel } from '@db/PvpDefense';
import { createHeroes } from '../../../services/role/createHero';
import { calculateCeWithHero, calculateCeWithRole } from '../../../services/playerCeService';
import { pushChangeGuildLeader, pushGuildDismiss, pushGuildInfoUpdate } from '../../../services/guildService';
import { sendMessageToUserWithSuc } from '../../../services/pushService';
import { RScriptRecordModel } from '@db/RScriptRecord';
import { DicWar } from '@pubUtils/dictionary/DicWar';
import { SchoolModel } from '@db/School';
import { JewelModel } from '@db/Jewel';
import { RoleCeModel } from '@db/RoleCe';
import { setTrainLv } from '../../../services/gmService';
import { ArtifactModel } from '@db/Artifact';
import { roleLeave } from '../../../services/redisService';
import { KeyName } from '@domain/rank';
import { LadderMatchModel } from '@db/LadderMatch';
let timer: NodeJS.Timer;
export default function (app: Application) {
return new GmRoleHandler(app);
}
export class GmRoleHandler {
constructor(private app: Application) {
}
async addItems(msg: { roleId: string, roleName: string, serverId: number, values: { reward: RewardInter[], heroes: number[], lv: number, expInc: number, fixedIpLocation: string }}, session: BackendSession) {
let { roleId, roleName, serverId, values } = msg;
let { reward, heroes, lv, expInc = 0, fixedIpLocation } = values;
let connect = await getRoleOnlineInfo(roleId);
let sid = connect.isOnline?connect.sid: null;
if(reward &&reward.length > 0) {
await addItems(roleId, roleName, sid, values.reward, ITEM_CHANGE_REASON.DEBUG);
}
if(heroes && heroes.length > 0) {
await createHeroes(roleId, roleName, sid, serverId, heroes.map(hid => { return { hid, count: 1 }}))
}
if(lv && lv > 0) {
let exp = getExpByLv(lv - 1)?.sum||0;
exp += expInc;
let newLv = getLvByExp(exp);
let role = await RoleModel.updateRoleInfo(roleId, { lv: newLv, exp })
let r = new Rank(REDIS_KEY.USER_LV, { serverId: serverId });
await r.setRankWithRoleInfo(roleId, newLv, Date.now(), role);
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.PLAYER_EXP_CHANGE, {
isLvUp: false, lv: newLv, exp
}, sid);
}
if(fixedIpLocation != undefined) {
await RoleModel.updateRoleInfo(roleId, { fixedIpLocation })
}
return resResult(STATUS.SUCCESS);
}
async handleBlock(msg: { roleId: string, blockType: BLOCK_TYPE, blockReason: string }, session: BackendSession) {
let { roleId, blockType, blockReason } = msg;
if(roleId == undefined || blockType == undefined || blockReason == undefined) return resResult(STATUS.WRONG_PARMS);
let role = await RoleModel.updateRoleInfo(roleId, { blockType, blockReason });
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
let { isOnline, sid } = await getRoleOnlineInfo(roleId);
if(isOnline) {
await this.app.rpc.connector.connectorRemote.setOtherUserSession.toServer(sid,[{ roleId, blockType }]);
if(blockType == BLOCK_TYPE.BLOCK) { // 踢走
await this.app.rpc.connector.connectorRemote.remoteLogin.toServer(sid, roleId, STATUS.BLOCKED);
await roleLeave(roleId);
}
}
return resResult(STATUS.SUCCESS);
}
async setHero(msg: { roleId: string, hid: number, param: SetHeroParam }, session: BackendSession) {
let { roleId, hid } = msg;
let param = new SetHeroParam(msg.param);
if(!param.checkParams()) return resResult(STATUS.WRONG_PARMS);
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if(!hero) return resResult(STATUS.HERO_NOT_FIND);
let { sid } = await getRoleOnlineInfo(roleId);
if(param.lv && param.lv > 0) {
let exp = getHeroExpByLv(param.lv - 1)||0;
exp += (param.expInc||0);
let newLv = getHeroLvByExp(exp);
param.lv = newLv;
param['exp'] = exp;
}
await calculateCeWithHero(HERO_SYSTEM_TYPE.INIT, roleId, hero.serverId, sid, hid, {...hero, ...param});
// if(param.job > 0) {
// await calculateCe(HERO_SYSTEM_TYPE.STAGEUP, roleId, hero.serverId, sid, param, {}, { hid });
// hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.STAGEUP, sid, roleId, hero, { job: param.job, jobStage: 0 });
// }
// if (hero.star != param.star) {
// await calAllHeroCe(HERO_SYSTEM_TYPE.STAR, sid, roleId, {}, [hid, 1]); // 升星可能影响到百家学院全局加成
// }
return resResult(STATUS.SUCCESS);
}
/**
* 升级英雄装备至限制内的最高级
*
* @param {{ roleId: string, hid: number }} msg
* @param {BackendSession} session
* @return {*}
* @memberof GmRoleHandler
*/
async upgradeHeroEPlace(msg: { roleId: string, hid: number }, session: BackendSession) {
let { roleId, hid } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
/*
* 通过
* dic_zyz_equipQuality.json
* dic_zyz_equipStar.json
* dic_zyz_equipStrength.json
* dic_zyz_artifactQuality.json
* 配置文件得出:
* maxLevel: 100
* maxQuality: 5 (金)
* maxStar: 12
*
* 限制:
* 装备等级不能超过hero等级
* maxQuality限制等级最大值: 金 最大lv 100
*
* 装备信息:
* dic_zyz_equip.json
*/
const MAX_STAR = 12;
const MAX_QUALITY = 5;
// EPLACE_ID 分别代表4个部位
const EPLACE_IDS = [1, 2, 3, 4];
// 装备升级、升星、升品(注意升级限制)
// 装备未满 - 补全 - 并升至满级
let doNotGetEPlaceIds = new Set(EPLACE_IDS);
hero.ePlace.forEach((ePlaceItem) => {
doNotGetEPlaceIds.delete(ePlaceItem.id);
// 该装备已拥有 - 升级、品、星
// 升级 - 最大等级100
ePlaceItem.lv = hero.lv; // 英雄等级肯定小于MAX_LV
// 升品 - 金
ePlaceItem.quality = MAX_QUALITY;
ePlaceItem.qualityStage = 0;
// 生星 - 最高12
ePlaceItem.star = MAX_STAR;
ePlaceItem.starStage = 0;
});
// 装备补全
let dicHero = gameData.hero.get(hero.skinId);
doNotGetEPlaceIds.forEach((ePlaceId) => {
let dicEquip = getEquipByJobClassAndEPlace(dicHero?.jobClass, ePlaceId);
if (dicEquip) {
hero.ePlace.push({
lv: hero.lv,
quality: MAX_QUALITY,
qualityStage: 0,
star: MAX_STAR,
starStage: 0,
jewel: 0,
id: ePlaceId,
equipId: dicEquip.id,
stones: [
{
id: 1,
stone: 0
},
{
id: 2,
stone: 0
},
{
id: 3,
stone: 0
}
]
})
}
})
// 更新装备信息
await HeroModel.updateHeroInfo(roleId, hid, { ePlace: hero.ePlace });
// 获取战力重算需要的数据
let role = await RoleModel.findByRoleId(roleId);
let schools = await SchoolModel.findByRoleId(roleId);
let jewels = await JewelModel.findbyRole(roleId);
let heroes = await HeroModel.findByRole(roleId);
let skins = await SkinModel.findbyRole(roleId);
let artifacts = await ArtifactModel.findbyRole(roleId);
// 所有战力重算
await calculateCeWithRole(HERO_SYSTEM_TYPE.RE_CAL, roleId, role.serverId, null, {}, { role, schools, jewels, heroes, skins, artifacts });
// 获取更新装备的英雄
hero = await HeroModel.findByHidAndRole(hid, roleId);
// 返回强化,升星,升品后的hero数据
return resResult(STATUS.SUCCESS, { curHero: hero });
}
async deleteHero(msg: { roleId: string, hid: number }, session: BackendSession) {
let { roleId, hid } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
await HeroModel.deleteHero(roleId, hid);
await SkinModel.deleteByHero(roleId, hid);
let role = await RoleModel.findByRoleId(roleId);
await PvpDefenseModel.deleteHero(roleId, hid);
await RoleCeModel.deleteHero(roleId, hid);
await RoleModel.updateRoleInfo(roleId, { topLineup: role.topLineup.filter(cur => cur.hid != hid), topLineupCe: role.topLineupCe - hero.ce, ce: role.ce - hero.ce });
await JewelModel.updateMany({ hid }, { $set: { hid: 0}});
return resResult(STATUS.SUCCESS);
}
async updateGuild(msg: GuildFormParam, session: BackendSession ) {
const uid = session.get('uid');
let params = new GuildFormParam(msg);
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
let guild = await GuildModel.findByCode(params.code, null, '+members');
let structure = guild.structure||[];
let updateParams: GuildUpdateParam = { code: params.code };
if(params.name && guild.name != params.name) updateParams.name = params.name;
if(params.fund != undefined && guild.fund != params.fund) updateParams.fund = params.fund;
if(params.notice && guild.notice != params.notice) updateParams.notice = params.notice;
if(params.lv && guild.lv != params.lv) updateParams.lv = params.lv;
for(let id = GUILD_STRUCTURE.START; id < GUILD_STRUCTURE.END; id ++) {
let curStructure = structure.find(cur => cur.id == id);
let lv = params.lv;
switch(id) {
case GUILD_STRUCTURE.ARMY_CENTER:
lv = params.lv; break;
case GUILD_STRUCTURE.EQUIP_PRODUCE:
lv = params.equipProduce; break;
case GUILD_STRUCTURE.BOSS:
lv = params.boss; break;
case GUILD_STRUCTURE.TRAIN:
lv = params.train; break;
case GUILD_STRUCTURE.DONATE:
lv = params.donate; break;
case GUILD_STRUCTURE.WISH_POOL:
lv = params.wishPool; break;
case GUILD_STRUCTURE.STORE:
lv = params.store; break;
}
if(curStructure) {
curStructure.lv = lv;
} else {
structure.push({ id, lv });
}
}
updateParams.structure = structure;
await pushGuildInfoUpdate(params.code, updateParams);
// 设置玩家名
if(updateParams.name != undefined || updateParams.lv != undefined) {
let arr = [];
if(updateParams.name != undefined) {
arr.push({ field: 'name', value: updateParams.name });
for(let roleId of guild.members) {
await updateUserInfo(REDIS_KEY.USER_INFO, roleId, [{ field: 'guildName', value: updateParams.name }]);
}
}
if(updateParams.lv != undefined) arr.push({ field: 'lv', value: updateParams.lv });
await updateUserInfo(REDIS_KEY.GUILD_INFO, params.code, arr);
}
if (updateParams.lv != undefined) {
let r = new Rank(REDIS_KEY.GUILD_LV_RANK, { serverId: guild.serverId });
await r.setRankWithGuildInfo2(guild.code, updateParams.lv, guild.activeWeekly, guild.lvUpdateTime, guild);
}
guild = await GuildModel.updateInfo(params.code, updateParams);
if(params.trainLv) {
await setTrainLv(params.code, params.trainLv);
}
return resResult(STATUS.SUCCESS);
}
async dismissGuild(msg: { code: string }, session: BackendSession) {
const { code } = msg;
let guild = await GuildModel.findByCode(code, null, '+serverId');
if(!guild) return resResult(STATUS.GUILD_NOT_FOUND);
if(guild.status == GUILD_STATUS.DISMISSED) return resResult(STATUS.GUILD_DELETE_ERROR);
let serverId = guild.serverId;
guild = await GuildModel.dismiss(code, serverId);
if (!guild) return resResult(STATUS.GUILD_DELETE_ERROR);
await UserGuildModel.dismiss(code);
const { members } = guild;
await RoleModel.dissmissGuild(members);
await UserGuildApplyModel.deleteApplyByGuild(code);
await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast(members.map(roleId => { return { roleId, userGuild: null } })); // 更新session
// 删除channel
await pushGuildDismiss(code);
let r = new Rank(REDIS_KEY.GUILD_ACTIVE_RANK, { serverId });
await r.removeFromRank({ guildCode: code });
let r2 = new Rank(REDIS_KEY.GUILD_LV_RANK, { serverId });
await r2.removeFromRank({ guildCode: code });
let leader = <RoleType>guild.leader;
reportTAEvent(leader.roleId, TA_EVENT.GUILD_DISMISS, { name: guild.name, way: GUILD_DISMISS_WAY.BACKEND });
return resResult(STATUS.SUCCESS, { code, status: guild.status });
}
async setGuildLeader(msg: { code: string, roleId: string }, session: BackendSession) {
const { code, roleId } = msg;
let guild = await GuildModel.findByCode(code, null, '+serverId');
if(!guild) return resResult(STATUS.GUILD_NOT_FOUND);
if(guild.status == GUILD_STATUS.DISMISSED) return resResult(STATUS.GUILD_DELETE_ERROR);
let role = await RoleModel.findByRoleId(roleId);
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
let userGuild = await UserGuildModel.getMyGuild(roleId);
if(!userGuild || userGuild.guildCode != code) return resResult(STATUS.GUILD_KICK_ERROR);
if(userGuild.auth == GUILD_AUTH.LEADER) return resResult(STATUS.GUILD_USER_IS_LEADER);
let leader = <RoleType>guild.leader;
// 交换
let oldLeaderUserGuild = await UserGuildModel.updateInfo(leader.roleId, { auth: GUILD_AUTH.MEMBER, job: GUILD_JOB.SHIBING }, {}, 'auth'); // 团长撤
await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast([{ roleId: leader.roleId, userGuild: oldLeaderUserGuild }]); // 更新session
let newLeaderUserGuild = await UserGuildModel.updateInfo(roleId, { auth: GUILD_AUTH.LEADER, job: GUILD_JOB.DAJIANGJUN }, {}, 'auth'); // 最高功勋人升
await this.app.rpc.connector.connectorRemote.setOtherUserGuildSession.broadcast([{ roleId: roleId, userGuild: newLeaderUserGuild }]); // 更新session
let managerCntInc = userGuild.auth == GUILD_AUTH.MANAGER ? -1 : 0; // 管理人数
guild = await GuildModel.updateInfo(code, { leader: role._id }, { managerCnt: managerCntInc }, 'managerCnt name'); // 如果有转让团长设置leader
// 添加动态
await pushChangeGuildLeader(code, guild.managerCnt, role, leader.roleId);
await sendMailByContent(MAIL_TYPE.GUILD_BE_IMPEACH, leader.roleId, { params: [guild.name] });
await sendMailByContent(MAIL_TYPE.GUILD_BE_SET_LEADER, roleId, { params: [guild.name] });
await updateUserInfo(REDIS_KEY.GUILD_INFO, code, [{ field: 'leader', value: new GuildLeader(role) }]);
reportTAEvent(roleId, TA_EVENT.GUILD_MASTER_CHANGE, { way: GUILD_MASTER_CHANGE_WAY.BACKEND, change_id_after: roleId })
return resResult(STATUS.SUCCESS, { code });
}
async skipEpilogue(msg: { roleId: string, roleName: string }, session: BackendSession) {
const { roleId, roleName } = msg;
let role = await RoleModel.findByRoleId(roleId);
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
if(role.hasInit) return resResult(STATUS.ROLE_HAS_INIT);
let checkName = await RoleModel.checkName(roleName, role.serverId);
if (checkName) return resResult(STATUS.NAME_HAS_USED);
let warStars: WarStar[] = [];
let insertParams: DicWar[] = [];
let exp = 0;
for(let i = 101; i <= 103; i++) {
let dicWar = gameData.war.get(i);
insertParams.push(dicWar);
warStars.push({ id: dicWar.war_id, warType: dicWar.warType, star: 0, stars: [] });
exp += dicWar.kingExp;
}
let lv = getLvByExp(exp);
await RScriptRecordModel.deleteByWarType(roleId, WAR_TYPE.NORMAL);
await RScriptRecordModel.insertScripts(roleId, insertParams);
let onlineUser = await getRoleOnlineInfo(roleId);
await createHeroes(roleId, roleName, onlineUser?.sid, role.serverId, DEFAULT_HEROES.map(hid => ({hid, count: 1})), { roleName, hasInit: true, title: role.title, teraphs: role.teraphs, lv, exp, warStar: warStars });
return resResult(STATUS.SUCCESS);
}
async reCalCe(msg: { roleId: string }, session: BackendSession) {
const { roleId } = msg;
let role = await RoleModel.findByRoleId(roleId);
let schools = await SchoolModel.findByRoleId(roleId);
let jewels = await JewelModel.findbyRole(roleId);
let heroes = await HeroModel.findByRole(roleId);
let skins = await SkinModel.findbyRole(roleId);
let artifacts = await ArtifactModel.findbyRole(roleId);
await calculateCeWithRole(HERO_SYSTEM_TYPE.RE_CAL, roleId, role.serverId, null, {}, { role, schools, jewels, heroes, skins, artifacts });
return resResult(STATUS.SUCCESS);
}
async clearRank(msg: { roleId: string }, session: BackendSession) {
let { roleId } = msg;
let role = await RoleModel.findByRoleId(roleId);
if(!role) return resResult(STATUS.WRONG_PARMS);
if(role.blockType != 2) return resResult(STATUS.GM_CANNOT_CLEAR_RANK)
let { serverId } = role;
await redisClient().zremAsync(new KeyName(REDIS_KEY.TOWER_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.LADDER, { serverId }).getName(), roleId);
await LadderMatchModel.updateByRoleId(roleId, { rank: 0 });
await redisClient().zremAsync(new KeyName(REDIS_KEY.TOP_LINEUP_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.TOP_HERO_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.HERO_NUM_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.SUM_CE_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.USER_LV, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.MAIN_RANK, { serverId }).getName(), roleId);
await redisClient().zremAsync(new KeyName(REDIS_KEY.MAIN_ELITE_RANK, { serverId }).getName(), roleId);
let keys = await redisClient().keysAsync(REDIS_KEY.PVP_RANK);
for(let key of keys) await redisClient().zremAsync(key, roleId);
return resResult(STATUS.SUCCESS);
}
}
@@ -1,271 +1,272 @@
import { Application, BackendSession, pinus } from 'pinus';
import { genCode, getRandSingleEelm, isTimestamp, resResult } from '../../../pubUtils/util';
import { STATUS } from '../../../consts/statusCode';
import { UpdateHiddenDataParam, CreatePvpConfigParam, CreateServerParam, UpdateRegionParams, CreateServersParam } from '../../../domain/backEndField/params';
import { RegionModel, RegionType } from '../../../db/Region';
import { getDicServerName } from '../../../pubUtils/data';
import { Maintenance, ServerlistModel, ServerlistUpdate } from '../../../db/Serverlist';
import { nowSeconds, getFutureTime, getPastTime } from '../../../pubUtils/timeUtil';
import { calHiddenData } from '../../../services/gmService';
import { isNumber } from 'util';
import { MarqueeModel } from '../../../db/Marquee';
import { setApiIsCloseToRemote } from '../../../services/chatService';
import { PVPConfigModel } from '../../../db/PvpConfig';
import { HiddenDataByIdModel, HiddenDataByIdModelTypeParam } from '../../../db/HiddenDataById';
import { isDevelopEnv } from '../../../services/utilService';
import { redisClient } from "../../../services/redisService";
import { REDIS_KEY } from "../../../consts";
import { createNewServer } from '../../../services/serverService';
export default function (app: Application) {
return new GmHandler(app);
}
export class GmHandler {
constructor(private app: Application) {
}
// 保存大区配置
async saveRegionConf(msg: UpdateRegionParams, session: BackendSession) {
let params = new UpdateRegionParams(msg);
let uid = session.get('uid');
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
let region: RegionType;
if(params.id == 'new') {
let update = params.getUpdateParam();
region = await RegionModel.createNewRegion(update, uid);
} else {
let oldRegion = await RegionModel.findRegionById(params.id);
if(!oldRegion) return resResult(STATUS.WRONG_PARMS);
let update = params.getUpdateParam(oldRegion);
region = await RegionModel.updateRegion(params.id, update, uid);
}
return resResult(STATUS.SUCCESS);
}
// 手动开服
async createNewServer(msg: CreateServersParam, session: BackendSession) {
if(isNumber(msg.openTime)) return resResult(STATUS.WRONG_PARMS, '请刷新后使用新后台页面');
let params = new CreateServersParam(msg);
let uid = session.get('uid');
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
console.log('*******', params);
let curRegion = await RegionModel.findRegionByEnv(params.env);
console.log('******* curRegion', curRegion);
if(!curRegion) return resResult(STATUS.WRONG_PARMS);
msg.openTime.sort()
let { latestServer = 0, env } = curRegion;
for(let openTime of msg.openTime) {
let dic = getDicServerName(env, latestServer + 1);
if(!dic) return resResult(STATUS.DIC_DATA_NOT_FOUND);
await createNewServer(curRegion, latestServer + 1, new CreateServerParam({...params, openTime}), uid);
latestServer++;
}
return resResult(STATUS.SUCCESS);
}
// 开始维护
async startMaintenance(msg: { id: number, startTime: number, endTime: number, hasNotify: boolean, version: string }, session: BackendSession) {
const { id, startTime, endTime, hasNotify, version } = msg;
if(!id || !isNumber(startTime) || !isNumber(endTime)) return resResult(STATUS.WRONG_PARMS);
if(endTime < nowSeconds()) return resResult(STATUS.WRONG_PARMS, '结束时间不能比现在早');
const uid = session.get('uid');
let server = await ServerlistModel.findByServerId(id);
if(server && server.maintenance) {
await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(server.maintenance.batchCode, [server.id]);
}
let newMaintenance: Maintenance = { batchCode: genCode(10), startTime, endTime, hasNotify, isOpen: true, version }
server = await ServerlistModel.updateByServerId(id, { maintenance: newMaintenance });
await pinus.app.rpc.systimer.systimerRemote.initMaintenance.broadcast([server]);
return resResult(STATUS.SUCCESS,);
}
// 大区一起维护
async startRegionMaintenance(msg: { startTime: number, endTime: number, hasNotify: boolean, version: string }, session: BackendSession) {
const { startTime, endTime, hasNotify, version } = msg;
if(!isNumber(startTime) || !isNumber(endTime)) return resResult(STATUS.WRONG_PARMS);
if(endTime < nowSeconds()) return resResult(STATUS.WRONG_PARMS, '结束时间不能比现在早');
const uid = session.get('uid');
let newMaintenance: Maintenance = { batchCode: genCode(10), startTime, endTime, hasNotify, isOpen: true, version }
let servers = await ServerlistModel.findByEnv(this.app.get('env'));
let serverIdsOfBatchCode = new Map<string, number[]>();
let serverIds: number[] = [];
for(let server of servers) {
if(server.maintenance) {
let { batchCode } = server.maintenance;
if(!serverIdsOfBatchCode.has(batchCode)) {
serverIdsOfBatchCode.set(batchCode, []);
}
serverIdsOfBatchCode.get(batchCode).push(server.id);
}
serverIds.push(server.id);
}
for(let [ batchCode, serverIds ] of serverIdsOfBatchCode) {
await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(batchCode, serverIds);
}
await ServerlistModel.updateByServerIds(serverIds, { maintenance: newMaintenance });
servers = await ServerlistModel.findByEnv(this.app.get('env'));
await pinus.app.rpc.systimer.systimerRemote.initMaintenance.broadcast(servers.map(server => ({...server, maintenance: newMaintenance })));
return resResult(STATUS.SUCCESS,);
}
// 提前结束维护
async stopMaintenance(msg: { id: number }, session: BackendSession) {
const { id } = msg;
const uid = session.get('uid');
let server = await ServerlistModel.findByServerId(id);
let maintenance = server.maintenance;
if(maintenance) {
// 更新serverlist上的status
await ServerlistModel.updateByServerId(server.id, { 'maintenance.isOpen': false } as ServerlistUpdate);
// console.log('&&&', server, server.id)
await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(maintenance.batchCode, [server.id]);
}
return resResult(STATUS.SUCCESS,);
}
// 大区一起结束维护
async stopRegionMaintenance(msg: {}, session: BackendSession) {
const { } = msg;
const uid = session.get('uid');
let servers = await ServerlistModel.findByEnv(this.app.get('env'));
let serverIdsOfBatchCode = new Map<string, number[]>();
let serverIds: number[] = [];
for(let server of servers) {
if(server.maintenance) {
let { batchCode } = server.maintenance;
if(!serverIdsOfBatchCode.has(batchCode)) {
serverIdsOfBatchCode.set(batchCode, []);
}
serverIdsOfBatchCode.get(batchCode).push(server.id);
serverIds.push(server.id);
}
}
for(let [ batchCode, serverIds ] of serverIdsOfBatchCode) {
await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(batchCode, serverIds);
}
// 更新serverlist上的status
await ServerlistModel.updateByServerIds(serverIds, { 'maintenance.isOpen': false } as ServerlistUpdate);
return resResult(STATUS.SUCCESS,);
}
async sendMarquee(msg: { code: string }, session: BackendSession) {
const { code } = msg;
let marquee = await MarqueeModel.findByCode(code);
if(!marquee) return resResult(STATUS.DB_DATA_NOT_FOUND);
await MarqueeModel.updateData(code, { isEnable: true });
let result = await this.app.rpc.systimer.systimerRemote.setMarquee.broadcast(marquee);
if (!result) return resResult(STATUS.GM_MARQUEE_ERR);
return resResult(STATUS.SUCCESS);
}
async cancelMarquee(msg: { code: string }, session: BackendSession) {
const { code } = msg;
await MarqueeModel.updateData(code, { isEnable: false });
let result = await this.app.rpc.systimer.systimerRemote.cancelMarquee.broadcast(code);
if (!result) return resResult(STATUS.GM_MARQUEE_CANCEL_ERR);
return resResult(STATUS.SUCCESS);
}
async setApiIsClose(msg: { isCloseApi: boolean }, session: BackendSession) {
const { isCloseApi } = msg;
let region = await RegionModel.findRegionByEnv(pinus.app.get('env'));
if(!region) return resResult(STATUS.SERVER_NOT_FOUND);
region = await RegionModel.updateRegion(region.id, { isCloseApi });
setApiIsCloseToRemote(region.isCloseApi);
return resResult(STATUS.SUCCESS);
}
async savePvpConfig(msg: CreatePvpConfigParam, session: BackendSession) {
let params = new CreatePvpConfigParam(msg);
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
if(params.seasonStartTime >= params.seasonEndTime) return resResult(STATUS.WRONG_PARMS, null, '开始时间不可晚于结束时间');
if(params.seasonEndTime >= params.seasonRewardTime) return resResult(STATUS.WRONG_PARMS, null, '结束时间不可晚于奖励时间');
if(await PVPConfigModel.checkTime(params.seasonNum, params.seasonStartTime, params.seasonRewardTime)) {
return resResult(STATUS.WRONG_PARMS, null, '不可与其他赛季时间重叠');
}
let uid = session.get('uid');
await PVPConfigModel.createPVPConfig(params.seasonNum, params.getUpdateParam(), uid);
pinus.app.rpc.systimer.systimerRemote.setPvpSeasonSchedule.broadcast(true);
return resResult(STATUS.SUCCESS);
}
async initHiddenData(msg: {pubArr: number[], hideArr: number[], type: number}, session: BackendSession) {
let { pubArr = [], hideArr = [], type } = msg;
let uid = session.get('uid');
let datas = await HiddenDataByIdModel.findExistData(type);
let existIds = datas.map(cur => cur.id);
let insertParam: HiddenDataByIdModelTypeParam[] = [];
for(let id of pubArr) {
if(existIds.indexOf(id) == -1) {
insertParam.push({ type, id, publishTime: getPastTime(), createdBy: uid, updatedBy: uid });
}
}
for(let id of hideArr) {
if(existIds.indexOf(id) == -1) {
insertParam.push({ type, id, publishTime: getFutureTime(), createdBy: uid, updatedBy: uid });
}
}
await HiddenDataByIdModel.createDatas(insertParam);
await calHiddenData(uid);
await pinus.app.rpc.systimer.systimerRemote.gmSetHiddenDataSchedule.broadcast();
return resResult(STATUS.SUCCESS);
}
async saveHiddenData(msg: UpdateHiddenDataParam, session: BackendSession) {
let params = new UpdateHiddenDataParam(msg);
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
let uid = session.get('uid');
let heroes: number[] = [], goods: number[] = [];
for(let {type, id} of params.arr) {
if(type == 1) heroes.push(id);
if(type == 2) goods.push(id);
}
if(!isDevelopEnv()) {
if(!await HiddenDataByIdModel.checkById(1, heroes, params.publishTime) || !await HiddenDataByIdModel.checkById(2, goods, params.publishTime)) {
return resResult(STATUS.GM_OLD_REF_TIME_ERR);
}
}
for(let {type, id} of params.arr) {
await HiddenDataByIdModel.updateData(type, id, params.publishTime, uid);
}
await calHiddenData(uid);
await pinus.app.rpc.systimer.systimerRemote.gmSetHiddenDataSchedule.broadcast();
return resResult(STATUS.SUCCESS);
}
async setServerOpenTime(msg: { serverId: number, serverOpenTime: number }, session: BackendSession) {
let { serverId, serverOpenTime } = msg;
if(!isTimestamp(serverOpenTime)) return resResult(STATUS.WRONG_PARMS);
let server = await ServerlistModel.findByServerId(serverId);
if(!server) return resResult(STATUS.WRONG_PARMS);
let region = await RegionModel.findRegionById(server.regionId);
if(!region) return resResult(STATUS.WRONG_PARMS);
server = await ServerlistModel.updateByServerId(serverId, { openTime: serverOpenTime });
if(server.id == region.latestServerUniqId) {
region = await RegionModel.updateRegion(server.regionId, { latestServerOpenTime: server.openTime })
}
await redisClient().hsetAsync(REDIS_KEY.SERVER_OPEN_TIME, `${server.id}`, `${server.openTime}`);
return resResult(STATUS.SUCCESS);
}
}
import { Application, BackendSession, pinus } from 'pinus';
import { genCode, getRandSingleEelm, isTimestamp, resResult } from '@pubUtils/util';
import { STATUS } from '@consts/statusCode';
import { UpdateHiddenDataParam, CreatePvpConfigParam, CreateServerParam, UpdateRegionParams, CreateServersParam } from '@domain/backEndField/params';
import { RegionModel, RegionType } from '@db/Region';
import { getDicServerName } from '@pubUtils/data';
import { Maintenance, ServerlistModel, ServerlistUpdate } from '@db/Serverlist';
import { nowSeconds, getFutureTime, getPastTime } from '@pubUtils/timeUtil';
import { calHiddenData } from '../../../services/gmService';
import { isNumber } from 'util';
import { MarqueeModel } from '@db/Marquee';
import { setApiIsCloseToRemote } from '../../../services/chatService';
import { PVPConfigModel } from '@db/PvpConfig';
import { HiddenDataByIdModel, HiddenDataByIdModelTypeParam } from '@db/HiddenDataById';
import { isDevelopEnv } from '../../../services/utilService';
import { redisClient } from "../../../services/redisService";
import { REDIS_KEY } from "../../../consts";
import { createNewServer } from '../../../services/serverService';
export default function (app: Application) {
return new GmHandler(app);
}
export class GmHandler {
constructor(private app: Application) {
}
// 保存大区配置
async saveRegionConf(msg: UpdateRegionParams, session: BackendSession) {
let params = new UpdateRegionParams(msg);
let uid = session.get('uid');
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
let region: RegionType;
if(params.id == 'new') {
let update = params.getUpdateParam();
region = await RegionModel.createNewRegion(update, uid);
} else {
let oldRegion = await RegionModel.findRegionById(params.id);
if(!oldRegion) return resResult(STATUS.WRONG_PARMS);
let update = params.getUpdateParam(oldRegion);
region = await RegionModel.updateRegion(params.id, update, uid);
}
return resResult(STATUS.SUCCESS);
}
// 手动开服
async createNewServer(msg: CreateServersParam, session: BackendSession) {
if(isNumber(msg.openTime)) return resResult(STATUS.WRONG_PARMS, '请刷新后使用新后台页面');
let params = new CreateServersParam(msg);
let uid = session.get('uid');
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
console.log('*******', params);
let curRegion = await RegionModel.findRegionByEnv(params.env);
console.log('******* curRegion', curRegion);
if(!curRegion) return resResult(STATUS.WRONG_PARMS);
msg.openTime.sort()
let { latestServer = 0, env } = curRegion;
for(let openTime of msg.openTime) {
let dic = getDicServerName(env, latestServer + 1);
if(!dic) return resResult(STATUS.DIC_DATA_NOT_FOUND);
await createNewServer(curRegion, latestServer + 1, new CreateServerParam({...params, openTime}), uid);
latestServer++;
}
return resResult(STATUS.SUCCESS);
}
// 开始维护
async startMaintenance(msg: { id: number, startTime: number, endTime: number, hasNotify: boolean, version: string }, session: BackendSession) {
const { id, startTime, endTime, hasNotify, version } = msg;
if(!id || !isNumber(startTime) || !isNumber(endTime)) return resResult(STATUS.WRONG_PARMS);
if(endTime < nowSeconds()) return resResult(STATUS.WRONG_PARMS, '结束时间不能比现在早');
const uid = session.get('uid');
let server = await ServerlistModel.findByServerId(id);
if(server && server.maintenance) {
await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(server.maintenance.batchCode, [server.id]);
}
let newMaintenance: Maintenance = { batchCode: genCode(10), startTime, endTime, hasNotify, isOpen: true, version }
server = await ServerlistModel.updateByServerId(id, { maintenance: newMaintenance });
await pinus.app.rpc.systimer.systimerRemote.initMaintenance.broadcast([server]);
return resResult(STATUS.SUCCESS,);
}
// 大区一起维护
async startRegionMaintenance(msg: { startTime: number, endTime: number, hasNotify: boolean, version: string }, session: BackendSession) {
const { startTime, endTime, hasNotify, version } = msg;
if(!isNumber(startTime) || !isNumber(endTime)) return resResult(STATUS.WRONG_PARMS);
if(endTime < nowSeconds()) return resResult(STATUS.WRONG_PARMS, '结束时间不能比现在早');
const uid = session.get('uid');
let newMaintenance: Maintenance = { batchCode: genCode(10), startTime, endTime, hasNotify, isOpen: true, version }
let servers = await ServerlistModel.findByEnv(this.app.get('env'));
let serverIdsOfBatchCode = new Map<string, number[]>();
let serverIds: number[] = [];
for(let server of servers) {
if(server.maintenance) {
let { batchCode } = server.maintenance;
if(!serverIdsOfBatchCode.has(batchCode)) {
serverIdsOfBatchCode.set(batchCode, []);
}
serverIdsOfBatchCode.get(batchCode).push(server.id);
}
serverIds.push(server.id);
}
for(let [ batchCode, serverIds ] of serverIdsOfBatchCode) {
await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(batchCode, serverIds);
}
await ServerlistModel.updateByServerIds(serverIds, { maintenance: newMaintenance });
servers = await ServerlistModel.findByEnv(this.app.get('env'));
await pinus.app.rpc.systimer.systimerRemote.initMaintenance.broadcast(servers.map(server => ({...server, maintenance: newMaintenance })));
return resResult(STATUS.SUCCESS,);
}
// 提前结束维护
async stopMaintenance(msg: { id: number }, session: BackendSession) {
const { id } = msg;
const uid = session.get('uid');
let server = await ServerlistModel.findByServerId(id);
let maintenance = server.maintenance;
if(maintenance) {
// 更新serverlist上的status
await ServerlistModel.updateByServerId(server.id, { 'maintenance.isOpen': false } as ServerlistUpdate);
// console.log('&&&', server, server.id)
await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(maintenance.batchCode, [server.id]);
}
return resResult(STATUS.SUCCESS,);
}
// 大区一起结束维护
async stopRegionMaintenance(msg: {}, session: BackendSession) {
const { } = msg;
const uid = session.get('uid');
let servers = await ServerlistModel.findByEnv(this.app.get('env'));
let serverIdsOfBatchCode = new Map<string, number[]>();
let serverIds: number[] = [];
for(let server of servers) {
if(server.maintenance) {
let { batchCode } = server.maintenance;
if(!serverIdsOfBatchCode.has(batchCode)) {
serverIdsOfBatchCode.set(batchCode, []);
}
serverIdsOfBatchCode.get(batchCode).push(server.id);
serverIds.push(server.id);
}
}
for(let [ batchCode, serverIds ] of serverIdsOfBatchCode) {
await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(batchCode, serverIds);
}
// 更新serverlist上的status
await ServerlistModel.updateByServerIds(serverIds, { 'maintenance.isOpen': false } as ServerlistUpdate);
return resResult(STATUS.SUCCESS,);
}
async sendMarquee(msg: { code: string }, session: BackendSession) {
const { code } = msg;
let marquee = await MarqueeModel.findByCode(code);
if(!marquee) return resResult(STATUS.DB_DATA_NOT_FOUND);
await MarqueeModel.updateData(code, { isEnable: true });
let result = await this.app.rpc.systimer.systimerRemote.setMarquee.broadcast(marquee);
if (!result) return resResult(STATUS.GM_MARQUEE_ERR);
return resResult(STATUS.SUCCESS);
}
async cancelMarquee(msg: { code: string }, session: BackendSession) {
const { code } = msg;
await MarqueeModel.updateData(code, { isEnable: false });
let result = await this.app.rpc.systimer.systimerRemote.cancelMarquee.broadcast(code);
if (!result) return resResult(STATUS.GM_MARQUEE_CANCEL_ERR);
return resResult(STATUS.SUCCESS);
}
async setApiIsClose(msg: { isCloseApi: boolean }, session: BackendSession) {
const { isCloseApi } = msg;
let region = await RegionModel.findRegionByEnv(pinus.app.get('env'));
if(!region) return resResult(STATUS.SERVER_NOT_FOUND);
region = await RegionModel.updateRegion(region.id, { isCloseApi });
setApiIsCloseToRemote(region.isCloseApi);
return resResult(STATUS.SUCCESS);
}
async savePvpConfig(msg: CreatePvpConfigParam, session: BackendSession) {
let params = new CreatePvpConfigParam(msg);
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
if(params.seasonStartTime >= params.seasonEndTime) return resResult(STATUS.WRONG_PARMS, null, '开始时间不可晚于结束时间');
if(params.seasonEndTime >= params.seasonRewardTime) return resResult(STATUS.WRONG_PARMS, null, '结束时间不可晚于奖励时间');
if(await PVPConfigModel.checkTime(params.seasonNum, params.seasonStartTime, params.seasonRewardTime)) {
return resResult(STATUS.WRONG_PARMS, null, '不可与其他赛季时间重叠');
}
let uid = session.get('uid');
await PVPConfigModel.createPVPConfig(params.seasonNum, params.getUpdateParam(), uid);
pinus.app.rpc.systimer.systimerRemote.setPvpSeasonSchedule.broadcast(true);
return resResult(STATUS.SUCCESS);
}
async initHiddenData(msg: {pubArr: number[], hideArr: number[], type: number}, session: BackendSession) {
let { pubArr = [], hideArr = [], type } = msg;
let uid = session.get('uid');
let datas = await HiddenDataByIdModel.findExistData(type);
let existIds = datas.map(cur => cur.id);
let insertParam: HiddenDataByIdModelTypeParam[] = [];
for(let id of pubArr) {
if(existIds.indexOf(id) == -1) {
insertParam.push({ type, id, publishTime: getPastTime(), createdBy: uid, updatedBy: uid });
}
}
for(let id of hideArr) {
if(existIds.indexOf(id) == -1) {
insertParam.push({ type, id, publishTime: getFutureTime(), createdBy: uid, updatedBy: uid });
}
}
await HiddenDataByIdModel.createDatas(insertParam);
await calHiddenData(uid);
await pinus.app.rpc.systimer.systimerRemote.gmSetHiddenDataSchedule.broadcast();
return resResult(STATUS.SUCCESS);
}
async saveHiddenData(msg: UpdateHiddenDataParam, session: BackendSession) {
let params = new UpdateHiddenDataParam(msg);
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
let uid = session.get('uid');
let heroes: number[] = [], goods: number[] = [];
for(let {type, id} of params.arr) {
if(type == 1) heroes.push(id);
if(type == 2) goods.push(id);
}
if(!isDevelopEnv()) {
if(!await HiddenDataByIdModel.checkById(1, heroes, params.publishTime) || !await HiddenDataByIdModel.checkById(2, goods, params.publishTime)) {
return resResult(STATUS.GM_OLD_REF_TIME_ERR);
}
}
for(let {type, id} of params.arr) {
await HiddenDataByIdModel.updateData(type, id, params.publishTime, uid);
}
await calHiddenData(uid);
await pinus.app.rpc.systimer.systimerRemote.gmSetHiddenDataSchedule.broadcast();
return resResult(STATUS.SUCCESS);
}
async setServerOpenTime(msg: { serverId: number, serverOpenTime: number }, session: BackendSession) {
let { serverId, serverOpenTime } = msg;
if(!isTimestamp(serverOpenTime)) return resResult(STATUS.WRONG_PARMS);
let server = await ServerlistModel.findByServerId(serverId);
if(!server) return resResult(STATUS.WRONG_PARMS);
let region = await RegionModel.findRegionById(server.regionId);
if(!region) return resResult(STATUS.WRONG_PARMS);
server = await ServerlistModel.updateByServerId(serverId, { openTime: serverOpenTime });
if(server.id == region.latestServerUniqId) {
region = await RegionModel.updateRegion(server.regionId, { latestServerOpenTime: server.openTime })
}
await redisClient().hsetAsync(REDIS_KEY.SERVER_OPEN_TIME, `${server.id}`, `${server.openTime}`);
return resResult(STATUS.SUCCESS);
}
}