diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index e7d743248..b6787b840 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -21,6 +21,7 @@ import { ActivityGroupTypeModel } from '../../../db/ActivityGroupType'; import { GuildActivityCityModel } from '../../../db/GuildActivityCity'; import { GuildActivityRecordModel } from '../../../db/GuildActivityRec'; import { getTimeFunM } from '../../../pubUtils/timeUtil'; +let timer: NodeJS.Timer; export default function (app: Application) { return new GmHandler(app); } @@ -342,12 +343,18 @@ export class GmHandler { * @param msg * @param session */ - async setGuildActivityDebug(msg: { aid: number, day: number, startActivity: number, endActivity: number, startGuildAuction: number, endGuildAuction: number, startWorldAuction: number, endWorldAuction: number }, session: BackendSession) { - const { aid, day, startActivity = 0, endActivity = 0, startGuildAuction = 0, endGuildAuction = 0, startWorldAuction = 0, endWorldAuction = 0 } = msg; + async setGuildActivityDebug(msg: { aid: number, day: number, startActivity: number, endActivity: number, startGuildAuction: number, endGuildAuction: number, startWorldAuction: number, endWorldAuction: number, startNextDay: number }, session: BackendSession) { + let { aid, day, startActivity = 0, endActivity = 0, startGuildAuction = 0, endGuildAuction = 0, startWorldAuction = 0, endWorldAuction = 0, startNextDay = 0 } = msg; + if(timer) { + clearTimeout(timer); + } const uid = session.get('uid'); if(aid == undefined || day == undefined ) { return resResult(STATUS.WRONG_PARMS); } + if(aid == 0) { + day = new Date().getDay(); + } // 设置字典 let now = new Date(); @@ -371,9 +378,14 @@ export class GmHandler { await pinus.app.rpc.systimer.systimerRemote.setAuctionSchedule.broadcast(); await pinus.app.rpc.systimer.systimerRemote.setGuildActivitySchedule.broadcast(); // 向客户端发送时间 - let time = getTimeFunM().getTimeWithWeek(day, 20, 0, 0) - startActivity; + let time = getTimeFunM().getTimeWithWeek(day, 20, 0, 0) - startActivity * 1000; pinus.app.rpc.guild.guildActivityRemote.setCurrentTime.broadcast(time); await pushCurrentTime(time); + timer = setTimeout(async () => { + let time = getTimeFunM().getAfterDayWithHour(0); + pinus.app.rpc.guild.guildActivityRemote.setCurrentTime.broadcast(time); + await pushCurrentTime(time); + }, startActivity * 1000 + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000 + endWorldAuction * 1000 + startNextDay * 1000) return resResult(STATUS.SUCCESS, { startActivity: startTimes[0], endActivity: startTimes[0] + endActivity * 1000, @@ -381,13 +393,16 @@ export class GmHandler { endGuildAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000, startWorldAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000, endWorldAuction: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000 + endWorldAuction * 1000, + startNextDay: startTimes[0] + endActivity * 1000 + startGuildAuction * 1000 + endGuildAuction * 1000 + startWorldAuction * 1000 + endWorldAuction * 1000 + startNextDay * 1000, }); } async cancelGuildActivityDebug(msg: { }, session: BackendSession) { // 设置字典 let now = new Date(); - + if(timer) { + clearTimeout(timer); + } await pinus.app.rpc.guild.guildRemote.reloadResources.broadcast(); await pinus.app.rpc.systimer.systimerRemote.reloadResources.broadcast(); await pinus.app.rpc.guild.guildActivityRemote.setDay.broadcast(now.getDay()); diff --git a/game-server/app/servers/guild/handler/auctionHandler.ts b/game-server/app/servers/guild/handler/auctionHandler.ts index 0e8a6799b..c9517bb51 100644 --- a/game-server/app/servers/guild/handler/auctionHandler.ts +++ b/game-server/app/servers/guild/handler/auctionHandler.ts @@ -130,7 +130,7 @@ export class AuctionHandler { } async checkDividend(msg: {}, session: BackendSession) { - const begin = todayGuildBegin(); + const begin = await todayGuildBegin(); const guildCode = session.get('guildCode'); if (!guildCode) return resResult(STATUS.GUILD_NOT_FOUND); const dividends = await DividendModel.findGuildDividendsByBegin(guildCode, begin); @@ -155,9 +155,9 @@ export class AuctionHandler { async myWatching(msg: {}, session: BackendSession) { const roleId = session.get('roleId'); const serverId = session.get('serverId'); - const begin = todayGuildBegin(); + const begin = await todayGuildBegin(); const lots = await LotModel.watchingLotsByBegin(serverId, roleId, begin); - const stage = auctionStage(); + const stage = await auctionStage(); return resResult(STATUS.SUCCESS, { lots: stage === AUCTION_STAGE.END ? [] : lots }); } diff --git a/game-server/app/services/auctionService.ts b/game-server/app/services/auctionService.ts index d0f6a19ed..183b37a62 100644 --- a/game-server/app/services/auctionService.ts +++ b/game-server/app/services/auctionService.ts @@ -1,7 +1,7 @@ import { DividendModel } from './../db/Dividend'; import { LOT_CODE_LEN, AUCTION_STAGE, AUCTION_TIME, DIVIDEND_CODE_LEN, DIVIDEND_STATUS, LOT_STATUS, MAIL_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, DIVIDENDMAXRATIO, DIVIDENDPOSITIONMAXRATIO, ROLE_RECEIVE_STATUS, AUCTION_BID_STATUS, DEBUG_MAGIC_WORD, AUCTION_SOURCE } from './../consts'; import { DividendRec, ItemReward } from "../domain/dbGeneral"; -import { genCode } from '../pubUtils/util'; +import { genCode, getRandSingleEelm } from '../pubUtils/util'; import { LotModel, LotParam } from '../db/Lot'; import { getCurDay, getTimeFunD, getTimeFunM } from '../pubUtils/timeUtil'; import { gameData, getGoodById } from '../pubUtils/data'; @@ -26,12 +26,12 @@ export function getMaxPrice(gid: number, count: number) { return (good ? good.quality * 200 : 200) * count; } -export function auctionStage() { +export async function auctionStage() { const curTime = new Date().getTime(); - if (curTime < todayGuildBegin().getTime()) return AUCTION_STAGE.DEFAULT; - if (curTime < todayWorldBegin().getTime() && curTime > todayGuildBegin().getTime()) return AUCTION_STAGE.GUILD; - if (curTime > todayWorldBegin().getTime() && curTime < todayWorldEnd().getTime()) return AUCTION_STAGE.WORLD; - if (curTime > todayWorldEnd().getTime()) return AUCTION_STAGE.END; + if (curTime < (await todayGuildBegin()).getTime()) return AUCTION_STAGE.DEFAULT; + if (curTime < (await todayWorldBegin()).getTime() && curTime > (await todayGuildBegin()).getTime()) return AUCTION_STAGE.GUILD; + if (curTime > (await todayWorldBegin()).getTime() && curTime < (await todayWorldEnd()).getTime()) return AUCTION_STAGE.WORLD; + if (curTime > (await todayWorldEnd()).getTime()) return AUCTION_STAGE.END; } export async function debugAuctionLots(session: FrontendOrBackendSession, begin: Date) { @@ -43,7 +43,7 @@ export async function debugAuctionLots(session: FrontendOrBackendSession, begin: export async function officialAuctionLots(session: FrontendOrBackendSession, begin: Date) { const serverId = session.get('serverId'); const guildCode = session.get('guildCode'); - const stage = auctionStage(); + const stage = await auctionStage(); let lots = []; if (stage === AUCTION_STAGE.DEFAULT || stage === AUCTION_STAGE.GUILD) { lots = await LotModel.findGuildLotsByBegin(guildCode, begin); @@ -54,83 +54,102 @@ export async function officialAuctionLots(session: FrontendOrBackendSession, beg } // 拍卖行开始时间 今天20:20 -export function auctionBegin() { +export async function auctionBegin() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.GUILD_OPEN); - return getTimeFunD().getAfterDayAndSetHour(0, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(0, hour, minute); } // 军团拍卖行结束时间 20:30 -export function guildAuctionEnd() { +export async function guildAuctionEnd() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.GUILD_CLOSE); - return getTimeFunD().getAfterDayAndSetHour(0, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(0, hour, minute); } // 拍卖行结束时间 22:00 -export function auctionEnd() { +export async function auctionEnd() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.WORLD_CLOSE); - return getTimeFunD().getAfterDayAndSetHour(0, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(0, hour, minute); } // 今天军团拍卖行开始时间 20:20 -export function todayGuildBegin() { +export async function todayGuildBegin() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.GUILD_OPEN); - return getTimeFunD().getAfterDayAndSetHour(0, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(0, hour, minute); } +async function getCurrentTime() { + let now = Date.now(); + if(dicParam.SERVER_DEBUG_MODE.CURRENT_TIME == 1) { + let guilds = pinus.app.getServersByType('guild'); + let guild = getRandSingleEelm(guilds); + now = await pinus.app.rpc.guild.guildActivityRemote.getCurrentTime.toServer(guild.id); + } + return now +} // 明天军团拍卖行开始时间 20:20 -export function tomorrowGuildBegin() { +export async function tomorrowGuildBegin() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.GUILD_OPEN); // console.log(hour, minute) - return getTimeFunD().getAfterDayAndSetHour(1, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(1, hour, minute); } // 明天军团拍卖行开始时间 20:20 -export function tomorrowGuildEnd() { +export async function tomorrowGuildEnd() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.GUILD_CLOSE); // console.log(hour, minute) - return getTimeFunD().getAfterDayAndSetHour(1, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(1, hour, minute); } // 昨天军团拍卖行开始时间 20:20 -export function yestodayGuildBegin() { +export async function yestodayGuildBegin() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.GUILD_OPEN); - return getTimeFunD().getAfterDayAndSetHour(-1, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(-1, hour, minute); } // 今天世界拍卖行开始时间 20:40 -export function todayWorldBegin() { +export async function todayWorldBegin() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.WORLD_OPEN); - return getTimeFunD().getAfterDayAndSetHour(0, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(0, hour, minute); } // 今天世界拍卖行结束时间 22:00 -export function todayWorldEnd() { +export async function todayWorldEnd() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.WORLD_CLOSE); - return getTimeFunD().getAfterDayAndSetHour(0, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(0, hour, minute); } // 拍卖行预览时间 20:00 -export function guildAuctionPreview() { +export async function guildAuctionPreview() { + let now = await getCurrentTime(); let { hour, minute } = gameData.auctionTime.get(AUCTION_TIME.GUILD_PREVIEW); - return getTimeFunD().getAfterDayAndSetHour(0, hour, minute); + return getTimeFunD(now).getAfterDayAndSetHour(0, hour, minute); } // 演武台。8点以前是今天的,8点以后是明天的 -export function getBossAuctionBegin() { - if(Date.now() < guildAuctionPreview().getTime()) { - return todayGuildBegin(); +export async function getBossAuctionBegin() { + if(Date.now() < (await guildAuctionPreview()).getTime()) { + return await todayGuildBegin(); } else { - return tomorrowGuildBegin(); + return await tomorrowGuildBegin(); } } // 演武台。8点以前是今天的,8点以后是明天的 -export function getBossAuctionEnd() { - if(Date.now() < guildAuctionPreview().getTime()) { - return guildAuctionEnd(); +export async function getBossAuctionEnd() { + if(Date.now() < (await guildAuctionPreview()).getTime()) { + return await guildAuctionEnd(); } else { - return tomorrowGuildEnd(); + return await tomorrowGuildEnd(); } } @@ -144,13 +163,13 @@ export function getBossAuctionEnd() { * @param {ItemReward[]} rewards */ export async function genAuction(guildCode: string, sourceType: number, sourceCode: string, serverId: number, rewards: { goods: RewardInter, basePrice: number, maxPrice: number}[]) { - let begin = auctionBegin(); - let end = auctionEnd(); + let begin = await auctionBegin(); + let end = await auctionEnd(); if(sourceType == AUCTION_SOURCE.BOSS) { // 军团boss本 - begin = getBossAuctionBegin(); - end = getBossAuctionEnd(); + begin = await getBossAuctionBegin(); + end = await getBossAuctionEnd(); } - const guildEnd = guildAuctionEnd(); + const guildEnd = await guildAuctionEnd(); const lotsData: LotParam[] = rewards.map(({ goods, basePrice, maxPrice }) => { const { id, count } = goods; const code = genCode(LOT_CODE_LEN); @@ -223,7 +242,7 @@ export async function calculateDividend(dividend: DividendType) { export async function startGuildAuction() { try { console.log('schedule startGuildAuction called:', new Date()); - const begin = todayGuildBegin(); + const begin = await todayGuildBegin(); await LotModel.updateLotsStageByBegin(begin, AUCTION_STAGE.GUILD); await DividendModel.updateDividendsStatus(begin, DIVIDEND_STATUS.ING); @@ -243,7 +262,7 @@ export async function startGuildAuction() { export async function startWorldAuction() { try { console.log('schedule startWorldAuction called:', new Date()); - const begin = todayGuildBegin(); + const begin = await todayGuildBegin(); await LotModel.setLotSoldByBegin(begin); await LotModel.updateUnSoldLotsStageByBegin(begin, AUCTION_STAGE.WORLD); await DividendModel.updateDividendsStatus(begin, DIVIDEND_STATUS.END); @@ -263,7 +282,7 @@ export async function startWorldAuction() { export async function stopAuction() { try { console.log('schedule stopAuction called:', new Date()); - const begin = todayGuildBegin(); + const begin = await todayGuildBegin(); await LotModel.setLotSoldByBegin(begin); await LotModel.updateLotsStageByBegin(begin, AUCTION_STAGE.END); @@ -280,28 +299,28 @@ export async function stopAuction() { } async function debugDividends() { - const begin = yestodayGuildBegin(); + const begin = await yestodayGuildBegin(); const dividends = await DividendModel.findDividendsByBegin(begin); - const todayBegin = todayGuildBegin(); + const todayBegin = await todayGuildBegin(); const todayDividends = await DividendModel.findDividendsByBegin(todayBegin); return [...dividends, ...todayDividends]; } async function officialDividends() { - const begin = yestodayGuildBegin(); + const begin = await yestodayGuildBegin(); const dividends = await DividendModel.findDividendsByBegin(begin); return dividends; } async function updateDebugDividendsStatus(status: number) { - const begin = yestodayGuildBegin(); + const begin = await yestodayGuildBegin(); await DividendModel.updateDividendsStatus(begin, status); - const todayBegin = todayGuildBegin(); + const todayBegin = await todayGuildBegin(); await DividendModel.updateDividendsStatus(todayBegin,status); } async function updateOfficialDividendsStatus(status: number) { - const begin = yestodayGuildBegin(); + const begin = await yestodayGuildBegin(); await DividendModel.updateDividendsStatus(begin, status); } @@ -361,7 +380,7 @@ export async function sendUngotDividend(debug = false) { * @param magicWord */ export async function getAuction(guildCode: string, session: FrontendOrBackendSession, magicWord?: string) { - const begin = todayGuildBegin(); + const begin = await todayGuildBegin(); let lots = magicWord === DEBUG_MAGIC_WORD ? await debugAuctionLots(session, begin) : await officialAuctionLots(session, begin); let dividends: DividendType[] = [];