根据在线人数路由
This commit is contained in:
@@ -223,6 +223,7 @@ function setupRoutes(app: _pinus.Application) {
|
||||
app.route('guild', routeUtil.guild);
|
||||
app.route('activity', routeUtil.activity);
|
||||
app.route('order', routeUtil.order);
|
||||
app.route('role', routeUtil.role);
|
||||
}
|
||||
|
||||
function setupFilters(app: _pinus.Application) {
|
||||
|
||||
@@ -14,7 +14,7 @@ import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin, getOnlineRole
|
||||
import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGuildAuctionChannel, leaveGuildChannel, leaveSysChannel, leaveWorldAuctionChannel, leaveWorldChannel, recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from '../../../services/chatService';
|
||||
import { reportOneOnline, savePlayTime } from '../../../services/authenticateService';
|
||||
import { checkTaskInEntry, } from '../../../services/task/taskService';
|
||||
import { pushData, kickUser, getModuleData } from '../../../services/connectorService';
|
||||
import { pushData, kickUser, getModuleData, assignServer, leaveServer } from '../../../services/connectorService';
|
||||
// import { setComBtlOnUserLeave } from '../../../services/comBattleService';
|
||||
import Counter from '../../../db/Counter';
|
||||
import { getExpByLv } from '../../../pubUtils/data';
|
||||
@@ -133,6 +133,7 @@ export class EntryHandler {
|
||||
session.push('ip', () => { });
|
||||
session.push('vipStartTime', () => { });
|
||||
session.push('channel', () => { });
|
||||
assignServer(role.roleId, session);
|
||||
// console.log(role.guildCode)
|
||||
// session.push('rid', function (err) {
|
||||
// if (err) {
|
||||
@@ -206,6 +207,7 @@ export class EntryHandler {
|
||||
// setComBtlOnUserLeave(roleId, teamCode)
|
||||
// }
|
||||
saveLoginAndOutLog(LOG_TYPE.LOGINOUT, session);
|
||||
leaveServer(session);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import { STATUS } from '../../../consts/statusCode';
|
||||
import { resResult } from '../../../pubUtils/util';
|
||||
import { reloadResources } from '../../../pubUtils/data';
|
||||
import { UserGuildType } from '../../../db/UserGuild';
|
||||
import { kickUser } from '../../../services/connectorService';
|
||||
import { incServerNum, kickUser } from '../../../services/connectorService';
|
||||
import { PVPConfigModel, PVPConfigType } from '../../../db/SystemConfig';
|
||||
import { setDicAuctionTime, setDicGuildActivity } from '../../../services/guildActivity/guildActivityService';
|
||||
import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService';
|
||||
@@ -163,4 +163,12 @@ export class ConnectorRemote {
|
||||
errlogger.error(`remote ${__filename} \n ${e.stack}`);
|
||||
}
|
||||
}
|
||||
|
||||
public async incServerNum(sid: string, inc: number) {
|
||||
try {
|
||||
incServerNum(sid, inc);
|
||||
} catch(e) {
|
||||
errlogger.error(`remote ${__filename} \n ${e.stack}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import { getCurTask, getPvpTask } from './task/taskService';
|
||||
|
||||
import { RoleType } from '../db/Role';
|
||||
import { Application, FrontendOrBackendSession, pinus, RpcClient } from 'pinus';
|
||||
import { resResult } from '../pubUtils/util';
|
||||
import { 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 } from '../consts';
|
||||
import { getAllShopList } from './shopService';
|
||||
import { getGeneralRank, getRankFirstReward } from './rankService';
|
||||
@@ -47,6 +47,7 @@ import { getSurvey } from './gmService';
|
||||
import { ComBattleTeamModel } from '../db/ComBattleTeam';
|
||||
import { INFO_WINDOW } from '../pubUtils/dicParam';
|
||||
import { getLadderData } from './ladderService';
|
||||
import { dispatch } from '../pubUtils/dispatcher';
|
||||
|
||||
/**
|
||||
* init: 初始的时候是否推送 true-推 false-不推
|
||||
@@ -320,3 +321,87 @@ export async function kickUser(app: Application, uid: string, message = STATUS.L
|
||||
}
|
||||
await sessionService.akick(uid);
|
||||
}
|
||||
|
||||
export async function assignServer(roleId: string, session: FrontendOrBackendSession) {
|
||||
try {
|
||||
let activity = _assignServer(roleId, 'activity');
|
||||
let battle = _assignServer(roleId, 'battle');
|
||||
let chat = _assignServer(roleId, 'chat');
|
||||
let guild = _assignServer(roleId, 'guild');
|
||||
let role = _assignServer(roleId, 'role');
|
||||
let order = _assignServer(roleId, 'order');
|
||||
if(activity) {
|
||||
session.set('activityServer', activity);
|
||||
session.push('activityServer', () => { });
|
||||
}
|
||||
if(battle) {
|
||||
session.set('battleServer', battle);
|
||||
session.push('battleServer', () => { });
|
||||
}
|
||||
if(chat) {
|
||||
session.set('chatServer', chat);
|
||||
session.push('chatServer', () => { });
|
||||
}
|
||||
if(guild) {
|
||||
session.set('guildServer', guild);
|
||||
session.push('guildServer', () => { });
|
||||
}
|
||||
if(role) {
|
||||
session.set('roleServer', role);
|
||||
session.push('roleServer', () => { });
|
||||
}
|
||||
if(order) {
|
||||
session.set('orderServer', order);
|
||||
session.push('orderServer', () => { });
|
||||
}
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
function _assignServer(roleId: string, serverType: string) {
|
||||
let servers = pinus.app.getServersByType(serverType)||[];
|
||||
let sum = servers.reduce((pre, cur) => pre + (cur['num']||0), 0);
|
||||
let id = '';
|
||||
if(sum <= 0) {
|
||||
id = dispatch(roleId, servers, serverType)?.id;
|
||||
} else {
|
||||
let serversWithWeight = servers.map(cur => ({...cur, weight: sum - (cur['num']||0)}));
|
||||
let { dic: server } = getRandEelmWithWeight(serversWithWeight);
|
||||
id = server?.id;
|
||||
}
|
||||
|
||||
// if(id) {
|
||||
// pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(id, 1);
|
||||
// }
|
||||
return id
|
||||
}
|
||||
|
||||
export function incServerNum(sid: string, inc: number) {
|
||||
if(!pinus.app.getServerById(sid)) return;
|
||||
if(!pinus.app.getServerById(sid)['num']) {
|
||||
pinus.app.getServerById(sid)['num'] = 0;
|
||||
}
|
||||
pinus.app.getServerById(sid)['num'] += inc;
|
||||
if(pinus.app.getServerById(sid)['num'] < 0) {
|
||||
pinus.app.getServerById(sid)['num'] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
export async function leaveServer(session: FrontendOrBackendSession) {
|
||||
let activity = session.get('activityServer');
|
||||
let battle = session.get('battleServer');
|
||||
let chat = session.get('chatServer');
|
||||
let guild = session.get('guildServer');
|
||||
let role = session.get('roleServer');
|
||||
let order = session.get('orderServer');
|
||||
let sid = session.get('sid');
|
||||
pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(activity, -1);
|
||||
pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(battle, -1);
|
||||
pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(chat, -1);
|
||||
pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(guild, -1);
|
||||
pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(role, -1);
|
||||
pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(order, -1);
|
||||
|
||||
incServerNum(sid, -1);
|
||||
}
|
||||
@@ -575,6 +575,15 @@ export async function checkConnectors() {
|
||||
}
|
||||
}
|
||||
|
||||
export async function incConnectorNum(sid: string, inc: number) {
|
||||
let server = await redisClient().hgetAsync(REDIS_KEY.SYS_SERVER, sid);
|
||||
let json = JSON.parse(server);
|
||||
let { id, serverType, clientHost, clientPort, num = 0 } = json;
|
||||
let newNum = num + inc;
|
||||
if(newNum < 0) newNum = 0;
|
||||
await redisClient().hsetAsync(REDIS_KEY.SYS_SERVER, id, JSON.stringify({ serverType, clientHost, clientPort, id, num: num + inc }));
|
||||
}
|
||||
|
||||
/*************** 将connector服插入redis *******/
|
||||
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ export function chat(session: Session, msg: any, app: Application, cb: (err: Err
|
||||
cb(new Error('can not find chat servers.'));
|
||||
return;
|
||||
}
|
||||
let id = session.get('chatServer')||dispatch(session.get('roleId'), chatServers, 'chat').id;
|
||||
|
||||
let res = dispatch(session.get('roleId'), chatServers, 'chat');
|
||||
cb(null, res.id);
|
||||
cb(null, id);
|
||||
}
|
||||
|
||||
export function battle(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) {
|
||||
@@ -38,8 +38,8 @@ export function battle(session: Session, msg: any, app: Application, cb: (err: E
|
||||
}
|
||||
}
|
||||
|
||||
let res = dispatch(rid, battleServers, 'battle');
|
||||
cb(null, res.id);
|
||||
let id = session.get('battleServer')||dispatch(rid, battleServers, 'battle').id;
|
||||
cb(null, id);
|
||||
}
|
||||
|
||||
|
||||
@@ -89,8 +89,8 @@ export function guild(session: Session, msg: any, app: Application, cb: (err: Er
|
||||
}
|
||||
}
|
||||
|
||||
let res = dispatch(rid, guildServers, 'guild');
|
||||
cb(null, res.id);
|
||||
let id = session.get('guildServer')||dispatch(rid, guildServers, 'guild').id;
|
||||
cb(null, id);
|
||||
}
|
||||
|
||||
export function activity(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) {
|
||||
@@ -99,8 +99,8 @@ export function activity(session: Session, msg: any, app: Application, cb: (err:
|
||||
cb(new Error('can not find activity servers.'));
|
||||
return;
|
||||
}
|
||||
let res = dispatch(session.get('roleId'), activityServers, 'activity');
|
||||
cb(null, res.id);
|
||||
let id = session.get('activityServer')||dispatch(session.get('roleId'), activityServers, 'activity');
|
||||
cb(null, id);
|
||||
}
|
||||
|
||||
export function gm(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) {
|
||||
@@ -115,6 +115,18 @@ export function gm(session: Session, msg: any, app: Application, cb: (err: Error
|
||||
cb(null, res.id);
|
||||
}
|
||||
|
||||
export function role(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) {
|
||||
let roleServers = app.getServersByType('role');
|
||||
|
||||
if (!roleServers || roleServers.length === 0) {
|
||||
cb(new Error('can not find activity servers.'));
|
||||
return;
|
||||
}
|
||||
|
||||
let id = session.get('roleServer')||dispatch(session.get('roleId'), roleServers).id;
|
||||
cb(null, id);
|
||||
}
|
||||
|
||||
export function order(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) {
|
||||
let orderServers = app.getServersByType('order');
|
||||
|
||||
@@ -123,6 +135,6 @@ export function order(session: Session, msg: any, app: Application, cb: (err: Er
|
||||
return;
|
||||
}
|
||||
|
||||
let res = dispatch(session.get('roleId'), orderServers, 'order');
|
||||
cb(null, res.id);
|
||||
let id = session.get('orderServer')||dispatch(session.get('roleId'), orderServers, 'order').id;
|
||||
cb(null, id);
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import { dispatch } from 'app/pubUtils/dispatcher';
|
||||
import { RedisClient } from 'redis';
|
||||
import { REDIS_KEY } from '@consts';
|
||||
import { RegionModel } from '@db/Region';
|
||||
import { resResult } from 'app/pubUtils/util';
|
||||
import { getRandEelmWithWeight, resResult } from 'app/pubUtils/util';
|
||||
|
||||
export default class GameController extends Controller {
|
||||
|
||||
@@ -158,7 +158,18 @@ export default class GameController extends Controller {
|
||||
return
|
||||
}
|
||||
// select connector
|
||||
let res = dispatch(userCode, connectors, 'connector');
|
||||
let sum = connectors.reduce((pre, cur) => pre + (cur['num']||0), 0);
|
||||
let res;
|
||||
if(sum == 0) {
|
||||
res = dispatch(userCode, connectors, 'connector');
|
||||
} else {
|
||||
let serversWithWeight = connectors.map(cur => ({...cur, weight: sum - (cur['num']||0)}));
|
||||
let randResult = getRandEelmWithWeight(serversWithWeight);
|
||||
res = randResult.dic;
|
||||
}
|
||||
let { id, serverType, clientHost, clientPort, num = 0 } = res;
|
||||
|
||||
await redisClient.hsetAsync(REDIS_KEY.SYS_SERVER, id, JSON.stringify({ serverType, clientHost, clientPort, id, num: num + 1 }));
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { host: res.clientHost, port: res.clientPort });
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user