init
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user