/** * @module BattleState * @module_description * 直播 PK 管理模块 * 核心功能:处理主播间的PK对战流程,包括PK请求、接受、拒绝、退出等完整的PK管理功能。 * 技术特点:支持实时PK状态同步、分数统计、PK时长控制、结果计算等高级功能。 * 业务价值:为直播平台提供丰富的互动玩法,增加主播收益和用户粘性。 * 应用场景:主播PK、对战直播、分数统计、互动游戏等娱乐互动场景。 */ import { ref } from "vue"; import { ILiveListener, RequestBattleOptions, CancelBattleRequestOptions, AcceptBattleOptions, RejectBattleOptions, ExitBattleOptions, BattleInfoParam, SeatUserInfoParam } from "@/uni_modules/tuikit-atomic-x"; import { getRTCRoomEngineManager } from "./rtcRoomEngine"; import { callUTSFunction, safeJsonParse } from "../utils/utsUtils"; /** * 当前 PK 信息 * @type {Ref} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { currentBattleInfo } = useBattleState('your_live_id'); * * // 监听当前 PK 信息变化 * watch(currentBattleInfo, (newBattle) => { * if (newBattle) { * console.log(' PK 已开始:', newBattle.battleID); * } * }); * * // 获取当前 PK 信息 * const battle = currentBattleInfo.value; */ const currentBattleInfo = ref(null); /** * PK 用户列表 * @type {Ref} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { battleUsers } = useBattleState('your_live_id'); * * // 监听当前 PK 用户列表变化 * watch(battleUsers, (newUsers) => { * console.log('PK 用户列表更新:', newUsers); * }); * * // 获取当前 PK 用户列表 * const users = battleUsers.value; * console.log('PK 用户列表更新:', users); */ const battleUsers = ref([]); /** * PK 分数映射 * @type {Ref> | null} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { battleScore } = useBattleState('your_live_id'); * * // 监听当前 PK 分数变化 * watch(battleScore, (newScore) => { * console.log('PK 分数更新:', newScore); * }); * * // 获取当前 PK 分数 * const score = battleScore.value; * console.log('当前 PK 分数:', score); */ const battleScore = ref | null>(null); /** * 请求 PK * @param {RequestBattleOptions} params - 请求 PK 参数 * @returns {void} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { requestBattle } = useBattleState("your_live_id"); * requestBattle({ * liveID: "your_live_id", * userIDList: ["target_user_id"], * timeout: 10, * config: { * duration: 300, * needResponse: true, * extensionInfo: "{"\"type\":\"standard\""}" * }, * success: (battleInfo, result) => { * console.log(' PK 请求成功:', battleInfo, result); * }, * fail: (code, desc) => { * console.error(' PK 请求失败:', code, desc); * } * }); */ function requestBattle(params : RequestBattleOptions) : void { callUTSFunction("requestBattle", params); } /** * 取消 PK 请求 * @param {CancelBattleRequestOptions} params - 取消 PK 请求参数 * @returns {void} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { cancelBattleRequest } = useBattleState("your_live_id"); * cancelBattleRequest({ * liveID: "your_live_id", * battleID: "battle_id", * userIDList: ["target_user_id"], * success: () => { * console.log('取消 PK 请求成功'); * }, * fail: (code, desc) => { * console.error('取消 PK 请求失败:', code, desc); * } * }); */ function cancelBattleRequest(params : CancelBattleRequestOptions) : void { callUTSFunction("cancelBattleRequest", params); } /** * 接受 PK * @param {AcceptBattleOptions} params - 接受 PK 参数 * @returns {void} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { acceptBattle } = useBattleState("your_live_id"); * acceptBattle({ * liveID: "your_live_id", * battleID: "battle_id", * success: () => { * console.log('接受 PK 成功'); * }, * fail: (code, desc) => { * console.error('接受 PK 失败:', code, desc); * } * }); */ function acceptBattle(params : AcceptBattleOptions) : void { callUTSFunction("acceptBattle", params); } /** * 拒绝 PK * @param {RejectBattleOptions} params - 拒绝 PK 参数 * @returns {void} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { rejectBattle } = useBattleState("your_live_id"); * rejectBattle({ * liveID: "your_live_id", * battleID: "battle_id", * success: () => { * console.log('拒绝 PK 成功'); * }, * fail: (code, desc) => { * console.error('拒绝 PK 失败:', code, desc); * } * }); */ function rejectBattle(params : RejectBattleOptions) : void { callUTSFunction("rejectBattle", params); } /** * 退出 PK * @param {ExitBattleOptions} params - 退出 PK 参数 * @returns {void} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { exitBattle } = useBattleState("your_live_id"); * exitBattle({ * liveID: "your_live_id", * battleID: "battle_id", * success: () => { * console.log('退出 PK 成功'); * }, * fail: (code, desc) => { * console.error('退出 PK 失败:', code, desc); * } * }); */ function exitBattle(params : ExitBattleOptions) : void { callUTSFunction("exitBattle", params); } /** * 添加 PK 事件监听器 * @param {string} liveID - 直播间ID * @param {string} eventName - 事件名称,可选值: 'onBattleStarted'( PK 开始)
'onBattleEnded'( PK 结束)
'onUserJoinBattle'(当前有用户加入 PK 对战)
'onUserExitBattle'(当前有用户退出 PK 对战)
'onBattleRequestReceived'(收到 PK 请求)
'onBattleRequestCancelled'(取消 PK 请求)
'onBattleRequestTimeout'(当前 PK 对战请求超时)
'onBattleRequestAccept'(当前 PK 对战请求被接受)
'onBattleRequestReject'(当前 PK 对战请求被拒绝) * @param {ILiveListener} listener - 事件处理函数 * @returns {void} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { addBattleListener } = useBattleState('your_live_id'); * addBattleListener('your_live_id', 'onBattleStarted', { * callback: (params) => { * console.log(' PK 已开始:', params); * } * }); */ function addBattleListener(liveID : string, eventName : string, listener : ILiveListener) : void { getRTCRoomEngineManager().addBattleListener(liveID, eventName, listener); } /** * 移除 PK 事件监听器 * @param {string} liveID - 直播间ID * @param {string} eventName - 事件名称,可选值: 'onBattleStarted'( PK 开始)
'onBattleEnded'( PK 结束)
'onUserJoinBattle'(当前有用户加入 PK 对战)
'onUserExitBattle'(当前有用户退出 PK 对战)
'onBattleRequestReceived'(收到 PK 请求)
'onBattleRequestCancelled'(取消 PK 请求)
'onBattleRequestTimeout'(当前 PK 对战请求超时)
'onBattleRequestAccept'(当前 PK 对战请求被接受)
'onBattleRequestReject'(当前 PK 对战请求被拒绝) * @param {ILiveListener} listener - 事件处理函数 * @returns {void} * @memberof module:BattleState * @example * import { useBattleState } from '@/uni_modules/tuikit-atomic-x/state/BattleState'; * const { removeBattleListener } = useBattleState('your_live_id'); * removeBattleListener('your_live_id', 'onBattleStarted', battleListener); */ function removeBattleListener(liveID : string, eventName : string, listener : ILiveListener) : void { getRTCRoomEngineManager().removeBattleListener(liveID, eventName, listener); } const onBattleStoreChanged = (eventName : string, res : string) : void => { try { switch (eventName) { case "currentBattleInfo": const battleData = safeJsonParse(res, null); currentBattleInfo.value = battleData; break; case "battleUsers": const requestsData = safeJsonParse(res, []); battleUsers.value = requestsData; break; case "battleScore": const scoreData = safeJsonParse | null>(res, null); battleScore.value = scoreData; break; } } catch (error) { console.error("onBattleStoreChanged JSON parse error:", error); } }; function bindEvent(liveID : string) : void { getRTCRoomEngineManager().on("battleStoreChanged", onBattleStoreChanged, liveID); } export function useBattleState(liveID : string) { bindEvent(liveID); return { currentBattleInfo, // 当前 PK 信息 battleUsers, // PK 用户列表 battleScore, // PK 分数映射 requestBattle, // 请求 PK cancelBattleRequest, // 取消 PK 请求 acceptBattle, // 接受 PK rejectBattle, // 拒绝 PK exitBattle, // 退出 PK addBattleListener, // 添加 PK 事件监听 removeBattleListener // 移除 PK 事件监听 }; } export default useBattleState;