diff --git a/game-server/app/servers/battle/handler/guildHandler.ts b/game-server/app/servers/battle/handler/guildHandler.ts index 45cdb5301..9b4c7549c 100644 --- a/game-server/app/servers/battle/handler/guildHandler.ts +++ b/game-server/app/servers/battle/handler/guildHandler.ts @@ -14,7 +14,7 @@ import { UserGuildApplyModel } from '../../../db/UserGuildApply'; import { hasStructureConsume, getStructureConsume, gameData } from '../../../pubUtils/data'; import { GuildRecModel } from '../../../db/GuildRec'; import { sendMail } from '../../../services/mailService'; -import { existsRank, initSingleRankWithServer, getRank, setRank, redisUserInfoUpdate, redisUserInfoAdd, removeFromRank, getMyRank } from '../../../services/redisService'; +import { existsRank, initSingleRankWithServer, getRank, setRank, redisUserInfoUpdate, redisUserInfoAdd, removeFromRank, getMyRank, isRoleOnline } from '../../../services/redisService'; import { lockData } from '../../../services/redLockService'; import { openGuildRefine } from '../../../services/guildRefineService'; @@ -81,7 +81,7 @@ export class GuildHandler { message.addRec(rec); // 返回 - const result = { ...guild, rank, myInfo: userGuild}; + const result = { ...guild, rank, myInfo: { ...userGuild, isOnline: true}}; return resResult(STATUS.SUCCESS, result); } @@ -258,6 +258,7 @@ export class GuildHandler { guild.guildCe = reduceCe(guild.guildCe); guild.leader = guild.leader; guild.leader.ce = reduceCe(guild.leader.ce); + let leaderIsOnline = await isRoleOnline(guild.leader.roleId); // 打开公会页面,加入channel message.enterChannel(userGuild.guildCode, roleId, sid); @@ -266,7 +267,7 @@ export class GuildHandler { const rank = await getMyRank(REDIS_KEY.GUILD_ACTIVE_RANK, serverId, guild.code); // 返回 - const result = { hasGuild: true, ...guild, rank, myInfo: userGuild}; + const result = { hasGuild: true, ...guild, rank, myInfo: {...userGuild, isOnline: leaderIsOnline}}; return resResult(STATUS.SUCCESS, result); } @@ -333,11 +334,13 @@ export class GuildHandler { if(!checkResult) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); const result = await UserGuildApplyModel.getListByGuild(code, lastApplyCode); - const list = result.map(cur => { + const list = []; + for(let cur of result) { let role = cur.role; delete cur.role; - return { applyCode: cur.applyCode, ...role, ce: reduceCe(role.ce) }; - }); + let isOnline = await isRoleOnline(role.roleId); + list.push({ applyCode: cur.applyCode, ...role, ce: reduceCe(role.ce), isOnline }); + } return resResult(STATUS.SUCCESS, { list }); } @@ -400,11 +403,14 @@ export class GuildHandler { const allList = await RoleModel.getInviteList(day, serverId); let list = getRandEelm(allList, 10); if(!list.length) list = allList; - list = list.map(cur => { - return {...cur, ce: reduceCe(cur.ce)} - }); - return resResult(STATUS.SUCCESS, { quitTime, list }); + let result = []; + for(let cur of list) { + let isOnline = await isRoleOnline(cur.roleId); + result.push({...cur, ce: reduceCe(cur.ce), isOnline}) + } + + return resResult(STATUS.SUCCESS, { quitTime, list: result }); } @@ -512,12 +518,14 @@ export class GuildHandler { select.push('auth', 'activeWeekly activeUpdateTime'); } let list = await UserGuildModel.getListByGuild(code, select.join(' '), { auth: 1 }); - let result = list.map(cur => { + let result = []; + for(let cur of list) { let role = cur.role; delete role._id; delete cur.role; - return { ...cur, ...role, ce: reduceCe(role.ce) }; - }); + let isOnline = await isRoleOnline(role.roleId) + result.push({ ...cur, ...role, ce: reduceCe(role.ce), isOnline: !!isOnline }); + } let leader = result.shift(); result.sort((a, b) => { @@ -528,7 +536,7 @@ export class GuildHandler { return b.activeWeekly - a.activeWeekly } } else if (sort == 'loginTime') { - return b.loginTime - a.loginTime; + return b.quitTime - a.quitTime; } else { return b.ce - a.ce; } @@ -649,8 +657,8 @@ export class GuildHandler { if (!checkHisAuth) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH); // 离线72小时 - const { roleName: oldRoleName, loginTime } = await RoleModel.findByRoleId(leaderRoleId); - if (loginTime > getBeforeDaySeconds(3)) { + const { roleName: oldRoleName, quitTime } = await RoleModel.findByRoleId(leaderRoleId); + if (quitTime > getBeforeDaySeconds(3)) { return resResult(STATUS.GUILD_LEADER_LOGIN); } // 上周周功勋最高的人 @@ -921,7 +929,7 @@ export class GuildHandler { const guild = await GuildModel.findByCode(code, serverId); const leader = guild.leader; let threeDaysBefore = getBeforeDaySeconds(3); - await RoleModel.updateRoleInfo(leader.roleId, { loginTime: threeDaysBefore } ); + await RoleModel.updateRoleInfo(leader.roleId, { quitTime: threeDaysBefore } ); return resResult(STATUS.SUCCESS, { code }); } diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index bade45471..f061a9c12 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -13,6 +13,7 @@ import { ItemModel } from '../../../db/Item'; import { chackFunOpenWhenLogin } from '../../../services/funcSwitchService'; import { loginRefresh } from '../../../services/playerEventService'; import { getRedis, setRedis, delRedis } from '../../../services/redisService'; +import { nowSeconds } from '../../../pubUtils/timeUtil'; export default function (app: Application) { return new EntryHandler(app); } @@ -121,6 +122,7 @@ export class EntryHandler { channel.leave(roleId, sid); // this.app.rpc.battle.battleRemote.kick.route(session)(roleId, this.app.get('serverId'), serverId); this.app.rpc.chat.chatRemote.kickWorldChannel.route(session, true)(roleId, sid, serverId); + RoleModel.updateRoleInfo(roleId, { quitTime: nowSeconds() }); } diff --git a/game-server/app/services/guildService.ts b/game-server/app/services/guildService.ts index bde54825e..577066786 100644 --- a/game-server/app/services/guildService.ts +++ b/game-server/app/services/guildService.ts @@ -283,8 +283,8 @@ export const message = { } }, changeLeader: function(guildCode: string, managerCnt: number, newLeader: RoleType, oldLeaderId: string) { - let { roleId, roleName, sHid, headHid, lv, loginTime } = newLeader; - this.updateInfo(guildCode, {managerCnt, leader: { roleId, roleName, sHid, headHid, lv, loginTime }}); + let { roleId, roleName, sHid, headHid, lv, quitTime } = newLeader; + this.updateInfo(guildCode, {managerCnt, leader: { roleId, roleName, sHid, headHid, lv, quitTime }}); this.demotion(guildCode, oldLeaderId); this.promotion(guildCode, roleId); }, diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index e321f03e5..eb9155086 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -304,6 +304,12 @@ export async function delRedis(key: string) { await client.delAsync(key); } +export async function isRoleOnline(roleId: string) { + let key = `login_roleId_${roleId}`; + let result = await getRedis(key); + return !!result; +} + export async function resetPvpRanks() { const client: Redis.RedisClient = pinus.app.get('redis'); await client.delAsync(REDIS_KEY.PVP_RANK); diff --git a/shared/db/Guild.ts b/shared/db/Guild.ts index 23be4c917..c2345f285 100644 --- a/shared/db/Guild.ts +++ b/shared/db/Guild.ts @@ -94,7 +94,7 @@ export default class Guild extends BaseModel { const code = genCode(6); const result: GuildType = await GuildModel.findOneAndUpdate({ code }, update, { upsert: true, new: true }) .select({ _id: 0, __v: 0, createdAt: 0, updatedAt: 0 }) - .populate('leader', { roleId: 1, roleName: 1, sHid: 1, headHid: 1, lv: 1, loginTime: 1, ce: 1, title: 1, _id: 0 }, 'Role') + .populate('leader', { roleId: 1, roleName: 1, sHid: 1, headHid: 1, lv: 1, quitTime: 1, ce: 1, title: 1, _id: 0 }, 'Role') .lean(); return result; @@ -142,7 +142,7 @@ export default class Guild extends BaseModel { public static async findByCode(code: string, serverId: number, select?: string) { const result: GuildType = await GuildModel.findOne({ code, status: GUILD_STATUS.RUNNING, serverId }) .select(select) - .populate('leader', {roleId: 1, roleName: 1, sHid: 1, headHid: 1, lv: 1, loginTime: 1, ce: 1, title: 1, _id: 0}, 'Role') + .populate('leader', {roleId: 1, roleName: 1, sHid: 1, headHid: 1, lv: 1, quitTime: 1, ce: 1, title: 1, _id: 0}, 'Role') .lean(); return result; } diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 3b9512554..f546677af 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -154,6 +154,8 @@ export default class Role extends BaseModel { createTime: number; // 创建时间 @prop({ required: true, default: nowSeconds() }) loginTime: number; // 更新 / 登录时间 + @prop({ required: true, default: 0 }) + quitTime: number; // 更新 / 登录时间 @prop({ required: true, type: Number, default: [], _id: false }) funcs: Array; // 开启了的功能 @@ -414,9 +416,9 @@ export default class Role extends BaseModel { // 获取未加入公会且登录时间在三天内的人 public static async getInviteList(time: number, serverId: number) { - const result = await RoleModel.find({ loginTime: { $gt: time }, hasGuild: false, serverId }) - .select('roleId roleName ce headHid sHid lv title job loginTime') - .sort({loginTime: -1, lv: -1, ce: -1}) + const result = await RoleModel.find({ quitTime: { $gt: time }, hasGuild: false, serverId }) + .select('roleId roleName ce headHid sHid lv title job quitTime') + .sort({quitTime: -1, lv: -1, ce: -1}) .limit(100).lean(); return result; } diff --git a/shared/db/UserGuild.ts b/shared/db/UserGuild.ts index ffdd236d7..22f1aba60 100644 --- a/shared/db/UserGuild.ts +++ b/shared/db/UserGuild.ts @@ -88,7 +88,7 @@ export default class UserGuild extends BaseModel { const userGuilds: UserGuildType[] = await UserGuildModel.find({ guildCode, status: USER_GUILD_STATUS.ON }) .select(select) .sort(sort) - .populate('role', 'roleId roleName ce headHid sHid lv title loginTime', 'Role') + .populate('role', 'roleId roleName ce headHid sHid lv title quitTime', 'Role') .lean(); return userGuilds; } @@ -97,7 +97,7 @@ export default class UserGuild extends BaseModel { const userGuilds: UserGuildType = await UserGuildModel.findOne({ guildCode, status: USER_GUILD_STATUS.ON, auth: { $ne: GUILD_AUTH.LEADER } }) .sort({ activeWeekly: -1, activeUpdateTime: 1 }) .select(select) - .populate('role', 'roleId roleName ce headHid sHid lv title loginTime', 'Role') + .populate('role', 'roleId roleName ce headHid sHid lv title quitTime', 'Role') .lean(); return userGuilds; } diff --git a/shared/db/UserGuildApply.ts b/shared/db/UserGuildApply.ts index c416cfc63..e88df4bc4 100644 --- a/shared/db/UserGuildApply.ts +++ b/shared/db/UserGuildApply.ts @@ -79,7 +79,7 @@ export default class UserGuildApply extends BaseModel { const list: UserGuildApplyType[] = await UserGuildApplyModel.find(condition) .sort({ createdAt: -1 }) .select('applyCode role') - .populate('role', 'roleId roleName ce headHid sHid lv title job loginTime', 'Role') + .populate('role', 'roleId roleName ce headHid sHid lv title job quitTime', 'Role') .limit(GUILD_PER_PAGE).lean(); return list }