diff --git a/game-server/app/servers/activity/remote/activityRemote.ts b/game-server/app/servers/activity/remote/activityRemote.ts index e17efc18c..1aadef38d 100644 --- a/game-server/app/servers/activity/remote/activityRemote.ts +++ b/game-server/app/servers/activity/remote/activityRemote.ts @@ -3,6 +3,7 @@ import { ActivityModel, ActivityModelType } from '../../../db/Activity'; import { ServerlistModel } from '../../../db/Serverlist'; import { reloadResources } from '../../../pubUtils/data'; import { _getActivitiesByType, _getActivityById, _getActivities } from '../../../services/activity/activityService'; +import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; export default function (app: Application) { new HandlerService(app, {}); @@ -30,8 +31,8 @@ export class ActivityRemote { } public async loadActivities() { - let servers = await ServerlistModel.getAllServerList(); - for(let { serverId, activityGroupId } of servers) { + let servers = await ServerlistModel.findByEnv(this.app.get('env')); + for(let { id: serverId, activityGroupId } of servers) { for(let groupId of activityGroupId) { if(!this.groupToServer.has(groupId)) { this.groupToServer.set(groupId, []); @@ -116,4 +117,16 @@ export class ActivityRemote { public getActivities() { return _getActivities(); } + + public setServerMainten(serverIds: number[], startTime: number, endTime: number) { + setServerMainten(serverIds, startTime, endTime); + } + + public stopServerMainten(serverIds: number[]) { + stopServerMainten(serverIds); + } + + public getServerMainten(serverId: number) { + return getServerMainten(serverId); + } } \ No newline at end of file diff --git a/game-server/app/servers/battle/remote/battleRemote.ts b/game-server/app/servers/battle/remote/battleRemote.ts index 9b9a2a74c..e72acdc67 100644 --- a/game-server/app/servers/battle/remote/battleRemote.ts +++ b/game-server/app/servers/battle/remote/battleRemote.ts @@ -1,6 +1,7 @@ import { Application, ChannelService, FrontendSession, RemoterClass, HandlerService, } from 'pinus'; import { PVPConfigType } from '../../../db/SystemConfig'; import { reloadResources } from '../../../pubUtils/data'; +import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; export default function (app: Application) { new HandlerService(app, {}); @@ -87,4 +88,16 @@ export class BattleRemote { this.app.set('pvpSeasonEndTime', pvpConfig.seasonEndTime); } } + + public setServerMainten(serverIds: number[], startTime: number, endTime: number) { + setServerMainten(serverIds, startTime, endTime); + } + + public stopServerMainten(serverIds: number[]) { + stopServerMainten(serverIds); + } + + public getServerMainten(serverId: number) { + return getServerMainten(serverId); + } } \ No newline at end of file diff --git a/game-server/app/servers/chat/remote/chatRemote.ts b/game-server/app/servers/chat/remote/chatRemote.ts index 3eb7a3d7e..c74d68f45 100644 --- a/game-server/app/servers/chat/remote/chatRemote.ts +++ b/game-server/app/servers/chat/remote/chatRemote.ts @@ -13,6 +13,7 @@ import { MailParam } from '../../../domain/roleField/mail'; import { RankFirstType } from '../../../db/RankFirst'; import { LotType } from '../../../db/Lot'; import { _checkFilterWords, getTire } from '../../../services/sdkService'; +import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; export default function (app: Application) { new HandlerService(app, {}); @@ -289,4 +290,16 @@ export class ChatRemote { public async checkFilterWords(word: string) { return await _checkFilterWords(word); } + + public setServerMainten(serverIds: number[], startTime: number, endTime: number) { + setServerMainten(serverIds, startTime, endTime); + } + + public stopServerMainten(serverIds: number[]) { + stopServerMainten(serverIds); + } + + public getServerMainten(serverId: number) { + return getServerMainten(serverId); + } } diff --git a/game-server/app/servers/connector/filter/global.ts b/game-server/app/servers/connector/filter/global.ts index 39bacedc4..b9de897d3 100644 --- a/game-server/app/servers/connector/filter/global.ts +++ b/game-server/app/servers/connector/filter/global.ts @@ -6,6 +6,8 @@ import { resResult, checkWhiteListWithUid, genCode } from "../../../pubUtils/uti import { BLOCK_TYPE, CHANNEL_PREFIX, MSG_TYPE, STATUS } from "../../../consts"; import { UserModel } from "../../../db/User"; import { SERVER_DEBUG_MODE } from "../../../pubUtils/dicParam"; +import { nowSeconds } from "../../../pubUtils/timeUtil"; +import { getServerMainten } from "../../../services/gmService"; export function globalFilter(app: Application) { return new Filter(app); } @@ -37,13 +39,17 @@ Filter.prototype.before = async function (routeRecord: RouteRecord, msg: any, se session.push('teamCode', () => {}); - const maintenServers = this.app.get('maintenServers'); - if(maintenServers && maintenServers.indexOf(serverId) != -1) { // 该服务器维护 - let isWhiteList = await checkWhiteListWithUid(uid); - if(isWhiteList) return next(null); - - pinus.app.get('channelService').pushMessageByUids('onServerMaintenance', resResult(STATUS.SERVER_MAINTENANCE), [{ uid: roleId, sid }]); - return next(new Error(), resResult(STATUS.SERVER_MAINTENANCE)); + if(sid) { + const mainten = getServerMainten(serverId); + console.log('***** maintenServers', mainten) + if(mainten) { // 该服务器维护 + if(mainten.startTime > nowSeconds() || mainten.endTime < nowSeconds()) return next(null) + let isWhiteList = await checkWhiteListWithUid(uid); + if(isWhiteList) return next(null); + + pinus.app.get('channelService').pushMessageByUids('onServerMaintenance', resResult(STATUS.SERVER_MAINTENANCE), [{ uid: roleId, sid }]); + return next(new Error(), resResult(STATUS.SERVER_MAINTENANCE)); + } } let hasBlockWords = false; diff --git a/game-server/app/servers/connector/remote/connectorRemote.ts b/game-server/app/servers/connector/remote/connectorRemote.ts index c5c1d943a..87da81832 100644 --- a/game-server/app/servers/connector/remote/connectorRemote.ts +++ b/game-server/app/servers/connector/remote/connectorRemote.ts @@ -6,6 +6,7 @@ import { UserGuildType } from '../../../db/UserGuild'; import { kickUser } from '../../../services/connectorService'; import { PVPConfigType } from '../../../db/SystemConfig'; import { setDicAuctionTime } from '../../../services/guildActivityService'; +import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; export default function (app: Application) { new HandlerService(app, {}); return new ConnectorRemote(app); @@ -16,7 +17,6 @@ export class ConnectorRemote { constructor(private app: Application) { this.app = app; } - private maintenServers: number[] = []; // 维护中的服务器 public async remoteLogin(uid: string, message?: any) { await kickUser(this.app, uid, message); @@ -69,13 +69,16 @@ export class ConnectorRemote { reloadResources(); } - public setServerMainten(maintenServers: number[]) { - this.app.set('maintenServers', maintenServers); - return this.maintenServers = maintenServers; + public setServerMainten(serverIds: number[], startTime: number, endTime: number) { + setServerMainten(serverIds, startTime, endTime); } - public getServerMainten() { - return this.maintenServers; + public stopServerMainten(serverIds: number[]) { + stopServerMainten(serverIds); + } + + public getServerMainten(serverId: number) { + return getServerMainten(serverId); } public setPvpSeasonNum(pvpConfig: PVPConfigType) { diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index 679db47ca..955548dcd 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -12,8 +12,6 @@ import { RewardInter } from '../../../pubUtils/interface'; import { MarqueeModel } from '../../../db/Marquee'; import { ServerlistModel } from '../../../db/Serverlist'; import { pushCurrentTime } from '../../../services/chatService'; -import { MaintenanceModel } from '../../../db/Maintenance'; -import { initMaintenance, stopMaintenance } from '../../../services/gmService'; import { checkActivityEditable, checkActivityGroupType } from '../../../services/activity/activityService'; import { ActivityModel } from '../../../db/Activity'; import { ActivityGroupModel } from '../../../db/ActivityGroup'; @@ -156,31 +154,6 @@ export class GmHandler { return resResult(STATUS.SUCCESS); } - async startMaintenance(msg: { code: string }, session: BackendSession) { - const { code } = msg; - const uid = session.get('uid'); - const maintenance = await MaintenanceModel.updateStatusByCode(code, true, uid); - if (!maintenance) return resResult(STATUS.WRONG_PARMS); - await initMaintenance(maintenance); - - return resResult(STATUS.SUCCESS,); - } - - async stopMaintenance(msg: { code: string }, session: BackendSession) { - const { code } = msg; - const uid = session.get('uid'); - const maintenance = await MaintenanceModel.updateStatusByCode(code, false, uid); - if (!maintenance) return resResult(STATUS.WRONG_PARMS); - await stopMaintenance(maintenance, uid); - - return resResult(STATUS.SUCCESS,); - } - - async setMaintenance() { - pinus.app.rpc.connector.connectorRemote.setServerMainten.broadcast([1]); - return resResult(STATUS.SUCCESS); - } - async updateActivity(msg: { activityId: number|string, groupId: number, beginTime: number, endTime: number, type: number, data: string }, session: BackendSession) { const { activityId, groupId, beginTime, endTime, type, data } = msg; const uid = session.get('uid'); diff --git a/game-server/app/servers/gm/handler/gmServerHandler.ts b/game-server/app/servers/gm/handler/gmServerHandler.ts index 7e8b5d51a..0b536995f 100644 --- a/game-server/app/servers/gm/handler/gmServerHandler.ts +++ b/game-server/app/servers/gm/handler/gmServerHandler.ts @@ -1,14 +1,17 @@ import { Application, BackendSession, pinus } from 'pinus'; -import { getRandSingleEelm, resResult } from '../../../pubUtils/util'; +import { genCode, getRandSingleEelm, resResult } from '../../../pubUtils/util'; import { STATUS } from '../../../consts/statusCode'; import moment = require('moment'); import { CreateServerParam, UpdateRegionParams } from '../../../domain/backEndField/params'; import { RegionModel } from '../../../db/Region'; import { gameData } from '../../../pubUtils/data'; -import { ServerlistModel } from '../../../db/Serverlist'; +import { Maintenance, ServerlistModel } from '../../../db/Serverlist'; import { nowSeconds } from '../../../pubUtils/timeUtil'; import { GM_MAIL_TYPE, MAIL_TIME_TYPE, REF_CIRCLE_MAIL_TIME } from '../../../consts'; import { SendMailFun } from '../../../services/mailService'; +import { sendOpenServerMail } from '../../../services/gmService'; +import { initMaintenance, stopMaintenance } from '../../../services/timeTaskService'; +import { isNumber } from 'util'; let timer: NodeJS.Timer; export default function (app: Application) { return new GmHandler(app); @@ -18,6 +21,7 @@ export class GmHandler { constructor(private app: Application) { } + // 保存大区配置 async saveRegionConf(msg: UpdateRegionParams, session: BackendSession) { let params = new UpdateRegionParams(msg); let uid = session.get('uid'); @@ -34,10 +38,13 @@ export class GmHandler { return resResult(STATUS.SUCCESS); } + // 手动开服 async createNewServer(msg: CreateServerParam, session: BackendSession) { let params = new CreateServerParam(msg); let uid = session.get('uid'); if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS); + + console.log('*******', params); let curRegion = await RegionModel.findRegionByEnv(params.env); if(!curRegion) return resResult(STATUS.WRONG_PARMS); @@ -46,26 +53,35 @@ export class GmHandler { if(!dicServerName) return resResult(STATUS.DIC_DATA_NOT_FOUND); let newServer = await ServerlistModel.newServer(params, curRegion, dicServerName, uid); - let mails = [ params.openMail, params.circleMail ]; - for(let mail of mails) { - let needSend = false; - if(mail.timeType == MAIL_TIME_TYPE.CIRCLE) { - let refTime = moment(moment().format(`YYYY-MM-DD ${REF_CIRCLE_MAIL_TIME}:00:00`)).unix(); - let sendTime = moment(moment().format('YYYY-MM-DD '+ mail.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(mail); - await f.sendToServer([newServer.id]); - } - } + if(params.openMail) await sendOpenServerMail('openMail', params.openMail, newServer, uid); + if(params.circleMail) await sendOpenServerMail('circleMail', params.circleMail, newServer, uid); + await RegionModel.newServer(curRegion.id, newServer) return resResult(STATUS.SUCCESS); } + + // 开始维护 + async startMaintenance(msg: { id: number, startTime: number, endTime: number, hasNotify: boolean }, session: BackendSession) { + const { id, startTime, endTime, hasNotify } = msg; + if(!id || !isNumber(startTime) || !isNumber(endTime)) return resResult(STATUS.WRONG_PARMS); + const uid = session.get('uid'); + let newMaintenance: Maintenance = { batchCode: genCode(10), startTime, endTime, hasNotify, isOpen: true } + let server = await ServerlistModel.updateByServerId(id, { maintenance: newMaintenance }); + await pinus.app.rpc.systimer.systimerRemote.initMaintenance.broadcast([server]); + + return resResult(STATUS.SUCCESS,); + } + + // 提前结束维护 + async stopMaintenance(msg: { id: number }, session: BackendSession) { + const { id } = msg; + const uid = session.get('uid'); + let server = await ServerlistModel.findByServerId(id); + let maintenance = server.maintenance; + if(maintenance) { + // console.log('&&&', server, server.id) + await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(maintenance.batchCode, [server.id]); + } + + return resResult(STATUS.SUCCESS,); + } } \ No newline at end of file diff --git a/game-server/app/servers/guild/remote/guildRemote.ts b/game-server/app/servers/guild/remote/guildRemote.ts index 3dc540ed5..9d59ed997 100644 --- a/game-server/app/servers/guild/remote/guildRemote.ts +++ b/game-server/app/servers/guild/remote/guildRemote.ts @@ -1,6 +1,7 @@ import { Application, ChannelService, HandlerService, } from 'pinus'; import { reloadResources } from '../../../pubUtils/data'; import { treatGuildName } from '../../../services/sdkService'; +import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; export default function (app: Application) { new HandlerService(app, {}); @@ -26,4 +27,16 @@ export class GuildRemote { public async treatGuildName(content: string) { await treatGuildName(content); } + + public setServerMainten(serverIds: number[], startTime: number, endTime: number) { + setServerMainten(serverIds, startTime, endTime); + } + + public stopServerMainten(serverIds: number[]) { + stopServerMainten(serverIds); + } + + public getServerMainten(serverId: number) { + return getServerMainten(serverId); + } } \ No newline at end of file diff --git a/game-server/app/servers/order/remote/orderRemote.ts b/game-server/app/servers/order/remote/orderRemote.ts index d804e1ca5..f243022e7 100644 --- a/game-server/app/servers/order/remote/orderRemote.ts +++ b/game-server/app/servers/order/remote/orderRemote.ts @@ -1,6 +1,7 @@ import { Application, ChannelService, HandlerService, } from 'pinus'; import { reloadResources } from '../../../pubUtils/data'; import { settleOrderFromRedisPub } from '../../../services/orderService'; +import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; export default function (app: Application) { new HandlerService(app, {}); @@ -26,4 +27,16 @@ export class OrderRemote { public async settleOrderFromRedisPub(message: string) { await settleOrderFromRedisPub(message); } + + public setServerMainten(serverIds: number[], startTime: number, endTime: number) { + setServerMainten(serverIds, startTime, endTime); + } + + public stopServerMainten(serverIds: number[]) { + stopServerMainten(serverIds); + } + + public getServerMainten(serverId: number) { + return getServerMainten(serverId); + } } \ No newline at end of file diff --git a/game-server/app/servers/role/remote/roleRemote.ts b/game-server/app/servers/role/remote/roleRemote.ts index 263bd233a..a4a376eb7 100644 --- a/game-server/app/servers/role/remote/roleRemote.ts +++ b/game-server/app/servers/role/remote/roleRemote.ts @@ -11,6 +11,8 @@ import { Figure } from '../../../domain/dbGeneral'; import { getDefaultRoleInfo } from '../../../services/roleService'; import { PVPConfigType } from '../../../db/SystemConfig'; import { treatRoleName } from '../../../services/sdkService'; +import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; + export default function (app: Application) { new HandlerService(app, {}); return new RoleRemote(app); @@ -121,4 +123,16 @@ export class RoleRemote { public async treatRoleName(roleId: string) { await treatRoleName(roleId); } + + public setServerMainten(serverIds: number[], startTime: number, endTime: number) { + setServerMainten(serverIds, startTime, endTime); + } + + public stopServerMainten(serverIds: number[]) { + stopServerMainten(serverIds); + } + + public getServerMainten(serverId: number) { + return getServerMainten(serverId); + } } diff --git a/game-server/app/servers/systimer/remote/systimerRemote.ts b/game-server/app/servers/systimer/remote/systimerRemote.ts index 854669712..9960f502b 100644 --- a/game-server/app/servers/systimer/remote/systimerRemote.ts +++ b/game-server/app/servers/systimer/remote/systimerRemote.ts @@ -1,11 +1,12 @@ import { Application, ChannelService } from 'pinus'; -import { resetPvpSeasonTime, guildActivityStart, gateActivityEnd, cityActivityEnd, raceActivityEnd, guildActivitySchedule, auctionSchedule } from '../../../services/timeTaskService'; +import { resetPvpSeasonTime, guildActivityStart, gateActivityEnd, cityActivityEnd, raceActivityEnd, guildActivitySchedule, auctionSchedule, initMaintenance, stopMaintenance } from '../../../services/timeTaskService'; import PvpDefenseType from '../../../db/PvpDefense'; import { DicGuildActivity } from '../../../pubUtils/dictionary/DicGuildActivity'; import { reloadResources } from '../../../pubUtils/data'; import { setMarquee, cancelMarquee } from '../../../services/gmService'; import { setDicAuctionTime, setDicGuildActivity } from '../../../services/guildActivityService'; import { setWeek } from '../../../pubUtils/timeUtil'; +import { ServerlistType } from '../../../db/Serverlist'; export default function (app: Application) { return new SystimerRemote(app); @@ -89,4 +90,12 @@ export class SystimerRemote { async setDay(week: number) { setWeek(week); } + + public async initMaintenance(servers?: ServerlistType[]) { + await initMaintenance(servers); + } + + public async stopMaintenance(batchCode: string, serverIds: number[]) { + await stopMaintenance(batchCode, serverIds); + } } diff --git a/game-server/app/services/gmService.ts b/game-server/app/services/gmService.ts index 7b1d62bc0..4faea1a24 100644 --- a/game-server/app/services/gmService.ts +++ b/game-server/app/services/gmService.ts @@ -1,15 +1,16 @@ import { MarqueeType, MarqueeModel } from "../db/Marquee"; -import { MARQUEE_TYPE, SERVER_STATUS } from "../consts"; +import { GM_MAIL_STATUS, MAIL_TIME_TYPE, MARQUEE_TYPE, REF_CIRCLE_MAIL_TIME, SERVER_STATUS } from "../consts"; import { scheduleJob, scheduledJobs, Job } from 'node-schedule'; import { createMarqueeMsg as sysCreateMarqueeMsg, pushMarqueeMsg as sysPushMarqueeMsg } from './sysChatService'; import { GroupMessageType } from "../db/GroupMessage"; -import { MaintenanceModel, MaintenanceType } from '../db/Maintenance'; import { pinus } from "pinus"; import { getWorldChannelSid } from "./chatChannelService"; -import { ServerlistModel } from "../db/Serverlist"; +import { ServerlistModel, ServerlistType } from "../db/Serverlist"; import { NoticeModel, NoticeType } from "../db/Notice"; import { SendMailFun } from "./mailService"; -import { GMMailType } from '../db/GMMail'; +import GMMail, { GMMailModel, GMMailType } from '../db/GMMail'; +import moment = require("moment"); +import { getSeconds, nowSeconds } from "../pubUtils/timeUtil"; // —————————————— 跑马灯 —————————————— // // 初始 @@ -103,69 +104,132 @@ export async function cancelMarquee(code: string) { // —————————————— 停服维护 —————————————— // // 维护信息 -export async function initMaintenance(maintenance?: MaintenanceType) { - if(!maintenance) - maintenance = await MaintenanceModel.findOpenMaintenance(); - if(maintenance) { - let { startTime, marquee } = maintenance; - if(marquee) { - let result = await generateMarqueeSchedule(marquee); - // console.log(result); - } - if(Date.now() > startTime.getTime()) { - await startMaintenance(maintenance); - } else { - let startJob = scheduleJob(`startMainten${maintenance.code}`, startTime.getTime(), async () => { - await startMaintenance(maintenance, startJob); - }); - } - } -} +// export async function initMaintenance() { +// let servers = await ServerlistModel.findByEnv(pinus.app.get('env')); +// for(let server of servers) +// // if(!maintenance) +// // maintenance = await MaintenanceModel.findOpenMaintenance(); +// // if(maintenance) { +// // let { startTime, marquee } = maintenance; +// // if(marquee) { +// // let result = await generateMarqueeSchedule(marquee); +// // // console.log(result); +// // } +// // if(Date.now() > startTime.getTime()) { +// // await startMaintenance(maintenance); +// // } else { +// // let startJob = scheduleJob(`startMainten${maintenance.code}`, startTime.getTime(), async () => { +// // await startMaintenance(maintenance, startJob); +// // }); +// // } +// } +// } -// 开启维护 -async function startMaintenance(maintenance: MaintenanceType, startJob?: Job) { - // 向全服发送 - let { serverIds, notice } = maintenance; - for(let serverId of serverIds) { - let chatSid = await getWorldChannelSid(serverId); - await pinus.app.rpc.chat.chatRemote.sendServerMaintenance.toServer(chatSid, serverId); - } +// // 开启维护 +// async function startMaintenance(maintenance: MaintenanceType, startJob?: Job) { +// // 向全服发送 +// let { serverIds, notice } = maintenance; +// for(let serverId of serverIds) { +// let chatSid = await getWorldChannelSid(serverId); +// await pinus.app.rpc.chat.chatRemote.sendServerMaintenance.toServer(chatSid, serverId); +// } - // 更新serverlist上的status - await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.MAINTENANCE }); - // 更新notice的isEnable - if(notice) { - await NoticeModel.updateNotice((notice).id, { isEnable: true }); - } +// // 更新serverlist上的status +// await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.MAINTENANCE }); +// // 更新notice的isEnable +// if(notice) { +// await NoticeModel.updateNotice((notice).id, { isEnable: true }); +// } - // 更新connectorRemote里面的维护服务器 - await pinus.app.rpc.connector.connectorRemote.setServerMainten.broadcast(serverIds); +// // 更新connectorRemote里面的维护服务器 +// await pinus.app.rpc.connector.connectorRemote.setServerMainten.broadcast(serverIds); +// } + +// // 停止维护 +// export async function stopMaintenance(maintenance: MaintenanceType, uid: number) { +// let { serverIds, notice, marquee, mail } = maintenance; +// // 更新serverlist上的status +// await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.HOT }); +// // 更新notice的isEnable +// if(notice) { +// await NoticeModel.updateNotice((notice).id, { isEnable: false }); +// } + +// // 更新connectorRemote里面的维护服务器 +// let connectorServers = pinus.app.getServersByType('connector'); +// for(let { id } of connectorServers) { +// await pinus.app.rpc.connector.connectorRemote.setServerMainten.toServer(id, []); +// } + +// if(marquee) { +// await cancelMarquee((marquee).code); +// } +// console.log('*****', JSON.stringify(mail)); +// if(mail) { +// let f = new SendMailFun(); +// await f.setWithGmMail((mail)._id); +// await f.sendToServer(serverIds); +// // await f.saveRecord(uid); +// } +// } + +export async function sendOpenServerMail(type: 'openMail'|'circleMail', mail: GMMail, newServer: ServerlistType, uid: number) { + let receivers = [{ + env: newServer.env, + serverId: newServer.id + }]; + let addParam = {...mail, receivers, status: GM_MAIL_STATUS.PASS }; + if(type == 'openMail') { + addParam.timeType = MAIL_TIME_TYPE.DELAY; + addParam.startTime = newServer.openTime; + } + let gmmail = await GMMailModel.addMail(addParam, uid); + let needSend = false; + if(mail.timeType == MAIL_TIME_TYPE.CIRCLE) { + let refTime = moment(moment().format(`YYYY-MM-DD ${REF_CIRCLE_MAIL_TIME}:00:00`)).unix(); + let sendTime = moment(moment().format('YYYY-MM-DD '+ mail.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); + await f.sendToServer([newServer.id]); + } + return true; } -// 停止维护 -export async function stopMaintenance(maintenance: MaintenanceType, uid: number) { - let { serverIds, notice, marquee, mail } = maintenance; - // 更新serverlist上的status - await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.HOT }); - // 更新notice的isEnable - if(notice) { - await NoticeModel.updateNotice((notice).id, { isEnable: false }); - } - // 更新connectorRemote里面的维护服务器 - let connectorServers = pinus.app.getServersByType('connector'); - for(let { id } of connectorServers) { - await pinus.app.rpc.connector.connectorRemote.setServerMainten.toServer(id, []); - } - if(marquee) { - await cancelMarquee((marquee).code); +export function setServerMainten(serverIds: number[], startTime: number, endTime: number) { + let maintenServers = pinus.app.get('maintenServers')||new Map(); + for(let id of serverIds) { + if(!maintenServers.has(id)) { + maintenServers.set(id, { startTime, endTime }); + } else { + maintenServers.get(id).startTime = startTime; + maintenServers.get(id).endTime = endTime; + } } - console.log('*****', JSON.stringify(mail)); - if(mail) { - let f = new SendMailFun(); - await f.setWithGmMail((mail)._id); - await f.sendToServer(serverIds); - // await f.saveRecord(uid); + pinus.app.set('maintenServers', maintenServers); +} + +export function stopServerMainten(serverIds: number[]) { + let maintenServers = pinus.app.get('maintenServers')||new Map(); + for(let id of serverIds) { + if(maintenServers.has(id)) { + maintenServers.delete(id); + } } + pinus.app.set('maintenServers', maintenServers); +} + +export function getServerMainten(serverId: number) { + let maintenServers = pinus.app.get('maintenServers')||new Map(); + return maintenServers.get(serverId); } \ No newline at end of file diff --git a/game-server/app/services/mailService.ts b/game-server/app/services/mailService.ts index 98be7adbc..bb8cd5cd3 100644 --- a/game-server/app/services/mailService.ts +++ b/game-server/app/services/mailService.ts @@ -109,7 +109,7 @@ export class SendMailFun { } // 从GMMail表读取数据 - public async setWithGmMail(gmmail: GMMailTypeParam) { + public async setWithGmMail(gmmail: GMMailType) { this.gmmail = gmmail; this.contentId = 0; if(gmmail.timeType == MAIL_TIME_TYPE.IMMEDIATE) { diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index 308c94aef..5c896d69a 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -17,7 +17,7 @@ import { getRandSingleEelm } from '../pubUtils/util'; */ export async function initAllRank() { console.log('******* initAllRank ******') - const serverList = await ServerlistModel.getAllServerList(); + const serverList = await ServerlistModel?.findByEnv(pinus.app.get('env'))||[]; await delKeys(REDIS_KEY.ONLINE_USERS); await delKeys(REDIS_KEY.USER_INFO); await delKeys(REDIS_KEY.GUILD_INFO); diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index dd575a0ab..d74eec711 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -1,11 +1,11 @@ -import { scheduleJob, Job, } from 'node-schedule'; +import { scheduleJob, Job, scheduledJobs, } from 'node-schedule'; import { PVPConfigModel, PVPConfigType } from '../db/SystemConfig'; 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 } from '../consts'; +import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, SEND_NAME, SERVER_OPEN_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE, SERVER_STATUS } from '../consts'; import { RoleModel } from '../db/Role'; import { pinus } from 'pinus'; import { indexOf } from 'underscore'; @@ -19,13 +19,16 @@ import { dispatch } from '../pubUtils/dispatcher'; import { Rank } from './rankService'; import { checkTask } from './taskService'; import { everydayRefresh } from './connectorService'; -import { initMarquee, initMaintenance } from './gmService'; +import { initMarquee } from './gmService'; import moment = require('moment'); import { CounterModel } from '../db/Counter'; 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 { getWorldChannelSid } from './chatService'; +import { createMarqueeMsg, pushMarqueeMsg } from './sysChatService'; const PER_SECOND = 1 * 1000; const PER_DAY = 24 * 60 * 60; @@ -396,4 +399,132 @@ async function sendCircleMail() { await f.sendToServer(serverIds); } } +} + + +/*** 维护 */ + +let maintenInfos = new Map(); // batchCode => {servers, maintenance} +export async function initMaintenance(servers?: ServerlistType[]) { + if(!servers) servers = await ServerlistModel.findByEnv(pinus.app.get('env')); + + console.log('#### initMaintenance', servers) + + for(let server of servers) { + let { maintenance } = server; + if(maintenance && maintenance.isOpen) { + if(!maintenInfos.has(maintenance.batchCode)) { + maintenInfos.set(maintenance.batchCode, { servers: [], maintenance }); + } + maintenInfos.get(maintenance.batchCode).servers.push(server); + } + } + for(let [batchCode] of maintenInfos) { + await setMaintenance(batchCode); + } +} + +// 设置维护 +async function setMaintenance(batchCode: string) { + let { maintenance } = maintenInfos.get(batchCode); + let now = nowSeconds(); + // 发送消息 + if(maintenance.hasNotify && now < maintenance.startTime) { + if(now > maintenance.startTime - 5 * 60) { + maintenanceNotifySchedule(batchCode); + } else { + scheduleJob(`maintenNotify${batchCode}`, maintenance.startTime - 5 * 60, () => { + maintenanceNotifySchedule(batchCode); + }) + } + } else { + if(scheduledJobs[`maintenNotify${batchCode}`]) scheduledJobs[`maintenNotify${batchCode}`].cancel(); + } + // 开始维护 + console.log('******* setMaintenance', now, now < maintenance.endTime, now > maintenance.startTime) + if(now < maintenance.endTime) { + if(now > maintenance.startTime) { + console.log('*******') + await startMaintenanceSchedule(batchCode); + } else { + scheduleJob(`startMainten${batchCode}`, maintenance.startTime * 1000, async () => { + await startMaintenanceSchedule(batchCode); + }); + } + } else { + if(scheduledJobs[`startMainten${batchCode}`]) scheduledJobs[`startMainten${batchCode}`].cancel(); + } + +} + +// 维护前通知 +async function maintenanceNotifySchedule(batchCode: string) { + let { servers, maintenance } = maintenInfos.get(batchCode); + if(scheduledJobs[`maintenNotify${batchCode}`]) scheduledJobs[`maintenNotify${batchCode}`].cancel(); + if(scheduledJobs[`maintenSec${batchCode}`]) scheduledJobs[`maintenSec${batchCode}`].cancel(); + + scheduleJob(`maintenSec${batchCode}`, `0 */1 * * * *`, async () => { + for(let { id: serverId } of servers) { + let msgData = await createMarqueeMsg('', '系统', serverId, '服务器即将维护,请玩家提前退出游戏'); + await pushMarqueeMsg(msgData); + } + }) +} + +// 开始维护 +async function startMaintenanceSchedule(batchCode: string) { + let { servers, maintenance } = maintenInfos.get(batchCode); + let serverIds = servers.map(cur => cur.id); + if(scheduledJobs[`maintenNotify${batchCode}`]) scheduledJobs[`maintenNotify${batchCode}`].cancel(); + if(scheduledJobs[`maintenSec${batchCode}`]) scheduledJobs[`maintenSec${batchCode}`].cancel(); + if(scheduledJobs[`startMainten${batchCode}`]) scheduledJobs[`startMainten${batchCode}`].cancel(); + + // 向全服发送 + for(let { id: serverId } of servers) { + let chatSid = await getWorldChannelSid(serverId); + if(chatSid) { + await pinus.app.rpc.chat.chatRemote.sendServerMaintenance.toServer(chatSid, serverId); + } + } + + // 更新serverlist上的status + await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.MAINTENANCE }); + + // 更新connectorRemote里面的维护服务器 + console.log('******** startMaintenanceSchedule', batchCode, serverIds, maintenance.startTime, maintenance.endTime) + pinus.app.rpc.connector.connectorRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime); + pinus.app.rpc.activity.activityRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime); + pinus.app.rpc.battle.battleRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime); + pinus.app.rpc.chat.chatRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime); + pinus.app.rpc.guild.guildRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime); + pinus.app.rpc.order.orderRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime); + pinus.app.rpc.role.roleRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime); +} + +// 提前结束维护 +export async function stopMaintenance(batchCode: string, serverIds: number[]) { + // console.log('***********', serverIds) + let { servers = [], maintenance = {} as Maintenance } = maintenInfos.get(batchCode)||{}; + for(let id of serverIds) { + let index = servers.findIndex(cur => cur.id == id); + if(index != -1) servers.splice(index); + } + if(servers.length == 0) { + if(scheduledJobs[`maintenNotify${batchCode}`]) scheduledJobs[`maintenNotify${batchCode}`].cancel(); + if(scheduledJobs[`maintenSec${batchCode}`]) scheduledJobs[`maintenSec${batchCode}`].cancel(); + if(scheduledJobs[`startMainten${batchCode}`]) scheduledJobs[`startMainten${batchCode}`].cancel(); + maintenInfos.delete(batchCode); + } + + // 更新serverlist上的status + await ServerlistModel.updateByServerIds(serverIds, { serverStatus: SERVER_STATUS.HOT, 'maintenance.isOpen': false } as ServerlistUpdate); + + // 更新connectorRemote里面的维护服务器 + pinus.app.rpc.connector.connectorRemote.stopServerMainten.broadcast(serverIds); + pinus.app.rpc.activity.activityRemote.stopServerMainten.broadcast(serverIds); + pinus.app.rpc.battle.battleRemote.stopServerMainten.broadcast(serverIds); + pinus.app.rpc.chat.chatRemote.stopServerMainten.broadcast(serverIds); + pinus.app.rpc.guild.guildRemote.stopServerMainten.broadcast(serverIds); + pinus.app.rpc.order.orderRemote.stopServerMainten.broadcast(serverIds); + pinus.app.rpc.role.roleRemote.stopServerMainten.broadcast(serverIds); } \ No newline at end of file diff --git a/gm-server/app/controller/game.ts b/gm-server/app/controller/game.ts index 011c56def..ab7ffd912 100644 --- a/gm-server/app/controller/game.ts +++ b/gm-server/app/controller/game.ts @@ -2,19 +2,19 @@ import { Controller } from 'egg'; export default class GameController extends Controller { - public async getServerListByEnv() { - const { ctx } = this; - ctx.body = await ctx.service.game.getServerListByEnv(); - return - } + // public async getServerListByEnv() { + // const { ctx } = this; + // ctx.body = await ctx.service.game.getServerListByEnv(); + // return + // } - public async getServerList() { - const { ctx } = this; - const { page, pageSize, sortField, sortOrder, form } = ctx.request.body; + // public async getServerList() { + // const { ctx } = this; + // const { page, pageSize, sortField, sortOrder, form } = ctx.request.body; - ctx.body = await ctx.service.game.getServerList(page, pageSize, sortField, sortOrder, form); - return - } + // ctx.body = await ctx.service.game.getServerList(page, pageSize, sortField, sortOrder, form); + // return + // } public async getRegions() { const { ctx } = this; diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index 6f1a49a65..ace939d7c 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -50,8 +50,8 @@ export default (app: Application) => { // router.post('/api/users/delgiftCode', controller.users.delGiftCode); router.get('/api/users/getgiftcodedetails/:id/:filename', controller.users.getGiftCodeDetails); - router.post('/api/game/getserverlistbyenv', tokenParser, controller.game.getServerListByEnv); - router.post('/api/game/getserverlist', controller.game.getServerList); + // router.post('/api/game/getserverlistbyenv', tokenParser, controller.game.getServerListByEnv); + // router.post('/api/game/getserverlist', controller.game.getServerList); router.post('/api/game/getregions', controller.game.getRegions); router.post('/api/game/getservers', controller.game.getServers); router.post('/api/game/getregionstategy', controller.game.getRegionStategy); diff --git a/gm-server/app/service/Game.ts b/gm-server/app/service/Game.ts index a0538928b..a75627ced 100644 --- a/gm-server/app/service/Game.ts +++ b/gm-server/app/service/Game.ts @@ -1,6 +1,6 @@ import { Service } from 'egg'; import { STATUS } from '@consts'; -import { GameModel } from '@db/Game'; +// import { GameModel } from '@db/Game'; import { ServerlistModel } from '@db/Serverlist'; import { gameData } from '@pubUtils/data'; import { DicHero } from '@pubUtils/dictionary/DicHero'; @@ -21,27 +21,27 @@ export default class Game extends Service { /** * 获取正式服,测试服,开发服等环境 */ - public async getServerListByEnv() { - const { ctx, app } = this; - let env = app.config.env - let serverEnv = await GameModel.getServerEnvList(); - let curEnv = serverEnv.find(cur => cur.env == env); - const list = await ServerlistModel.findByServerType(curEnv?.serverType); + // public async getServerListByEnv() { + // const { ctx, app } = this; + // let env = app.config.env + // let serverEnv = await GameModel.getServerEnvList(); + // let curEnv = serverEnv.find(cur => cur.env == env); + // const list = await ServerlistModel.findByServerType(curEnv?.serverType); - return ctx.service.utils.resResult(STATUS.SUCCESS, { - list - }); - } + // return ctx.service.utils.resResult(STATUS.SUCCESS, { + // list + // }); + // } - public async getServerList(page: number, pageSize: number, sortField: string, sortOrder: string, form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string } = {}) { - const { ctx } = this; + // public async getServerList(page: number, pageSize: number, sortField: string, sortOrder: string, form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string } = {}) { + // const { ctx } = this; - const list = await ServerlistModel.findByCondition(page, pageSize, sortField, sortOrder, form); - const total = await ServerlistModel.countByCondition( form ) - return ctx.service.utils.resResult(STATUS.SUCCESS, { - list, total - }); - } + // const list = await ServerlistModel.findByCondition(page, pageSize, sortField, sortOrder, form); + // const total = await ServerlistModel.countByCondition( form ) + // return ctx.service.utils.resResult(STATUS.SUCCESS, { + // list, total + // }); + // } public async getRegions() { @@ -57,6 +57,7 @@ export default class Game extends Service { const { ctx } = this; const list = await ServerlistModel.getAllServerList(); + console.log('******', list) return ctx.service.utils.resResult(STATUS.SUCCESS, { list }); diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 128493ca0..d1745c53d 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -707,6 +707,7 @@ export enum SERVER_STATUS { HOT = 2, // 火爆 WILL_OPEN = 3, // 即将开启 MAINTENANCE = 4, // 维护中 + HIDE = 0, // 隐藏 } export enum WHITE_LIST_TYPE { diff --git a/shared/db/Counter.ts b/shared/db/Counter.ts index 68a181dca..6ac266312 100644 --- a/shared/db/Counter.ts +++ b/shared/db/Counter.ts @@ -1,5 +1,5 @@ import BaseModel from './BaseModel'; -import { index, getModelForClass, prop, DocumentType, ReturnModelType, mongoose } from '@typegoose/typegoose'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; /** * 自增 ID diff --git a/shared/db/GMMail.ts b/shared/db/GMMail.ts index 65d394359..a341f2cd0 100644 --- a/shared/db/GMMail.ts +++ b/shared/db/GMMail.ts @@ -23,8 +23,6 @@ export class Receiver { roleId?: string; @prop({ required: true }) roleName?: string; - @prop({ required: true }) - hasSend?: boolean; } export default class GMMail extends BaseModel { diff --git a/shared/db/Maintenance.ts b/shared/db/Maintenance.ts deleted file mode 100644 index 99a8393f9..000000000 --- a/shared/db/Maintenance.ts +++ /dev/null @@ -1,107 +0,0 @@ -import BaseModel from './BaseModel'; -import { index, getModelForClass, prop, DocumentType, mongoose, Ref } from '@typegoose/typegoose'; -import Marquee, { MarqueeType } from './Marquee'; -import Notice, { NoticeType } from './Notice'; -import GMMail from './GMMail'; -import { genCode } from '../pubUtils/util'; -import { GMMailType } from './GMMail'; - -/** - * 开服策略 -*/ -@index({ id: 1 }) - -export default class Maintenance extends BaseModel { - - @prop({ required: true }) - code: string; // 策略唯一标志 - - @prop({ required: true, type: Number }) - serverIds: number[]; // 服务器类型 - - @prop({ required: true }) - isOpen: boolean; // 维护是否使用 - - @prop({ required: true }) - startTime: Date; // 维护开始时间 - - @prop({ ref: () => Marquee, type: mongoose.Schema.Types.ObjectId }) - marquee: Ref; // 跑马灯,连接到marquee表 - - @prop({ ref: () => Notice, type: mongoose.Schema.Types.ObjectId }) - notice: Ref; // 维护公告 - - @prop({ ref: () => GMMail, type: mongoose.Schema.Types.ObjectId }) - mail: Ref; // 维护结束邮件 - - - public static async createData(values: MaintenanceTypeParam, marquee: MarqueeType, notice: NoticeType, mail: GMMailType, uid = 1) { - const code = genCode(8); - const rec: MaintenanceType = await MaintenanceModel.findOneAndUpdate({ code }, { - $setOnInsert: {...values, code, isOpen: false, marquee: marquee._id, notice: notice._id, mail: mail._id, createdBy: uid}, $set: { updatedBy: uid } - }, { new: true, upsert: true }).lean(); - return rec; - } - - public static async updateData(code: string, values: MaintenanceTypeParam, uid = 1) { - const rec: MaintenanceType = await MaintenanceModel.findOneAndUpdate({ code }, { $set: { ...values, updatedBy: uid } }, { new: true, upsert: true }) - .populate('marquee', 'code') - .populate('notice') - .populate('mail') - .lean(); - return rec; - } - - public static async findOpenMaintenance() { - const rec: MaintenanceType = await MaintenanceModel.findOne({ isOpen: true }, { _id: 0 }).populate('marquee').populate('notice').populate('mail').lean(); - return rec; - } - - public static async findByCode(code: string) { - const rec: MaintenanceType = await MaintenanceModel.findOne({ code }).populate('marquee').populate('notice').populate('mail').lean(); - return rec; - } - - public static async updateStatusByCode(code: string, isOpen: boolean, uid = 1) { - const rec: MaintenanceType = await MaintenanceModel.findOneAndUpdate({ code }, { $set: { isOpen, updatedBy: uid } }).populate('marquee').populate('notice').populate('mail').lean(); - return rec; - } - - private static getSearchObj(form: { isOpen?: boolean }) { - let searchObj = {}; - if (form.isOpen) searchObj['isOpen'] = form.isOpen; - return searchObj - } - - public static async findByCondition(page: number, pageSize: number, sortField: string, sortOrder: string, form: { isOpen?: boolean } = {}) { - - let searchObj = this.getSearchObj(form); - let sort = {}; - if (sortField && sortOrder) { - if (sortOrder == 'ascend') { - sort[sortField] = 1; - } else if (sortOrder == 'descend') { - sort[sortField] = -1; - } - } - const result: MaintenanceType[] = await MaintenanceModel.find(searchObj, { _id: 0 }) - .populate('marquee').populate('notice', '+showStartTime +showEndTime').populate('mail') - .limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true }); - return result; - - } - - public static async countByCondition(form: { isOpen?: boolean } = {}) { - - let searchObj = this.getSearchObj(form); - const result = await MaintenanceModel.count(searchObj); - return result; - } - - -} - -export const MaintenanceModel = getModelForClass(Maintenance); - -export interface MaintenanceType extends Pick, keyof Maintenance> { } -export type MaintenanceTypeParam = Partial; // 将所有字段变成可选项 \ No newline at end of file diff --git a/shared/db/Region.ts b/shared/db/Region.ts index 33ad11e70..a5da14952 100644 --- a/shared/db/Region.ts +++ b/shared/db/Region.ts @@ -3,6 +3,7 @@ import { CounterModel } from './Counter'; import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose'; import ServerStategy from './ServerStategy'; +import { ServerlistType } from './Serverlist'; /** @@ -35,6 +36,9 @@ export default class Region extends BaseModel { @prop({ required: true }) latestServer: number; // 最新服 + @prop({ required: true }) + latestServerUniqId: number; // 最新服唯一id + @prop({ required: true }) serverCount: number; // 总数 @@ -56,6 +60,13 @@ export default class Region extends BaseModel { return rec; } + 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 }, + $inc: { serverCount: 1 } + }, { new: true }).lean(); + return rec; + } public static async getAllRegion() { const rec: RegionType[] = await RegionModel.find().select('-_id -stategy').lean(); return rec; diff --git a/shared/db/Serverlist.ts b/shared/db/Serverlist.ts index 53c5e55ae..68ac8e72f 100644 --- a/shared/db/Serverlist.ts +++ b/shared/db/Serverlist.ts @@ -5,11 +5,31 @@ import { COUNTER, SERVER_STATUS } from '../consts'; import { CreateServerParam } from '../domain/backEndField/params'; import { RegionType } from './Region'; import { DicServerName } from '../pubUtils/dictionary/DicServerName'; +import { nowSeconds } from '../pubUtils/timeUtil'; +export class Maintenance { + + @prop({ required: true }) + batchCode: string; // 批次,如果是从大区列表维护就是一批的,小区列表上就是一服一个 + + @prop({ required: true }) + isOpen: boolean; // 维护是否使用 + + @prop({ required: true }) + startTime: number; // 维护开始时间 + + @prop({ required: true }) + endTime: number; // 维护结束时间 + + @prop({ required: true }) + hasNotify: boolean; // 是否有维护通知 + +} /** * 游戏字段接口 */ @index({ id: 1 }) +@index({ env: 1 }) @modelOptions({ schemaOptions: { id: false } }) export default class Serverlist extends BaseModel { @@ -23,7 +43,7 @@ export default class Serverlist extends BaseModel { prefix: string; // 前缀 @prop({ required: true }) - id: number; // 小区id 自增 + id: number; // 小区id 自增,全大区共用自增counter,玩家role表中存的就是这个serverId @prop({ required: true }) serverId: number; // 相同serverType下的id,不同serverType下id一定不同,但是serverId可能相同 @@ -44,8 +64,7 @@ export default class Serverlist extends BaseModel { activityGroupId: number[]; // 活动组 public get status() { - let now = new Date(); - if (now > this.openTime) { + if (nowSeconds() > this.openTime) { return this.serverStatus; } else { return SERVER_STATUS.WILL_OPEN; // 未开服 @@ -53,10 +72,10 @@ export default class Serverlist extends BaseModel { } @prop({ required: true }) - openTime: Date; + openTime: number; @prop({ required: true }) - stopRegisterTime: Date; + stopRegisterTime: number; @prop({ required: true, default: true }) canRegister: boolean; @@ -67,6 +86,9 @@ export default class Serverlist extends BaseModel { @prop({ required: true, default: 0 }) medianCe: number; // 中位数武将战力、缩小10000倍后的结果 + @prop({ required: true, type: Maintenance, _id: false }) + maintenance: Maintenance + public static async getAllServerList() { let id = await CounterAllModal.getCounter(COUNTER.SERVER); let result: ServerlistType[] = []; @@ -79,7 +101,7 @@ export default class Serverlist extends BaseModel { } public static async findByServerId(serverId: number) { - let server: ServerlistType = await ServerlistModel.findOne({ id: serverId }).select('medianCe activityGroupId').lean({ getters: true, virtuals: true }); + let server: ServerlistType = await ServerlistModel.findOne({ id: serverId }).lean({ getters: true, virtuals: true }); return server; } @@ -89,7 +111,7 @@ export default class Serverlist extends BaseModel { } public static async updateByServerId(serverId: number, update: ServerlistUpdate) { - let server: ServerlistType = await ServerlistModel.findOneAndUpdate({ id: serverId }, { $set: update }).lean({ getters: true, virtuals: true }); + let server: ServerlistType = await ServerlistModel.findOneAndUpdate({ id: serverId }, { $set: update }, {new: true}).lean({ getters: true, virtuals: true }); return server; } @@ -98,19 +120,13 @@ export default class Serverlist extends BaseModel { return result; } - public static async updateGroupName(groupId: number, groupName: string) { - let server = await ServerlistModel.updateMany({ groupId }, { $set: { groupName } }); - return server; - } - public static async newServer(params: CreateServerParam, region: RegionType, dicServerName: DicServerName, uid = 1 ) { let { prefix, id: regionId, env } = region; // 分大区 let id = await CounterAllModal.getNewCounter(COUNTER.SERVER); - let { openTime: openTimeNum, stopRegisterTime: hour, activityGroupId } = params; + let { openTime, stopRegisterTime: hour, activityGroupId } = params; let { id: serverId, sname: name, groupId, groupName } = dicServerName; - let openTime = new Date(openTimeNum * 1000); - let stopRegisterTime = new Date(openTimeNum + hour * 60 * 60); + let stopRegisterTime = openTime + hour * 60 * 60; const doc = new ServerlistModel(); const update = Object.assign(doc.toJSON(), { @@ -124,49 +140,11 @@ export default class Serverlist extends BaseModel { return server; } - public static async findByServerType(serverType?: string) { - let condition = {}; - if(serverType) { - condition['serverType'] = serverType; - } - let server: ServerlistType[] = await ServerlistModel.find(condition).sort({ id: -1 }).lean({ getters: true, virtuals: true }); + public static async findByEnv(env?: string) { + let server: ServerlistType[] = await ServerlistModel.find({ env, serverStatus: { $gt: 0 } }).sort({ id: -1 }).lean({ getters: true, virtuals: true }); return server; } - private static getSearchObj(form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string }) { - let searchObj = {}; - if (form.id != undefined) searchObj['id'] = form.id; - if (form.serverId != undefined) searchObj['serverId'] = form.serverId; - if (form.groupId != undefined) searchObj['groupId'] = form.groupId; - if (form.name != undefined) searchObj['name'] = { $regex: new RegExp(form.name.toString(), 'i') }; - if (form.groupName != undefined) searchObj['groupName'] = { $regex: new RegExp(form.groupName.toString(), 'i') }; - if (form.serverType != undefined) searchObj['serverType'] = form.serverType; - return searchObj - } - - public static async findByCondition(page: number, pageSize: number, sortField: string, sortOrder: string, form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string } = {}) { - - let searchObj = this.getSearchObj(form); - let sort = {}; - if(sortField && sortOrder) { - if(sortOrder == 'ascend') { - sort[sortField] = 1; - } else if (sortOrder == 'descend') { - sort[sortField] = -1; - } - } - const result: ServerlistType[] = await ServerlistModel.find(searchObj, { _id: 0 }).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true }); - return result; - - } - - public static async countByCondition(form: { id?: number, serverId?: string|number, name?: string, groupName?: string, groupId?: number, serverType?: string } = {}) { - - let searchObj = this.getSearchObj(form); - const result = await ServerlistModel.count(searchObj); - return result; - } - //根据多个活动id查询活动数据 public static async findServerByIds(ids: number[]) { let result: ServerlistType[] = await ServerlistModel.find({ id: { $in: ids } }).lean(); diff --git a/shared/db/index.ts b/shared/db/index.ts index 64c559184..42adb0b1e 100644 --- a/shared/db/index.ts +++ b/shared/db/index.ts @@ -10,6 +10,7 @@ import { loadGMMailModel } from './GMMail'; import { loadCounterModal } from "./CounterAll"; export function loadGmDb(connect: mongoose.Connection) { + // console.log('************') loadApiModel(connect); loadGMGroupModel(connect); loadGMUserModel(connect); diff --git a/shared/domain/backEndField/params.ts b/shared/domain/backEndField/params.ts index 2a59e16d5..34b57cc6c 100644 --- a/shared/domain/backEndField/params.ts +++ b/shared/domain/backEndField/params.ts @@ -121,7 +121,9 @@ export class CreateServerParam { env: string = ''; openTime: number = 0; activityGroupId: number[] = []; + hasOpenMail: boolean = false; openMail?: GMMail; + hasCircleMail: boolean = false; circleMail?: GMMail; stopRegisterTime: number = 0; @@ -135,6 +137,8 @@ export class CreateServerParam { if(!this.env || !this.openTime || !this.stopRegisterTime || !isArray(this.activityGroupId) || this.activityGroupId.length <= 0 ) { return false } + if(this.hasOpenMail && !this.openMail) return false; + if(this.hasCircleMail && !this.circleMail) return false; return true; } } \ No newline at end of file diff --git a/shared/domain/gameField/serverlist.ts b/shared/domain/gameField/serverlist.ts index 1c6cabe1d..0aa331234 100644 --- a/shared/domain/gameField/serverlist.ts +++ b/shared/domain/gameField/serverlist.ts @@ -1,5 +1,4 @@ import { RoleType } from '../../db/Role'; -import { getSeconds } from '../../pubUtils/timeUtil'; import { ServerlistType } from '../../db/Serverlist'; export class ServerParam { @@ -15,10 +14,10 @@ export class ServerParam { constructor(server: ServerlistType) { this.id = server.id; this.serverId = server.serverId; - this.serverStr = `S${server.serverId}`; + this.serverStr = `${server.prefix}${server.serverId}`; this.name = server.name; this.status = server.status; - this.openTime = getSeconds(server.openTime); + this.openTime = server.openTime; } } @@ -31,15 +30,17 @@ export class GroupParam { constructor(server: ServerlistType) { this.groupId = server.groupId; this.groupName = server.groupName; - this.groupStr = `S${server.serverId}-S${server.serverId + 9}`; + this.groupStr = `${server.prefix}${server.serverId}`; this.servers = new Array(); } public pushServer(server: ServerlistType) { let srv = new ServerParam(server); this.servers.push(srv); - let min = this.servers.reduce((pre, cur) => pre < cur? pre: cur); - this.groupStr = `${min.serverId}-${min.serverId + 9}` + this.servers.sort((a, b) => b.serverId - a.serverId); + let min = this.servers[this.servers.length - 1]; + let max = this.servers[0]; + this.groupStr = `${min.serverStr}-${max.serverStr}` } } diff --git a/web-server/app/controller/game.ts b/web-server/app/controller/game.ts index 2cdbb530b..574299750 100644 --- a/web-server/app/controller/game.ts +++ b/web-server/app/controller/game.ts @@ -26,12 +26,12 @@ export default class GameController extends Controller { public async getServerList() { const { ctx } = this; - let { serverType, auth, uid, clientVersion } = ctx; + let { uid, clientVersion } = ctx; console.log('clientVersion', clientVersion); let serverList = new Array(); let loginServerList = new Array(); - let allServers = await ServerlistModel.findByServerType(auth == 1 ? null : serverType); + let allServers = await ServerlistModel.findByEnv(ctx.app.config.realEnv); let roles = await RoleModel.findAllByUid(uid, true, true); for (let server of allServers) { let curGroup = serverList.find(cur => cur.groupId == server.groupId); diff --git a/web-server/app/service/Game.ts b/web-server/app/service/Game.ts index faf39ab1b..8f93cedde 100644 --- a/web-server/app/service/Game.ts +++ b/web-server/app/service/Game.ts @@ -1,6 +1,5 @@ import { Service } from 'egg'; -import { MaintenanceModel } from '@db/Maintenance'; /** * Test Service @@ -12,14 +11,15 @@ export default class Game extends Service { // } public async getServerMainten() { - // return this.app['maintenServers']||[]; + // // return this.app['maintenServers']||[]; - const maintenance = await MaintenanceModel.findOpenMaintenance(); - if(maintenance) { - return maintenance.serverIds; - } else { - return []; - } + // const maintenance = await MaintenanceModel.findOpenMaintenance(); + // if(maintenance) { + // return maintenance.serverIds; + // } else { + // return []; + // } + return [] } // public async readDbMaintenance() {