# Chat 聊天业务模块 Chat 模块是游戏服务器的核心聊天业务层,负责实现游戏内实时聊天功能,包括玩家会话管理、消息过滤、位置追踪和 Zulip 异步同步。该模块通过 SESSION_QUERY_SERVICE 接口向其他业务模块提供会话查询能力。 ## 对外提供的接口 ### ChatService #### handlePlayerLogin(request: PlayerLoginRequest): Promise 处理玩家登录,验证 Token 并创建游戏会话。 #### handlePlayerLogout(socketId: string, reason?: string): Promise 处理玩家登出,清理会话和相关资源。 #### sendChatMessage(request: ChatMessageRequest): Promise 发送聊天消息,包含内容过滤、实时广播和 Zulip 异步同步。 #### updatePlayerPosition(request: PositionUpdateRequest): Promise 更新玩家在游戏地图中的位置。 #### getChatHistory(query: object): Promise 获取聊天历史记录。 #### getSession(socketId: string): Promise 获取指定 WebSocket 连接的会话信息。 ### ChatSessionService (实现 ISessionManagerService) #### createSession(socketId, userId, zulipQueueId, username?, initialMap?, initialPosition?): Promise 创建新的游戏会话,建立 WebSocket 与用户的映射关系。 #### getSession(socketId: string): Promise 获取会话信息并更新最后活动时间。 #### destroySession(socketId: string): Promise 销毁会话并清理相关资源。 #### injectContext(socketId: string, mapId?: string): Promise 根据玩家位置注入聊天上下文(Stream/Topic)。 #### updatePlayerPosition(socketId, mapId, x, y): Promise 更新玩家位置,支持跨地图切换。 #### getSocketsInMap(mapId: string): Promise 获取指定地图中的所有在线玩家 Socket。 #### cleanupExpiredSessions(timeoutMinutes?: number): Promise 清理过期会话,返回清理数量和 Zulip 队列 ID 列表。 ### ChatFilterService #### validateMessage(userId, content, targetStream, currentMap): Promise 综合验证消息,包含频率限制、内容过滤和权限验证。 #### filterContent(content: string): Promise 过滤消息内容,检测敏感词、重复字符和恶意链接。 #### checkRateLimit(userId: string): Promise 检查用户发送消息的频率是否超限。 #### validatePermission(userId, targetStream, currentMap): Promise 验证用户是否有权限向目标频道发送消息。 ### ChatCleanupService #### triggerCleanup(): Promise<{ cleanedCount: number }> 手动触发会话清理,返回清理的会话数量。 ## 使用的项目内部依赖 ### IZulipClientPoolService (来自 core/zulip_core) Zulip 客户端连接池服务,用于创建/销毁用户客户端和发送消息。 ### IApiKeySecurityService (来自 core/zulip_core) API Key 安全服务,用于获取和删除用户的 Zulip API Key。 ### IZulipConfigService (来自 core/zulip_core) Zulip 配置服务,提供地图与 Stream 的映射关系和附近对象查询。 ### IRedisService (来自 core/redis) Redis 缓存服务,用于存储会话数据、地图玩家列表和频率限制计数。 ### LoginCoreService (来自 core/login_core) 登录核心服务,用于验证 JWT Token。 ### ISessionManagerService (来自 core/session_core) 会话管理接口定义,ChatSessionService 实现此接口供其他模块依赖。 ## 核心特性 ### 实时聊天 + 异步同步架构 - 🚀 游戏内实时广播:消息直接广播给同地图玩家,延迟极低 - 🔄 Zulip 异步同步:消息异步存储到 Zulip,保证持久化 - ⚡ 低延迟体验:先广播后同步,不阻塞用户操作 ### 基于位置的聊天上下文 - 根据玩家当前地图自动确定 Zulip Stream - 根据玩家位置附近的对象自动确定 Topic - 支持跨地图切换时自动更新聊天频道 ### 会话生命周期管理 - 自动清理旧会话,防止重复登录 - 定时清理过期会话(默认 30 分钟无活动) - 支持手动触发清理操作 ### 内容安全和频率控制 - 敏感词过滤(支持替换和阻止两种模式) - 频率限制(默认 60 秒内最多 10 条消息) - 恶意链接检测和黑名单域名过滤 - 重复字符和刷屏检测 ## 潜在风险 ### Redis 连接故障风险 - 会话数据存储在 Redis,连接故障会导致会话丢失 - 缓解措施:Redis 集群部署、连接重试机制 ### Zulip 同步延迟风险 - 异步同步可能导致消息在 Zulip 中延迟出现 - 缓解措施:消息队列、重试机制、失败告警 ### 高并发广播性能风险 - 同一地图玩家过多时广播性能下降 - 缓解措施:分片广播、消息合并、限制单地图人数 ### 会话清理遗漏风险 - 定时清理可能遗漏部分过期会话 - 缓解措施:多次清理、Redis 过期策略配合