后台:跑马灯

This commit is contained in:
luying
2021-12-09 20:38:23 +08:00
parent 3db2735d6e
commit ecca95b40b
12 changed files with 187 additions and 94 deletions
@@ -126,34 +126,14 @@ export class GmHandler {
}
}
async createMarquee(msg: { startTime: string, endTime: string, interval: number, content: string }, session: BackendSession) {
async createMarquee(msg: { startTime: number, endTime: number, interval: number, content: string }, session: BackendSession) {
const { startTime, endTime, interval, content } = msg;
let marquee = await MarqueeModel.createData({ serverIds: [1], type: 2, startTime: new Date(startTime), endTime: new Date(endTime), interval, content });
let marquee = await MarqueeModel.createData({ timeType: 2, startTime, endTime, interval, content });
return resResult(STATUS.SUCCESS, {
code: marquee.code
});
}
async sendMarquee(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.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);
}
async updateActivity(msg: { activityId: number|string, groupId: number, beginTime: number, endTime: number, type: number, data: string }, session: BackendSession) {
const { activityId, groupId, beginTime, endTime, type, data } = msg;
const uid = session.get('uid');
@@ -12,6 +12,7 @@ import { SendMailFun } from '../../../services/mailService';
import { createNewServer, sendOpenServerMail } from '../../../services/gmService';
import { initAutoCreateServer, initMaintenance, stopMaintenance } from '../../../services/timeTaskService';
import { isNumber } from 'util';
import { MarqueeModel } from '../../../db/Marquee';
let timer: NodeJS.Timer;
export default function (app: Application) {
return new GmHandler(app);
@@ -101,4 +102,23 @@ export class GmHandler {
return resResult(STATUS.SUCCESS,);
}
async sendMarquee(msg: { code: string }, session: BackendSession) {
const { code } = msg;
let marquee = await MarqueeModel.findByCode(code);
if(!marquee) return resResult(STATUS.DB_DATA_NOT_FOUND);
await MarqueeModel.updateData(code, { isEnable: true });
let result = await this.app.rpc.systimer.systimerRemote.setMarquee.broadcast(marquee);
if (!result) return resResult(STATUS.GM_MARQUEE_ERR);
return resResult(STATUS.SUCCESS);
}
async cancelMarquee(msg: { code: string }, session: BackendSession) {
const { code } = msg;
await MarqueeModel.updateData(code, { isEnable: false });
let result = await this.app.rpc.systimer.systimerRemote.cancelMarquee.broadcast(code);
if (!result) return resResult(STATUS.GM_MARQUEE_CANCEL_ERR);
return resResult(STATUS.SUCCESS);
}
}
@@ -7,6 +7,7 @@ import { setMarquee, cancelMarquee } from '../../../services/gmService';
import { setDicAuctionTime, setDicGuildActivity } from '../../../services/guildActivityService';
import { setWeek } from '../../../pubUtils/timeUtil';
import { ServerlistType } from '../../../db/Serverlist';
import { MarqueeType } from '../../../db/Marquee';
export default function (app: Application) {
return new SystimerRemote(app);
@@ -51,8 +52,8 @@ export class SystimerRemote {
* @description 设置跑马灯配置
* @param code 跑马灯唯一code
*/
public async setMarquee(code: string) {
return await setMarquee(code);
public async setMarquee(marquee: MarqueeType) {
return await setMarquee(marquee);
}
public async cancelMarquee(code: string) {
+50 -32
View File
@@ -1,5 +1,5 @@
import { MarqueeType, MarqueeModel } from "../db/Marquee";
import { GM_MAIL_STATUS, GM_MAIL_TYPE, MAIL_TIME_TYPE, MARQUEE_TYPE, REF_CIRCLE_MAIL_TIME, SERVER_STATUS } from "../consts";
import Marquee, { MarqueeType, MarqueeModel } from "../db/Marquee";
import { GM_MAIL_STATUS, GM_MAIL_TYPE, MAIL_TIME_TYPE, MARQUEE_SHOW_TYPE, MARQUEE_TIME_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";
@@ -14,21 +14,21 @@ import { getSeconds, nowSeconds } from "../pubUtils/timeUtil";
import { CreateServerParam } from "../domain/backEndField/params";
import { RegionModel, RegionType } from "../db/Region";
import { GMMail as StategyMail } from "../db/ServerStategy";
import { uniq } from "underscore";
// —————————————— 跑马灯 —————————————— //
// 初始
export async function initMarquee() {
const marquees = await MarqueeModel.findEffectiveMarque();
const marquees = await MarqueeModel.findEffectiveMarque(pinus.app.get('env'));
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);
export async function setMarquee(marquee: MarqueeType) {
console.log('******', marquee.timeType, marquee)
if(marquee.timeType == MARQUEE_TIME_TYPE.INSTANT) {
await startMarquee(marquee);
return true;
} else {
return await generateMarqueeSchedule(marquee);
@@ -36,14 +36,14 @@ 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;
if(marquee.startTime.getTime() > Date.now()) {
let startJob = scheduleJob(`start${marquee.code}`, marquee.startTime.getTime(), async () => {
if(marquee.timeType != MARQUEE_TIME_TYPE.SCHEDULE) return false;
if(marquee.endTime && marquee.endTime < nowSeconds()) return false;
if(marquee.startTime > nowSeconds()) {
let startJob = scheduleJob(`start${marquee.code}`, marquee.startTime * 1000, async () => {
await startMarquee(marquee, startJob)
});
} else {
@@ -54,37 +54,56 @@ async function generateMarqueeSchedule(marquee: MarqueeType) {
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}****`)
if(marquee.showType == MARQUEE_SHOW_TYPE.ONCE) { // 一次性发送
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 });
});
} else {
await pushMarqueeMsg(msgDatas);
console.log('***', marquee.interval)
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 * 1000, async () => {
if(startJob) {
startJob.cancel();
startJob = undefined;
}
if(secondsJob) {
secondsJob.cancel();
secondsJob = undefined;
}
if(endJob) {
endJob.cancel();
endJob = undefined;
}
});
}
}
async function createMarqueeMsg(marquee: MarqueeType) {
let { serverIds, content } = marquee;
let { receivers, content } = marquee;
let msgDatas: GroupMessageType[] = [];
for(let serverId of serverIds) {
let serverIds: number[] = [];
for(let { env, serverId } of receivers) {
if(serverId == 0) {
let servers = await ServerlistModel.findByEnv(env);
for(let { serverId } of servers) {
serverIds.push(serverId);
}
} else {
serverIds.push(serverId);
}
}
for(let serverId of uniq(serverIds)) {
let msgData = await sysCreateMarqueeMsg('', '系统', serverId, content);
msgDatas.push(msgData);
}
return msgDatas;
}
@@ -101,7 +120,6 @@ export async function cancelMarquee(code: string) {
if(startMarquee) startMarquee.cancel();
if(setSecondsMarquee) setSecondsMarquee.cancel();
if(endMarquee) endMarquee.cancel();
await MarqueeModel.updateData(code, { isRunning: false });
return true
}
+1 -1
View File
@@ -552,7 +552,7 @@ function setStategyTimer(timerId: number, region: RegionType) {
case SERVER_TIMER.TEN_HALF:
cron = '0 30 10 * * *'; break;
case SERVER_TIMER.FIFTEEN_HALF:
cron = '0 19 16 * * *'; break;
cron = '0 30 15 * * *'; break;
case SERVER_TIMER.NINETEEN_HALF:
cron = '0 30 19 * * *'; break;
}