聊天:添加跑马灯功能

This commit is contained in:
luying
2021-07-02 17:23:18 +08:00
parent 4fce369680
commit e9280a38c9
8 changed files with 187 additions and 1 deletions
@@ -0,0 +1,66 @@
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);
}
}
@@ -10,6 +10,7 @@ import { pinus } from 'pinus';
import { resResult } from '../pubUtils/util';
import { BossInstanceType } from '../db/BossInstance';
import { getSimpleRoleInfo } from './roleService';
import { GroupMessageType } from '../db/GroupMessage';
async function pushNormalHeroInfoBySource(roleId: string, roleName: string, serverId: number | string, source: number, heroInfo: Partial<HeroType>) {
const hero = pick(heroInfo, ['hName', 'hid', 'seqId', 'quality', 'star', 'starStage', 'colorStar', 'colorStarStage']);
@@ -140,6 +141,15 @@ export async function pushVestigeFirstMsg(roleId: string, roleName: string, serv
return result;
}
export async function createMarqueeMsg(roleId: string, roleName: string, serverId: number | string, content: string) {
const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.SYS, `${serverId}`, MSG_TYPE.RICH_TEXT, MSG_SOURCE.SEND_MARQUEE, content, null, null);
return msgData;
}
export async function pushMarqueeMsg(msgData: GroupMessageType) {
await pushGroupMsgToRoom(msgData);
}
function shouldPushTowerMsg(lv: number) {
// 100 层之后每 50 层触发
return lv >= 100 && lv % 50 === 0;
+5 -1
View File
@@ -27,6 +27,7 @@ import { dispatch } from '../util/dispatcher';
import { Rank } from './rankService';
import { checkTask } from './taskService';
import { everydayRefresh } from './connectorService';
import { initMarquee } from './marqueeService';
const PER_SECOND = 1 * 1000;
const PER_DAY = 24 * 60 * 60;
@@ -83,6 +84,9 @@ export async function init() {
// 每天5点推送刷新时间消息
// 顺便每天0点计算前一天活跃玩家中位数战力
scheduleJob('everyDayRefresh', `0 0 ${REFRESH_TIME} * * ?`, everydayRefresh);
// 跑马灯
await initMarquee();
}
function setPvpSeasonSchdule() {
@@ -388,7 +392,7 @@ async function guildActivityStartSchedule() {
}
export async function guildActivityStart(dicGuildActivity?: DicGuildActivity) {
console.log('***********开始军团晚间活动****')
console.log('*******开始军团晚间活动****')
if(!dicGuildActivity) dicGuildActivity = getTodayGuildActivity();
if(!dicGuildActivity) return;