需要添加直播接口
This commit is contained in:
274
uni_modules/tuikit-atomic-x/state/BattleState.ts
Normal file
274
uni_modules/tuikit-atomic-x/state/BattleState.ts
Normal file
@@ -0,0 +1,274 @@
|
||||
/**
|
||||
* @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<BattleInfoParam | null>}
|
||||
* @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<BattleInfoParam | null>(null);
|
||||
|
||||
/**
|
||||
* PK 用户列表
|
||||
* @type {Ref<SeatUserInfoParam[]>}
|
||||
* @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<SeatUserInfoParam[]>([]);
|
||||
|
||||
/**
|
||||
* PK 分数映射
|
||||
* @type {Ref<Map<string, number>> | 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<Map<string, number> | 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 开始)<br>'onBattleEnded'( PK 结束)<br>'onUserJoinBattle'(当前有用户加入 PK 对战)<br>'onUserExitBattle'(当前有用户退出 PK 对战)<br>'onBattleRequestReceived'(收到 PK 请求)<br>'onBattleRequestCancelled'(取消 PK 请求)<br>'onBattleRequestTimeout'(当前 PK 对战请求超时)<br>'onBattleRequestAccept'(当前 PK 对战请求被接受)<br>'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 开始)<br>'onBattleEnded'( PK 结束)<br>'onUserJoinBattle'(当前有用户加入 PK 对战)<br>'onUserExitBattle'(当前有用户退出 PK 对战)<br>'onBattleRequestReceived'(收到 PK 请求)<br>'onBattleRequestCancelled'(取消 PK 请求)<br>'onBattleRequestTimeout'(当前 PK 对战请求超时)<br>'onBattleRequestAccept'(当前 PK 对战请求被接受)<br>'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<BattleInfoParam | null>(res, null);
|
||||
currentBattleInfo.value = battleData;
|
||||
break;
|
||||
case "battleUsers":
|
||||
const requestsData = safeJsonParse<SeatUserInfoParam[]>(res, []);
|
||||
battleUsers.value = requestsData;
|
||||
break;
|
||||
case "battleScore":
|
||||
const scoreData = safeJsonParse<Map<string, number> | 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;
|
||||
Reference in New Issue
Block a user