Files
whale-town-end/src/gateway/chat
moyin cd2a197288 feat(chat): 添加地图切换功能
范围: src/gateway/chat/
- 新增 change_map 事件处理
- 实现 handleChangeMap() 方法
- 支持玩家在不同地图间切换
- 自动更新房间成员和广播通知
- 完善地图切换的错误处理

功能说明:
- 玩家可以通过 WebSocket 发送 change_map 事件切换地图
- 自动处理房间加入/离开逻辑
- 向旧地图广播玩家离开,向新地图广播玩家加入
- 支持携带初始位置坐标,默认使用 (400, 300)
2026-01-19 17:43:59 +08:00
..

聊天网关模块 (Chat Gateway Module)

聊天网关模块是聊天系统的协议入口,负责处理 WebSocket 和 HTTP 请求,提供统一的 API 接口。作为 Gateway Layer 的核心组件,它专注于协议转换和路由管理,将客户端请求转发到 Business Layer 处理,不包含业务逻辑。

架构层级

Gateway Layer网关层

职责定位

网关层负责:

  1. 协议处理:处理 WebSocket 和 HTTP 请求
  2. 数据验证:使用 DTO 进行请求参数验证
  3. 路由管理:定义 API 端点和消息路由
  4. 错误转换:将业务错误转换为协议响应

模块组成

src/gateway/chat/
├── chat.gateway.ts              # WebSocket 网关
├── chat.controller.ts           # HTTP 控制器
├── chat.gateway.module.ts       # 网关模块配置
├── chat.dto.ts                  # 请求 DTO
├── chat_response.dto.ts         # 响应 DTO
└── README.md                    # 模块文档

依赖关系

Gateway Layer (chat.gateway.module)
    ↓ 依赖
Business Layer (chat.module)
    ↓ 依赖
Core Layer (zulip_core.module, redis.module)

对外提供的接口

ChatWebSocketGateway 类

sendToPlayer(socketId: string, data: any): void

向指定玩家的 WebSocket 连接发送消息,用于单播通信。

broadcastToMap(mapId: string, data: any, excludeId?: string): void

向指定地图内的所有玩家广播消息,支持排除特定玩家。

getConnectionCount(): number

获取当前 WebSocket 总连接数,用于监控和统计。

getAuthenticatedConnectionCount(): number

获取已认证的 WebSocket 连接数,用于在线玩家统计。

getMapPlayerCounts(): Record<string, number>

获取各地图的在线玩家数量统计,用于负载监控。

getMapPlayers(mapId: string): string[]

获取指定地图内的所有玩家用户名列表,用于房间成员查询。

ChatController 类

getChatHistory(query: GetChatHistoryDto): Promise

获取聊天历史记录,支持按地图筛选和分页查询。

getSystemStatus(): Promise

获取聊天系统状态,包括 WebSocket 连接数、Zulip 状态、内存使用等。

getWebSocketInfo(): Promise