Files
18xchat/assets/Scripts/Main/Channel/webSDK.ts
T

388 lines
10 KiB
TypeScript
Raw Normal View History

2025-07-17 17:18:21 +08:00
import { VideoPlayer, Node, director, Component, isValid } from "cc";
import HttpUnit from "../Common/HttpUnit";
import { SDKManager } from "./SDKManager";
import { SceneBgVideoLayer } from "../../Sub/UI/SceneBgVideoLayer";
import { BgVideo } from "./BgVideo";
import Utils from "../Common/Utils";
import { InnerMsgCode } from "../Config/InnerMsgCode";
import { VideoRoleType } from "../Common/GlobalValue";
2025-09-21 20:05:36 +08:00
import { logger } from "db://assets/Scripts/Main/Common/Logger";
2025-07-17 17:18:21 +08:00
2025-09-18 23:33:06 +08:00
export class WebSDK {
//初始化
init(cb: Function = null) {
2025-09-21 20:05:36 +08:00
logger.log("init webSDK");
2025-09-18 23:33:06 +08:00
cb && cb();
}
2025-07-17 17:18:21 +08:00
2025-09-18 23:33:06 +08:00
//检查权限
checkAutoSetting(autoKey: string, cb: Function = null) {
cb && cb(true);
}
2025-07-17 17:18:21 +08:00
2025-09-18 23:33:06 +08:00
//获取用户信息
getUserInfo(cb: Function = null) {
let name = HttpUnit.GetNickName();
cb &&
cb({
nickName: name,
avatarUrl: "https://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/webHead.png",
});
}
2025-07-17 17:18:21 +08:00
2025-09-18 23:33:06 +08:00
//region 登录
login(cb: Function = null) {
cb && cb({ platform: 2, code: null });
}
//显示视频广告
show_video(callback: Function, tag: number) {
callback && callback({ code: 0, tag: tag });
SDKManager.video_ad_back();
}
//显示插屏
show_splash() {}
//显示Banner
show_banner(...args) {}
//隐藏Banner
hide_banner(...args) {}
//主动拉起分享
show_share(rewardCB?: Function) {
rewardCB && rewardCB();
}
//获取设备分辨率
getWindowSize() {
return { width: screen.width, height: screen.height };
}
//显示游戏圈
show_gameClub(leftRatio, topRatio, widthRatio, heightRatio) {}
//隐藏游戏圈
hide_gameClub() {}
//检查是否支持base64音频播放
checkSupportBase64Audio() {
return true;
}
//播放base64音频
private _audioInst: HTMLAudioElement = null;
playBase64Audio(base64: string, loop: boolean) {
let substring = base64;
let qianzhui = "data:audio/x-wav;base64,";
if (base64.startsWith(qianzhui)) {
substring = base64.substring(qianzhui.length, base64.length);
2025-07-17 17:18:21 +08:00
}
2025-09-18 23:33:06 +08:00
// 解码 Base64 字符串为二进制数据
const binaryData = atob(substring);
// 创建一个包含二进制数据的 Uint8Array
const byteArray = new Uint8Array(binaryData.length);
for (let i = 0; i < binaryData.length; i++) {
byteArray[i] = binaryData.charCodeAt(i);
2025-07-17 17:18:21 +08:00
}
2025-09-18 23:33:06 +08:00
// 创建 Blob 对象,指定 MIME 类型为音频格式(例如 mp3)
const audioBlob = new Blob([byteArray], { type: "audio/mp3" });
// 创建音频 URL
const audioUrl = URL.createObjectURL(audioBlob);
2025-09-21 20:05:36 +08:00
logger.log("web 播放base64音频", audioUrl);
2025-09-18 23:33:06 +08:00
// 创建音频元素并播放
if (this._audioInst == null) {
this._audioInst = new Audio(audioUrl);
} else {
this._audioInst.src = audioUrl;
}
this._audioInst.play();
}
//客服功能是否支持
kefuSupport() {
2025-09-21 20:05:36 +08:00
logger.log("web 不支持联系客服");
2025-09-18 23:33:06 +08:00
return false;
}
//进入联系客服
openKefu() {
2025-09-21 20:05:36 +08:00
logger.log("web 进入联系客服");
2025-09-18 23:33:06 +08:00
}
//region 播放主背景视频
private zhuVideo1: BgVideo | null = null;
private zhuExtra1: any = null;
playBgAudio(
remoteUrl: string,
vtype: VideoRoleType,
loop: boolean = false,
extra: any = {}
) {
let bgvideo = SceneBgVideoLayer.handle;
if (!bgvideo) {
return;
2025-07-17 17:18:21 +08:00
}
2025-09-18 23:33:06 +08:00
this.initBgAudio();
if (this.zhuVideo1 && this.zhuVideo1.isPlaying) {
this.playBgAudioNext(remoteUrl, vtype, loop, extra);
return;
2025-07-17 17:18:21 +08:00
}
2025-09-18 23:33:06 +08:00
if (!this.zhuVideo1) {
this.zhuVideo1 = bgvideo.getVideoClone();
}
this.zhuExtra1 = extra;
this.zhuVideo1.vtype = vtype;
this.zhuVideo1.cbReady = this.audioReady.bind(this);
this.zhuVideo1.cbEnd = this.audioEnded.bind(this);
this.zhuVideo1.playVideo(remoteUrl, loop, false);
}
initBgAudio() {
let bgvideo = SceneBgVideoLayer.handle;
if (!bgvideo) {
return;
2025-07-17 17:18:21 +08:00
}
2025-09-21 20:05:36 +08:00
logger.log("web 初始化主背景视频");
2025-09-18 23:33:06 +08:00
if (!this.zhuVideo1) {
this.zhuVideo1 = bgvideo.getVideoClone();
this.zhuVideo1.remoteUrl =
"http://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/bginited.mp4";
}
if (!this.zhuVideo2) {
this.zhuVideo2 = bgvideo.getVideoClone();
this.zhuVideo2.remoteUrl =
"http://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/bginited.mp4";
}
if (!this.emoVideo1) {
this.emoVideo1 = bgvideo.getVideoClone();
this.emoVideo1.remoteUrl =
"http://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/bginited.mp4";
}
if (!this.emoVideo2) {
this.emoVideo2 = bgvideo.getVideoClone();
this.emoVideo2.remoteUrl =
"http://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/bginited.mp4";
}
}
audioReady() {
this.removeBgAudioNext();
this.zhuVideo1.moveIn();
Utils.sendInnerMsg(InnerMsgCode.BgVideo_Ready, {
compo: this.zhuVideo1,
extra: this.zhuExtra1,
});
}
audioEnded() {
Utils.sendInnerMsg(InnerMsgCode.BgVideo_End, {
compo: this.zhuVideo1,
extra: this.zhuExtra1,
});
}
removeBgAudio() {
if (this.zhuVideo1 && this.zhuVideo1.isPlaying) {
this.zhuVideo1.recycleVideo();
}
}
//主背景临时视频
private zhuVideo2: BgVideo | null = null;
private zhuExtra2: any = null;
playBgAudioNext(
remoteUrl: string,
vtype: VideoRoleType,
loop: boolean = false,
extra: any = {}
) {
let bgvideo = SceneBgVideoLayer.handle;
if (!bgvideo) {
return;
}
this.removeBgAudioNext();
if (!this.zhuVideo2) {
this.zhuVideo2 = bgvideo.getVideoClone();
}
this.zhuExtra2 = extra;
this.zhuVideo2.vtype = vtype;
this.zhuVideo2.cbReady = this.audioNextReady.bind(this);
this.zhuVideo2.cbEnd = this.audioNextEnded.bind(this);
this.zhuVideo2.playVideo(remoteUrl, loop, false);
}
audioNextReady() {
this.removeBgAudio();
this.zhuVideo2.moveIn();
Utils.sendInnerMsg(InnerMsgCode.BgVideo_Ready, {
compo: this.zhuVideo2,
extra: this.zhuExtra2,
});
}
audioNextEnded() {
Utils.sendInnerMsg(InnerMsgCode.BgVideo_End, {
compo: this.zhuVideo2,
extra: this.zhuExtra2,
});
}
removeBgAudioNext() {
if (this.zhuVideo2 && this.zhuVideo2.isPlaying) {
this.zhuVideo2.recycleVideo();
}
}
2025-07-17 17:18:21 +08:00
2025-09-18 23:33:06 +08:00
//region 播放emo视频
private emoVideo1: BgVideo | null = null;
private emoExtra1: any = {};
addEmoAudio(
remoteUrl: string,
vtype: VideoRoleType,
loop: boolean = false,
extra: any = {}
) {
let bgvideo = SceneBgVideoLayer.handle;
if (!bgvideo) {
return;
2025-07-17 17:18:21 +08:00
}
2025-09-18 23:33:06 +08:00
if (this.emoVideo1 && this.emoVideo1.isPlaying) {
this.playEmoAudioNext(remoteUrl, vtype, loop, extra);
return;
// this.emoVideo1.recycleVideo();
2025-07-17 17:18:21 +08:00
}
2025-09-18 23:33:06 +08:00
if (!this.emoVideo1 || !isValid(this.emoVideo1.node)) {
this.emoVideo1 = bgvideo.getVideoClone();
}
this.emoExtra1 = extra;
this.emoVideo1.vtype = vtype;
this.emoVideo1.cbReady = this.emoReady.bind(this);
this.emoVideo1.cbEnd = this.emoEnded.bind(this);
this.emoVideo1.playVideo(remoteUrl, loop, false);
}
emoReady() {
this.removeEmoNextAudio();
Utils.sendInnerMsg(InnerMsgCode.BgVideo_Ready, {
compo: this.emoVideo1,
extra: this.emoExtra1,
});
}
emoEnded() {
Utils.sendInnerMsg(InnerMsgCode.BgVideo_End, {
compo: this.emoVideo1,
extra: this.emoExtra1,
});
}
removeEmoAudio() {
if (this.emoVideo1 && this.emoVideo1.isPlaying) {
this.emoVideo1.recycleVideo();
}
}
// 播放emo临时视频
private emoVideo2: BgVideo | null = null;
private emoExtra2: any = {};
playEmoAudioNext(
remoteUrl: string,
vtype: VideoRoleType,
loop: boolean = false,
extra: any = {}
) {
let bgvideo = SceneBgVideoLayer.handle;
if (!bgvideo) {
return;
}
this.removeEmoNextAudio();
if (!this.emoVideo2) {
this.emoVideo2 = bgvideo.getVideoClone();
}
this.emoExtra2 = extra;
this.emoVideo2.vtype = vtype;
this.emoVideo2.cbReady = this.emoNextReady.bind(this);
this.emoVideo2.cbEnd = this.emoNextEnded.bind(this);
this.emoVideo2.playVideo(remoteUrl, loop, false);
}
emoNextReady() {
this.removeEmoAudio();
Utils.sendInnerMsg(InnerMsgCode.BgVideo_Ready, {
compo: this.emoVideo2,
extra: this.emoExtra2,
});
}
emoNextEnded() {
Utils.sendInnerMsg(InnerMsgCode.BgVideo_End, {
compo: this.emoVideo2,
extra: this.emoExtra2,
});
}
removeEmoNextAudio() {
if (this.emoVideo2 && this.emoVideo2.isPlaying) {
this.emoVideo2.recycleVideo();
}
}
2025-07-17 17:18:21 +08:00
2025-09-18 23:33:06 +08:00
//region 复制到剪贴板
/**复制文本到剪贴板 */
copyToClipboard(text: string, cb?: Function) {
2025-09-21 20:05:36 +08:00
logger.log("web 复制到剪贴板:", text);
2025-09-18 23:33:06 +08:00
if (navigator.clipboard && window.isSecureContext) {
// 使用现代的 Clipboard API
navigator.clipboard
.writeText(text)
.then(() => {
2025-09-21 20:05:36 +08:00
logger.log("web 复制成功 (Clipboard API)");
2025-09-18 23:33:06 +08:00
cb && cb(true);
})
.catch((err) => {
2025-09-21 20:05:36 +08:00
logger.log("web 复制失败 (Clipboard API)", err);
2025-09-18 23:33:06 +08:00
this.fallbackCopyToClipboard(text, cb);
});
} else {
// 使用兼容性方案
this.fallbackCopyToClipboard(text, cb);
2025-07-17 17:18:21 +08:00
}
2025-09-18 23:33:06 +08:00
}
/**兼容性复制方案 */
private fallbackCopyToClipboard(text: string, cb?: Function) {
const textArea = document.createElement("textarea");
textArea.value = text;
// 避免滚动到底部
textArea.style.top = "0";
textArea.style.left = "0";
textArea.style.position = "fixed";
textArea.style.opacity = "0";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
const successful = document.execCommand("copy");
if (successful) {
2025-09-21 20:05:36 +08:00
logger.log("web 复制成功 (fallback)");
2025-09-18 23:33:06 +08:00
cb && cb(true);
} else {
2025-09-21 20:05:36 +08:00
logger.log("web 复制失败 (fallback)");
2025-09-18 23:33:06 +08:00
cb && cb(false);
}
} catch (err) {
2025-09-21 20:05:36 +08:00
logger.log("web 复制异常 (fallback)", err);
2025-09-18 23:33:06 +08:00
cb && cb(false);
2025-07-17 17:18:21 +08:00
}
2025-09-18 23:33:06 +08:00
document.body.removeChild(textArea);
}
//region 友盟+
umaInit() {}
//友盟统计是否开启
umaSwt() {
return false;
}
//友盟事件统计
umaEvent(eventName: string, value: any = {}) {}
2025-07-17 17:18:21 +08:00
}