三人PK功能说明.md 7.4 KB

三人PK功能实现说明

功能概述

基于现有的三人主播连麦和一对一主播PK功能,新增了三人PK功能。该功能允许在三人连麦的基础上进行PK竞赛,通过礼物统计来决定胜负。

实现原理

1. 数据结构设计

Redis键值设计

  • LivePK_Three: 存储三人PK房间信息

    • Key: room_id
    • Value: JSON格式 {"uid1": "主播1ID", "uid2": "主播2ID", "uid3": "主播3ID", "room_id": "房间ID"}
  • LivePK_Three_gift: 存储三人PK礼物统计

    • Key: uid (主播ID)
    • Value: 礼物总价值
  • LivePK_Three_timer: 存储三人PK开始时间

    • Key: room_id
    • Value: 开始时间戳

现有Redis键复用

  • LiveRoom: 房间成员列表
  • LiveRoomMaster: 用户所在房间映射
  • LiveConnect: 连麦关系
  • LiveConnect_pull: 拉流地址

2. API接口

2.1 开始三人PK

接口: Livepk.setThreePK

参数:

  • uid: 发起者用户ID
  • pkuid2: 第二个主播ID
  • pkuid3: 第三个主播ID
  • sign: 签名

返回:

{
    "code": 0,
    "msg": "",
    "info": [{
        "addtime": 1632123456,
        "room_id": "12345_1632123456"
    }]
}

2.2 结束三人PK

接口: Livepk.endThreePK

参数:

  • uid: 用户ID
  • addtime: PK开始时间戳
  • type: 结束类型 (0:自动结束, 1:手动结束)
  • sign: 签名

返回:

{
    "code": 0,
    "msg": "",
    "info": [{
        "win_uid": "获胜者ID",
        "uid1": "主播1ID",
        "uid2": "主播2ID", 
        "uid3": "主播3ID",
        "gift1": "主播1礼物总值",
        "gift2": "主播2礼物总值",
        "gift3": "主播3礼物总值",
        "room_id": "房间ID"
    }]
}

3. Socket消息协议

3.1 三人PK消息类型

方法: LiveThreePK

Action类型:

  • 1: 发起三人PK
  • 2: 接受三人PK
  • 3: 拒绝三人PK
  • 4: 三人PK开始通知
  • 5: 手动结束三人PK
  • 7: 忙碌/不可用
  • 8: 无响应
  • 9: 三人PK结果

3.2 消息格式示例

发起三人PK:

{
    "msg": [{
        "_method_": "LiveThreePK",
        "action": "1",
        "msgtype": "10",
        "uid": "发起者ID",
        "uname": "发起者昵称",
        "pkuid2": "主播2ID",
        "pkuid3": "主播3ID"
    }],
    "retcode": "000000",
    "retmsg": "OK"
}

PK开始通知:

{
    "msg": [{
        "_method_": "LiveThreePK",
        "action": "4",
        "msgtype": "10",
        "uid1": "主播1ID",
        "uid2": "主播2ID",
        "uid3": "主播3ID",
        "room_id": "房间ID",
        "addtime": "开始时间戳"
    }],
    "retcode": "000000",
    "retmsg": "OK"
}

PK结果通知:

{
    "msg": [{
        "_method_": "LiveThreePK",
        "action": "9",
        "msgtype": "10",
        "win_uid": "获胜者ID",
        "uid1": "主播1ID",
        "uid2": "主播2ID",
        "uid3": "主播3ID",
        "gift1": "主播1礼物总值",
        "gift2": "主播2礼物总值",
        "gift3": "主播3礼物总值",
        "room_id": "房间ID"
    }],
    "retcode": "000000",
    "retmsg": "OK"
}

4. 礼物统计机制

4.1 礼物发送增强

在原有礼物发送基础上,增加三人PK检测:

新增字段:

  • isthreepk: 是否三人PK (0/1)
  • threepk_uid1: 主播1ID
  • threepk_uid2: 主播2ID
  • threepk_uid3: 主播3ID
  • threepk_total1: 主播1礼物总值
  • threepk_total2: 主播2礼物总值
  • threepk_total3: 主播3礼物总值

4.2 统计逻辑

  1. 检查主播是否在三人PK房间中
  2. 如果是,则增加对应主播的礼物统计
  3. 返回所有三人的实时统计数据
  4. 前端根据统计数据实时更新PK进度

5. 使用流程

5.1 完整流程

  1. 建立三人连麦: 三个主播先建立连麦关系
  2. 发起三人PK: 任一主播发起三人PK邀请
  3. 接受PK: 其他主播接受PK邀请
  4. PK进行: 观众送礼物,实时统计各主播礼物价值
  5. PK结束: 5分钟后自动结束或手动结束
  6. 结果公布: 礼物价值最高者获胜,平局则无获胜者

5.2 前端集成示例

JavaScript客户端代码:

// 发起三人PK
function startThreePK(pkuid2, pkuid3) {
    var data = {
        msg: [{
            _method_: "LiveThreePK",
            action: "1",
            msgtype: "10",
            uid: currentUserId,
            uname: currentUserName,
            pkuid2: pkuid2,
            pkuid3: pkuid3
        }],
        token: userToken
    };
    socket.emit('broadcast', data);
}

// 接受三人PK
function acceptThreePK(uid, pkuid2, pkuid3) {
    var data = {
        msg: [{
            _method_: "LiveThreePK", 
            action: "2",
            msgtype: "10",
            uid: uid,
            pkuid2: pkuid2,
            pkuid3: pkuid3
        }],
        token: userToken
    };
    socket.emit('broadcast', data);
}

// 监听PK消息
socket.on('broadcastingListen', function(data) {
    var msg = JSON.parse(data[0]);
    if(msg.msg[0]._method_ === 'LiveThreePK') {
        switch(msg.msg[0].action) {
            case '1': // PK邀请
                showPKInvite(msg.msg[0]);
                break;
            case '4': // PK开始
                startPKTimer(msg.msg[0]);
                break;
            case '9': // PK结果
                showPKResult(msg.msg[0]);
                break;
        }
    }
});

6. 修改文件清单

6.1 后端文件

  1. phalapi/src/app/Api/Livepk.php - 新增三人PK API接口
  2. phalapi/src/app/Model/Live.php - 修改礼物发送逻辑,支持三人PK统计
  3. dspIM/s1.js - 新增三人PK Socket处理逻辑

6.2 主要修改点

  • API层: 新增 setThreePKendThreePK 方法
  • Model层: 在 sendGift 方法中增加三人PK检测和统计
  • Socket层: 新增 LiveThreePK 消息处理和 endThreePk 函数

7. 兼容性说明

7.1 向后兼容

  • 现有的一对一PK功能完全保持不变
  • 现有的三人连麦功能完全保持不变
  • 新增功能不影响现有业务逻辑

7.2 最小改动原则

  • 复用现有的房间管理机制
  • 复用现有的礼物发送机制
  • 复用现有的Socket通信机制
  • 仅在必要位置增加三人PK相关逻辑

8. 测试建议

8.1 功能测试

  1. 三人连麦建立后发起PK
  2. PK过程中礼物统计准确性
  3. PK自动结束和手动结束
  4. 异常情况处理(断线重连等)

8.2 性能测试

  1. 多个三人PK房间同时进行
  2. 高频礼物发送时的统计性能
  3. Redis内存使用情况

8.3 兼容性测试

  1. 确保一对一PK功能正常
  2. 确保三人连麦功能正常
  3. 确保普通礼物发送功能正常

9. 部署说明

9.1 部署步骤

  1. 备份现有代码
  2. 更新后端PHP文件
  3. 重启Socket服务器
  4. 更新前端代码(如需要)
  5. 测试功能完整性

9.2 回滚方案

如果出现问题,可以快速回滚到备份版本,因为新功能是增量式的,不会破坏现有数据结构。

10. 总结

本次三人PK功能的实现严格遵循了最小改动原则,在现有架构基础上进行扩展,确保了:

  1. 功能完整性: 支持完整的三人PK流程
  2. 向后兼容: 不影响现有功能
  3. 代码质量: 遵循现有代码规范
  4. 性能优化: 复用现有机制,避免重复开发
  5. 易于维护: 代码结构清晰,便于后续维护

该实现方案可以直接部署使用,为平台增加更丰富的互动玩法。