diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index cefee2551..c5e508528 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -20,7 +20,7 @@ import { gameData } from '../../../pubUtils/data'; import { getMails } from '../../../services/mailService'; 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) { return new EntryHandler(app); } @@ -100,7 +100,7 @@ export class EntryHandler { let mails = await getMails(role.roleId, serverId) await chackFunOpenWhenLogin(role, session); await loginRefresh(role.roleId); - await reportOnlineSchedule(); + reportOneOnline(role.roleId, user.userCode, self.app.get('serverId'), user.pkgName); role['heros'] = heros; role['equips'] = equips; @@ -146,7 +146,11 @@ export class EntryHandler { let roleId = session.get('roleId'); let sid = session.get('sid'); 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中寻宝的匹配记录 let channelService = this.app.get('channelService'); let channel = channelService.getChannel(roleId, true); @@ -158,7 +162,6 @@ export class EntryHandler { await leaveWorldChannel(roleId, sid, serverId); await leaveGuildChannel(roleId, sid); RoleModel.updateRoleInfo(roleId, { quitTime: nowSeconds() }); - reportOnlineSchedule(); } diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index 0073ef6e7..a06637fc3 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -377,7 +377,9 @@ export async function roleLogin(roleId: string, userCode: string, sid: string, p * @param roleId role表id */ 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; } /** diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 580074284..7103a933a 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -271,45 +271,50 @@ export async function reportOnlineSchedule() { let allRoles = await getAllOnlineRoles(); console.log('reportOnlineSchedule all roles count: ', allRoles.length) for(let { roleId, userCode, sid, pkgName } of allRoles) { - let result = await reportOnline(userCode, pkgName); // 连接sdk - if(!result || result.code == -1) continue; + let result = reportOneOnline(roleId, userCode, sid, pkgName); + if(!result) continue; + } +} - let user = await UserModel.findUserByUserCode(userCode); - if(!user) continue; - let { reportTime = new Date(), lastLoginTime = new Date(), guestTime, isGuest, hasAuthenticated, birthday } = user; - - let age = getAge(birthday); - let isAdult = age >= ADULT_AGE; +export async function reportOneOnline(roleId: string, userCode: string, sid: string, pkgName: string) { - 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); // 记录时间 + let result = await reportOnline(userCode, pkgName); // 连接sdk + if(!result || result.code == -1) return false; + + 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, { isGuest, guestTime, // 游客已体验时间 - hasAuthenticated, // 是否进行过实名认证 + hasAuthenticated, // 是否进行过实名认证 isAdult, // 是否已成年 todayPlayTime: result.total, // 今天已游戏时长 - type: result.code + type: ADDICTION_PREVENTION_CODE.GUEST, } ), [{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}]); - } } - } } \ No newline at end of file