登录:当账号登录的时候,将已登录玩家踢下
This commit is contained in:
@@ -9,7 +9,7 @@ import { genCode, generateStr, resResult } from '../../../pubUtils/util';
|
|||||||
import { COM_BTL_QUALITY, HERO_SELECT, DEBUG_MAGIC_WORD, REDIS_KEY, TASK_TYPE, ENTERY_ROLE_PICK, COUNTER, DEFAULT_LV, TA_USERSET_TYPE, LOG_TYPE, JEWEL_SELECT, ITEM_SELECT, SKIN_SELECT, PUSH_ROUTE } from '../../../consts';
|
import { COM_BTL_QUALITY, HERO_SELECT, DEBUG_MAGIC_WORD, REDIS_KEY, TASK_TYPE, ENTERY_ROLE_PICK, COUNTER, DEFAULT_LV, TA_USERSET_TYPE, LOG_TYPE, JEWEL_SELECT, ITEM_SELECT, SKIN_SELECT, PUSH_ROUTE } from '../../../consts';
|
||||||
// import { loginRefresh } from '../../../services/playerEventService';
|
// import { loginRefresh } from '../../../services/playerEventService';
|
||||||
import { nowSeconds, getZeroPoint } from '../../../pubUtils/timeUtil';
|
import { nowSeconds, getZeroPoint } from '../../../pubUtils/timeUtil';
|
||||||
import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin } from '../../../services/redisService';
|
import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin, getOnlineRoleByUserCode } from '../../../services/redisService';
|
||||||
|
|
||||||
import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGuildAuctionChannel, leaveGuildChannel, leaveSysChannel, leaveWorldAuctionChannel, leaveWorldChannel, recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from '../../../services/chatService';
|
import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGuildAuctionChannel, leaveGuildChannel, leaveSysChannel, leaveWorldAuctionChannel, leaveWorldChannel, recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from '../../../services/chatService';
|
||||||
import { reportOneOnline, savePlayTime } from '../../../services/authenticateService';
|
import { reportOneOnline, savePlayTime } from '../../../services/authenticateService';
|
||||||
@@ -47,21 +47,22 @@ export class EntryHandler {
|
|||||||
console.log('user token not found');
|
console.log('user token not found');
|
||||||
return resResult(STATUS.TOKEN_ERR);
|
return resResult(STATUS.TOKEN_ERR);
|
||||||
}
|
}
|
||||||
|
let onlineRoleId = await getOnlineRoleByUserCode(user.userCode);
|
||||||
|
|
||||||
|
if (!!onlineRoleId) { // 多地登陆踢下线
|
||||||
|
let connect = await getRoleOnlineInfo(onlineRoleId);
|
||||||
|
if (connect.sid = self.app.getServerId()) {
|
||||||
|
await kickUser(self.app, onlineRoleId);
|
||||||
|
} else {
|
||||||
|
await self.app.rpc.connector.connectorRemote.remoteLogin.toServer(connect.sid, onlineRoleId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let role = await RoleModel.findByUidAndSetTime(user.uid, serverId, null, true);
|
let role = await RoleModel.findByUidAndSetTime(user.uid, serverId, null, true);
|
||||||
if (!role) {
|
if (!role) {
|
||||||
return resResult(STATUS.ROLE_NOT_FOUND);
|
return resResult(STATUS.ROLE_NOT_FOUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
let connect = await getRoleOnlineInfo(role.roleId);
|
|
||||||
|
|
||||||
if (connect.isOnline) { // 多地登陆踢下线
|
|
||||||
if (connect.sid = self.app.getServerId()) {
|
|
||||||
await kickUser(self.app, role.roleId);
|
|
||||||
} else {
|
|
||||||
await self.app.rpc.connector.connectorRemote.remoteLogin.toServer(connect.sid, role.roleId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let serverName = this.app.getServerId();
|
let serverName = this.app.getServerId();
|
||||||
await roleLogin(role.roleId, user.userCode, serverName, user.pkgName, role.createTime, role.serverId); // 保存在线用户
|
await roleLogin(role.roleId, user.userCode, serverName, user.pkgName, role.createTime, role.serverId); // 保存在线用户
|
||||||
await this.addSession(user, role, session);
|
await this.addSession(user, role, session);
|
||||||
|
|||||||
@@ -312,6 +312,7 @@ export async function clearChannelServers() {
|
|||||||
*/
|
*/
|
||||||
export async function roleLogin(roleId: string, userCode: string, sid: string, pkgName: string, createTime: number, serverId: number) {
|
export async function roleLogin(roleId: string, userCode: string, sid: string, pkgName: string, createTime: number, serverId: number) {
|
||||||
await redisClient().hincrbyAsync(REDIS_KEY.ONLINE_CNT, roleId, 1);
|
await redisClient().hincrbyAsync(REDIS_KEY.ONLINE_CNT, roleId, 1);
|
||||||
|
await redisClient().hsetAsync(REDIS_KEY.USER_CODE, userCode, roleId);
|
||||||
return await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, `${userCode}|${sid}|${pkgName}|${createTime}|${serverId}`);
|
return await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, `${userCode}|${sid}|${pkgName}|${createTime}|${serverId}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -323,7 +324,9 @@ export async function roleLeave(roleId: string) {
|
|||||||
let role = await getRoleOnlineInfo(roleId);
|
let role = await getRoleOnlineInfo(roleId);
|
||||||
let count = await redisClient().hincrbyAsync(REDIS_KEY.ONLINE_CNT, roleId, -1);
|
let count = await redisClient().hincrbyAsync(REDIS_KEY.ONLINE_CNT, roleId, -1);
|
||||||
if(count <= 0) {
|
if(count <= 0) {
|
||||||
|
await redisClient().hdelAsync(REDIS_KEY.ONLINE_CNT, roleId);
|
||||||
await redisClient().hdelAsync(REDIS_KEY.ONLINE_USERS, roleId);
|
await redisClient().hdelAsync(REDIS_KEY.ONLINE_USERS, roleId);
|
||||||
|
await redisClient().hdelAsync(REDIS_KEY.USER_CODE, role.userCode);
|
||||||
}
|
}
|
||||||
return role;
|
return role;
|
||||||
}
|
}
|
||||||
@@ -337,6 +340,11 @@ export async function isRoleOnline(roleId: string) {
|
|||||||
return !!result;
|
return !!result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getOnlineRoleByUserCode(userCode: string) {
|
||||||
|
let roleId = await redisClient().hgetAsync(REDIS_KEY.USER_CODE, userCode);
|
||||||
|
return roleId;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得在线玩家userCode和sid
|
* 获得在线玩家userCode和sid
|
||||||
* @param roleId
|
* @param roleId
|
||||||
@@ -550,7 +558,8 @@ export async function redisSubScribe() {
|
|||||||
let treatRoleChannel = getRedisSubChannel(REDIS_KEY.TREAT_ROLE_CHANNEL, env);
|
let treatRoleChannel = getRedisSubChannel(REDIS_KEY.TREAT_ROLE_CHANNEL, env);
|
||||||
let treatGuildChannel = getRedisSubChannel(REDIS_KEY.TREAT_GUILD_CHANNEL, env);
|
let treatGuildChannel = getRedisSubChannel(REDIS_KEY.TREAT_GUILD_CHANNEL, env);
|
||||||
let surveyChannel = getRedisSubChannel(REDIS_KEY.SURVEY_CHANNEL, env);
|
let surveyChannel = getRedisSubChannel(REDIS_KEY.SURVEY_CHANNEL, env);
|
||||||
await redisClientPub().subscribeAsync(payChannel, treatRoleChannel, treatGuildChannel, refundChannel, surveyChannel);
|
let userChannel = getRedisSubChannel(REDIS_KEY.USER_CHANNEL, env);
|
||||||
|
await redisClientPub().subscribeAsync(payChannel, treatRoleChannel, treatGuildChannel, refundChannel, surveyChannel, userChannel);
|
||||||
redisClientPub().on('message', (channel, message) => {
|
redisClientPub().on('message', (channel, message) => {
|
||||||
console.log('**********redisSubScribe*******')
|
console.log('**********redisSubScribe*******')
|
||||||
console.log('channel: ', channel, payChannel);
|
console.log('channel: ', channel, payChannel);
|
||||||
@@ -575,6 +584,9 @@ export async function redisSubScribe() {
|
|||||||
let servers = pinus.app.getServersByType('role');
|
let servers = pinus.app.getServersByType('role');
|
||||||
let server = getRandSingleEelm(servers);
|
let server = getRandSingleEelm(servers);
|
||||||
pinus.app.rpc.role.roleRemote.sendSurveyMail.toServer(server.id, message);
|
pinus.app.rpc.role.roleRemote.sendSurveyMail.toServer(server.id, message);
|
||||||
|
} else if(channel == userChannel) {
|
||||||
|
let [sid, roleId] = (message||'').split('|');
|
||||||
|
if(!!sid && !!roleId) pinus.app.rpc.connector.connectorRemote.remoteLogin.toServer(sid, roleId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,6 +242,8 @@ export enum REDIS_KEY {
|
|||||||
GUILD_FUND = 'guildFund', // 限时排行
|
GUILD_FUND = 'guildFund', // 限时排行
|
||||||
SUM_CE_SNAPSHOT = "sumCeTL", // 限时战力排行榜
|
SUM_CE_SNAPSHOT = "sumCeTL", // 限时战力排行榜
|
||||||
SURVEY_CHANNEL = 'survey', // 文件频道
|
SURVEY_CHANNEL = 'survey', // 文件频道
|
||||||
|
USER_CHANNEL = 'userChannel', // 玩家登录频道
|
||||||
|
USER_CODE = 'userCode', // 玩家userCode对应roleId
|
||||||
}
|
}
|
||||||
|
|
||||||
// 各排行榜对应hash的key
|
// 各排行榜对应hash的key
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ export default class Auth extends Service {
|
|||||||
if (getuiCID) {//更新个推cid
|
if (getuiCID) {//更新个推cid
|
||||||
await UserModel.updateGetuiCID(tel, getuiCID);
|
await UserModel.updateGetuiCID(tel, getuiCID);
|
||||||
}
|
}
|
||||||
|
if(user && user.userCode) {
|
||||||
|
ctx.service.utils.checkOnlineUser(user.userCode);
|
||||||
|
}
|
||||||
let param = this.getReturnParam(user);
|
let param = this.getReturnParam(user);
|
||||||
|
|
||||||
return this.ctx.service.utils.resResult(STATUS.SUCCESS, {
|
return this.ctx.service.utils.resResult(STATUS.SUCCESS, {
|
||||||
@@ -68,6 +71,9 @@ export default class Auth extends Service {
|
|||||||
if (getuiCID) {//更新个推cid
|
if (getuiCID) {//更新个推cid
|
||||||
await UserModel.updateGetuiCID(user.tel, getuiCID);
|
await UserModel.updateGetuiCID(user.tel, getuiCID);
|
||||||
}
|
}
|
||||||
|
if(user && user.userCode) {
|
||||||
|
ctx.service.utils.checkOnlineUser(user.userCode);
|
||||||
|
}
|
||||||
let param = this.getReturnParam(user);
|
let param = this.getReturnParam(user);
|
||||||
|
|
||||||
let canLogin = true;
|
let canLogin = true;
|
||||||
@@ -219,6 +225,9 @@ export default class Auth extends Service {
|
|||||||
if (getuiCID) {//更新个推cid
|
if (getuiCID) {//更新个推cid
|
||||||
await UserModel.updateGetuiCID(tel, getuiCID);
|
await UserModel.updateGetuiCID(tel, getuiCID);
|
||||||
}
|
}
|
||||||
|
if(user && user.userCode) {
|
||||||
|
ctx.service.utils.checkOnlineUser(user.userCode);
|
||||||
|
}
|
||||||
let param = this.getReturnParam(user);
|
let param = this.getReturnParam(user);
|
||||||
return ctx.service.utils.resResult(STATUS.SUCCESS, param);
|
return ctx.service.utils.resResult(STATUS.SUCCESS, param);
|
||||||
}
|
}
|
||||||
@@ -281,6 +290,9 @@ export default class Auth extends Service {
|
|||||||
if (getuiCID) {//更新个推cid
|
if (getuiCID) {//更新个推cid
|
||||||
await UserModel.updateGetuiCID(tel, getuiCID);
|
await UserModel.updateGetuiCID(tel, getuiCID);
|
||||||
}
|
}
|
||||||
|
if(user && user.userCode) {
|
||||||
|
ctx.service.utils.checkOnlineUser(user.userCode);
|
||||||
|
}
|
||||||
let param = this.getReturnParam(user);
|
let param = this.getReturnParam(user);
|
||||||
return ctx.service.utils.resResult(STATUS.SUCCESS, { ...param });
|
return ctx.service.utils.resResult(STATUS.SUCCESS, { ...param });
|
||||||
}
|
}
|
||||||
@@ -410,11 +422,11 @@ export default class Auth extends Service {
|
|||||||
|
|
||||||
let channelId = getChannelId(channelType, requestResult.data.uid);
|
let channelId = getChannelId(channelType, requestResult.data.uid);
|
||||||
const token = ctx.service.utils.generateStr(256);
|
const token = ctx.service.utils.generateStr(256);
|
||||||
let { isCreate, user} = await UserModel.createOrUpdateChannelUser(channelId, channelType, {
|
let { user} = await UserModel.createOrUpdateChannelUser(channelId, channelType, {
|
||||||
...requestResult.data, childGameId:`${childGameId}`, platformAppid
|
...requestResult.data, childGameId:`${childGameId}`, platformAppid
|
||||||
}, token, platform, pkgName, serverType, deviceId, ctx.clientIp);
|
}, token, platform, pkgName, serverType, deviceId, ctx.clientIp);
|
||||||
if(isCreate) {
|
if(user && user.userCode) {
|
||||||
// ctx.service.sdk.reportTAEventWithDistinctId(distinctId, TA_EVENT.REGISTER, null, ctx.clientIp);
|
ctx.service.utils.checkOnlineUser(user.userCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getuiCID) {//更新个推cid
|
if (getuiCID) {//更新个推cid
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { resResult as pubResult } from '../pubUtils/util';
|
|||||||
import { gameData } from 'app/pubUtils/data';
|
import { gameData } from 'app/pubUtils/data';
|
||||||
import { RedisClient } from 'redis';
|
import { RedisClient } from 'redis';
|
||||||
import { REDIS_KEY } from '@consts';
|
import { REDIS_KEY } from '@consts';
|
||||||
|
import { getRedisSubChannel } from 'app/pubUtils/sdkUtil';
|
||||||
const csprng = require('csprng');
|
const csprng = require('csprng');
|
||||||
/**
|
/**
|
||||||
* Utils Service
|
* Utils Service
|
||||||
@@ -57,6 +58,25 @@ export default class Utils extends Service {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async checkOnlineUser(userCode: string) {
|
||||||
|
let redisClient: RedisClient = this.ctx.app.context.redisClient;
|
||||||
|
let onlineRoleId = await redisClient.hgetAsync(REDIS_KEY.USER_CODE, userCode);
|
||||||
|
|
||||||
|
if (!!onlineRoleId) { // 多地登陆踢下线
|
||||||
|
let str = await redisClient.hgetAsync(REDIS_KEY.ONLINE_USERS, onlineRoleId);
|
||||||
|
|
||||||
|
if(str) {
|
||||||
|
try {
|
||||||
|
let [,sid] = str?.split('|')??[];
|
||||||
|
let name = getRedisSubChannel(REDIS_KEY.USER_CHANNEL, this.ctx.app.config.env);
|
||||||
|
let result = await redisClient.publishAsync(name, `${sid}|${onlineRoleId}`);
|
||||||
|
} catch(e) {
|
||||||
|
console.error('checkOnlineUser', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 检测是否可以登录
|
// 检测是否可以登录
|
||||||
public async validateCanLogin() {
|
public async validateCanLogin() {
|
||||||
if(gameData.serverConst.CLOSE_LOGIN == 1) return false;
|
if(gameData.serverConst.CLOSE_LOGIN == 1) return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user