后台:服务器维护
This commit is contained in:
@@ -1,15 +1,16 @@
|
||||
import { MarqueeType, MarqueeModel } from "../db/Marquee";
|
||||
import { MARQUEE_TYPE, SERVER_STATUS } from "../consts";
|
||||
import { GM_MAIL_STATUS, MAIL_TIME_TYPE, MARQUEE_TYPE, REF_CIRCLE_MAIL_TIME, SERVER_STATUS } from "../consts";
|
||||
import { scheduleJob, scheduledJobs, Job } from 'node-schedule';
|
||||
import { createMarqueeMsg as sysCreateMarqueeMsg, pushMarqueeMsg as sysPushMarqueeMsg } from './sysChatService';
|
||||
import { GroupMessageType } from "../db/GroupMessage";
|
||||
import { MaintenanceModel, MaintenanceType } from '../db/Maintenance';
|
||||
import { pinus } from "pinus";
|
||||
import { getWorldChannelSid } from "./chatChannelService";
|
||||
import { ServerlistModel } from "../db/Serverlist";
|
||||
import { ServerlistModel, ServerlistType } from "../db/Serverlist";
|
||||
import { NoticeModel, NoticeType } from "../db/Notice";
|
||||
import { SendMailFun } from "./mailService";
|
||||
import { GMMailType } from '../db/GMMail';
|
||||
import GMMail, { GMMailModel, GMMailType } from '../db/GMMail';
|
||||
import moment = require("moment");
|
||||
import { getSeconds, nowSeconds } from "../pubUtils/timeUtil";
|
||||
|
||||
// —————————————— 跑马灯 —————————————— //
|
||||
// 初始
|
||||
@@ -103,69 +104,132 @@ export async function cancelMarquee(code: string) {
|
||||
|
||||
// —————————————— 停服维护 —————————————— //
|
||||
// 维护信息
|
||||
export async function initMaintenance(maintenance?: MaintenanceType) {
|
||||
if(!maintenance)
|
||||
maintenance = await MaintenanceModel.findOpenMaintenance();
|
||||
if(maintenance) {
|
||||
let { startTime, marquee } = maintenance;
|
||||
if(marquee) {
|
||||
let result = await generateMarqueeSchedule(<MarqueeType>marquee);
|
||||
// console.log(result);
|
||||
}
|
||||
if(Date.now() > startTime.getTime()) {
|
||||
await startMaintenance(maintenance);
|
||||
} else {
|
||||
let startJob = scheduleJob(`startMainten${maintenance.code}`, startTime.getTime(), async () => {
|
||||
await startMaintenance(maintenance, startJob);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
// export async function initMaintenance() {
|
||||
// let servers = await ServerlistModel.findByEnv(pinus.app.get('env'));
|
||||
// for(let server of servers)
|
||||
// // if(!maintenance)
|
||||
// // maintenance = await MaintenanceModel.findOpenMaintenance();
|
||||
// // if(maintenance) {
|
||||
// // let { startTime, marquee } = maintenance;
|
||||
// // if(marquee) {
|
||||
// // let result = await generateMarqueeSchedule(<MarqueeType>marquee);
|
||||
// // // console.log(result);
|
||||
// // }
|
||||
// // if(Date.now() > startTime.getTime()) {
|
||||
// // await startMaintenance(maintenance);
|
||||
// // } else {
|
||||
// // let startJob = scheduleJob(`startMainten${maintenance.code}`, startTime.getTime(), async () => {
|
||||
// // await startMaintenance(maintenance, startJob);
|
||||
// // });
|
||||
// // }
|
||||
// }
|
||||
// }
|
||||
|
||||
// 开启维护
|
||||
async function startMaintenance(maintenance: MaintenanceType, startJob?: Job) {
|
||||
// 向全服发送
|
||||
let { serverIds, notice } = maintenance;
|
||||
for(let serverId of serverIds) {
|
||||
let chatSid = await getWorldChannelSid(serverId);
|
||||
await pinus.app.rpc.chat.chatRemote.sendServerMaintenance.toServer(chatSid, serverId);
|
||||
}
|
||||
// // 开启维护
|
||||
// async function startMaintenance(maintenance: MaintenanceType, startJob?: Job) {
|
||||
// // 向全服发送
|
||||
// let { serverIds, notice } = maintenance;
|
||||
// for(let serverId of serverIds) {
|
||||
// let chatSid = await getWorldChannelSid(serverId);
|
||||
// await pinus.app.rpc.chat.chatRemote.sendServerMaintenance.toServer(chatSid, serverId);
|
||||
// }
|
||||
|
||||
// 更新serverlist上的status
|
||||
await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.MAINTENANCE });
|
||||
// 更新notice的isEnable
|
||||
if(notice) {
|
||||
await NoticeModel.updateNotice((<NoticeType>notice).id, { isEnable: true });
|
||||
}
|
||||
// // 更新serverlist上的status
|
||||
// await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.MAINTENANCE });
|
||||
// // 更新notice的isEnable
|
||||
// if(notice) {
|
||||
// await NoticeModel.updateNotice((<NoticeType>notice).id, { isEnable: true });
|
||||
// }
|
||||
|
||||
// 更新connectorRemote里面的维护服务器
|
||||
await pinus.app.rpc.connector.connectorRemote.setServerMainten.broadcast(serverIds);
|
||||
// // 更新connectorRemote里面的维护服务器
|
||||
// await pinus.app.rpc.connector.connectorRemote.setServerMainten.broadcast(serverIds);
|
||||
// }
|
||||
|
||||
// // 停止维护
|
||||
// export async function stopMaintenance(maintenance: MaintenanceType, uid: number) {
|
||||
// let { serverIds, notice, marquee, mail } = maintenance;
|
||||
// // 更新serverlist上的status
|
||||
// await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.HOT });
|
||||
// // 更新notice的isEnable
|
||||
// if(notice) {
|
||||
// await NoticeModel.updateNotice((<NoticeType>notice).id, { isEnable: false });
|
||||
// }
|
||||
|
||||
// // 更新connectorRemote里面的维护服务器
|
||||
// let connectorServers = pinus.app.getServersByType('connector');
|
||||
// for(let { id } of connectorServers) {
|
||||
// await pinus.app.rpc.connector.connectorRemote.setServerMainten.toServer(id, []);
|
||||
// }
|
||||
|
||||
// if(marquee) {
|
||||
// await cancelMarquee((<MarqueeType>marquee).code);
|
||||
// }
|
||||
// console.log('*****', JSON.stringify(mail));
|
||||
// if(mail) {
|
||||
// let f = new SendMailFun();
|
||||
// await f.setWithGmMail((<GMMailType>mail)._id);
|
||||
// await f.sendToServer(serverIds);
|
||||
// // await f.saveRecord(uid);
|
||||
// }
|
||||
// }
|
||||
|
||||
export async function sendOpenServerMail(type: 'openMail'|'circleMail', mail: GMMail, newServer: ServerlistType, uid: number) {
|
||||
let receivers = [{
|
||||
env: newServer.env,
|
||||
serverId: newServer.id
|
||||
}];
|
||||
let addParam = {...mail, receivers, status: GM_MAIL_STATUS.PASS };
|
||||
if(type == 'openMail') {
|
||||
addParam.timeType = MAIL_TIME_TYPE.DELAY;
|
||||
addParam.startTime = newServer.openTime;
|
||||
}
|
||||
let gmmail = await GMMailModel.addMail(addParam, uid);
|
||||
let needSend = false;
|
||||
if(mail.timeType == MAIL_TIME_TYPE.CIRCLE) {
|
||||
let refTime = moment(moment().format(`YYYY-MM-DD ${REF_CIRCLE_MAIL_TIME}:00:00`)).unix();
|
||||
let sendTime = moment(moment().format('YYYY-MM-DD '+ mail.circleHour)).unix();
|
||||
if(sendTime < refTime) sendTime += 86400;
|
||||
let now = nowSeconds();
|
||||
if(refTime < now && sendTime > now) {
|
||||
needSend = true;
|
||||
}
|
||||
} else {
|
||||
needSend = true;
|
||||
}
|
||||
if(needSend) {
|
||||
let f = new SendMailFun();
|
||||
await f.setWithGmMail(gmmail);
|
||||
await f.sendToServer([newServer.id]);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// 停止维护
|
||||
export async function stopMaintenance(maintenance: MaintenanceType, uid: number) {
|
||||
let { serverIds, notice, marquee, mail } = maintenance;
|
||||
// 更新serverlist上的status
|
||||
await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.HOT });
|
||||
// 更新notice的isEnable
|
||||
if(notice) {
|
||||
await NoticeModel.updateNotice((<NoticeType>notice).id, { isEnable: false });
|
||||
}
|
||||
|
||||
// 更新connectorRemote里面的维护服务器
|
||||
let connectorServers = pinus.app.getServersByType('connector');
|
||||
for(let { id } of connectorServers) {
|
||||
await pinus.app.rpc.connector.connectorRemote.setServerMainten.toServer(id, []);
|
||||
}
|
||||
|
||||
if(marquee) {
|
||||
await cancelMarquee((<MarqueeType>marquee).code);
|
||||
export function setServerMainten(serverIds: number[], startTime: number, endTime: number) {
|
||||
let maintenServers = pinus.app.get('maintenServers')||new Map();
|
||||
for(let id of serverIds) {
|
||||
if(!maintenServers.has(id)) {
|
||||
maintenServers.set(id, { startTime, endTime });
|
||||
} else {
|
||||
maintenServers.get(id).startTime = startTime;
|
||||
maintenServers.get(id).endTime = endTime;
|
||||
}
|
||||
}
|
||||
console.log('*****', JSON.stringify(mail));
|
||||
if(mail) {
|
||||
let f = new SendMailFun();
|
||||
await f.setWithGmMail((<GMMailType>mail)._id);
|
||||
await f.sendToServer(serverIds);
|
||||
// await f.saveRecord(uid);
|
||||
pinus.app.set('maintenServers', maintenServers);
|
||||
}
|
||||
|
||||
export function stopServerMainten(serverIds: number[]) {
|
||||
let maintenServers = pinus.app.get('maintenServers')||new Map();
|
||||
for(let id of serverIds) {
|
||||
if(maintenServers.has(id)) {
|
||||
maintenServers.delete(id);
|
||||
}
|
||||
}
|
||||
pinus.app.set('maintenServers', maintenServers);
|
||||
}
|
||||
|
||||
export function getServerMainten(serverId: number) {
|
||||
let maintenServers = pinus.app.get('maintenServers')||new Map();
|
||||
return maintenServers.get(serverId);
|
||||
}
|
||||
@@ -109,7 +109,7 @@ export class SendMailFun {
|
||||
}
|
||||
|
||||
// 从GMMail表读取数据
|
||||
public async setWithGmMail(gmmail: GMMailTypeParam) {
|
||||
public async setWithGmMail(gmmail: GMMailType) {
|
||||
this.gmmail = gmmail;
|
||||
this.contentId = 0;
|
||||
if(gmmail.timeType == MAIL_TIME_TYPE.IMMEDIATE) {
|
||||
|
||||
@@ -17,7 +17,7 @@ import { getRandSingleEelm } from '../pubUtils/util';
|
||||
*/
|
||||
export async function initAllRank() {
|
||||
console.log('******* initAllRank ******')
|
||||
const serverList = await ServerlistModel.getAllServerList();
|
||||
const serverList = await ServerlistModel?.findByEnv(pinus.app.get('env'))||[];
|
||||
await delKeys(REDIS_KEY.ONLINE_USERS);
|
||||
await delKeys(REDIS_KEY.USER_INFO);
|
||||
await delKeys(REDIS_KEY.GUILD_INFO);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
|
||||
import { scheduleJob, Job, } from 'node-schedule';
|
||||
import { scheduleJob, Job, scheduledJobs, } from 'node-schedule';
|
||||
import { PVPConfigModel, PVPConfigType } from '../db/SystemConfig';
|
||||
import { nowSeconds, getTimeFun, getSeconds } from '../pubUtils/timeUtil';
|
||||
import { getTodayGuildActivity, gameData } from '../pubUtils/data';
|
||||
import { pvpSeasonEnd } from './pvpService';
|
||||
import { getAllOnlineRoles, getAllServers, delGuildActivityRank } from './redisService';
|
||||
import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, SEND_NAME, SERVER_OPEN_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE } from '../consts';
|
||||
import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, SEND_NAME, SERVER_OPEN_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE, SERVER_STATUS } from '../consts';
|
||||
import { RoleModel } from '../db/Role';
|
||||
import { pinus } from 'pinus';
|
||||
import { indexOf } from 'underscore';
|
||||
@@ -19,13 +19,16 @@ import { dispatch } from '../pubUtils/dispatcher';
|
||||
import { Rank } from './rankService';
|
||||
import { checkTask } from './taskService';
|
||||
import { everydayRefresh } from './connectorService';
|
||||
import { initMarquee, initMaintenance } from './gmService';
|
||||
import { initMarquee } from './gmService';
|
||||
import moment = require('moment');
|
||||
import { CounterModel } from '../db/Counter';
|
||||
import { reportOneOnline } from './authenticateService';
|
||||
import { PVP } from '../pubUtils/dicParam';
|
||||
import { fetch37Words } from './sdkService';
|
||||
import { GMMailModel } from '../db/GMMail';
|
||||
import { Maintenance, ServerlistModel, ServerlistType, ServerlistUpdate } from '../db/Serverlist';
|
||||
import { getWorldChannelSid } from './chatService';
|
||||
import { createMarqueeMsg, pushMarqueeMsg } from './sysChatService';
|
||||
|
||||
const PER_SECOND = 1 * 1000;
|
||||
const PER_DAY = 24 * 60 * 60;
|
||||
@@ -396,4 +399,132 @@ async function sendCircleMail() {
|
||||
await f.sendToServer(serverIds);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*** 维护 */
|
||||
|
||||
let maintenInfos = new Map<string, { servers: ServerlistType[], maintenance: Maintenance }>(); // batchCode => {servers, maintenance}
|
||||
export async function initMaintenance(servers?: ServerlistType[]) {
|
||||
if(!servers) servers = await ServerlistModel.findByEnv(pinus.app.get('env'));
|
||||
|
||||
console.log('#### initMaintenance', servers)
|
||||
|
||||
for(let server of servers) {
|
||||
let { maintenance } = server;
|
||||
if(maintenance && maintenance.isOpen) {
|
||||
if(!maintenInfos.has(maintenance.batchCode)) {
|
||||
maintenInfos.set(maintenance.batchCode, { servers: [], maintenance });
|
||||
}
|
||||
maintenInfos.get(maintenance.batchCode).servers.push(server);
|
||||
}
|
||||
}
|
||||
for(let [batchCode] of maintenInfos) {
|
||||
await setMaintenance(batchCode);
|
||||
}
|
||||
}
|
||||
|
||||
// 设置维护
|
||||
async function setMaintenance(batchCode: string) {
|
||||
let { maintenance } = maintenInfos.get(batchCode);
|
||||
let now = nowSeconds();
|
||||
// 发送消息
|
||||
if(maintenance.hasNotify && now < maintenance.startTime) {
|
||||
if(now > maintenance.startTime - 5 * 60) {
|
||||
maintenanceNotifySchedule(batchCode);
|
||||
} else {
|
||||
scheduleJob(`maintenNotify${batchCode}`, maintenance.startTime - 5 * 60, () => {
|
||||
maintenanceNotifySchedule(batchCode);
|
||||
})
|
||||
}
|
||||
} else {
|
||||
if(scheduledJobs[`maintenNotify${batchCode}`]) scheduledJobs[`maintenNotify${batchCode}`].cancel();
|
||||
}
|
||||
// 开始维护
|
||||
console.log('******* setMaintenance', now, now < maintenance.endTime, now > maintenance.startTime)
|
||||
if(now < maintenance.endTime) {
|
||||
if(now > maintenance.startTime) {
|
||||
console.log('*******')
|
||||
await startMaintenanceSchedule(batchCode);
|
||||
} else {
|
||||
scheduleJob(`startMainten${batchCode}`, maintenance.startTime * 1000, async () => {
|
||||
await startMaintenanceSchedule(batchCode);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if(scheduledJobs[`startMainten${batchCode}`]) scheduledJobs[`startMainten${batchCode}`].cancel();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 维护前通知
|
||||
async function maintenanceNotifySchedule(batchCode: string) {
|
||||
let { servers, maintenance } = maintenInfos.get(batchCode);
|
||||
if(scheduledJobs[`maintenNotify${batchCode}`]) scheduledJobs[`maintenNotify${batchCode}`].cancel();
|
||||
if(scheduledJobs[`maintenSec${batchCode}`]) scheduledJobs[`maintenSec${batchCode}`].cancel();
|
||||
|
||||
scheduleJob(`maintenSec${batchCode}`, `0 */1 * * * *`, async () => {
|
||||
for(let { id: serverId } of servers) {
|
||||
let msgData = await createMarqueeMsg('', '系统', serverId, '服务器即将维护,请玩家提前退出游戏');
|
||||
await pushMarqueeMsg(msgData);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 开始维护
|
||||
async function startMaintenanceSchedule(batchCode: string) {
|
||||
let { servers, maintenance } = maintenInfos.get(batchCode);
|
||||
let serverIds = servers.map(cur => cur.id);
|
||||
if(scheduledJobs[`maintenNotify${batchCode}`]) scheduledJobs[`maintenNotify${batchCode}`].cancel();
|
||||
if(scheduledJobs[`maintenSec${batchCode}`]) scheduledJobs[`maintenSec${batchCode}`].cancel();
|
||||
if(scheduledJobs[`startMainten${batchCode}`]) scheduledJobs[`startMainten${batchCode}`].cancel();
|
||||
|
||||
// 向全服发送
|
||||
for(let { id: serverId } of servers) {
|
||||
let chatSid = await getWorldChannelSid(serverId);
|
||||
if(chatSid) {
|
||||
await pinus.app.rpc.chat.chatRemote.sendServerMaintenance.toServer(chatSid, serverId);
|
||||
}
|
||||
}
|
||||
|
||||
// 更新serverlist上的status
|
||||
await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.MAINTENANCE });
|
||||
|
||||
// 更新connectorRemote里面的维护服务器
|
||||
console.log('******** startMaintenanceSchedule', batchCode, serverIds, maintenance.startTime, maintenance.endTime)
|
||||
pinus.app.rpc.connector.connectorRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime);
|
||||
pinus.app.rpc.activity.activityRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime);
|
||||
pinus.app.rpc.battle.battleRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime);
|
||||
pinus.app.rpc.chat.chatRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime);
|
||||
pinus.app.rpc.guild.guildRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime);
|
||||
pinus.app.rpc.order.orderRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime);
|
||||
pinus.app.rpc.role.roleRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime);
|
||||
}
|
||||
|
||||
// 提前结束维护
|
||||
export async function stopMaintenance(batchCode: string, serverIds: number[]) {
|
||||
// console.log('***********', serverIds)
|
||||
let { servers = [], maintenance = {} as Maintenance } = maintenInfos.get(batchCode)||{};
|
||||
for(let id of serverIds) {
|
||||
let index = servers.findIndex(cur => cur.id == id);
|
||||
if(index != -1) servers.splice(index);
|
||||
}
|
||||
if(servers.length == 0) {
|
||||
if(scheduledJobs[`maintenNotify${batchCode}`]) scheduledJobs[`maintenNotify${batchCode}`].cancel();
|
||||
if(scheduledJobs[`maintenSec${batchCode}`]) scheduledJobs[`maintenSec${batchCode}`].cancel();
|
||||
if(scheduledJobs[`startMainten${batchCode}`]) scheduledJobs[`startMainten${batchCode}`].cancel();
|
||||
maintenInfos.delete(batchCode);
|
||||
}
|
||||
|
||||
// 更新serverlist上的status
|
||||
await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.HOT, 'maintenance.isOpen': false } as ServerlistUpdate);
|
||||
|
||||
// 更新connectorRemote里面的维护服务器
|
||||
pinus.app.rpc.connector.connectorRemote.stopServerMainten.broadcast(serverIds);
|
||||
pinus.app.rpc.activity.activityRemote.stopServerMainten.broadcast(serverIds);
|
||||
pinus.app.rpc.battle.battleRemote.stopServerMainten.broadcast(serverIds);
|
||||
pinus.app.rpc.chat.chatRemote.stopServerMainten.broadcast(serverIds);
|
||||
pinus.app.rpc.guild.guildRemote.stopServerMainten.broadcast(serverIds);
|
||||
pinus.app.rpc.order.orderRemote.stopServerMainten.broadcast(serverIds);
|
||||
pinus.app.rpc.role.roleRemote.stopServerMainten.broadcast(serverIds);
|
||||
}
|
||||
Reference in New Issue
Block a user