diff --git a/game-server/app/servers/chat/handler/chatHandler.ts b/game-server/app/servers/chat/handler/chatHandler.ts index eb4f9cd62..120ee103f 100644 --- a/game-server/app/servers/chat/handler/chatHandler.ts +++ b/game-server/app/servers/chat/handler/chatHandler.ts @@ -2,7 +2,7 @@ import { CHANNEL_PREFIX, MSG_SOURCE } from './../../../consts/constModules/chatC import {Application, BackendSession} from 'pinus'; import { resResult } from '../../../pubUtils/util'; import { DEFAULT_MSG_PER_PAGE, STATUS } from '../../../consts'; -import { createGroupMsg, createPrivateMsg, getPrivateMessages, groupRoomId, pushGroupMsgToRoom, pushMsgToRole, updatePrivateMsgReadTime } from '../../../services/chatService'; +import { createGroupMsg, createPrivateMsg, getPrivateMessages, pushGroupMsgToRoom, pushMsgToRole, updatePrivateMsgReadInfo } from '../../../services/chatService'; export default function(app: Application) { @@ -136,7 +136,7 @@ export class ChatHandler { async readPrivateMessage(msg: { targetRoleId: string }, session: BackendSession) { const roleId = session.get('roleId'); const { targetRoleId } = msg; - const result = await updatePrivateMsgReadTime(roleId, targetRoleId); + const result = await updatePrivateMsgReadInfo(roleId, targetRoleId); if (!result) { return resResult(STATUS.UPDATE_PRIVATE_MSG_READ_TIME_ERR); } diff --git a/game-server/app/services/chatService.ts b/game-server/app/services/chatService.ts index 836694db3..6df6a7de8 100644 --- a/game-server/app/services/chatService.ts +++ b/game-server/app/services/chatService.ts @@ -82,8 +82,8 @@ async function createGroupMsgData(roleId: string, roleName: string, channel: str function createChatRec(sender: boolean, curTime: Date, targetRoleId) { const result: PrivateChatRec = { - // 接收者没有阅读时间 - targetRoleId, lastChatTime: curTime, lastReadTime: sender ? curTime : null + // 接收者没有阅读时间,发送者未读数为 0 + targetRoleId, lastChatTime: curTime, lastReadTime: sender ? curTime : null, unreadCnt: sender ? 0 : 1 }; return result; } @@ -95,8 +95,10 @@ async function updateRecentChats(sender: boolean, roleId: string, targetRoleId: recentPrivateChats.push(createChatRec(sender, curTime, targetRoleId)); } else { recentPrivateChats[recIdx].lastChatTime = curTime; - // 发送者的最后阅读时间也更新 - recentPrivateChats[recIdx].lastReadTime = sender ? curTime : recentPrivateChats[recIdx].lastReadTime; + const { lastReadTime, unreadCnt } = recentPrivateChats[recIdx]; + // 发送者的最后阅读时间也更新,接收者的未读消息数增加 + recentPrivateChats[recIdx].lastReadTime = sender ? curTime : lastReadTime; + recentPrivateChats[recIdx].unreadCnt = sender ? 0 : unreadCnt + 1; } await ChatInfoModel.updateInfo({ roleId, recentPrivateChats}); } @@ -353,19 +355,11 @@ export async function recentPrivateChatInfos(roleId: string, roleName: string) { .splice(RECENT_PRIVATE_CHATS_CNT); if (!recentPrivateChats || !recentPrivateChats.length) return null; - const unreadChats = recentPrivateChats.filter(chat => { return chat.lastChatTime > chat.lastReadTime }); - let unreadMsgs = {}; - for (let { targetRoleId, lastReadTime } of unreadChats) { - const msgs = await PrivateMessageModel.getMsgsByTime(privateRoomId(roleId, targetRoleId), lastReadTime, MAX_PRIVATE_MSGS); - unreadMsgs[targetRoleId] = msgs; - } - const roleInfos = await RoleModel.findRoleByField('roleId', recentPrivateChats.map(chat => { return chat.targetRoleId })); const chatInfos = recentPrivateChats.map( chat => { for (let { roleId: targetRoleId, quitTime, roleName: targetRoleName, title, guildName, headHid, sHid, lv } of roleInfos) { if (targetRoleId === chat.targetRoleId) { - const unreadCnt = unreadMsgs[targetRoleId] ? unreadMsgs[targetRoleId].length : 0; - return { ...chat, quitTime, targetRoleName, title, guildName, headHid, sHid, lv, unreadCnt }; + return { ...chat, quitTime, targetRoleName, title, guildName, headHid, sHid, lv }; } } }); @@ -397,9 +391,9 @@ function shouldPushTowerMsg(lv: number) { return lv >= 100 && lv % 50 === 0; } -export async function updatePrivateMsgReadTime(roleId: string, targetRoleId: string) { +export async function updatePrivateMsgReadInfo(roleId: string, targetRoleId: string) { const time = new Date(); - const chatInfo = await ChatInfoModel.updateReadTime(roleId, targetRoleId, time); + const chatInfo = await ChatInfoModel.updateReadInfo(roleId, targetRoleId, time); if (!chatInfo || !chatInfo.recentPrivateChats) { return null; } diff --git a/shared/db/ChatInfo.ts b/shared/db/ChatInfo.ts index f14ff3ebb..933aaad63 100644 --- a/shared/db/ChatInfo.ts +++ b/shared/db/ChatInfo.ts @@ -8,6 +8,8 @@ export class PrivateChatRec { lastReadTime: Date; // 最后查看时间,用来检查未读消息数 @prop({ required: true }) lastChatTime: Date; // 最后聊天时间 + @prop({ required: true, default: 0 }) + unreadCnt: number; // 未读消息数 } /** @@ -50,8 +52,13 @@ export default class ChatInfo extends BaseModel { return result; } - public static async updateReadTime(roleId: string, targetRoleId: string, time: Date) { - const result: ChatInfoType = await ChatInfoModel.findOneAndUpdate({ roleId, 'recentPrivateChats.targetRoleId': targetRoleId }, { 'recentPrivateChats.$.lastReadTime': time }, { new: true }).select('-_id').lean(); + public static async updateReadInfo(roleId: string, targetRoleId: string, time: Date) { + const result: ChatInfoType = await ChatInfoModel + .findOneAndUpdate( + { roleId, 'recentPrivateChats.targetRoleId': targetRoleId }, + { 'recentPrivateChats.$.lastReadTime': time, 'recentPrivateChats.$.unreadCnt': 0 }, + { new: true }) + .select('-_id').lean(); return result; } }