Files
ZYZ/game-server/app/services/gmService.ts
T
2021-12-08 16:23:00 +08:00

172 lines
6.7 KiB
TypeScript

import { MarqueeType, MarqueeModel } from "../db/Marquee";
import { GM_MAIL_STATUS, MAIL_TIME_TYPE, MARQUEE_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";
import { pinus } from "pinus";
import { getWorldChannelSid } from "./chatChannelService";
import { ServerlistModel, ServerlistType } from "../db/Serverlist";
import { NoticeModel, NoticeType } from "../db/Notice";
import { SendMailFun } from "./mailService";
import GMMail, { GMMailModel, GMMailType } from '../db/GMMail';
import moment = require("moment");
import { getSeconds, nowSeconds } from "../pubUtils/timeUtil";
import { CreateServerParam } from "../domain/backEndField/params";
import { RegionModel, RegionType } from "../db/Region";
// —————————————— 跑马灯 —————————————— //
// 初始
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);
return true;
} else {
return await generateMarqueeSchedule(marquee);
}
}
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 () => {
await startMarquee(marquee, startJob)
});
} 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[] = [];
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);
}
}
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
}
export async function sendOpenServerMail(type: 'openMail'|'circleMail', mail: GMMail, newServer: ServerlistType, uid: number) {
let receivers = [{
env: newServer.env,
serverId: newServer.id
}];
let addParam = {...mail, receivers, status: GM_MAIL_STATUS.PASS };
if(type == 'openMail') {
addParam.timeType = MAIL_TIME_TYPE.DELAY;
addParam.startTime = newServer.openTime;
}
let gmmail = await GMMailModel.addMail(addParam, uid);
let needSend = false;
if(mail.timeType == MAIL_TIME_TYPE.CIRCLE) {
let refTimeStr = REF_CIRCLE_MAIL_TIME >= 10? `${REF_CIRCLE_MAIL_TIME}`: `0${REF_CIRCLE_MAIL_TIME}`;
let refTime = moment(moment().format(`YYYY-MM-DD ${refTimeStr}:00:00`)).unix();
let sendTime = moment(moment().format('YYYY-MM-DD '+ mail.circleHour)).unix();
if(sendTime < refTime) sendTime += 86400;
let now = nowSeconds();
if(refTime < now && sendTime > now) {
needSend = true;
}
} else {
needSend = true;
}
if(needSend) {
let f = new SendMailFun();
await f.setWithGmMail(gmmail);
await f.sendToServer([newServer.id]);
}
return true;
}
export function setServerMainten(serverIds: number[], startTime: number, endTime: number) {
let maintenServers = pinus.app.get('maintenServers')||new Map();
for(let id of serverIds) {
if(!maintenServers.has(id)) {
maintenServers.set(id, { startTime, endTime });
} else {
maintenServers.get(id).startTime = startTime;
maintenServers.get(id).endTime = endTime;
}
}
pinus.app.set('maintenServers', maintenServers);
}
export function stopServerMainten(serverIds: number[]) {
let maintenServers = pinus.app.get('maintenServers')||new Map();
for(let id of serverIds) {
if(maintenServers.has(id)) {
maintenServers.delete(id);
}
}
pinus.app.set('maintenServers', maintenServers);
}
export function getServerMainten(serverId: number) {
let maintenServers = pinus.app.get('maintenServers')||new Map();
return maintenServers.get(serverId);
}
export async function createNewServer(region: RegionType ,serverId: number, params: CreateServerParam, uid?: number) {
let newServer = await ServerlistModel.newServer(params, region, serverId, uid);
if(params.openMail) await sendOpenServerMail('openMail', params.openMail, newServer, uid);
if(params.circleMail) await sendOpenServerMail('circleMail', params.circleMail, newServer, uid);
await RegionModel.newServer(region.id, newServer);
}