From 4c0f0bb56bab1ce21339668d14d1d9d2a2af2ee7 Mon Sep 17 00:00:00 2001 From: luying Date: Mon, 31 Jul 2023 15:18:47 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(=E6=9C=8D=E5=8A=A1=E5=99=A8):?= =?UTF-8?q?=20=E5=A4=9A=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=BC=80=E6=9C=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/servers/gm/handler/gmServerHandler.ts | 27 ++++++++---- game-server/app/services/serverService.ts | 7 ++-- shared/db/Region.ts | 5 ++- shared/domain/backEndField/params.ts | 42 ++++++++++++++----- web-server/app/controller/game.ts | 15 +++++++ 5 files changed, 74 insertions(+), 22 deletions(-) diff --git a/game-server/app/servers/gm/handler/gmServerHandler.ts b/game-server/app/servers/gm/handler/gmServerHandler.ts index 6ace1e54b..b78a5f7cc 100644 --- a/game-server/app/servers/gm/handler/gmServerHandler.ts +++ b/game-server/app/servers/gm/handler/gmServerHandler.ts @@ -1,7 +1,7 @@ import { Application, BackendSession, pinus } from 'pinus'; import { genCode, getRandSingleEelm, isTimestamp, resResult } from '../../../pubUtils/util'; import { STATUS } from '../../../consts/statusCode'; -import { UpdateHiddenDataParam, CreatePvpConfigParam, CreateServerParam, UpdateRegionParams } from '../../../domain/backEndField/params'; +import { UpdateHiddenDataParam, CreatePvpConfigParam, CreateServerParam, UpdateRegionParams, CreateServersParam } from '../../../domain/backEndField/params'; import { RegionModel, RegionType } from '../../../db/Region'; import { getDicServerName } from '../../../pubUtils/data'; import { Maintenance, ServerlistModel, ServerlistUpdate } from '../../../db/Serverlist'; @@ -45,8 +45,9 @@ export class GmHandler { } // 手动开服 - async createNewServer(msg: CreateServerParam, session: BackendSession) { - let params = new CreateServerParam(msg); + async createNewServer(msg: CreateServersParam, session: BackendSession) { + if(isNumber(msg.openTime)) return resResult(STATUS.WRONG_PARMS, '请刷新后使用新后台页面'); + let params = new CreateServersParam(msg); let uid = session.get('uid'); if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS); @@ -54,12 +55,15 @@ export class GmHandler { let curRegion = await RegionModel.findRegionByEnv(params.env); console.log('******* curRegion', curRegion); if(!curRegion) return resResult(STATUS.WRONG_PARMS); - + msg.openTime.sort() let { latestServer = 0, env } = curRegion; - let dic = getDicServerName(env, latestServer + 1); - if(!dic) return resResult(STATUS.DIC_DATA_NOT_FOUND); - - await createNewServer(curRegion, latestServer + 1, params, uid); + for(let openTime of msg.openTime) { + let dic = getDicServerName(env, latestServer + 1); + if(!dic) return resResult(STATUS.DIC_DATA_NOT_FOUND); + + await createNewServer(curRegion, latestServer + 1, new CreateServerParam({...params, openTime}), uid); + latestServer++; + } return resResult(STATUS.SUCCESS); } @@ -253,7 +257,14 @@ export class GmHandler { let server = await ServerlistModel.findByServerId(serverId); if(!server) return resResult(STATUS.WRONG_PARMS); + let region = await RegionModel.findRegionById(server.regionId); + if(!region) return resResult(STATUS.WRONG_PARMS); + server = await ServerlistModel.updateByServerId(serverId, { openTime: serverOpenTime }); + if(server.id == region.latestServerUniqId) { + region = await RegionModel.updateRegion(server.regionId, { latestServerOpenTime: server.openTime }) + } + await redisClient().hsetAsync(REDIS_KEY.SERVER_OPEN_TIME, `${server.id}`, `${server.openTime}`); return resResult(STATUS.SUCCESS); } diff --git a/game-server/app/services/serverService.ts b/game-server/app/services/serverService.ts index c2bb7c1d5..af259c4a2 100644 --- a/game-server/app/services/serverService.ts +++ b/game-server/app/services/serverService.ts @@ -123,8 +123,8 @@ export async function autoCreateServerSchedule() { return errlogger.error('create new server region not found'); } let time = moment().format('HH:mm'); - console.log('#### time', time) - if(region.stategy && region.stategy.type == 1 && region.stategy.timers.indexOf(time) != -1) { + let latestServerOpenTime = region.latestServerOpenTime||0; + if(region.stategy && region.stategy.type == 1 && region.stategy.timers.indexOf(time) != -1 && latestServerOpenTime < nowSeconds()) { let latestServer = await ServerlistModel.findByServerId(region.latestServerUniqId); if(!latestServer || latestServer.playerCnt >= region.stategy.maxPlayerCnt) { let params = new CreateServerParam(); @@ -146,7 +146,8 @@ export async function autoCreateServerWhenRoleInit(serverId: number) { return errlogger.error('create new server region not found'); } - if(region.stategy && region.stategy.isOpen && region.stategy.type == 2 && region.latestServerUniqId == server.id && server.playerCnt >= region.stategy.maxPlayerCnt) { + let latestServerOpenTime = region.latestServerOpenTime||0; + if(region.stategy && region.stategy.isOpen && region.stategy.type == 2 && region.latestServerUniqId == server.id && server.playerCnt >= region.stategy.maxPlayerCnt && latestServerOpenTime <= nowSeconds()) { let params = new CreateServerParam(); params.setByRegionStategy(region, nowSeconds()) await createNewServer(region, server.serverId + 1, params); diff --git a/shared/db/Region.ts b/shared/db/Region.ts index 8b9fc77cd..95f47dad7 100644 --- a/shared/db/Region.ts +++ b/shared/db/Region.ts @@ -55,6 +55,9 @@ export default class Region extends BaseModel { @prop({ required: true }) latestServerUniqId: number; // 最新服唯一id + @prop({ required: true }) + latestServerOpenTime: number; // 最新服的开服时间 + @prop({ required: true }) addressType: number; // 参数表的那个addressType @@ -90,7 +93,7 @@ export default class Region extends BaseModel { public static async newServer(id: number, newServer: ServerlistType, uid = 1) { const rec: RegionType = await RegionModel.findOneAndUpdate({ id }, { - $set: { latestServer: newServer.serverId, latestServerUniqId: newServer.id, updatedBy: uid }, + $set: { latestServer: newServer.serverId, latestServerUniqId: newServer.id, latestServerOpenTime: newServer.openTime, updatedBy: uid }, $inc: { serverCount: 1 } }, { new: true }).lean(); return rec; diff --git a/shared/domain/backEndField/params.ts b/shared/domain/backEndField/params.ts index bb3caca9b..d72de87b0 100644 --- a/shared/domain/backEndField/params.ts +++ b/shared/domain/backEndField/params.ts @@ -183,6 +183,38 @@ export class CreateRegionParam { } } +export class CreateServersParam { + env: string = ''; + openTime: number[] = []; + activityGroupId: number[] = []; + hasOpenMail: boolean = false; + openMail?: GMMail; + // hasCircleMail: boolean = false; + // circleMail?: GMMail; + stopRegisterTime: number = 0; + + constructor(obj?: any) { + if(obj) { + for(let key in obj) { + this[key] = obj[key]; + } + } + } + + checkParams() { + // console.log('##### createNew', this.env, this.openTime, this.stopRegisterTime, this.hasOpenMail, this.hasCircleMail) + if(!this.env || !this.openTime || !this.stopRegisterTime ) { + return false + } + if(!isArray(this.openTime)) return false; + for(let time of this.openTime) { + if(!isNumber(time)) return false; + } + if(this.hasOpenMail && !this.openMail) return false; + // if(this.hasCircleMail && !this.circleMail) return false; + return true; + } +} export class CreateServerParam { env: string = ''; openTime: number = 0; @@ -214,16 +246,6 @@ export class CreateServerParam { } } - - checkParams() { - // console.log('##### createNew', this.env, this.openTime, this.stopRegisterTime, this.hasOpenMail, this.hasCircleMail) - if(!this.env || !this.openTime || !this.stopRegisterTime ) { - return false - } - if(this.hasOpenMail && !this.openMail) return false; - // if(this.hasCircleMail && !this.circleMail) return false; - return true; - } } export class CreateGiftCode { diff --git a/web-server/app/controller/game.ts b/web-server/app/controller/game.ts index 845d42cc3..802747d84 100644 --- a/web-server/app/controller/game.ts +++ b/web-server/app/controller/game.ts @@ -20,6 +20,7 @@ import { ChannelInfoModel } from '@db/ChannelInfo'; import { GVGVestigeRecModel } from '@db/GVGVestigeRec'; import { GVGBattleRecModel } from '@db/GVGBattleRec'; import { PackageModel } from '@db/Package'; +import { nowSeconds } from 'app/pubUtils/timeUtil'; const sendToWormhole = require('stream-wormhole'); const pump = require('mz-modules/pump'); @@ -112,6 +113,20 @@ export default class GameController extends Controller { allServers = allServers.filter(server => !pkg.hideServers.includes(server.id)); } } + // 新开服的展示 需要提前12小时,超过12小时不在前端展示即将开启 + // 新开服的数量有且仅显示一个,目的为了防止1天多个服导致出来多个即将开启 + let hideFutureServerIds: number[] = [], showFutureServerIds: number[] = []; + for(let server of allServers) { + if(server.openTime > nowSeconds() + 12 * 60 * 60) hideFutureServerIds.push(server.id); + if(server.openTime > nowSeconds() && server.openTime <= nowSeconds() + 12 * 60 * 60) showFutureServerIds.push(server.id); + } + if(showFutureServerIds.length > 0) { + showFutureServerIds.sort((a, b) => b - a); + hideFutureServerIds.push(...showFutureServerIds.slice(0, showFutureServerIds.length -1)) + } + if(hideFutureServerIds.length > 0) { + allServers = allServers.filter(server => !hideFutureServerIds.includes(server.id)); + } let roles = await RoleModel.findAllByUid(uid, true, true); for (let server of allServers) {