活动:限时排行后台
This commit is contained in:
@@ -180,6 +180,7 @@ export class GmHandler {
|
|||||||
for(let server of activityServers) {
|
for(let server of activityServers) {
|
||||||
pinus.app.rpc.activity.activityRemote.updateActivities.toServer(server.id, activities.map(activity => new ActivityInRemote(activity)));
|
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, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
activity: activities
|
activity: activities
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Application, ChannelService } from 'pinus';
|
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 PvpDefenseType from '../../../db/PvpDefense';
|
||||||
import { DicGuildActivity } from '../../../pubUtils/dictionary/DicGuildActivity';
|
import { DicGuildActivity } from '../../../pubUtils/dictionary/DicGuildActivity';
|
||||||
import { reloadResources } from '../../../pubUtils/data';
|
import { reloadResources } from '../../../pubUtils/data';
|
||||||
@@ -14,6 +14,7 @@ import { errlogger } from '../../../util/logger';
|
|||||||
import { MailType } from '../../../db/Mail';
|
import { MailType } from '../../../db/Mail';
|
||||||
import { GroupMailType } from '../../../db/GroupMail';
|
import { GroupMailType } from '../../../db/GroupMail';
|
||||||
import { ServerMailType } from '../../../db/ServerMail';
|
import { ServerMailType } from '../../../db/ServerMail';
|
||||||
|
import { ActivityModelType } from '../../../db/Activity';
|
||||||
|
|
||||||
export default function (app: Application) {
|
export default function (app: Application) {
|
||||||
return new SystimerRemote(app);
|
return new SystimerRemote(app);
|
||||||
@@ -189,4 +190,12 @@ export class SystimerRemote {
|
|||||||
errlogger.error(`remote ${__filename} \n ${e.stack}`);
|
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}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,35 +62,41 @@ export async function recordGuildFund(serverId: number, guild: GuildType, fund:
|
|||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export async function sendRankMail(data: TimeLimitRankData) {
|
export async function sendRankMail(data: TimeLimitRankData) {
|
||||||
let redisKey = getRedisKeyByRankType(data.rankType);
|
let group = await ActivityGroupModel.findGroupData(data.groupId);
|
||||||
if (!redisKey) return null;
|
let serverIds = group?.serverIds||[];
|
||||||
let r = new Rank(redisKey, { activityId: data.activityId });
|
for(let serverId of serverIds) {
|
||||||
if(r.infoKey == REDIS_KEY.GUILD_INFO) {
|
let redisKey = getRedisKeyByRankType(data.rankType, true);
|
||||||
let allRank = <GuildRankInfo[]>(await r.getRankByRange());
|
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 = <GuildRankInfo[]>(await r.getRankByRange());
|
||||||
|
|
||||||
for(let { rank, code, name, leader } of allRank) {
|
for(let { rank, code, name, leader } of allRank) {
|
||||||
let reward = data.getRewardByRank(rank);
|
let reward = data.getRewardByRank(rank);
|
||||||
if(reward) {
|
if(reward) {
|
||||||
await sendMailToGuildByContent(MAIL_TYPE.TIME_LIMIT_RANK, code, {
|
await sendMailToGuildByContent(MAIL_TYPE.TIME_LIMIT_RANK, code, {
|
||||||
params: [data.tabName,`${rank}`],
|
params: [data.tabName,`${rank}`],
|
||||||
goods: stringToRewardInter(reward.guildRewards)
|
goods: stringToRewardInter(reward.guildRewards)
|
||||||
});
|
});
|
||||||
if(leader.roleId) await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, leader.roleId, {
|
if(leader.roleId) await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, leader.roleId, {
|
||||||
params: [data.tabName,`${rank}`],
|
params: [data.tabName,`${rank}`],
|
||||||
goods: stringToRewardInter(reward.rewards)
|
goods: stringToRewardInter(reward.rewards)
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
} else {
|
let allRank = <RoleRankInfo[]>(await r.getRankByRange());
|
||||||
let allRank = <RoleRankInfo[]>(await r.getRankByRange());
|
|
||||||
|
|
||||||
for(let { rank, roleId } of allRank) {
|
for(let { rank, roleId } of allRank) {
|
||||||
let reward = data.getRewardByRank(rank);
|
let reward = data.getRewardByRank(rank);
|
||||||
if(reward) {
|
if(reward) {
|
||||||
await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleId, {
|
await sendMailByContent(MAIL_TYPE.TIME_LIMIT_RANK, roleId, {
|
||||||
params: [data.tabName, `${rank}`],
|
params: [data.tabName, `${rank}`],
|
||||||
goods: stringToRewardInter(reward.rewards)
|
goods: stringToRewardInter(reward.rewards)
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,18 @@
|
|||||||
|
|
||||||
import { scheduleJob, Job, scheduledJobs, } from 'node-schedule';
|
import { scheduleJob, Job, scheduledJobs, } from 'node-schedule';
|
||||||
import { PVPConfigModel, PVPConfigType } from '../db/SystemConfig';
|
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 { getTodayGuildActivity, gameData } from '../pubUtils/data';
|
||||||
import { pvpSeasonEnd } from './pvpService';
|
import { pvpSeasonEnd } from './pvpService';
|
||||||
import { getAllOnlineRoles, getAllServers, delGuildActivityRank } from './redisService';
|
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 { GUILD_ACTIVITY_TYPE, REFRESH_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE, SERVER_TIMER, ACTIVITY_TYPE } from '../consts';
|
||||||
import { RoleModel } from '../db/Role';
|
|
||||||
import { pinus } from 'pinus';
|
import { pinus } from 'pinus';
|
||||||
import { indexOf } from 'underscore';
|
|
||||||
import { PvpSeasonResultModel } from '../db/PvpSeasonResult';
|
|
||||||
import { settleGuildWeekly } from './guildService';
|
import { settleGuildWeekly } from './guildService';
|
||||||
import { sendMailByContent, SendMailFun, sendMailToGuildByContent } from './mailService';
|
import { SendMailFun, } from './mailService';
|
||||||
import { getGuildActivityByDic, sendEndMsgToAll, autoDeclare, sendGuildActivityStatus } from './guildActivity/guildActivityService';
|
import { sendEndMsgToAll, autoDeclare, sendGuildActivityStatus } from './guildActivity/guildActivityService';
|
||||||
import { sendUngotDividendJob, startGuildAuction, startWorldAuction, stopAuction } from './auctionService';
|
import { sendUngotDividendJob, startGuildAuction, startWorldAuction, stopAuction } from './auctionService';
|
||||||
import { DicGuildActivity } from '../pubUtils/dictionary/DicGuildActivity';
|
import { DicGuildActivity } from '../pubUtils/dictionary/DicGuildActivity';
|
||||||
import { dispatch } from '../pubUtils/dispatcher';
|
import { dispatch } from '../pubUtils/dispatcher';
|
||||||
import { Rank } from './rankService';
|
|
||||||
import { checkTask } from './taskService';
|
|
||||||
import { everydayRefresh } from './connectorService';
|
import { everydayRefresh } from './connectorService';
|
||||||
import { createNewServer, initMarquee } from './gmService';
|
import { createNewServer, initMarquee } from './gmService';
|
||||||
import moment = require('moment');
|
import moment = require('moment');
|
||||||
@@ -26,7 +21,7 @@ import { reportOneOnline } from './authenticateService';
|
|||||||
import { PVP } from '../pubUtils/dicParam';
|
import { PVP } from '../pubUtils/dicParam';
|
||||||
import { fetch37Words } from './sdkService';
|
import { fetch37Words } from './sdkService';
|
||||||
import { GMMailModel } from '../db/GMMail';
|
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 { getWorldChannelSid } from './chatService';
|
||||||
import { createMarqueeMsg, pushMarqueeMsg } from './sysChatService';
|
import { createMarqueeMsg, pushMarqueeMsg } from './sysChatService';
|
||||||
import { RegionModel, RegionType } from '../db/Region';
|
import { RegionModel, RegionType } from '../db/Region';
|
||||||
@@ -35,10 +30,8 @@ import { infologger } from '../util/logger';
|
|||||||
import { MailModel, MailType } from '../db/Mail';
|
import { MailModel, MailType } from '../db/Mail';
|
||||||
import { GroupMailModel, GroupMailType } from '../db/GroupMail';
|
import { GroupMailModel, GroupMailType } from '../db/GroupMail';
|
||||||
import { ServerMailModel, ServerMailType } from '../db/ServerMail';
|
import { ServerMailModel, ServerMailType } from '../db/ServerMail';
|
||||||
import { ActivityModel } from '../db/Activity';
|
import { ActivityModel, ActivityModelType } from '../db/Activity';
|
||||||
import { TimeLimitRankData } from '../domain/activityField/timeLimitRankField';
|
import { TimeLimitRankData } from '../domain/activityField/timeLimitRankField';
|
||||||
import { GuildRankInfo, RoleRankInfo } from '../domain/rank';
|
|
||||||
import { stringToRewardInter } from './activity/giftPackageService';
|
|
||||||
import { sendRankMail, takeSnapshot } from './activity/timeLimitRankService';
|
import { sendRankMail, takeSnapshot } from './activity/timeLimitRankService';
|
||||||
|
|
||||||
const PER_SECOND = 1 * 1000;
|
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}`]) {
|
if(scheduledJobs[`rankMail${data.activityId}`]) {
|
||||||
scheduledJobs[`rankMail${data.activityId}`].cancel();
|
scheduledJobs[`rankMail${data.activityId}`].cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
scheduleJob(`rankMail${data.activityId}`, data.sendMailTime, async () => {
|
scheduleJob(`rankMail${data.activityId}`, data.sendMailTime, async () => {
|
||||||
|
console.log('########### setSendRankMailSchedule2 ########')
|
||||||
await sendRankMail(data);
|
await sendRankMail(data);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async function setTakeRankSnapshotSchedule(data: TimeLimitRankData, groupId: number) {
|
async function setTakeRankSnapshotSchedule(data: TimeLimitRankData, groupId: number) {
|
||||||
|
console.log('########### setTakeRankSnapshotSchedule1 ########')
|
||||||
|
|
||||||
if(scheduledJobs[`snapshot${data.activityId}`]) {
|
if(scheduledJobs[`snapshot${data.activityId}`]) {
|
||||||
scheduledJobs[`snapshot${data.activityId}`].cancel();
|
scheduledJobs[`snapshot${data.activityId}`].cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
scheduleJob(`snapshot${data.activityId}`, data.rankEndTime, async () => {
|
scheduleJob(`snapshot${data.activityId}`, data.rankEndTime, async () => {
|
||||||
|
console.log('########### setTakeRankSnapshotSchedule2 ########')
|
||||||
await takeSnapshot(data, groupId);
|
await takeSnapshot(data, groupId);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { deltaDays } from '../../pubUtils/util';
|
|||||||
|
|
||||||
// 活动数据
|
// 活动数据
|
||||||
export abstract class ActivityBase {
|
export abstract class ActivityBase {
|
||||||
|
groupId: number;
|
||||||
activityId: number = 0;
|
activityId: number = 0;
|
||||||
name: string = '';
|
name: string = '';
|
||||||
beginTime: number = 0;
|
beginTime: number = 0;
|
||||||
@@ -47,6 +48,7 @@ export abstract class ActivityBase {
|
|||||||
|
|
||||||
constructor(activityData: ActivityModelType, createTime: number, serverTime?: number) {
|
constructor(activityData: ActivityModelType, createTime: number, serverTime?: number) {
|
||||||
this.activityId = activityData.activityId;
|
this.activityId = activityData.activityId;
|
||||||
|
this.groupId = activityData.groupId;
|
||||||
this.delayDay = activityData.delayDay ? activityData.delayDay : 0;
|
this.delayDay = activityData.delayDay ? activityData.delayDay : 0;
|
||||||
this.beginTime = moment(activityData.beginTime).add(this.delayDay, 'd').valueOf();
|
this.beginTime = moment(activityData.beginTime).add(this.delayDay, 'd').valueOf();
|
||||||
this.endTime = moment(activityData.endTime).add(this.delayDay, 'd').valueOf();
|
this.endTime = moment(activityData.endTime).add(this.delayDay, 'd').valueOf();
|
||||||
|
|||||||
@@ -249,7 +249,7 @@
|
|||||||
"id": 42,
|
"id": 42,
|
||||||
"activityType": 42,
|
"activityType": 42,
|
||||||
"name": "TASK_PASS",
|
"name": "TASK_PASS",
|
||||||
"string": "朝夕拾遗"
|
"string": "战令活动"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 43,
|
"id": 43,
|
||||||
|
|||||||
Reference in New Issue
Block a user