跳到主要内容

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→SCS_FriendApply申请
C→SCS_FriendReply同意/拒绝
C→SCS_FriendDelete删除
C→SCS_FriendBlock拉黑/解除
C→SCS_FriendList列表
S→CSC_FriendList好友/关注/黑名单
S→CSC_FriendOnline在线状态变化
S→CSC_FriendApplyNotify新申请

3.3 关系链一致性​

  • 好友关系双向写入,使用事务;失败回滚。
  • 删除/拉黑同时清理对方的反向关系。
  • 角色改名按 role_id 关联,不按名字。
  • 角色删除时清理所有关系。

4. 客户端设计​

  • 好友面板:分组、搜索、在线排序、离线灰显。
  • 申请列表:来源、等级、职业、同意/拒绝/拉黑。
  • 右键菜单:私聊、组队、交易、删除、拉黑。
  • 黑名单页签:解除拉黑、查看原因。
  • 离线好友显示最后在线时间。

5. 配置​

Friend.xml:max_friends、max_follows、max_blocks、apply_expire_days、stranger_chat。

6. 边界与异常​

场景处理
重复申请幂等,返回已申请
好友已满拒绝并提示
对方已拉黑自己申请失败,不暴露拉黑状态
跨服私聊由 MiniServer 转发,失败提示
删除好友时对方在线双方列表即时刷新
角色改名关系不变,列表刷新名字

7. 验收标准​

  • 好友申请/同意/删除/拉黑/解除全流程正确。
  • 在线状态跨服同步延迟 ≤ 30 秒。
  • 黑名单拦截私聊/组队/交易。
  • 关系链双向一致,无单边残留。
  • 好友上限、申请过期正确。