Files
18xchat/assets/Scripts/Main/Channel/webSDK.ts
T
2025-09-21 20:05:39 +08:00

388 lines
10 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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";
import { logger } from "db://assets/Scripts/Main/Common/Logger";
export class WebSDK {
//初始化
init(cb: Function = null) {
logger.log("init webSDK");
cb && cb();
}
//检查权限
checkAutoSetting(autoKey: string, cb: Function = null) {
cb && cb(true);
}
//获取用户信息
getUserInfo(cb: Function = null) {
let name = HttpUnit.GetNickName();
cb &&
cb({
nickName: name,
avatarUrl: "https://hxzgame.vip.hnhxzkj.com/lzx/XiangQin/webHead.png",
});
}
//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);
}
// 解码 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);
}
// 创建 Blob 对象,指定 MIME 类型为音频格式(例如 mp3)
const audioBlob = new Blob([byteArray], { type: "audio/mp3" });
// 创建音频 URL
const audioUrl = URL.createObjectURL(audioBlob);
logger.log("web 播放base64音频", audioUrl);
// 创建音频元素并播放
if (this._audioInst == null) {
this._audioInst = new Audio(audioUrl);
} else {
this._audioInst.src = audioUrl;
}
this._audioInst.play();
}
//客服功能是否支持
kefuSupport() {
logger.log("web 不支持联系客服");
return false;
}
//进入联系客服
openKefu() {
logger.log("web 进入联系客服");
}
//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;
}
this.initBgAudio();
if (this.zhuVideo1 && this.zhuVideo1.isPlaying) {
this.playBgAudioNext(remoteUrl, vtype, loop, extra);
return;
}
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;
}
logger.log("web 初始化主背景视频");
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();
}
}
//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;
}
if (this.emoVideo1 && this.emoVideo1.isPlaying) {
this.playEmoAudioNext(remoteUrl, vtype, loop, extra);
return;
// this.emoVideo1.recycleVideo();
}
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();
}
}
//region 复制到剪贴板
/**复制文本到剪贴板 */
copyToClipboard(text: string, cb?: Function) {
logger.log("web 复制到剪贴板:", text);
if (navigator.clipboard && window.isSecureContext) {
// 使用现代的 Clipboard API
navigator.clipboard
.writeText(text)
.then(() => {
logger.log("web 复制成功 (Clipboard API)");
cb && cb(true);
})
.catch((err) => {
logger.log("web 复制失败 (Clipboard API)", err);
this.fallbackCopyToClipboard(text, cb);
});
} else {
// 使用兼容性方案
this.fallbackCopyToClipboard(text, cb);
}
}
/**兼容性复制方案 */
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) {
logger.log("web 复制成功 (fallback)");
cb && cb(true);
} else {
logger.log("web 复制失败 (fallback)");
cb && cb(false);
}
} catch (err) {
logger.log("web 复制异常 (fallback)", err);
cb && cb(false);
}
document.body.removeChild(textArea);
}
//region 友盟+
umaInit() {}
//友盟统计是否开启
umaSwt() {
return false;
}
//友盟事件统计
umaEvent(eventName: string, value: any = {}) {}
}