世界聊天与私聊
本页统一聊天策划、好友文档的私聊要求与客户端设计。当前 UI 发送命令仍向本地 SocialModel 追加消息,真实世界/私聊服务联调未被本次证明。v1 范围为文字世界频道和私聊;公会、系统通告、表情、富消息等规划保留为边界,不作为已交付功能。来源批准状态 unknown。
开启、频道与进入方式
来源入口为主界面常驻“聊天图标+最新聊天文本”,点开聊天页,也可从其他页面直达频道/对象。新手流程后按配置开放;未开放入口隐藏或显示锁的最终样式未统一,其他功能的聊天跳转也必须检查条件。世界聊天还可限制账号等级/关卡与禁言状态。私聊可从好友、玩家资料、世界消息头像进入;公会成员/历史/搜索等入口在不同表中有后续标记,其中会话列表当前已见客户端结构。
| 频道 | 设计准入、频率与范围 |
|---|---|
| 世界 | 面向同频道在线玩家;发送前校验开放/等级/关卡/禁言;默认5秒冷却,限制重复内容 |
| 私聊 | 允许非好友首条;对方回复前限制条数/时间窗口由服务端配置;任一方拉黑均阻止;策划频率表写1秒 |
| 公会(后续) | 仅成员;退出公会隐藏旧记录,新公会显示新频道;频率示例2秒 |
| 队伍(后续) | 频率示例1秒;未有完整当前队伍功能契约 |
| 系统(后续/移出本模块) | 不可回复,关系/公会/活动/奖励/维护/官方/安全/处罚消息;普通文本、重要样式、高重要红点/弹窗 |
2026-09-08 客户端对齐决策将旧系统通告页签、公告 storage 及通知码1003从社交模块移除。游戏公告归公告。旧策划“未解锁前保存仍有效系统消息”只适用于将来接入系统频道的方案,不能据此要求当前聊天保留该页签。
输入、发送、失败与过滤
输入上限100字符,显示如87/100,达到上限停止输入。原文对英文等语言写 Unicode 字符长度,但未明确字形簇、码点或 UTF-16 计数口径;不可直接把任意实现的 .Length 宣称等同“100字”。空字符串、全空格或换行不发送;外部 URL 只作文本,不转可点链接。
正常流是本地基础校验→发送中气泡→服务器确认成功或失败。冷却、重复内容、非好友未回复上限、禁言剩余时间、拉黑和网络错误给出相应反馈;发送失败保留可重试消息,点失败标记重发,不能伪装成已成功到达对端。重连保留页面和输入/失败状态,历史从服务端恢复。
方案规定普通敏感内容替换星号、严重内容拒绝发送,高风险由服务端记录,多次违规禁言;服务端词库应作为最终准入,不公开词库正文。客户端 Nakama 层的本地过滤只能提供即时反馈,不能证明服务端审核已经接通。
重复条数/时间窗、陌生人条数/窗口、禁言时长、举报冷却均为可配项,来源没有给正式数值。SocialChatConfig 当前默认100字符/世界5秒,注释明确私聊不限,与策划私聊1秒存在差异。
会话、历史与未读
会话列表按最后消息时间倒序,新消息会话上移,显示头像/头像框、昵称、等级/VIP(存在时)、最近消息、时间、未读、在线与好友状态。点击会话进入,阅读后清除对应未读并重算父入口。删除会话仅清除本地列表/记录,服务器历史不删,再聊天重建;删除好友保留会话和历史。
| 时间 | 展示方案 |
|---|---|
| 今天 | HH:mm |
| 昨天 | 昨天 HH:mm |
| 本年更早 | MM-dd HH:mm |
| 跨年 | yyyy-MM-dd HH:mm |
| 相邻消息 | 小于配置间隔不重复显示时间条;具体间隔未定 |
服务端历史建议保留30天,并按条数上限清理;好友文档另写100条,聊天表描述每会话上限,聚合口径尚待统一。客户端 ChatService 历史请求默认每次50条并支持向前翻页,不等于服务端只保留50条。设计中的世界缓冲200是本地展示策略,不覆盖30天持久化要求。
未读分入口、频道、会话三级。私聊常规新消息驱动入口;普通世界消息不持续制造主入口红点,重要@、公会和系统提醒属于后续范围。超过99显示99+。ChatService 采用单设备本地 cursor;没有 cursor、重新安装/换设备、登录补收通知与在线计数的边界不能视为账号级一致。客户端设计还描述在线上限99、登录补收上限20,与显示99+需要一致解释,未读完整性尚未证明。
界面与交互
自身气泡在右、他人在左,系统样式居中且不带玩家头像;当前仅文本频道用对应样式。滚动在底部时新消息自动滚入;翻历史时保持位置并显示“新消息N条”,点击回到底部。头像可开资料;长按菜单方案包含复制/举报/资料/拉黑,举报属后续,不能呈现为已受理。系统消息不显示查看玩家、拉黑等玩家相关操作。
键盘弹起时输入区抬升,消息列表可继续阅读;安全区适配16:9、18:9、19.5:9、20:9屏幕,长昵称/多语言不能遮住按钮与计数。退出/切频道应正确保存输入或按明确规则处理,来源未统一草稿持久化范围。
表情设计包括分类、滚动、最近使用及表情文本插入或直接发送;快捷语有文案key/频道/解锁/排序/直接发送字段。但2026-09-08 对齐明确 v1 不做表情,仅保留 EmojiTextParser 渲染预留;快捷语是否随文字版开放也未有已核实服务链路。玩家名片、战报、道具、组队邀请等富消息本轮隐藏,不将占位协议当当前功能。
屏蔽、举报和内容管理边界
拉黑阻断双方私聊/申请,在公共频道隐藏被拉黑者消息;解除不自动恢复好友。举报设计需选择类型、附带目标与上下文、返回受理结果并限制重复举报;举报不自动等价封禁。禁言由服务器决定,客户端显示原因/剩余时间并阻止发送。普通玩家不能撤回,管理员删除以占位提示替换;这些管理能力未获当前接线证明。
好友和聊天文档对举报/禁言既有完整交互描述又有后续标记,客户端决策也将其列范围外。这里保存其数据/表现要求以避免丢失设计,不把范围外机制列作当前必须能操作的功能。
具体文案、资源和资料同步
聊天主界面采用竖屏:顶部返回/标题/黑名单/设置,横向频道页签高亮当前项,中部消息按时间旧→新、最新在底,底部输入及发送。私聊顶部为返回、对方头像/昵称/在线、更多;点击头像或昵称看资料。未开放频道和扩展项不显示。头像、头像框、昵称、等级变化时上传,打开对应页再同步一次;当前模拟资料不证明真实同步已成功。
| 场景 | 文案 |
|---|---|
| 标题/频道/输入 | 聊天;好友/世界/公会/队伍/系统(后续频道按开放显示);请输入消息;发送;黑名单 |
| 无记录/无会话 | 暂无聊天消息 / 暂无聊天对象 |
| 频率/长度/空输入 | 发送过于频繁,请稍后再试 / 消息内容过长 / 请输入聊天内容 |
| 网络/发送/重复 | 网络异常,请稍后重试 / 消息发送失败 / 请勿重复发送相同内容 |
| 黑名单 | 你已将该玩家加入黑名单 / 已加入黑名单 / 已解除黑名单;被对方限制只提示消息发送失败 |
| 后续管理 | 举报已提交;当前处于禁言状态;禁言剩余时间示例“23小时16分钟”;该消息已被撤回 |
| 新消息 | 有新的聊天消息;历史浏览时显示“↓ N条新消息” |
| 拉黑确认 | 加入黑名单:加入后无法与该玩家私聊,取消/确认 |
| 举报确认(后续) | 举报玩家:请选择举报原因,取消/提交 |
| 删除会话确认 | 删除聊天记录:是否删除当前会话记录?取消/确认 |
举报类型为广告、辱骂、骚扰、欺诈、违法违规、其他;服务器记录举报人、目标、类型、时间、最近若干条消息及频道。禁言范围可为全部、世界或私聊。撤回规则限官方/系统管理员发送的信息可后台撤回,普通玩家无撤回入口。
美术资源包括入口/红点/未读数字底图、页面背景、频道默认/选中态、自身/他人气泡、系统背景、输入/发送/表情/扩展按钮、在线/离线/失败/黑名单/举报/新消息/系统通知图标。消息状态应区分正常、发送中、失败、已撤回、被系统屏蔽。后续内置表情要求统一风格和尺寸,基础类别为开心、大笑、生气、哭泣、惊讶、无语、点赞、鼓掌、加油、感谢。
音效、多语言、配置和统计
普通世界消息不逐条播放声音。未在对应聊天界面时的私聊/客服或重要系统提醒可播放提示,并限频避免连续打扰;客服/重要系统本身属于后续频道。打开页面用通用开启音,切频道/点会话用按钮音,点击发送用发送音,发送失败用错误音,拉黑/举报提交用确认音;后续表情展开/关闭用通用展开/关闭音。保持当前背景音乐。
固定 UI 文案、错误、时间格式和快捷语走多语言;用户文本原样显示,不自动翻译;系统类消息按 key+参数组织,昵称作为参数。配置包括:
| 配置组 | 字段含义 |
|---|---|
| 基础 | ChatUnlockLevel/ChatUnlockQuest 开放等级/任务;MessageMaxLength 长度;MessageSaveDays/MessageSaveCount 保留天数/每会话条数;ChatLoadCount 加载量;ChatConversationMax 会话上限 |
| 频道 | ChannelID/ChannelType;UnlockCondition;SendCooldown;HistoryCount 历史数量;RedDotRule;Sort |
| 陌生人 | StrangerChatEnable 开关;StrangerMessageLimit 主动条数;StrangerMessageTime 周期;StrangerChatLevel 等级门槛 |
| 内容管理 | RepeatMessageCount/RepeatMessageTime 重复次数/窗口;MuteDuration;SensitiveWordMode;ReportMessageCount 上下文条数 |
| 快捷语 | QuickChatID、频道、文案key、解锁、排序、是否直接发送 |
原方案埋点未确认已接入:
| 事件 | 记录字段 |
|---|---|
chat_page_open | player_id、account_level、source、default_channel、unread_count |
chat_page_close | stay_time、current_channel |
chat_channel_click | channel_type、unread_count |
chat_message_send | channel_type、relation_type、message_type、message_length、send_result、fail_reason;不记录正文 |
chat_message_receive | channel_type、relation_type、message_type、is_current_page |
chat_emoji_click / chat_quick_message_send | emoji_id/emoji_type/channel_type;quick_chat_id/channel_type,后续范围 |
chat_private_start | 首次向玩家发起私聊:target_player_id、relation_type、source |
chat_block_player / chat_unblock_player | target_player_id、source/relation_type(拉黑) |
chat_report_player | target_player_id、report_type、channel_type/source,后续范围 |
chat_unread_click | unread_count、channel_type、source |
chat_message_fail | channel_type、message_type、fail_reason、network_state;原因覆盖网络/频率/敏感词/禁言/黑名单/非好友限制/服务端异常 |
指标包括聊天渗透率/DAU、消息量与参与人数、发送成功/失败率、举报/拉黑率、表情/快捷语使用、次日/7日留存和聊天转好友;这是分析目标,不能据文档存在称已采集。
当前接线与明确缺口
frontend 7f0636c9 的 Features/Social/Commands/SendSocialPrivateTalkCommand.cs 只 Trim、判断模型/对象/非空,再 AppendPrivateTalk;SendSocialChannelTalkCommand.cs 同样 AppendChannelTalk。两者均明确处于假数据阶段,并没有在这些命令调用 Nakama。UI 中看到自己的新气泡不证明消息已发送到真实玩家。
Infrastructure/Nakama/ChatService.cs 已有世界/私聊、历史50条分页、本机 cursor、未读计算、提醒清理/恢复的代码;登录恢复读持久通知,通知1001/1002及原生-2/-3用于社交,1003已移除。它与 UI 的实际连接、nakamaKey、世界房间身份和真实对端必须另有证据。不得沿用旧设计“UI尚未组装”的结论,也不得因已有服务类将“待接线”升级为“已打通”。
尚缺真实投递/对端接收、失败重试、频控/敏感词服务端拒绝、离线未读/跨设备、历史保留、拉黑双向约束、完整音效与布局观察。本次仅源码审计。
来源与现有测试入口
整合旧 social-chat-guild-friend.md;飞书 AZIgdFJbxo7no2xBUvbcSIZRnng 全部聊天功能/界面/参数/事件表、Wc0UdS9nDoM43PxzsYUc1wlbnvg 私聊/未读/好友关联内容(2026-10-13 阅读件);frontend Infrastructure/Nakama/Nakama社交模块-客户端设计.md(含第13/14节)、ChatService.cs、Social 发送命令/配置/模型。失效的旧服务端设计和差异清单链接没有保留为当前依赖。
现有观察入口是社交→会话/世界、好友→私聊;未定位可证明真实社交闭环的独立现有测试。未新增或扩写测试。本地验证:根据项目策略禁止执行。