PRD-015 好友与黑名单
文档编号:PRD-015
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:SessionServer/Friend.cpp、RecordServer、聊天系统
1. 背景与目标
好友系统承载社交关系与私聊入口。当前存在跨服好友在线状态不同步、删除好友后仍能私聊、黑名单不拦截组队邀请等问题。本 PRD 统一好友申请、分组、在线状态、私聊与黑名单。
2. 核心规则
2.1 关系
| 关系 | 上限 | 说明 |
|---|---|---|
| 好友 | 100 | 双向确认 |
| 关注 | 50 | 单向,可查看在线 |
| 黑名单 | 50 | 单向屏蔽 |
- 好友申请需对方同意,7 天未处理自动过期。
- 删除好友双向移除,聊天记录保留(本地)。
- 黑名单自动移除好友关系,并拦截私聊/组队/交易邀请。
2.2 在线状态
- 在线/离线/忙碌/战斗中/副本中。
- 跨服状态由
MiniServer汇总,延迟不超过 30 秒。 - 好友上线/下线推送,客户端可关闭。
2.3 私聊
- 好友/关注可直接私聊;非好友需对方开启“允许陌生人私聊”。
- 黑名单用户无法发送私聊、组队、交易邀请。
- 私聊内容经过敏感词过滤,违规记录日志。
3. 服务端设计
3.1 数据结构
struct FriendRelation {
uint64_t role_id;
uint64_t target_id;
uint8_t type; // friend/follow/block
uint32_t group_id;
uint64_t create_time;
};
struct FriendOnline {
uint64_t role_id;
uint8_t status;
uint32_t map_id;
uint32_t server_id;
};
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_FriendApply | 申请 |
| C→S | CS_FriendReply | 同意/拒绝 |
| C→S | CS_FriendDelete | 删除 |
| C→S | CS_FriendBlock | 拉黑/解除 |
| C→S | CS_FriendList | 列表 |
| S→C | SC_FriendList | 好友/关注/黑名单 |
| S→C | SC_FriendOnline | 在线状态变化 |
| S→C | SC_FriendApplyNotify | 新申请 |
3.3 关系链一致性
- 好友关系双向写入,使用事务;失败回滚。
- 删除/拉黑同时清理对方的反向关系。
- 角色改名按
role_id关联,不按名字。 - 角色删除时清理所有关系。
4. 客户端设计
- 好友面板:分组、搜索、在线排序、离线灰显。
- 申请列表:来源、等级、职业、同意/拒绝/拉黑。
- 右键菜单:私聊、组队、交易、删除、拉黑。
- 黑名单页签:解除拉黑、查看原因。
- 离线好友显示最后在线时间。
5. 配置
Friend.xml:max_friends、max_follows、max_blocks、apply_expire_days、stranger_chat。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 重复申请 | 幂等,返回已申请 |
| 好友已满 | 拒绝并提示 |
| 对方已拉黑自己 | 申请失败,不暴露拉黑状态 |
| 跨服私聊 | 由 MiniServer 转发,失败提示 |
| 删除好友时对方在线 | 双方列表即时刷新 |
| 角色改名 | 关系不变,列表刷新名字 |
7. 验收标准
- 好友申请/同意/删除/拉黑/解除全流程正确。
- 在线状态跨服同步延迟 ≤ 30 秒。
- 黑名单拦截私聊/组队/交易。
- 关系链双向一致,无单边残留。
- 好友上限、申请过期正确。