feat(服务器): 更新维护逻辑

This commit is contained in:
luying
2023-05-06 11:44:05 +08:00
parent a651254821
commit f47d2d131f
24 changed files with 183 additions and 89 deletions

View File

@@ -112,9 +112,9 @@ export class ActivityRemote {
}
}
public setServerMainten(serverIds: number[], startTime: number, endTime: number) {
public setServerMainten(serverIds: number[], startTime: number, endTime: number, version: string) {
try {
setServerMainten(serverIds, startTime, endTime);
setServerMainten(serverIds, startTime, endTime, version);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}

View File

@@ -119,9 +119,9 @@ export class BattleRemote {
}
}
public setServerMainten(serverIds: number[], startTime: number, endTime: number) {
public setServerMainten(serverIds: number[], startTime: number, endTime: number, version: string) {
try {
setServerMainten(serverIds, startTime, endTime);
setServerMainten(serverIds, startTime, endTime, version);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}

View File

@@ -119,9 +119,9 @@ export class ChatRemote {
}
}
public setServerMainten(serverIds: number[], startTime: number, endTime: number) {
public setServerMainten(serverIds: number[], startTime: number, endTime: number, version: string) {
try {
setServerMainten(serverIds, startTime, endTime);
setServerMainten(serverIds, startTime, endTime, version);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}

View File

@@ -82,9 +82,9 @@ export class ComBattleRemote {
}
}
public setServerMainten(serverIds: number[], startTime: number, endTime: number) {
public setServerMainten(serverIds: number[], startTime: number, endTime: number, version: string) {
try {
setServerMainten(serverIds, startTime, endTime);
setServerMainten(serverIds, startTime, endTime, version);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}

View File

@@ -36,6 +36,8 @@ class Filter {
const uid: number = session.get('userid');
const ip: string = session.get('ip');
// console.log('*********** global before ip', ip)
const version: string = session.get('version');
const isNewUser: boolean = session.get('isNewUser');
let guildCode = session.get('guildCode');
let blockType = session.get('blockType');
const logCode = genCode(10);
@@ -79,9 +81,10 @@ class Filter {
msg.guildCode = guildCode;
}
if(await this.checkMainten(serverId, sid, ip, uid)) {
if(routeRecord.route != 'connector.entryHandler.enter' && await this.checkMainten(serverId, sid, ip, uid, isNewUser)) {
sendMessageToUser(roleId, PUSH_ROUTE.SERVER_MAINTENANCE, resResult(STATUS.SERVER_MAINTENANCE), sid);
return next(new Error('globalFilter'), resResult(STATUS.SERVER_MAINTENANCE, { route: routeRecord.route }));
const mainten = getServerMainten(serverId);
return next(new Error('globalFilter'), resResult(STATUS.SERVER_MAINTENANCE, { route: routeRecord.route, curVersion: version, minVersion: mainten.version }));
}
next(null);
@@ -294,7 +297,7 @@ class Filter {
}
// 检查是否维护中
private async checkMainten(serverId: number, sid: string, ip: string, uid: number) {
private async checkMainten(serverId: number, sid: string, ip: string, uid: number, isNewUser: boolean) {
if(!sid) return false;
const mainten = getServerMainten(serverId);
@@ -303,6 +306,7 @@ class Filter {
let isWhiteList = await checkWhiteList(this.app.get('env'), ip, uid);
if(isWhiteList) return false;
if(isNewUser) return false;
return true
}

View File

@@ -21,11 +21,14 @@ import { getExpByLv } from '../../../pubUtils/data';
import { reportCreateRoleEventToTa, reportTAEvent, reportTAUserSet } from '../../../services/sdkService';
import { saveLoginAndOutLog } from '../../../pubUtils/logUtil';
import { sendMessageToAllWithSuc, sendMessageToUserWithSuc } from '../../../services/pushService';
import { checkServerIsOpen, getIpLocation } from '../../../services/roleService';
import { checkIsNewUser, getIpLocation } from '../../../services/roleService';
import { leaveRaceActivityToRemote } from '../../../services/guildActivity/guildActivityService';
import { leaveCity } from '../../../services/gvg/gvgBattleService';
import { autoCreateServerWhenRoleInit } from '../../../services/serverService';
import { getHiddenData } from '../../../services/memoryCache/hiddenData';
import { ServerlistModel } from '../../../db/Serverlist';
import { checkWhiteList } from '../../../pubUtils/sysUtil';
import { getAp } from '../../../services/actionPointService';
export default function (app: Application) {
new HandlerService(app, {});
@@ -42,7 +45,7 @@ export class EntryHandler {
* @param {Object} msg request message
* @param {Object} session current session object
*/
async enter(msg: { token: string, serverId: number }, session: FrontendSession) {
async enter(msg: { token: string, serverId: number, version: string }, session: FrontendSession) {
// console.log('****** entry before', Date.now());
let self = this;
let serverId = msg.serverId;
@@ -64,8 +67,22 @@ export class EntryHandler {
}
let ip = this.getIp(session);
if(!await checkServerIsOpen(serverId, ip, user.uid)) {
return resResult(STATUS.SERVER_IS_NOT_OPEN)
let server = await ServerlistModel.findByServerId(serverId);
if(!server) return resResult(STATUS.SERVER_NOT_FOUND);
let isWhiteList = await checkWhiteList(pinus.app.get('env'), ip, user.uid);
if(!isWhiteList) { // 白名单
if(server.openTime > nowSeconds()) {
return resResult(STATUS.SERVER_IS_NOT_OPEN);
}
if(server.maintenance && server.maintenance.isOpen && server.maintenance.startTime <= nowSeconds() && server.maintenance.endTime >= nowSeconds()) {
let isNewUser = await checkIsNewUser(msg.version, server.maintenance.version, user.uid, server.latestServerUniqId);
console.log('#### isNewUser', isNewUser)
if(isNewUser && server.id == server.latestServerUniqId) {
user['isNewUser'] = true;
} else {
return resResult(STATUS.SERVER_MAINTENANCE, { curVersion: msg.version, minVersion: server.maintenance.version })
}
}
}
@@ -74,11 +91,10 @@ export class EntryHandler {
if (!role) {
return resResult(STATUS.ROLE_NOT_FOUND);
}
console.log('#### needCount 0', role.needCount)
let serverName = this.app.getServerId();
await roleLogin(role.roleId, user.userCode, serverName, role.createTime, role.serverId, role.lv, role.topLineupCe); // 保存在线用户
await this.addSession(user, role, session);
await this.addSession(user, role, msg.version, session);
await reportCreateRoleEventToTa(role, ip);
saveLoginAndOutLog(LOG_TYPE.LOGIN, session);
@@ -93,7 +109,6 @@ export class EntryHandler {
}
let todayZeroPoint = getZeroPoint();
console.log('####### needCount', role.needCount)
if(role.needCount) autoCreateServerWhenRoleInit(serverId);
// console.log('****** entry after', Date.now());
@@ -116,10 +131,12 @@ export class EntryHandler {
return session.remoteAddress.ip.replace('::ffff:', '');
}
async addSession(user: UserType, role: RoleType, session: FrontendSession) {
async addSession(user: UserType, role: RoleType, version: string, session: FrontendSession) {
const self = this;
let ip = this.getIp(session);
console.log('####### addSession', user['isNewUser']||false)
await session.abind(role.roleId);
session.set('userid', role.userInfo.uid);
session.set('roleId', role.roleId);
@@ -133,6 +150,8 @@ export class EntryHandler {
session.set('ip', ip);
session.set('vipStartTime', role.vipStartTime||0);
session.set('channel', user.channelInfo?.platformAppid||'pc');
session.set('isNewUser', user['isNewUser']||false);
session.set('version', version);
session.push('userid', () => { });
session.push('sid', () => { });
session.push('roleId', () => { });
@@ -145,6 +164,8 @@ export class EntryHandler {
session.push('ip', () => { });
session.push('vipStartTime', () => { });
session.push('channel', () => { });
session.push('version', () => { });
session.push('isNewUser', () => { });
assignServer(role.roleId, session);
// console.log('#####', role.serverId, role.guildCode)
@@ -188,6 +209,15 @@ export class EntryHandler {
return resResult(STATUS.SUCCESS, data);
}
async comeBack(msg: { version: string }, session: FrontendSession) {
let roleId = session.get('roleId');
let ip = session.get('ip');
let role = await RoleModel.findByRoleId(roleId, 'lv');
let apJson = await getAp(roleId, ip, role.lv);
return resResult(STATUS.SUCCESS, { apJson });
}
/**
* User log out handler
*

View File

@@ -83,9 +83,9 @@ export class ConnectorRemote {
}
}
public setServerMainten(serverIds: number[], startTime: number, endTime: number) {
public setServerMainten(serverIds: number[], startTime: number, endTime: number, version: string) {
try {
setServerMainten(serverIds, startTime, endTime);
setServerMainten(serverIds, startTime, endTime, version);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}

View File

@@ -65,8 +65,8 @@ export class GmHandler {
}
// 开始维护
async startMaintenance(msg: { id: number, startTime: number, endTime: number, hasNotify: boolean }, session: BackendSession) {
const { id, startTime, endTime, hasNotify } = msg;
async startMaintenance(msg: { id: number, startTime: number, endTime: number, hasNotify: boolean, version: string }, session: BackendSession) {
const { id, startTime, endTime, hasNotify, version } = msg;
if(!id || !isNumber(startTime) || !isNumber(endTime)) return resResult(STATUS.WRONG_PARMS);
if(endTime < nowSeconds()) return resResult(STATUS.WRONG_PARMS, '结束时间不能比现在早');
const uid = session.get('uid');
@@ -75,7 +75,7 @@ export class GmHandler {
await pinus.app.rpc.systimer.systimerRemote.stopMaintenance.broadcast(server.maintenance.batchCode, [server.id]);
}
let newMaintenance: Maintenance = { batchCode: genCode(10), startTime, endTime, hasNotify, isOpen: true }
let newMaintenance: Maintenance = { batchCode: genCode(10), startTime, endTime, hasNotify, isOpen: true, version }
server = await ServerlistModel.updateByServerId(id, { maintenance: newMaintenance });
await pinus.app.rpc.systimer.systimerRemote.initMaintenance.broadcast([server]);
@@ -83,12 +83,12 @@ export class GmHandler {
}
// 大区一起维护
async startRegionMaintenance(msg: { startTime: number, endTime: number, hasNotify: boolean }, session: BackendSession) {
const { startTime, endTime, hasNotify } = msg;
async startRegionMaintenance(msg: { startTime: number, endTime: number, hasNotify: boolean, version: string }, session: BackendSession) {
const { startTime, endTime, hasNotify, version } = msg;
if(!isNumber(startTime) || !isNumber(endTime)) return resResult(STATUS.WRONG_PARMS);
if(endTime < nowSeconds()) return resResult(STATUS.WRONG_PARMS, '结束时间不能比现在早');
const uid = session.get('uid');
let newMaintenance: Maintenance = { batchCode: genCode(10), startTime, endTime, hasNotify, isOpen: true }
let newMaintenance: Maintenance = { batchCode: genCode(10), startTime, endTime, hasNotify, isOpen: true, version }
let servers = await ServerlistModel.findByEnv(this.app.get('env'));
let serverIdsOfBatchCode = new Map<string, number[]>();
let serverIds: number[] = [];

View File

@@ -44,9 +44,9 @@ export class GuildRemote {
}
}
public setServerMainten(serverIds: number[], startTime: number, endTime: number) {
public setServerMainten(serverIds: number[], startTime: number, endTime: number, version: string) {
try {
setServerMainten(serverIds, startTime, endTime);
setServerMainten(serverIds, startTime, endTime, version);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}

View File

@@ -49,9 +49,9 @@ export class OrderRemote {
}
}
public setServerMainten(serverIds: number[], startTime: number, endTime: number) {
public setServerMainten(serverIds: number[], startTime: number, endTime: number, version: string) {
try {
setServerMainten(serverIds, startTime, endTime);
setServerMainten(serverIds, startTime, endTime, version);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}

View File

@@ -96,9 +96,9 @@ export class RoleRemote {
}
}
public setServerMainten(serverIds: number[], startTime: number, endTime: number) {
public setServerMainten(serverIds: number[], startTime: number, endTime: number, version: string) {
try {
setServerMainten(serverIds, startTime, endTime);
setServerMainten(serverIds, startTime, endTime, version);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}

View File

@@ -5,9 +5,9 @@ import { getMails } from './mailService';
import { recentGuildMsgs, recentLeagueMsgs, recentPrivateChatInfos, recentServerGroupMsgs, recentSysMsgs, recentWorldMsgs } from './chatService';
import { getCurTask, getPvpTask } from './task/taskService';
import { RoleType } from '../db/Role';
import { RoleModel, RoleType } from '../db/Role';
import { Application, FrontendOrBackendSession, pinus, RpcClient } from 'pinus';
import { getRandEelmWithWeight, resResult } from '../pubUtils/util';
import { compareVersion, getRandEelmWithWeight, resResult } from '../pubUtils/util';
import { STATUS, PUSH_BATCH, PUSH_INTERVAL, CONSUME_TYPE, HERO_SELECT, ENTERY_ROLE_PICK, JEWEL_SELECT, ITEM_SELECT, SKIN_SELECT, PUSH_ROUTE, ARTIFACT_SELECT, ACTIVITYITEM_SELECT, SNS_LINK_TYPE } from '../consts';
import { getAllShopList } from './shopService';
import { getGeneralRank, getRankFirstReward } from './rankService';

View File

@@ -159,14 +159,15 @@ export async function sendOpenServerMail(type: 'openMail'|'circleMail', mail: St
return true;
}
export function setServerMainten(serverIds: number[], startTime: number, endTime: number) {
export function setServerMainten(serverIds: number[], startTime: number, endTime: number, version: string) {
let maintenServers = pinus.app.get('maintenServers')||new Map();
for(let id of serverIds) {
if(!maintenServers.has(id)) {
maintenServers.set(id, { startTime, endTime });
maintenServers.set(id, { startTime, endTime, version });
} else {
maintenServers.get(id).startTime = startTime;
maintenServers.get(id).endTime = endTime;
maintenServers.get(id).version = version;
}
}
pinus.app.set('maintenServers', maintenServers);

View File

@@ -1,5 +1,5 @@
import { Channel, pinus } from 'pinus';
import { getRandValueByMinMax, getRandEelm, decodeIdCntArrayStr } from '../pubUtils/util';
import { getRandValueByMinMax, getRandEelm, decodeIdCntArrayStr, compareVersion } from '../pubUtils/util';
import { DEFAULT_HEROES, LINEUP_NUM, ROLE_SELECT, TALENT_RELATION_TYPE, TERAPH_RANDOM, SYSTEM_OPEN_ID, GuideUnloadNum, CHECK_HERO_CONSUME, ABI_STAGE } from "../consts";
import { DicTeraph } from '../pubUtils/dictionary/DicTeraph';
import { Teraph, RoleModel, RoleType, RoleUpdate } from '../db/Role';
@@ -17,6 +17,7 @@ import IP2Region from "ip2region";
import { getServerCreateTime } from './redisService';
import { checkWhiteList } from '../pubUtils/sysUtil';
import { nowSeconds } from '../pubUtils/timeUtil';
import { ServerlistModel } from '../db/Serverlist';
const query = new IP2Region({ disableIpv6: true });
@@ -305,13 +306,15 @@ export async function getIpLocation(ip: string) {
}
}
// 服务器是否开启
export async function checkServerIsOpen(serverId: number, ip: string, uid: number) {
let isWhiteList = await checkWhiteList(pinus.app.get('env'), ip, uid);
if(isWhiteList) return true;
let serverTime = await getServerCreateTime(serverId);
return serverTime <= nowSeconds();
// 玩家是否是新玩家
export async function checkIsNewUser(version: string, minVersion: string, uid: number, latestServerUniqId: number) {
let versionFlag = compareVersion(version, minVersion||'0.0.0.0');
if(versionFlag >= 0) {
let hasRole = await RoleModel.checkHasRole(uid, latestServerUniqId);
return !hasRole
} else {
return true;
}
}
export function calStarUpConsume(hero: HeroType) {

View File

@@ -143,7 +143,7 @@ export async function autoCreateServerWhenRoleInit(serverId: number) {
return errlogger.error('create new server region not found');
}
if(region.stategy && region.stategy.type == 2 && region.latestServerUniqId == server.id && server.playerCnt >= region.stategy.maxPlayerCnt) {
if(region.stategy && region.stategy.isOpen && region.stategy.type == 2 && region.latestServerUniqId == server.id && server.playerCnt >= region.stategy.maxPlayerCnt) {
let params = new CreateServerParam();
params.setByRegionStategy(region, nowSeconds())
await createNewServer(region, server.serverId + 1, params);

View File

@@ -571,7 +571,7 @@ export async function initMaintenanaceInOtherServers() {
for(let server of servers) {
let { id, maintenance } = server;
if(maintenance && maintenance.isOpen) {
setServerMainten([id], maintenance.startTime, maintenance.endTime)
setServerMainten([id], maintenance.startTime, maintenance.endTime, maintenance.version)
}
}
}
@@ -641,14 +641,14 @@ async function startMaintenanceSchedule(batchCode: string) {
// 更新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.comBattle.comBattleRemote.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);
pinus.app.rpc.connector.connectorRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime, maintenance.version);
pinus.app.rpc.activity.activityRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime, maintenance.version);
pinus.app.rpc.battle.battleRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime, maintenance.version);
pinus.app.rpc.comBattle.comBattleRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime, maintenance.version);
pinus.app.rpc.chat.chatRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime, maintenance.version);
pinus.app.rpc.guild.guildRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime, maintenance.version);
pinus.app.rpc.order.orderRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime, maintenance.version);
pinus.app.rpc.role.roleRemote.setServerMainten.broadcast(serverIds, maintenance.startTime, maintenance.endTime, maintenance.version);
// 数数flush
pinus.app.rpc.activity.activityRemote.taflush.broadcast();
pinus.app.rpc.battle.battleRemote.taflush.broadcast();