基于现有的三人主播连麦和一对一主播PK功能,新增了三人PK功能。该功能允许在三人连麦的基础上进行PK竞赛,通过礼物统计来决定胜负。
LivePK_Three: 存储三人PK房间信息
{"uid1": "主播1ID", "uid2": "主播2ID", "uid3": "主播3ID", "room_id": "房间ID"}LivePK_Three_gift: 存储三人PK礼物统计
LivePK_Three_timer: 存储三人PK开始时间
LiveRoom: 房间成员列表LiveRoomMaster: 用户所在房间映射LiveConnect: 连麦关系LiveConnect_pull: 拉流地址接口: Livepk.setThreePK
参数:
uid: 发起者用户IDpkuid2: 第二个主播IDpkuid3: 第三个主播IDsign: 签名返回:
{
"code": 0,
"msg": "",
"info": [{
"addtime": 1632123456,
"room_id": "12345_1632123456"
}]
}
接口: Livepk.endThreePK
参数:
uid: 用户IDaddtime: 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"
}]
}
方法: LiveThreePK
Action类型:
1: 发起三人PK2: 接受三人PK3: 拒绝三人PK4: 三人PK开始通知5: 手动结束三人PK7: 忙碌/不可用8: 无响应9: 三人PK结果发起三人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"
}
在原有礼物发送基础上,增加三人PK检测:
新增字段:
isthreepk: 是否三人PK (0/1)threepk_uid1: 主播1IDthreepk_uid2: 主播2IDthreepk_uid3: 主播3IDthreepk_total1: 主播1礼物总值threepk_total2: 主播2礼物总值threepk_total3: 主播3礼物总值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;
}
}
});
phalapi/src/app/Api/Livepk.php - 新增三人PK API接口phalapi/src/app/Model/Live.php - 修改礼物发送逻辑,支持三人PK统计dspIM/s1.js - 新增三人PK Socket处理逻辑setThreePK 和 endThreePK 方法sendGift 方法中增加三人PK检测和统计LiveThreePK 消息处理和 endThreePk 函数如果出现问题,可以快速回滚到备份版本,因为新功能是增量式的,不会破坏现有数据结构。
本次三人PK功能的实现严格遵循了最小改动原则,在现有架构基础上进行扩展,确保了:
该实现方案可以直接部署使用,为平台增加更丰富的互动玩法。