560 lines
16 KiB
JavaScript
560 lines
16 KiB
JavaScript
globalThis.WebSdkWrapper = (function () {
|
|
function addScript(src, id, onload) {
|
|
if (document.getElementById(id)) return;
|
|
let fjs = document.getElementsByTagName("script")[0];
|
|
let js = document.createElement("script");
|
|
js.id = id;
|
|
fjs.parentNode.insertBefore(js, fjs);
|
|
js.onload = onload;
|
|
js.src = src;
|
|
}
|
|
|
|
window.addEventListener("keydown", (ev) => {
|
|
if (["ArrowDown", "ArrowUp", " "].includes(ev.key)) {
|
|
ev.preventDefault();
|
|
}
|
|
});
|
|
window.addEventListener("wheel", (ev) => ev.preventDefault(), {
|
|
passive: false,
|
|
});
|
|
|
|
/*
|
|
============== EVENT DISPATCHER =================
|
|
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
*/
|
|
const events = {};
|
|
|
|
function listen(event, fn, { once = false } = {}) {
|
|
events[event] = events[event] || [];
|
|
events[event].push({
|
|
fn,
|
|
once,
|
|
});
|
|
}
|
|
|
|
function listenOnce(event, fn) {
|
|
listen(event, fn, { once: true });
|
|
}
|
|
|
|
function dispatch(event, ...data) {
|
|
(events[event] || []).forEach((fnObj) => {
|
|
fnObj.fn(...data);
|
|
});
|
|
events[event] = (events[event] || []).filter((fnObj) => !fnObj.once);
|
|
}
|
|
/*
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
============== EVENT DISPATCHER =================
|
|
*/
|
|
let sdk;
|
|
const sdkContext = {};
|
|
let supportedNetworks = [
|
|
{
|
|
name: "Poki",
|
|
get sdk() {
|
|
return globalThis.PokiSDK;
|
|
},
|
|
scriptSrc: "//game-cdn.poki.com/scripts/v2/poki-sdk.js",
|
|
hasAds: true,
|
|
hasBanner: false,
|
|
enableOnlyInProduction: false,
|
|
implementation: {
|
|
//async preInit(debug = false) {},
|
|
init(debug = false) {
|
|
return new Promise((resolve) => {
|
|
sdk
|
|
.init()
|
|
.then(() => {
|
|
sdkContext.hasAdblock = false;
|
|
resolve();
|
|
})
|
|
.catch(() => {
|
|
sdkContext.hasAdblock = true;
|
|
resolve();
|
|
});
|
|
sdk.setDebug(debug);
|
|
});
|
|
},
|
|
setUpEventListeners() {
|
|
listen("loadingStart", () => {
|
|
sdk.gameLoadingStart();
|
|
});
|
|
listen("loadingEnd", () => {
|
|
sdk.gameLoadingFinished();
|
|
});
|
|
listen("gameplayStart", () => {
|
|
if (sdkContext.gameplayStarted) return;
|
|
sdkContext.gameplayStarted = true;
|
|
sdk.gameplayStart();
|
|
});
|
|
listen("gameplayStop", () => {
|
|
if (!sdkContext.gameplayStarted) return;
|
|
sdkContext.gameplayStarted = false;
|
|
sdk.gameplayStop();
|
|
});
|
|
listen("interstitial", () => {
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
sdk.commercialBreak().then(() => {
|
|
dispatch("interstitialEnd", true);
|
|
});
|
|
});
|
|
listen("rewarded", () => {
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
sdk.rewardedBreak().then((success) => {
|
|
dispatch("rewardedEnd", success);
|
|
});
|
|
});
|
|
listen("happyTime", (scale) => {
|
|
sdk.happyTime(scale);
|
|
});
|
|
},
|
|
hasAdblock() {
|
|
return !!sdkContext.hasAdblock;
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "CrazyGames",
|
|
get sdk() {
|
|
if (!sdkContext.crazysdk)
|
|
sdkContext.crazysdk = globalThis?.CrazyGames?.CrazySDK?.getInstance();
|
|
return sdkContext.crazysdk;
|
|
},
|
|
scriptSrc: "//sdk.crazygames.com/crazygames-sdk-v1.js",
|
|
hasAds: true,
|
|
enableOnlyInProduction: false,
|
|
hasBanner: true,
|
|
implementation: {
|
|
//async preInit(debug = false) {},
|
|
init() {
|
|
return new Promise((resolve) => {
|
|
sdk.addEventListener("adblockDetectionExecuted", (event) => {
|
|
sdkContext.hasAdblock = event.hasAdblock;
|
|
resolve();
|
|
});
|
|
sdk.init();
|
|
});
|
|
},
|
|
setUpEventListeners() {
|
|
sdk.addEventListener("adStarted", () => {
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
});
|
|
sdk.addEventListener("adFinished", () => {
|
|
if (sdkContext.lastRequestedAd === "interstitial")
|
|
dispatch("interstitialEnd", true);
|
|
else dispatch("rewardedEnd", true);
|
|
});
|
|
sdk.addEventListener("adFinished", () => {
|
|
if (sdkContext.lastRequestedAd === "interstitial")
|
|
dispatch("interstitialEnd", true);
|
|
else dispatch("rewardedEnd", true);
|
|
});
|
|
sdk.addEventListener("adError", () => {
|
|
if (sdkContext.lastRequestedAd === "interstitial")
|
|
dispatch("interstitialEnd", false);
|
|
else dispatch("rewardedEnd", false);
|
|
});
|
|
listen("gameplayStart", () => {
|
|
if (sdkContext.gameplayStarted) return;
|
|
sdkContext.gameplayStarted = true;
|
|
sdk.gameplayStart();
|
|
});
|
|
listen("gameplayStop", () => {
|
|
if (!sdkContext.gameplayStarted) return;
|
|
sdkContext.gameplayStarted = false;
|
|
sdk.gameplayStop();
|
|
});
|
|
listen("interstitial", () => {
|
|
sdkContext.lastRequestedAd = "interstitial";
|
|
sdk.requestAd("midgame");
|
|
});
|
|
listen("rewarded", () => {
|
|
sdkContext.lastRequestedAd = "rewarded";
|
|
sdk.requestAd("rewarded");
|
|
});
|
|
listen("happyTime", () => {
|
|
sdk.happytime();
|
|
});
|
|
listen("banner", (data) => {
|
|
sdk.requestBanner(data);
|
|
});
|
|
},
|
|
hasAdblock() {
|
|
return !!sdkContext.hasAdblock;
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "GamePix",
|
|
get sdk() {
|
|
return globalThis.GamePix;
|
|
},
|
|
scriptSrc: "//integration.gamepix.com/sdk/v3/gamepix.sdk.js",
|
|
hasAds: true,
|
|
enableOnlyInProduction: true,
|
|
hasBanner: false,
|
|
implementation: {
|
|
//async preInit(debug = false) {},
|
|
//init() {},
|
|
setUpEventListeners() {
|
|
listen("loadingProgress", (progress) => {
|
|
sdk.loading(progress);
|
|
});
|
|
listen("loadingEnd", () => {
|
|
sdk.loaded();
|
|
});
|
|
sdk.pause = () => {
|
|
dispatch("pause");
|
|
};
|
|
sdk.resume = () => {
|
|
dispatch("resume");
|
|
};
|
|
listen("levelStart", (level) => {
|
|
sdk.updateLevel(level);
|
|
});
|
|
listen("score", (score) => {
|
|
sdk.updateScore(score);
|
|
});
|
|
listen("interstitial", () => {
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
sdk.interstitialAd().then(() => {
|
|
dispatch("interstitialEnd", true);
|
|
});
|
|
});
|
|
listen("rewarded", () => {
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
sdk.rewardAd().then((res) => {
|
|
dispatch("rewardedEnd", res.success);
|
|
});
|
|
});
|
|
listen("happyTime", () => {
|
|
sdk.happyMoment();
|
|
});
|
|
},
|
|
hasAdblock() {
|
|
return false;
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "GameDistribution",
|
|
get sdk() {
|
|
return globalThis.gdsdk;
|
|
},
|
|
scriptSrc: "//html5.api.gamedistribution.com/main.min.js",
|
|
hasAds: true,
|
|
enableOnlyInProduction: true,
|
|
hasBanner: false,
|
|
implementation: {
|
|
async preInit(debug = false, data) {
|
|
sdkContext.errors = 0;
|
|
window["GD_OPTIONS"] = {
|
|
gameId: data.gameId,
|
|
debug,
|
|
testing: debug,
|
|
onEvent: function (event) {
|
|
switch (event.name) {
|
|
case "SDK_GAME_START":
|
|
sdkContext.errors = 0;
|
|
// if (sdkContext.lastRequestedAd === "interstitial")
|
|
// dispatch("interstitialEnd", true);
|
|
// else dispatch("rewardedEnd", true);
|
|
break;
|
|
case "SDK_GAME_PAUSE":
|
|
dispatch("pause");
|
|
break;
|
|
case "SDK_GDPR_TRACKING":
|
|
// this event is triggered when your user doesn't want to be tracked
|
|
break;
|
|
case "SDK_GDPR_TARGETING":
|
|
// this event is triggered when your user doesn't want personalised targeting of ads and such
|
|
break;
|
|
case "AD_ERROR":
|
|
sdkContext.errors += 1;
|
|
// if (sdkContext.errors >= 2) {
|
|
// if (sdkContext.lastRequestedAd === "interstitial")
|
|
// dispatch("interstitialEnd", false);
|
|
// else dispatch("rewardedEnd", false);
|
|
// } else {
|
|
// dispatch(sdkContext.lastRequestedAd);
|
|
// }
|
|
break;
|
|
}
|
|
},
|
|
};
|
|
},
|
|
//init() {},
|
|
setUpEventListeners() {
|
|
listen("interstitial", () => {
|
|
sdkContext.lastRequestedAd = "interstitial";
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
sdk
|
|
.showAd()
|
|
.then((response) => {
|
|
dispatch("interstitialEnd", true);
|
|
})
|
|
.catch((error) => {
|
|
dispatch("interstitialEnd", false);
|
|
});
|
|
});
|
|
listen("rewarded", () => {
|
|
sdkContext.lastRequestedAd = "rewarded";
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
sdk
|
|
.showAd("rewarded")
|
|
.then((response) => {
|
|
dispatch("rewardedEnd", true);
|
|
})
|
|
.catch((error) => {
|
|
dispatch("rewardedEnd", false);
|
|
});
|
|
});
|
|
},
|
|
hasAdblock() {
|
|
return false;
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "GameMonetize",
|
|
get sdk() {
|
|
return globalThis.sdk;
|
|
},
|
|
scriptSrc: "//html5.api.gamedistribution.com/main.min.js",
|
|
hasAds: true,
|
|
enableOnlyInProduction: true,
|
|
hasBanner: false,
|
|
implementation: {
|
|
async preInit(debug = false, data) {
|
|
window["SDK_OPTIONS "] = {
|
|
gameId: data.gameId,
|
|
debug,
|
|
testing: debug,
|
|
onEvent: function (event) {
|
|
switch (event.name) {
|
|
case "SDK_GAME_START":
|
|
if (sdkContext.lastRequestedAd === "interstitial")
|
|
dispatch("interstitialEnd", true);
|
|
else dispatch("rewardedEnd", true);
|
|
break;
|
|
case "SDK_GAME_PAUSE":
|
|
dispatch("pause");
|
|
break;
|
|
case "SDK_GDPR_TRACKING":
|
|
// this event is triggered when your user doesn't want to be tracked
|
|
break;
|
|
case "SDK_GDPR_TARGETING":
|
|
// this event is triggered when your user doesn't want personalised targeting of ads and such
|
|
break;
|
|
case "AD_ERROR":
|
|
sdkContext.errors += 1;
|
|
if (sdkContext.errors >= 2) {
|
|
if (sdkContext.lastRequestedAd === "interstitial")
|
|
dispatch("interstitialEnd", false);
|
|
else dispatch("rewardedEnd", false);
|
|
} else {
|
|
dispatch(sdkContext.lastRequestedAd);
|
|
}
|
|
break;
|
|
}
|
|
},
|
|
};
|
|
},
|
|
//init() {},
|
|
setUpEventListeners() {
|
|
listen("interstitial", () => {
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
sdk.showBanner();
|
|
});
|
|
listen("rewarded", () => {
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
sdk.showBanner();
|
|
});
|
|
},
|
|
hasAdblock() {
|
|
return false;
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "CoolMathGames",
|
|
get sdk() {
|
|
return null;
|
|
},
|
|
scriptSrc: null,
|
|
hasAds: false,
|
|
enableOnlyInProduction: true,
|
|
hasBanner: false,
|
|
implementation: {
|
|
//async preInit(debug = false, data) {},
|
|
init() {},
|
|
setUpEventListeners() {
|
|
listen("replayLevel", (level) => {
|
|
parent.cmgGameEvent("replay", level.toString());
|
|
});
|
|
listen("gameplayStart", () => {
|
|
parent.cmgGameEvent("start");
|
|
});
|
|
listen("levelStart", (level) => {
|
|
parent.cmgGameEvent("start", level.toString());
|
|
});
|
|
},
|
|
hasAdblock() {
|
|
return false;
|
|
},
|
|
},
|
|
},
|
|
];
|
|
|
|
let currentSdk = null;
|
|
let enabled = false;
|
|
const Wrapper = {
|
|
get enabled() {
|
|
return enabled;
|
|
},
|
|
get currentSdk() {
|
|
return currentSdk;
|
|
},
|
|
async init(name, debug = false, data = {}) {
|
|
return new Promise(async (resolve) => {
|
|
currentSdk = supportedNetworks.find(
|
|
(x) => x.name.toLowerCase() === name.toLowerCase()
|
|
);
|
|
if (currentSdk) {
|
|
enabled = true;
|
|
if (currentSdk.enableOnlyInProduction && debug) {
|
|
enabled = false;
|
|
resolve();
|
|
} else {
|
|
if (currentSdk.implementation.preInit)
|
|
await currentSdk.implementation.preInit(debug, data);
|
|
if (currentSdk.scriptSrc) {
|
|
addScript(
|
|
currentSdk.scriptSrc,
|
|
currentSdk.name + "-jssdk",
|
|
async () => {
|
|
sdk = currentSdk.sdk;
|
|
currentSdk.implementation.setUpEventListeners();
|
|
if (currentSdk.implementation.init)
|
|
await currentSdk.implementation.init(debug, data);
|
|
resolve();
|
|
}
|
|
);
|
|
} else {
|
|
resolve();
|
|
}
|
|
}
|
|
} else {
|
|
resolve();
|
|
}
|
|
});
|
|
},
|
|
onPause(fn) {
|
|
listen("pause", fn);
|
|
},
|
|
pause() {
|
|
dispatch("pause");
|
|
},
|
|
onResume(fn) {
|
|
listen("resume", fn);
|
|
},
|
|
resume() {
|
|
dispatch("resume");
|
|
},
|
|
onMute(fn) {
|
|
listen("mute", fn);
|
|
},
|
|
mute() {
|
|
dispatch("mute");
|
|
},
|
|
onUnmute(fn) {
|
|
listen("unmute", fn);
|
|
},
|
|
unmute() {
|
|
dispatch("unmute");
|
|
},
|
|
onUnlockAllLevels(fn) {
|
|
window.unlockAllLevels = fn;
|
|
},
|
|
hasAdblock() {
|
|
if (currentSdk && currentSdk.implementation.hasAdblock)
|
|
return currentSdk.implementation.hasAdblock();
|
|
return false;
|
|
},
|
|
loadingStart() {
|
|
dispatch("loadingStart");
|
|
},
|
|
loadingProgress(progress) {
|
|
progress = Math.min(Math.max(0, progress), 100);
|
|
dispatch("loadingProgress", progress);
|
|
},
|
|
loadingEnd() {
|
|
dispatch("loadingEnd");
|
|
},
|
|
gameplayStart() {
|
|
dispatch("gameplayStart");
|
|
},
|
|
gameplayStop() {
|
|
dispatch("gameplayStop");
|
|
},
|
|
happyTime() {
|
|
dispatch("happyTime");
|
|
},
|
|
levelStart(level) {
|
|
dispatch("levelStart", level);
|
|
},
|
|
replayLevel(level) {
|
|
dispatch("replayLevel", level);
|
|
},
|
|
score(score) {
|
|
dispatch("score", score);
|
|
},
|
|
banner(data) {
|
|
dispatch("banner", data);
|
|
},
|
|
interstitial() {
|
|
sdkContext.lastRequestedAd = "interstitial";
|
|
if (!currentSdk || !currentSdk.hasAds) {
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
return Promise.resolve(false);
|
|
}
|
|
return new Promise((resolve) => {
|
|
let gameplayStarted = sdkContext.gameplayStarted;
|
|
if (gameplayStarted) Wrapper.gameplayStop();
|
|
Wrapper.mute();
|
|
dispatch("interstitial");
|
|
listenOnce("interstitialEnd", (...args) => {
|
|
if (gameplayStarted) Wrapper.gameplayStart();
|
|
Wrapper.unmute();
|
|
resolve(...args);
|
|
});
|
|
});
|
|
},
|
|
rewarded() {
|
|
sdkContext.lastRequestedAd = "rewarded";
|
|
if (!currentSdk || !currentSdk.hasAds) {
|
|
dispatch("adStarted", sdkContext.lastRequestedAd);
|
|
return Promise.resolve(false);
|
|
}
|
|
return new Promise((resolve) => {
|
|
let gameplayStarted = sdkContext.gameplayStarted;
|
|
if (gameplayStarted) Wrapper.gameplayStop();
|
|
Wrapper.mute();
|
|
dispatch("rewarded");
|
|
listenOnce("rewardedEnd", (...args) => {
|
|
if (gameplayStarted) Wrapper.gameplayStart();
|
|
Wrapper.unmute();
|
|
resolve(...args);
|
|
});
|
|
});
|
|
},
|
|
onAdStarted(fn) {
|
|
listen("adStarted", fn);
|
|
},
|
|
hasAds() {
|
|
return currentSdk && currentSdk.hasAds ? 1 : 0;
|
|
},
|
|
};
|
|
return Wrapper;
|
|
})();
|