From fbcdbf149b1c0117d3e2bf3e342d33d30fee45af Mon Sep 17 00:00:00 2001 From: luying Date: Thu, 10 Mar 2022 10:07:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=EF=BC=9A=E9=99=90=E6=97=B6?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E5=90=8E=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/servers/gm/handler/gmHandler.ts | 1 + .../servers/systimer/remote/systimerRemote.ts | 11 +++- .../services/activity/timeLimitRankService.ts | 62 ++++++++++--------- game-server/app/services/timeTaskService.ts | 36 ++++++----- shared/domain/activityField/activityField.ts | 2 + .../resource/jsons/dic_zyz_activityType.json | 2 +- 6 files changed, 70 insertions(+), 44 deletions(-) diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index 0977bf245..026f432d0 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -180,6 +180,7 @@ export class GmHandler { for(let server of activityServers) { pinus.app.rpc.activity.activityRemote.updateActivities.toServer(server.id, activities.map(activity => new ActivityInRemote(activity))); } + pinus.app.rpc.systimer.systimerRemote.updateTimeLimitRank.broadcast(activities); return resResult(STATUS.SUCCESS, { activity: activities diff --git a/game-server/app/servers/systimer/remote/systimerRemote.ts b/game-server/app/servers/systimer/remote/systimerRemote.ts index 5b40e39e9..93902c3c8 100644 --- a/game-server/app/servers/systimer/remote/systimerRemote.ts +++ b/game-server/app/servers/systimer/remote/systimerRemote.ts @@ -1,5 +1,5 @@ import { Application, ChannelService } from 'pinus'; -import { resetPvpSeasonTime, guildActivityStart, gateActivityEnd, cityActivityEnd, raceActivityEnd, guildActivitySchedule, auctionSchedule, initMaintenance, stopMaintenance, initAutoCreateServer, addMailsToSchedule } from '../../../services/timeTaskService'; +import { resetPvpSeasonTime, guildActivityStart, gateActivityEnd, cityActivityEnd, raceActivityEnd, guildActivitySchedule, auctionSchedule, initMaintenance, stopMaintenance, initAutoCreateServer, addMailsToSchedule, updateTimeLimitRank } from '../../../services/timeTaskService'; import PvpDefenseType from '../../../db/PvpDefense'; import { DicGuildActivity } from '../../../pubUtils/dictionary/DicGuildActivity'; import { reloadResources } from '../../../pubUtils/data'; @@ -14,6 +14,7 @@ import { errlogger } from '../../../util/logger'; import { MailType } from '../../../db/Mail'; import { GroupMailType } from '../../../db/GroupMail'; import { ServerMailType } from '../../../db/ServerMail'; +import { ActivityModelType } from '../../../db/Activity'; export default function (app: Application) { return new SystimerRemote(app); @@ -189,4 +190,12 @@ export class SystimerRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async updateTimeLimitRank(activities: ActivityModelType[]) { + try { + await updateTimeLimitRank(activities); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } diff --git a/game-server/app/services/activity/timeLimitRankService.ts b/game-server/app/services/activity/timeLimitRankService.ts index f22ddb042..58f5f6ec9 100644 --- a/game-server/app/services/activity/timeLimitRankService.ts +++ b/game-server/app/services/activity/timeLimitRankService.ts @@ -62,35 +62,41 @@ export async function recordGuildFund(serverId: number, guild: GuildType, fund: * @returns */ export async function sendRankMail(data: TimeLimitRankData) { - let redisKey = getRedisKeyByRankType(data.rankType); - if (!redisKey) return null; - let r = new Rank(redisKey, { activityId: data.activityId }); - if(r.infoKey == REDIS_KEY.GUILD_INFO) { - let allRank = (await r.getRankByRange()); - - for(let { rank, code, name, leader } of allRank) { - let reward = data.getRewardByRank(rank); - if(reward) { - await sendMailToGuildByContent(MAIL_TYPE.TIME_LIMIT_RANK, code, { - params: [data.tabName,`${rank}`], - goods: stringToRewardInter(reward.guildRewards) - }); - if(leader.roleId) await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, leader.roleId, { - params: [data.tabName,`${rank}`], - goods: stringToRewardInter(reward.rewards) - }); + let group = await ActivityGroupModel.findGroupData(data.groupId); + let serverIds = group?.serverIds||[]; + for(let serverId of serverIds) { + let redisKey = getRedisKeyByRankType(data.rankType, true); + console.log('#### redisKey', redisKey, serverId) + if (!redisKey) return null; + let r = new Rank(redisKey, { activityId: data.activityId, serverId }); + console.log('#### getRankByRange',r.infoKey, await r.getRankByRange()) + if(r.infoKey == REDIS_KEY.GUILD_INFO) { + let allRank = (await r.getRankByRange()); + + for(let { rank, code, name, leader } of allRank) { + let reward = data.getRewardByRank(rank); + if(reward) { + await sendMailToGuildByContent(MAIL_TYPE.TIME_LIMIT_RANK, code, { + params: [data.tabName,`${rank}`], + goods: stringToRewardInter(reward.guildRewards) + }); + if(leader.roleId) await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, leader.roleId, { + params: [data.tabName,`${rank}`], + goods: stringToRewardInter(reward.rewards) + }); + } } - } - } else { - let allRank = (await r.getRankByRange()); - - for(let { rank, roleId } of allRank) { - let reward = data.getRewardByRank(rank); - if(reward) { - await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleId, { - params: [data.tabName, `${rank}`], - goods: stringToRewardInter(reward.rewards) - }); + } else { + let allRank = (await r.getRankByRange()); + + for(let { rank, roleId } of allRank) { + let reward = data.getRewardByRank(rank); + if(reward) { + await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleId, { + params: [data.tabName, `${rank}`], + goods: stringToRewardInter(reward.rewards) + }); + } } } } diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 0adb5795e..cc1ff5c1c 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -1,23 +1,18 @@ import { scheduleJob, Job, scheduledJobs, } from 'node-schedule'; import { PVPConfigModel, PVPConfigType } from '../db/SystemConfig'; -import { nowSeconds, getTimeFun, getSeconds, getZeroPoint } from '../pubUtils/timeUtil'; +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, GM_MAIL_TYPE, SERVER_STATUS, SERVER_TIMER, ACTIVITY_TYPE, getRedisKeyByRankType, MAIL_TYPE, REDIS_KEY } from '../consts'; -import { RoleModel } from '../db/Role'; +import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE, SERVER_TIMER, ACTIVITY_TYPE } from '../consts'; import { pinus } from 'pinus'; -import { indexOf } from 'underscore'; -import { PvpSeasonResultModel } from '../db/PvpSeasonResult'; import { settleGuildWeekly } from './guildService'; -import { sendMailByContent, SendMailFun, sendMailToGuildByContent } from './mailService'; -import { getGuildActivityByDic, sendEndMsgToAll, autoDeclare, sendGuildActivityStatus } from './guildActivity/guildActivityService'; +import { SendMailFun, } from './mailService'; +import { sendEndMsgToAll, autoDeclare, sendGuildActivityStatus } from './guildActivity/guildActivityService'; import { sendUngotDividendJob, startGuildAuction, startWorldAuction, stopAuction } from './auctionService'; import { DicGuildActivity } from '../pubUtils/dictionary/DicGuildActivity'; import { dispatch } from '../pubUtils/dispatcher'; -import { Rank } from './rankService'; -import { checkTask } from './taskService'; import { everydayRefresh } from './connectorService'; import { createNewServer, initMarquee } from './gmService'; import moment = require('moment'); @@ -26,7 +21,7 @@ import { reportOneOnline } from './authenticateService'; import { PVP } from '../pubUtils/dicParam'; import { fetch37Words } from './sdkService'; import { GMMailModel } from '../db/GMMail'; -import { Maintenance, ServerlistModel, ServerlistType, ServerlistUpdate } from '../db/Serverlist'; +import { Maintenance, ServerlistModel, ServerlistType } from '../db/Serverlist'; import { getWorldChannelSid } from './chatService'; import { createMarqueeMsg, pushMarqueeMsg } from './sysChatService'; import { RegionModel, RegionType } from '../db/Region'; @@ -35,10 +30,8 @@ import { infologger } from '../util/logger'; import { MailModel, MailType } from '../db/Mail'; import { GroupMailModel, GroupMailType } from '../db/GroupMail'; import { ServerMailModel, ServerMailType } from '../db/ServerMail'; -import { ActivityModel } from '../db/Activity'; +import { ActivityModel, ActivityModelType } from '../db/Activity'; import { TimeLimitRankData } from '../domain/activityField/timeLimitRankField'; -import { GuildRankInfo, RoleRankInfo } from '../domain/rank'; -import { stringToRewardInter } from './activity/giftPackageService'; import { sendRankMail, takeSnapshot } from './activity/timeLimitRankService'; const PER_SECOND = 1 * 1000; @@ -705,25 +698,40 @@ async function initTimeLimitRank() { } -async function setSendRankMailSchedule(data: TimeLimitRankData) { +export async function updateTimeLimitRank(activities: ActivityModelType[]) { + for(let activity of activities) { + let data = new TimeLimitRankData(activity, 0); + if(data.sendMailTime > Date.now()) { + await setSendRankMailSchedule(data); + } + if(data.rankEndTime > Date.now() && data.needSnapshot()) { + await setTakeRankSnapshotSchedule(data, activity.groupId); + } + } +} +async function setSendRankMailSchedule(data: TimeLimitRankData) { + console.log('########### setSendRankMailSchedule1 ########') if(scheduledJobs[`rankMail${data.activityId}`]) { scheduledJobs[`rankMail${data.activityId}`].cancel(); } scheduleJob(`rankMail${data.activityId}`, data.sendMailTime, async () => { + console.log('########### setSendRankMailSchedule2 ########') await sendRankMail(data); }) } async function setTakeRankSnapshotSchedule(data: TimeLimitRankData, groupId: number) { + console.log('########### setTakeRankSnapshotSchedule1 ########') if(scheduledJobs[`snapshot${data.activityId}`]) { scheduledJobs[`snapshot${data.activityId}`].cancel(); } scheduleJob(`snapshot${data.activityId}`, data.rankEndTime, async () => { + console.log('########### setTakeRankSnapshotSchedule2 ########') await takeSnapshot(data, groupId); }) } diff --git a/shared/domain/activityField/activityField.ts b/shared/domain/activityField/activityField.ts index b1f7e20f2..83f93b1da 100644 --- a/shared/domain/activityField/activityField.ts +++ b/shared/domain/activityField/activityField.ts @@ -5,6 +5,7 @@ import { deltaDays } from '../../pubUtils/util'; // 活动数据 export abstract class ActivityBase { + groupId: number; activityId: number = 0; name: string = ''; beginTime: number = 0; @@ -47,6 +48,7 @@ export abstract class ActivityBase { constructor(activityData: ActivityModelType, createTime: number, serverTime?: number) { this.activityId = activityData.activityId; + this.groupId = activityData.groupId; this.delayDay = activityData.delayDay ? activityData.delayDay : 0; this.beginTime = moment(activityData.beginTime).add(this.delayDay, 'd').valueOf(); this.endTime = moment(activityData.endTime).add(this.delayDay, 'd').valueOf(); diff --git a/shared/resource/jsons/dic_zyz_activityType.json b/shared/resource/jsons/dic_zyz_activityType.json index 8cfbca5e2..efcf9eb58 100644 --- a/shared/resource/jsons/dic_zyz_activityType.json +++ b/shared/resource/jsons/dic_zyz_activityType.json @@ -249,7 +249,7 @@ "id": 42, "activityType": 42, "name": "TASK_PASS", - "string": "朝夕拾遗" + "string": "战令活动" }, { "id": 43,