游戏聊天特征
最后更新:2026-09-27(enhanced 形态接入撤回端点:游戏平面部署形态补上 DELETE_MESSAGE,撤回在两种形态均可用)
本文档列出游戏聊天系统需要支持的特征,按优先级分阶段实现。
P0 — 核心(游戏上线必须)
消息处理
- 敏感词过滤:三级策略(替换为
**、直接拒绝、记录待审核)。本地词库加载,支持热更新。覆盖脏话、政治敏感、外挂/私服/代练广告。 - 消息长度限制:不同频道不同上限。私聊 200 字、世界 100 字、公告 500 字。超长截断或拒绝。
- 发送频率限制:按用户 + 频道限流。世界频道 5 秒一条、公会 2 秒一条、私聊 1 秒一条。超频返回
RATE_LIMITED。 - 重复消息检测:连续 3 条相同内容自动禁言 5 分钟。防刷屏。
- 消息撤回(已落地:
MessageEditManager::RecallMessage,窗口--recall_window_sec默认 120s、可撤回频道--recall_channels默认private,guild;版主删除走DeleteMessage治理路径,不受窗口约束。回码:非发送者AUTH_FAILED、超窗/非撤回频道/重复撤回INVALID_PARAM、本进程无台账USER_NOT_FOUND):发送后 2 分钟内可撤回(私聊/公会)。撤回后对方通过MESSAGE_DELETED_NOTIFY(is_hard_delete=false、deleted_by=作者)把气泡换成"消息已撤回"墓碑,接收方离线队列里已入队的副本同步按message_id回收。历史存档墓碑已贯通(2026-09-27):墓碑的语义是「置位is_recalled+ 抹除正文」,只置位等于原文仍躺在存档里——MessageStore::MarkMessageRecalled与基础形态的MarkRecalled都连content一并清空(MySQLUPDATE ... SET is_recalled = 1, content = '';Hybrid 双 tier:Redis 热层LSet原位改写、列表顺序与其余条目不动,冷层同上 UPDATE;镜像就是ChatMessageproto 字节,抹除逻辑收敛为recall_tombstone.{h,cc}供三种存储实现共用)。因此重拉GET_HISTORY只剩"这条被撤回过"的事实,读不出原文;BULK_DELETE的软删与单体软删同语义(成功每条立碑、每成员回收副本)。两种部署形态都有撤回入口(2026-09-27):basic 之外,enhanced(MYSQL_FOUND下实际构建的main_enhanced.cc)此前根本没有DELETE_MESSAGE槽位,现已接入同一套MessageEditManager/MessageEditHandlers——发送侧记台账,撤回侧经 session registry 把墓碑扇出到接收方的每一条在线设备,marker/purger 分别接HybridMessageStore::MarkMessageRecalled(双 tier 抹除)与PurgeOfflineByMessageId(Redis 与 Redis-down 回退队列都扫)。两条已记账的形态差异:游戏平面没有群组订阅登记,成员解析只覆盖私聊(规范a|b键取对方),公会撤回的 notify/离线回收对空成员列表是 no-op——与频道屏蔽同缺口,随群聊扇出路径一起落地;无角色体系则版主恒判 false(fail-closed),is_hard_delete=true一律AUTH_FAILED。gateway 侧零改动:已认证连接原样转发 2001-2999,MESSAGE_DELETED_NOTIFY(2232) 经 ChatBridge 的 verbatim 管道可达客户端。 - @提及:
@某人、@全体成员。被 @ 的玩家收到高亮提示。
频道管理
- 世界频道:全服广播。发言有等级门槛(默认 10 级)。每人每 5 秒一条。
- 公会频道:公会成员自动加入,退出/被踢自动移除。公会管理者可设置发言权限。
- 队伍频道:组队自动创建,解散/离队自动销毁。仅队长可解散。
- 私聊:1v1 对话。支持离线消息(离线期间存队列,上线推送)。
- 系统公告频道:全服推送,只读(玩家不能发言)。管理后台发布。
- 频道屏蔽:玩家可屏蔽特定频道(如关闭世界频道)。屏蔽后不接收该频道消息。
消息展示
- 走马灯:
priority = URGENT+ttl_seconds > 0的消息在屏幕顶部滚动。同时只显示一条,新的替换旧的。 - 系统弹窗:
priority = HIGH的系统消息弹窗显示(维护通知、全服奖励)。 - 消息气泡:按
sender_kind区分样式——普通玩家白色、系统黄色、NPC 绿色、交易橙色。 - 物品链接:
msg_type = ITEM_LINK,可点击查看详情弹窗。品质颜色:白(普通)/绿(优秀)/蓝(精良)/紫(史诗)/橙(传说)。 - 历史消息:离线期间的消息,上线时拉取。支持分页加载(
GetHistoryRequest)。 - 消息已读:私聊消息标记已读/未读。未读数 badge。
用户行为
- 黑名单:屏蔽特定玩家。屏蔽后不接收该玩家的私聊和频道消息(在频道中显示为"已屏蔽用户的消息")。
- 在线状态:在线/忙碌/离开/隐身。好友可见。
- 正在输入:私聊时显示"对方正在输入..."。
P1 — 增强(上线后迭代)
消息处理
- 消息编辑:已发送消息可编辑一次。编辑后显示"已编辑"标记。编辑历史不保留。
- 表情/贴图:系统表情包(内置 N 个)。消息中插入表情码
[emoji:xxx]。 - 消息引用:回复特定消息。显示被引用消息的摘要。
- 富文本:支持粗体、斜体、颜色(VIP 特权)。
频道管理
- 临时频道:活动/副本临时频道。活动结束自动清理。参与者自动加入。
- 跨服频道:合服后的跨服聊天。按 server_id 路由。
- 自定义频道:玩家创建的频道(如"交易频道"、"组队频道")。创建者为管理员。
用户行为
- 禁言:管理员禁言(按分钟/小时/天)。禁言期间所有频道不能发言。
- 举报:玩家举报消息。管理后台审核队列。审核结果:无事/警告/禁言/封号。
- 聊天等级门槛:世界频道需要达到 N 级才能发言。可在管理后台配置。
- VIP 特权:VIP 玩家消息带颜色、喇叭效果、专属表情。
消息展示
- 坐标链接:
msg_type = COORD_LINK,可点击自动寻路到指定坐标。 - 成就分享:卡片式展示(图标 + 名称 + 稀有度 + 获得时间)。
- 公会招募:公会招募信息卡片(公会名 + 等级 + 人数 + 一键加入按钮)。
- 组队招募:队伍招募信息卡片(副本名 + 人数需求 + 一键申请按钮)。
- 消息搜索:搜索聊天历史。按关键词、时间范围、频道过滤。
游戏特色
- NPC 对话:玩家与 NPC 聊天。NPC 回复走关键词规则引擎(当前已实现),未来可替换为 LLM。
- 系统播报:全服播报(BOSS 刷新、首杀、稀有掉落、玩家成就)。走世界频道 + 走马灯。
- 交易消息:拍卖行/交易行状态变更(上架、出价、成交、过期)。走系统频道。
- 好友上线通知:好友上线时推送通知(可关闭)。
- 邮件通知:新邮件到达时推送通知。
P2 — 运营(长期维护)
安全与合规
- 反广告:检测重复刷屏的广告内容(相同内容发 N 次)。自动禁言 + 标记审核。
- 消息审计:所有消息留存 N 天(可配置)。管理后台可回溯查询。
- 实名关联:消息可追溯到实名账号。配合举报/投诉处理。
- 防骚扰:陌生人私聊限制(需加好友或同公会)。可在设置中开关。
性能与运维
- 消息持久化:离线消息、历史记录存储(Redis 热数据 + MySQL 冷数据)。
- 消息过期:自动清理 N 天前的消息(可配置)。私聊保留更久。
- 消息压缩:大量消息传输时启用 gzip 压缩。
- 多设备同步:同账号多设备消息同步。已读状态同步。
- 消息去重:重连后不重复显示已收到的消息(靠
message_id去重)。 - 连接保活:心跳检测、断线重连、消息补发。
客户端渲染决策矩阵
客户端收到消息后,按 (channel_type, msg_type, priority) 三维度决策渲染方式:
优先级判断:
priority == URGENT && ttl_seconds > 0 → 屏幕顶部走马灯
priority == HIGH && channel_type == SYSTEM → 系统弹窗
频道路由:
channel_type → 对应 tab/窗口(私聊 tab、公会 tab、世界 tab、...)
消息渲染:
msg_type == TEXT → 文本气泡
msg_type == ITEM_LINK → 可点击物品卡片
msg_type == SKILL_LINK → 可点击技能卡片
msg_type == ACHIEVEMENT → 成就分享卡片
msg_type == NPC_DIALOG → NPC 对话气泡(绿色)
msg_type == TRADE_STATUS → 交易状态卡片(橙色)
msg_type == SYSTEM → 系统消息(黄色,居中)Proto 对应关系
| 文档概念 | Proto 字段 |
|---|---|
| 频道类型 | ChannelType(PRIVATE/TEAM/GUILD/WORLD/SYSTEM_CHANNEL/MARQUEE) |
| 消息类型 | MsgType(TEXT/ITEM_LINK/SKILL_LINK/ACHIEVEMENT/NPC_DIALOG/TRADE_STATUS/...) |
| 优先级 | Priority(PRIORITY_LOW/NORMAL/HIGH/URGENT) |
| 发送者类型 | SenderKind(SENDER_USER/SYSTEM/NPC/SERVICE) |
| 物品数据 | ItemMetadata(item_id/item_name/quality/icon_url/count/attrs) |
| 技能数据 | SkillMetadata(skill_id/skill_name/level/icon_url/description) |
| 成就数据 | AchievementMetadata(achievement_id/achievement_name/description/icon_url/rarity) |
| 交易数据 | TradeMetadata(trade_id/status/amount/item_name/item_count) |
| NPC 对话数据 | NpcDialogMetadata(npc_id/npc_name/dialog_id/options) |