系统:停服维护逻辑
This commit is contained in:
@@ -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();
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user