✨ feat(服务器): 多服务器开服
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import { Application, BackendSession, pinus } from 'pinus';
|
import { Application, BackendSession, pinus } from 'pinus';
|
||||||
import { genCode, getRandSingleEelm, isTimestamp, resResult } from '../../../pubUtils/util';
|
import { genCode, getRandSingleEelm, isTimestamp, resResult } from '../../../pubUtils/util';
|
||||||
import { STATUS } from '../../../consts/statusCode';
|
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 { RegionModel, RegionType } from '../../../db/Region';
|
||||||
import { getDicServerName } from '../../../pubUtils/data';
|
import { getDicServerName } from '../../../pubUtils/data';
|
||||||
import { Maintenance, ServerlistModel, ServerlistUpdate } from '../../../db/Serverlist';
|
import { Maintenance, ServerlistModel, ServerlistUpdate } from '../../../db/Serverlist';
|
||||||
@@ -45,8 +45,9 @@ export class GmHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 手动开服
|
// 手动开服
|
||||||
async createNewServer(msg: CreateServerParam, session: BackendSession) {
|
async createNewServer(msg: CreateServersParam, session: BackendSession) {
|
||||||
let params = new CreateServerParam(msg);
|
if(isNumber(msg.openTime)) return resResult(STATUS.WRONG_PARMS, '请刷新后使用新后台页面');
|
||||||
|
let params = new CreateServersParam(msg);
|
||||||
let uid = session.get('uid');
|
let uid = session.get('uid');
|
||||||
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
|
if(!params.checkParams()) return resResult(STATUS.WRONG_PARMS);
|
||||||
|
|
||||||
@@ -54,12 +55,15 @@ export class GmHandler {
|
|||||||
let curRegion = await RegionModel.findRegionByEnv(params.env);
|
let curRegion = await RegionModel.findRegionByEnv(params.env);
|
||||||
console.log('******* curRegion', curRegion);
|
console.log('******* curRegion', curRegion);
|
||||||
if(!curRegion) return resResult(STATUS.WRONG_PARMS);
|
if(!curRegion) return resResult(STATUS.WRONG_PARMS);
|
||||||
|
msg.openTime.sort()
|
||||||
let { latestServer = 0, env } = curRegion;
|
let { latestServer = 0, env } = curRegion;
|
||||||
let dic = getDicServerName(env, latestServer + 1);
|
for(let openTime of msg.openTime) {
|
||||||
if(!dic) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
let dic = getDicServerName(env, latestServer + 1);
|
||||||
|
if(!dic) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||||
|
|
||||||
await createNewServer(curRegion, latestServer + 1, params, uid);
|
await createNewServer(curRegion, latestServer + 1, new CreateServerParam({...params, openTime}), uid);
|
||||||
|
latestServer++;
|
||||||
|
}
|
||||||
return resResult(STATUS.SUCCESS);
|
return resResult(STATUS.SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,7 +257,14 @@ export class GmHandler {
|
|||||||
let server = await ServerlistModel.findByServerId(serverId);
|
let server = await ServerlistModel.findByServerId(serverId);
|
||||||
if(!server) return resResult(STATUS.WRONG_PARMS);
|
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 });
|
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}`);
|
await redisClient().hsetAsync(REDIS_KEY.SERVER_OPEN_TIME, `${server.id}`, `${server.openTime}`);
|
||||||
return resResult(STATUS.SUCCESS);
|
return resResult(STATUS.SUCCESS);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,8 +123,8 @@ export async function autoCreateServerSchedule() {
|
|||||||
return errlogger.error('create new server region not found');
|
return errlogger.error('create new server region not found');
|
||||||
}
|
}
|
||||||
let time = moment().format('HH:mm');
|
let time = moment().format('HH:mm');
|
||||||
console.log('#### time', time)
|
let latestServerOpenTime = region.latestServerOpenTime||0;
|
||||||
if(region.stategy && region.stategy.type == 1 && region.stategy.timers.indexOf(time) != -1) {
|
if(region.stategy && region.stategy.type == 1 && region.stategy.timers.indexOf(time) != -1 && latestServerOpenTime < nowSeconds()) {
|
||||||
let latestServer = await ServerlistModel.findByServerId(region.latestServerUniqId);
|
let latestServer = await ServerlistModel.findByServerId(region.latestServerUniqId);
|
||||||
if(!latestServer || latestServer.playerCnt >= region.stategy.maxPlayerCnt) {
|
if(!latestServer || latestServer.playerCnt >= region.stategy.maxPlayerCnt) {
|
||||||
let params = new CreateServerParam();
|
let params = new CreateServerParam();
|
||||||
@@ -146,7 +146,8 @@ export async function autoCreateServerWhenRoleInit(serverId: number) {
|
|||||||
return errlogger.error('create new server region not found');
|
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();
|
let params = new CreateServerParam();
|
||||||
params.setByRegionStategy(region, nowSeconds())
|
params.setByRegionStategy(region, nowSeconds())
|
||||||
await createNewServer(region, server.serverId + 1, params);
|
await createNewServer(region, server.serverId + 1, params);
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ export default class Region extends BaseModel {
|
|||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
latestServerUniqId: number; // 最新服唯一id
|
latestServerUniqId: number; // 最新服唯一id
|
||||||
|
|
||||||
|
@prop({ required: true })
|
||||||
|
latestServerOpenTime: number; // 最新服的开服时间
|
||||||
|
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
addressType: number; // 参数表的那个addressType
|
addressType: number; // 参数表的那个addressType
|
||||||
|
|
||||||
@@ -90,7 +93,7 @@ export default class Region extends BaseModel {
|
|||||||
|
|
||||||
public static async newServer(id: number, newServer: ServerlistType, uid = 1) {
|
public static async newServer(id: number, newServer: ServerlistType, uid = 1) {
|
||||||
const rec: RegionType = await RegionModel.findOneAndUpdate({ id }, {
|
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 }
|
$inc: { serverCount: 1 }
|
||||||
}, { new: true }).lean();
|
}, { new: true }).lean();
|
||||||
return rec;
|
return rec;
|
||||||
|
|||||||
@@ -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 {
|
export class CreateServerParam {
|
||||||
env: string = '';
|
env: string = '';
|
||||||
openTime: number = 0;
|
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 {
|
export class CreateGiftCode {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import { ChannelInfoModel } from '@db/ChannelInfo';
|
|||||||
import { GVGVestigeRecModel } from '@db/GVGVestigeRec';
|
import { GVGVestigeRecModel } from '@db/GVGVestigeRec';
|
||||||
import { GVGBattleRecModel } from '@db/GVGBattleRec';
|
import { GVGBattleRecModel } from '@db/GVGBattleRec';
|
||||||
import { PackageModel } from '@db/Package';
|
import { PackageModel } from '@db/Package';
|
||||||
|
import { nowSeconds } from 'app/pubUtils/timeUtil';
|
||||||
const sendToWormhole = require('stream-wormhole');
|
const sendToWormhole = require('stream-wormhole');
|
||||||
const pump = require('mz-modules/pump');
|
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));
|
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);
|
let roles = await RoleModel.findAllByUid(uid, true, true);
|
||||||
for (let server of allServers) {
|
for (let server of allServers) {
|
||||||
|
|||||||
Reference in New Issue
Block a user