import { MarqueeType, MarqueeModel } from "../db/Marquee"; import { MARQUEE_TYPE } from "../consts"; import { scheduleJob } from 'node-schedule'; import { createMarqueeMsg as sysCreateMarqueeMsg, pushMarqueeMsg as sysPushMarqueeMsg } from './sysChatService'; import { GroupMessageType } from "../db/GroupMessage"; export async function initMarquee() { const marquees = await MarqueeModel.findEffectiveMarque(); for(let marquee of marquees) { await generateMarqueeSchedule(marquee); } } export async function setMarquee(code: string) { let marquee = await MarqueeModel.findByCode(code); if(marquee.type == MARQUEE_TYPE.INSTANT) { let msgDatas = await createMarqueeMsg(marquee); await pushMarqueeMsg(msgDatas); } else { 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); }); 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; } }); }); return true; } async function createMarqueeMsg(marquee: MarqueeType) { let { serverIds, content } = marquee; let msgDatas: GroupMessageType[] = []; for(let serverId of serverIds) { let msgData = await sysCreateMarqueeMsg('', '系统', serverId, content); msgDatas.push(msgData); } return msgDatas; } async function pushMarqueeMsg(msgDatas: GroupMessageType[]) { for(let msgData of msgDatas) { await sysPushMarqueeMsg(msgData); } }