diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index b5655dc3c..b28d6147e 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -20,7 +20,7 @@ import { ActivityGroupModel } from '../../../db/ActivityGroup'; import { ActivityGroupTypeModel } from '../../../db/ActivityGroupType'; import { GuildActivityCityModel } from '../../../db/GuildActivityCity'; import { GuildActivityRecordModel } from '../../../db/GuildActivityRec'; -import { getTimeFunM } from '../../../pubUtils/timeUtil'; +import { getTimeFunM, nowSeconds } from '../../../pubUtils/timeUtil'; import { sendUngotDividend } from '../../../services/auctionService'; import moment = require('moment'); let timer: NodeJS.Timer; @@ -43,15 +43,29 @@ export class GmHandler { if(status != GM_MAIL_STATUS.CREATE) { return resResult(STATUS.GM_MAIL_HAS_SENT); } + let needSend = false; if(isPass) { + if(timeType == MAIL_TIME_TYPE.CIRCLE) { + let refTime = moment(moment().format('YYYY-MM-DD 03:00:00')).unix(); + let sendTime = moment(moment().format('YYYY-MM-DD '+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); if (mailType == GM_MAIL_TYPE.SINGLE || mailType == GM_MAIL_TYPE.GROUP) { - let roleIds = receivers.map(cur => cur.roleId); + let roleIds = receivers.filter(cur => cur.env == this.app.get('env')).map(cur => cur.roleId); await f.sendToUsers(mailType, roleIds); } else { - let serverIds = receivers.map(cur => cur.serverId); + let serverIds = receivers.filter(cur => cur.env == this.app.get('env')).map(cur => cur.serverId); await f.sendToServer(serverIds); } // await f.saveRecord(uid); diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 2d6110c0e..dd575a0ab 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -5,13 +5,13 @@ import { nowSeconds, getTimeFun, getSeconds } from '../pubUtils/timeUtil'; import { getTodayGuildActivity, gameData } from '../pubUtils/data'; import { pvpSeasonEnd } from './pvpService'; import { getAllOnlineRoles, getAllServers, delGuildActivityRank } from './redisService'; -import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, SEND_NAME, SERVER_OPEN_TIME, COUNTER, AUCTION_TIME } from '../consts'; +import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, SEND_NAME, SERVER_OPEN_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE } from '../consts'; import { RoleModel } from '../db/Role'; import { pinus } from 'pinus'; import { indexOf } from 'underscore'; import { PvpSeasonResultModel } from '../db/PvpSeasonResult'; import { settleGuildWeekly } from './guildService'; -import { sendMailByContent } from './mailService'; +import { sendMailByContent, SendMailFun } from './mailService'; import { getGuildActivityByDic, sendEndMsgToAll, autoDeclare, sendGuildActivityStatus } from './guildActivityService'; import { sendUngotDividendJob, startGuildAuction, startWorldAuction, stopAuction } from './auctionService'; import { DicGuildActivity } from '../pubUtils/dictionary/DicGuildActivity'; @@ -25,6 +25,7 @@ import { CounterModel } from '../db/Counter'; import { reportOneOnline } from './authenticateService'; import { PVP } from '../pubUtils/dicParam'; import { fetch37Words } from './sdkService'; +import { GMMailModel } from '../db/GMMail'; const PER_SECOND = 1 * 1000; const PER_DAY = 24 * 60 * 60; @@ -59,6 +60,9 @@ export async function init() { // 每天拉取37词库 scheduleJob('fetchWord', '0 0 4 * * ?', fetch37Words); + // 每天邮件 + scheduleJob('circleMail', '0 0 3 * * ?', sendCircleMail); + // 军团活动排行榜 guildActivitySchedule(); @@ -374,4 +378,22 @@ function clearAuctionSchedule() { sendUngotDividendJobId.cancel(); sendUngotDividendJobId = undefined; } +} + + +async function sendCircleMail() { + let gmmails = await GMMailModel.findCircleMails(pinus.app.get('env')); + for(let gmmail of gmmails) { + let { receivers, mailType } = gmmail; + let f = new SendMailFun(); + await f.setWithGmMail(gmmail); + + if (mailType == GM_MAIL_TYPE.SINGLE || mailType == GM_MAIL_TYPE.GROUP) { + let roleIds = receivers.map(cur => cur.roleId); + await f.sendToUsers(mailType, roleIds); + } else { + let serverIds = receivers.map(cur => cur.serverId); + await f.sendToServer(serverIds); + } + } } \ No newline at end of file diff --git a/shared/db/GMMail.ts b/shared/db/GMMail.ts index 9baf2d987..65d394359 100644 --- a/shared/db/GMMail.ts +++ b/shared/db/GMMail.ts @@ -5,6 +5,7 @@ import BaseModel from './BaseModel'; import { getModelForClass, prop, DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose'; import { GM_MAIL_STATUS, GM_MAIL_TYPE, MAIL_TIME_TYPE } from '../consts'; import { SearchMailParam } from '../domain/backEndField/search'; +import { getCurDay, nowSeconds } from '../pubUtils/timeUtil'; class Reward { @prop({ required: true }) @@ -142,6 +143,15 @@ export default class GMMail extends BaseModel { return result; } + public static async findCircleMails(env: string) { + const result: GMMailType[] = await GMMailModel.find({ + timeType: MAIL_TIME_TYPE.CIRCLE, + circleStart: { $lt: nowSeconds() }, circleEnd: { $gte: nowSeconds() }, + circleDay: { $in: [0, getCurDay(true)] }, 'receivers.env': env, + status: GM_MAIL_STATUS.PASS + }); + return result; + } }