系统:停服维护逻辑

This commit is contained in:
luying
2021-07-15 14:40:26 +08:00
parent 352aecfb56
commit 0028c9b992
26 changed files with 348 additions and 50 deletions
@@ -1,10 +1,17 @@
import { MarqueeType, MarqueeModel } from "../db/Marquee";
import { MARQUEE_TYPE, STATUS } from "../consts";
import { MARQUEE_TYPE, STATUS, 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 { resResult } from "../pubUtils/util";
import { MaintenanceModel, MaintenanceType } from '../db/Maintenance';
import { pinus } from "pinus";
import { getWorldChannelSid } from "./chatChannelService";
import { ServerlistModel } from "../db/Serverlist";
import { NoticeModel, NoticeType } from "../db/Notice";
// —————————————— 跑马灯 —————————————— //
// 初始
export async function initMarquee() {
const marquees = await MarqueeModel.findEffectiveMarque();
for(let marquee of marquees) {
@@ -24,6 +31,9 @@ export async function setMarquee(code: string) {
}
async function generateMarqueeSchedule(marquee: MarqueeType) {
let setSecondsMarquee = scheduledJobs[`setSeconds${marquee.code}`];
if(setSecondsMarquee) return false; // 已经在运行中了
if(marquee.type != MARQUEE_TYPE.SCHEDULE) return false;
if(marquee.startTime.getTime() >= marquee.endTime.getTime()) return false;
if(marquee.endTime.getTime() < Date.now()) return false;
@@ -88,4 +98,44 @@ export async function cancelMarquee(code: string) {
if(endMarquee) endMarquee.cancel();
await MarqueeModel.updateData(code, { isRunning: false });
return true
}
// —————————————— 停服维护 —————————————— //
// 维护信息
export async function initMaintenance() {
const maintenance = await MaintenanceModel.findOpenMaintenance();
if(maintenance) {
let { startTime, marquee } = maintenance;
if(marquee) await generateMarqueeSchedule(<MarqueeType>marquee);
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);
}
// 更新serverlist上的status
await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.MAINTENANCE });
// 更新notice的isEnable
if(notice) {
await NoticeModel.updateNotice((<NoticeType>notice).id, { isEnable: true });
}
// 更新connectorRemote里面的
let connectorServers = pinus.app.getServersByType('connector');
for(let { id } of connectorServers) {
pinus.app.rpc.connector.connectorRemote.setServerMainten.toServer(id, serverIds);
}
if(startJob) startJob.cancel();
}
+5 -2
View File
@@ -1,5 +1,5 @@
import { scheduleJob, Job } from 'node-schedule';
import { scheduleJob, Job, scheduledJobs } from 'node-schedule';
import { SystemConfigModel } from '../db/SystemConfig';
import PvpDefenseType,{ PvpDefenseModel } from '../db/PvpDefense';
import { PVP } from '../pubUtils/dicParam';
@@ -27,7 +27,7 @@ import { dispatch } from '../util/dispatcher';
import { Rank } from './rankService';
import { checkTask } from './taskService';
import { everydayRefresh } from './connectorService';
import { initMarquee } from './marqueeService';
import { initMarquee, initMaintenance } from './gmService';
const PER_SECOND = 1 * 1000;
const PER_DAY = 24 * 60 * 60;
@@ -87,6 +87,9 @@ export async function init() {
// 跑马灯
await initMarquee();
// 维护信息
await initMaintenance();
}
function setPvpSeasonSchdule() {