后台:跑马灯
This commit is contained in:
@@ -168,7 +168,18 @@ export class GmHandler {
|
||||
const { code } = msg;
|
||||
let systimerServers = this.app.getServersByType('systimer');
|
||||
for(let { id } of systimerServers) {
|
||||
await this.app.rpc.systimer.systimerRemote.setMarquee.toServer(id, code);
|
||||
let result = await this.app.rpc.systimer.systimerRemote.setMarquee.toServer(id, code);
|
||||
if(!result) return resResult(STATUS.GM_MARQUEE_ERR);
|
||||
}
|
||||
return resResult(STATUS.SUCCESS);
|
||||
}
|
||||
|
||||
async cancelMarquee(msg: { code: string }, session: BackendSession) {
|
||||
const { code } = msg;
|
||||
let systimerServers = this.app.getServersByType('systimer');
|
||||
for(let { id } of systimerServers) {
|
||||
let result = await this.app.rpc.systimer.systimerRemote.cancelMarquee.toServer(id, code);
|
||||
if(!result) return resResult(STATUS.GM_MARQUEE_CANCEL_ERR);
|
||||
}
|
||||
return resResult(STATUS.SUCCESS);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import { resetPvpSeasonTime, setPvpDefResult, guildActivityStart, gateActivityEn
|
||||
import PvpDefenseType from '../../../db/PvpDefense';
|
||||
import { DicGuildActivity } from '../../../pubUtils/dictionary/DicGuildActivity';
|
||||
import { reloadResources } from '../../../pubUtils/data';
|
||||
import { setMarquee } from '../../../services/marqueeService';
|
||||
import { setMarquee, cancelMarquee } from '../../../services/marqueeService';
|
||||
|
||||
export default function (app: Application) {
|
||||
return new SystimerRemote(app);
|
||||
@@ -53,6 +53,10 @@ export class SystimerRemote {
|
||||
* @param code 跑马灯唯一code
|
||||
*/
|
||||
public async setMarquee(code: string) {
|
||||
await setMarquee(code);
|
||||
return await setMarquee(code);
|
||||
}
|
||||
|
||||
public async cancelMarquee(code: string) {
|
||||
return await cancelMarquee(code);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { MarqueeType, MarqueeModel } from "../db/Marquee";
|
||||
import { MARQUEE_TYPE } from "../consts";
|
||||
import { scheduleJob } from 'node-schedule';
|
||||
import { MARQUEE_TYPE, 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";
|
||||
|
||||
export async function initMarquee() {
|
||||
const marquees = await MarqueeModel.findEffectiveMarque();
|
||||
@@ -16,39 +17,52 @@ export async function setMarquee(code: string) {
|
||||
if(marquee.type == MARQUEE_TYPE.INSTANT) {
|
||||
let msgDatas = await createMarqueeMsg(marquee);
|
||||
await pushMarqueeMsg(msgDatas);
|
||||
return true;
|
||||
} else {
|
||||
await generateMarqueeSchedule(marquee);
|
||||
return await generateMarqueeSchedule(marquee);
|
||||
}
|
||||
}
|
||||
|
||||
async function generateMarqueeSchedule(marquee: MarqueeType) {
|
||||
if(marquee.type != MARQUEE_TYPE.SCHEDULE) return false;
|
||||
if(marquee.startTime.getTime() >= marquee.endTime.getTime()) return false
|
||||
let startJob = scheduleJob(`start${marquee.code}`, marquee.startTime.getTime(), async () => {
|
||||
console.log('************', `跑马灯定时器 ${marquee.code}开始`, '************');
|
||||
let msgDatas = await createMarqueeMsg(marquee);
|
||||
await pushMarqueeMsg(msgDatas);
|
||||
let secondsJob = scheduleJob(`setSeconds${marquee.code}`, `*/${marquee.interval} * * * * *`, async () => {
|
||||
await pushMarqueeMsg(msgDatas);
|
||||
if(marquee.startTime.getTime() >= marquee.endTime.getTime()) return false;
|
||||
if(marquee.endTime.getTime() < Date.now()) return false;
|
||||
if(marquee.startTime.getTime() > Date.now()) {
|
||||
let startJob = scheduleJob(`start${marquee.code}`, marquee.startTime.getTime(), async () => {
|
||||
await startMarquee(marquee, startJob)
|
||||
});
|
||||
let endJob = scheduleJob(`end${marquee.code}`, marquee.endTime.getTime(), () => {
|
||||
if(startJob) {
|
||||
startJob.cancel();
|
||||
startJob = undefined;
|
||||
}
|
||||
if(secondsJob) {
|
||||
secondsJob.cancel();
|
||||
secondsJob = undefined;
|
||||
}
|
||||
if(endJob) {
|
||||
endJob.cancel();
|
||||
endJob = undefined;
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
await startMarquee(marquee)
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
async function startMarquee(marquee: MarqueeType, startJob?: Job) {
|
||||
console.log('************', `跑马灯定时器 ${marquee.code}开始`, '************');
|
||||
await MarqueeModel.updateData(marquee.code, { isRunning: true });
|
||||
let msgDatas = await createMarqueeMsg(marquee);
|
||||
await pushMarqueeMsg(msgDatas);
|
||||
let secondsJob = scheduleJob(`setSeconds${marquee.code}`, `*/${marquee.interval} * * * * *`, async () => {
|
||||
console.log(`*****setSeconds${marquee.code}****`)
|
||||
await pushMarqueeMsg(msgDatas);
|
||||
});
|
||||
let endJob = scheduleJob(`end${marquee.code}`, marquee.endTime.getTime(), async () => {
|
||||
if(startJob) {
|
||||
startJob.cancel();
|
||||
startJob = undefined;
|
||||
}
|
||||
if(secondsJob) {
|
||||
secondsJob.cancel();
|
||||
secondsJob = undefined;
|
||||
}
|
||||
if(endJob) {
|
||||
endJob.cancel();
|
||||
endJob = undefined;
|
||||
}
|
||||
await MarqueeModel.updateData(marquee.code, { isRunning: false });
|
||||
});
|
||||
}
|
||||
|
||||
async function createMarqueeMsg(marquee: MarqueeType) {
|
||||
let { serverIds, content } = marquee;
|
||||
let msgDatas: GroupMessageType[] = [];
|
||||
@@ -63,4 +77,15 @@ async function pushMarqueeMsg(msgDatas: GroupMessageType[]) {
|
||||
for(let msgData of msgDatas) {
|
||||
await sysPushMarqueeMsg(msgData);
|
||||
}
|
||||
}
|
||||
|
||||
export async function cancelMarquee(code: string) {
|
||||
let startMarquee = scheduledJobs[`start${code}`];
|
||||
let setSecondsMarquee = scheduledJobs[`setSeconds${code}`];
|
||||
let endMarquee = scheduledJobs[`end${code}`];
|
||||
if(startMarquee) startMarquee.cancel();
|
||||
if(setSecondsMarquee) setSecondsMarquee.cancel();
|
||||
if(endMarquee) endMarquee.cancel();
|
||||
await MarqueeModel.updateData(code, { isRunning: false });
|
||||
return true
|
||||
}
|
||||
Reference in New Issue
Block a user