Skip to content

游戏聊天特征 ​

最后更新: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 一并清空(MySQL UPDATE ... SET is_recalled = 1, content = '';Hybrid 双 tier:Redis 热层 LSet 原位改写、列表顺序与其余条目不动,冷层同上 UPDATE;镜像就是 ChatMessage proto 字节,抹除逻辑收敛为 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)