防沉迷:修复登录退出时不必全部用户循环

This commit is contained in:
luying
2021-03-10 10:35:58 +08:00
parent 1764ce6462
commit 83d9e398db
3 changed files with 44 additions and 34 deletions
@@ -20,7 +20,7 @@ import { gameData } from '../../../pubUtils/data';
import { getMails } from '../../../services/mailService'; import { getMails } from '../../../services/mailService';
import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGuildChannel, leaveSysChannel, leaveWorldChannel } from '../../../services/chatService'; import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGuildChannel, leaveSysChannel, leaveWorldChannel } from '../../../services/chatService';
import { reportOnlineSchedule } from '../../../services/timeTaskService'; import { reportOneOnline } from '../../../services/timeTaskService';
export default function (app: Application) { export default function (app: Application) {
return new EntryHandler(app); return new EntryHandler(app);
} }
@@ -100,7 +100,7 @@ export class EntryHandler {
let mails = await getMails(role.roleId, serverId) let mails = await getMails(role.roleId, serverId)
await chackFunOpenWhenLogin(role, session); await chackFunOpenWhenLogin(role, session);
await loginRefresh(role.roleId); await loginRefresh(role.roleId);
await reportOnlineSchedule(); reportOneOnline(role.roleId, user.userCode, self.app.get('serverId'), user.pkgName);
role['heros'] = heros; role['heros'] = heros;
role['equips'] = equips; role['equips'] = equips;
@@ -146,7 +146,11 @@ export class EntryHandler {
let roleId = session.get('roleId'); let roleId = session.get('roleId');
let sid = session.get('sid'); let sid = session.get('sid');
let serverId = session.get('serverId'); let serverId = session.get('serverId');
roleLeave(roleId); roleLeave(roleId).then(function(roleInfo) {
if(roleInfo.isOnline) {
reportOneOnline(roleId, roleInfo.userCode, sid, roleInfo.pkgName);
}
});
rmRoleFromQueue(roleId, sid, COM_BTL_QUALITY, null); // 删除redis中寻宝的匹配记录 rmRoleFromQueue(roleId, sid, COM_BTL_QUALITY, null); // 删除redis中寻宝的匹配记录
let channelService = this.app.get('channelService'); let channelService = this.app.get('channelService');
let channel = channelService.getChannel(roleId, true); let channel = channelService.getChannel(roleId, true);
@@ -158,7 +162,6 @@ export class EntryHandler {
await leaveWorldChannel(roleId, sid, serverId); await leaveWorldChannel(roleId, sid, serverId);
await leaveGuildChannel(roleId, sid); await leaveGuildChannel(roleId, sid);
RoleModel.updateRoleInfo(roleId, { quitTime: nowSeconds() }); RoleModel.updateRoleInfo(roleId, { quitTime: nowSeconds() });
reportOnlineSchedule();
} }
+3 -1
View File
@@ -377,7 +377,9 @@ export async function roleLogin(roleId: string, userCode: string, sid: string, p
* @param roleId role表id * @param roleId role表id
*/ */
export async function roleLeave(roleId: string) { export async function roleLeave(roleId: string) {
return await redisClient().hdelAsync(REDIS_KEY.ONLINE_USERS, roleId); let role = await getRoleOnlineInfo(roleId);
await redisClient().hdelAsync(REDIS_KEY.ONLINE_USERS, roleId);
return role;
} }
/** /**
+34 -29
View File
@@ -271,45 +271,50 @@ export async function reportOnlineSchedule() {
let allRoles = await getAllOnlineRoles(); let allRoles = await getAllOnlineRoles();
console.log('reportOnlineSchedule all roles count: ', allRoles.length) console.log('reportOnlineSchedule all roles count: ', allRoles.length)
for(let { roleId, userCode, sid, pkgName } of allRoles) { for(let { roleId, userCode, sid, pkgName } of allRoles) {
let result = await reportOnline(userCode, pkgName); // 连接sdk let result = reportOneOnline(roleId, userCode, sid, pkgName);
if(!result || result.code == -1) continue; if(!result) continue;
}
}
let user = await UserModel.findUserByUserCode(userCode); export async function reportOneOnline(roleId: string, userCode: string, sid: string, pkgName: string) {
if(!user) continue;
let { reportTime = new Date(), lastLoginTime = new Date(), guestTime, isGuest, hasAuthenticated, birthday } = user;
let age = getAge(birthday);
let isAdult = age >= ADULT_AGE;
if(isGuest || !hasAuthenticated) { let result = await reportOnline(userCode, pkgName); // 连接sdk
let lastTime = lastLoginTime > reportTime? lastLoginTime.getTime(): reportTime.getTime(); if(!result || result.code == -1) return false;
let guestTimeInc = Math.floor((Date.now() - lastTime)/1000);
user = await UserModel.updatePlayTime(userCode, guestTimeInc, result.total); // 记录时间 let user = await UserModel.findUserByUserCode(userCode);
if(!user) return false;
let { reportTime = new Date(), lastLoginTime = new Date(), guestTime, isGuest, hasAuthenticated, birthday } = user;
guestTime = user.guestTime; let age = getAge(birthday);
} let isAdult = age >= ADULT_AGE;
if(result.code != ADDICTION_PREVENTION_CODE.SUCCESS && result.age != -1) { // 未成年人防沉迷 if(isGuest || !hasAuthenticated) {
let lastTime = lastLoginTime > reportTime? lastLoginTime.getTime(): reportTime.getTime();
let guestTimeInc = Math.floor((Date.now() - lastTime)/1000);
user = await UserModel.updatePlayTime(userCode, guestTimeInc, result.total); // 记录时间
guestTime = user.guestTime;
}
if(result.code != ADDICTION_PREVENTION_CODE.SUCCESS && result.age != -1) { // 未成年人防沉迷
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
isGuest,
guestTime, // 游客已体验时间
hasAuthenticated, // 是否进行过实名认证
isAdult, // 是否已成年
todayPlayTime: result.total, // 今天已游戏时长
type: result.code
} ), [{uid: roleId, sid: sid}]);
} else {
if ((isGuest || !hasAuthenticated) && guestTime > GUEST_MAX_TIME) {
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, { pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
isGuest, isGuest,
guestTime, // 游客已体验时间 guestTime, // 游客已体验时间
hasAuthenticated, // 是否进行过实名认证 hasAuthenticated, // 是否进行过实名认证
isAdult, // 是否已成年 isAdult, // 是否已成年
todayPlayTime: result.total, // 今天已游戏时长 todayPlayTime: result.total, // 今天已游戏时长
type: result.code type: ADDICTION_PREVENTION_CODE.GUEST,
} ), [{uid: roleId, sid: sid}]); } ), [{uid: roleId, sid: sid}]);
} else {
if ((isGuest || !hasAuthenticated) && guestTime > GUEST_MAX_TIME) {
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
isGuest,
guestTime, // 游客已体验时间
hasAuthenticated, // 是否进行过实名认证
isAdult, // 是否已成年
todayPlayTime: result.total, // 今天已游戏时长
type: ADDICTION_PREVENTION_CODE.GUEST,
} ), [{uid: roleId, sid: sid}]);
}
} }
} }
} }