diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index a8e322af0..4001be3ca 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -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); } diff --git a/game-server/app/servers/systimer/remote/systimerRemote.ts b/game-server/app/servers/systimer/remote/systimerRemote.ts index 166dd783e..a82a1dbce 100644 --- a/game-server/app/servers/systimer/remote/systimerRemote.ts +++ b/game-server/app/servers/systimer/remote/systimerRemote.ts @@ -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); } } diff --git a/game-server/app/services/marqueeService.ts b/game-server/app/services/marqueeService.ts index c1d5d3135..eb7651468 100644 --- a/game-server/app/services/marqueeService.ts +++ b/game-server/app/services/marqueeService.ts @@ -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 } \ No newline at end of file diff --git a/gm-server/app/service/Game.ts b/gm-server/app/service/Game.ts index d1d8ffc54..397796438 100644 --- a/gm-server/app/service/Game.ts +++ b/gm-server/app/service/Game.ts @@ -32,9 +32,12 @@ export default class Game extends Service { /** * 获取正式服,测试服,开发服等环境 */ - public async getServerListByEnv(serverType?: string) { - const { ctx } = this; - const list = await ServerlistModel.findByServerType(serverType); + public async getServerListByEnv() { + const { ctx, app } = this; + let env = app.config.env + let serverEnv = await GameModel.getServerEnvList(); + let curEnv = serverEnv.find(cur => cur.env == env); + const list = await ServerlistModel.findByServerType(curEnv?.serverType); return ctx.service.utils.resResult(STATUS.SUCCESS, { list diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 803f22ad2..43a2ef758 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -397,6 +397,8 @@ export const STATUS = { GM_ACTIVITY_GROUP_NOT_FOUND: { code: 60019, simStr: '未找到该活动组' }, GM_ACTIVITY_GROUP_TYPE_NOT_FOUND: { code: 60020, simStr: '未找到活动组类型' }, GM_ACTIVITY_NOT_FIT_GROUP_TYPE: { code: 60021, simStr: '该活动不满足该活动组类型' }, + GM_MARQUEE_ERR: { code: 60022, simStr: '跑马灯定时设置错误' }, + GM_MARQUEE_CANCEL_ERR: { code: 60023, simStr: '取消失败' }, // 支付相关状态 70000 - 79999 NO_PRODUCT_ID: { code: 70001, simStr: '无效商品' }, NO_PAY_TYPE: { code: 70002, simStr: '无效支付类型' }, diff --git a/shared/db/Marquee.ts b/shared/db/Marquee.ts index 5648b8e69..97c5c33fd 100644 --- a/shared/db/Marquee.ts +++ b/shared/db/Marquee.ts @@ -29,6 +29,9 @@ export default class Marquee extends BaseModel { @prop({ required: true }) content: string; // 广播内容 + @prop({ required: true }) + isRunning: boolean; // 当前正在发布 + /** * 创建跑马灯 * @param params 参数 @@ -75,10 +78,7 @@ export default class Marquee extends BaseModel { private static getSearchObj(form: { type?: number, current?: boolean, content?: string }) { let searchObj = {}; if(form['type']) searchObj['type'] = form.type; - if(form['current']) { - searchObj['startTime'] = { $lte: new Date }; - searchObj['endTime'] = { $gte: new Date }; - } + if(form['current']) searchObj['isRunning'] = form.current if(form['content']) searchObj['content'] = { $regex: new RegExp(form.content.toString(), 'i') }; return searchObj }