1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2026-03-02 03:39:21 +00:00

Prepare for the release on gamedistribution

This commit is contained in:
tobspr
2020-05-22 13:12:07 +02:00
parent b3a2e869d1
commit ab5462e140
32 changed files with 375 additions and 243 deletions

View File

@@ -0,0 +1,125 @@
/* typehints:start */
import { Application } from "../../application";
/* typehints:end */
import { AdProviderInterface } from "../ad_provider";
import { performanceNow } from "../../core/builtins";
import { createLogger } from "../../core/logging";
const minimumTimeBetweenVideoAdsMs = G_IS_DEV ? 1 : 5 * 60 * 1000;
const logger = createLogger("gamedistribution");
export class GamedistributionAdProvider extends AdProviderInterface {
/**
*
* @param {Application} app
*/
constructor(app) {
super(app);
/**
* The resolve function to finish the current video ad. Null if none is currently running
* @type {Function}
*/
this.videoAdResolveFunction = null;
/**
* The current timer which will timeout the resolve
*/
this.videoAdResolveTimer = null;
/**
* When we showed the last video ad
*/
this.lastVideoAdShowTime = -1e20;
console.error("X");
}
getHasAds() {
return true;
}
getCanShowVideoAd() {
return (
this.getHasAds() &&
!this.videoAdResolveFunction &&
performanceNow() - this.lastVideoAdShowTime > minimumTimeBetweenVideoAdsMs
);
}
initialize() {
// No point to initialize everything if ads are not supported
if (!this.getHasAds()) {
return Promise.resolve();
}
logger.log("🎬 Initializing gamedistribution ads");
try {
parent.postMessage("shapezio://gd.game_loaded", "*");
} catch (ex) {
return Promise.reject("Frame communication not allowed");
}
window.addEventListener(
"message",
event => {
if (event.data === "shapezio://gd.ad_started") {
console.log("🎬 Got ad started callback");
} else if (event.data === "shapezio://gd.ad_finished") {
console.log("🎬 Got ad finished callback");
if (this.videoAdResolveFunction) {
this.videoAdResolveFunction();
}
}
},
false
);
return Promise.resolve();
}
showVideoAd() {
assert(this.getHasAds(), "Called showVideoAd but ads are not supported!");
assert(!this.videoAdResolveFunction, "Video ad still running, can not show again!");
this.lastVideoAdShowTime = performanceNow();
console.log("🎬 Gamedistribution: Start ad");
try {
parent.postMessage("shapezio://gd.show_ad", "*");
} catch (ex) {
logger.warn("🎬 Failed to send message for gd ad:", ex);
return Promise.resolve();
}
document.body.classList.add("externalAdOpen");
return new Promise(resolve => {
// So, wait for the remove call but also remove after N seconds
this.videoAdResolveFunction = () => {
this.videoAdResolveFunction = null;
clearTimeout(this.videoAdResolveTimer);
this.videoAdResolveTimer = null;
// When the ad closed, also set the time
this.lastVideoAdShowTime = performanceNow();
resolve();
};
this.videoAdResolveTimer = setTimeout(() => {
logger.warn("Automatically closing ad after not receiving callback");
if (this.videoAdResolveFunction) {
this.videoAdResolveFunction();
}
}, 35000);
})
.catch(err => {
logger.error(this, "Error while resolving video ad:", err);
})
.then(() => {
document.body.classList.remove("externalAdOpen");
});
}
}

View File

@@ -1,47 +0,0 @@
import { AdProviderInterface } from "../ad_provider";
/**
* Stores information about where we are iframed
*/
export class EmbedProvider {
/**
* @returns {string}
*/
getId() {
abstract;
return "";
}
/**
* Whether this provider supports ads
* @returns {boolean}
*/
getSupportsAds() {
return false;
}
/**
* Returns the ad provider
* @returns {typeof AdProviderInterface}
*/
getAdProvider() {
abstract;
return null;
}
/**
* Whetherexternal links are supported
* @returns {boolean}
*/
getSupportsExternalLinks() {
return true;
}
/**
* Returns whether this provider is iframed
* @returns {boolean}
*/
getIsIframed() {
return true;
}
}

View File

@@ -1,16 +0,0 @@
import { AdinplayAdProvider } from "../../ad_providers/adinplay";
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
export class ArmorgamesEmbedProvider extends ShapezioWebsiteEmbedProvider {
getId() {
return "armorgames";
}
getAdProvider() {
return AdinplayAdProvider;
}
getIsIframed() {
return true;
}
}

View File

@@ -1,11 +0,0 @@
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
export class CrazygamesEmbedProvider extends ShapezioWebsiteEmbedProvider {
getId() {
return "crazygames";
}
getIsIframed() {
return true;
}
}

View File

@@ -1,20 +0,0 @@
import { AdinplayAdProvider } from "../../ad_providers/adinplay";
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
export class GamedistributionEmbedProvider extends ShapezioWebsiteEmbedProvider {
getId() {
return "gamedistribution";
}
getAdProvider() {
return AdinplayAdProvider;
}
getSupportsExternalLinks() {
return false;
}
getIsIframed() {
return true;
}
}

View File

@@ -1,15 +0,0 @@
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
export class IogamesSpaceEmbedProvider extends ShapezioWebsiteEmbedProvider {
getId() {
return "iogames.space";
}
getShowUpvoteHints() {
return true;
}
getIsIframed() {
return true;
}
}

View File

@@ -1,24 +0,0 @@
import { NoAdProvider } from "../../ad_providers/no_ad_provider";
import { EmbedProvider } from "../embed_provider";
export class KongregateEmbedProvider extends EmbedProvider {
getId() {
return "kongregate";
}
getSupportsAds() {
return false;
}
getAdProvider() {
return NoAdProvider;
}
getSupportsExternalLinks() {
return true;
}
getIsIframed() {
return true;
}
}

View File

@@ -1,11 +0,0 @@
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
export class MiniclipEmbedProvider extends ShapezioWebsiteEmbedProvider {
getId() {
return "miniclip";
}
getIsIframed() {
return true;
}
}

View File

@@ -1,24 +0,0 @@
import { EmbedProvider } from "../embed_provider";
import { AdinplayAdProvider } from "../../ad_providers/adinplay";
export class ShapezioWebsiteEmbedProvider extends EmbedProvider {
getId() {
return "shapezio";
}
getSupportsAds() {
return true;
}
getAdProvider() {
return AdinplayAdProvider;
}
getIsIframed() {
return false;
}
getSupportsExternalLinks() {
return true;
}
}

View File

@@ -1,18 +1,11 @@
import { Math_min } from "../../core/builtins";
import { globalConfig, IS_MOBILE } from "../../core/config";
import { createLogger } from "../../core/logging";
import { queryParamOptions } from "../../core/query_parameters";
import { clamp } from "../../core/utils";
import { globalConfig, IS_MOBILE } from "../../core/config";
import { NoAdProvider } from "../ad_providers/no_ad_provider";
import { PlatformWrapperInterface } from "../wrapper";
import { ShapezioWebsiteEmbedProvider } from "./embed_providers/shapezio_website";
import { ArmorgamesEmbedProvider } from "./embed_providers/armorgames";
import { IogamesSpaceEmbedProvider } from "./embed_providers/iogames_space";
import { MiniclipEmbedProvider } from "./embed_providers/miniclip";
import { GamedistributionEmbedProvider } from "./embed_providers/gamedistribution";
import { KongregateEmbedProvider } from "./embed_providers/kongregate";
import { CrazygamesEmbedProvider } from "./embed_providers/crazygames";
import { EmbedProvider } from "./embed_provider";
import { GamedistributionAdProvider } from "../ad_providers/gamedistribution";
const logger = createLogger("platform/browser");
@@ -20,39 +13,50 @@ export class PlatformWrapperImplBrowser extends PlatformWrapperInterface {
initialize() {
this.recaptchaTokenCallback = null;
this.embedProvider = new ShapezioWebsiteEmbedProvider();
this.embedProvider = {
id: "shapezio-website",
adProvider: NoAdProvider,
iframed: false,
externalLinks: true,
iogLink: true,
};
if (!G_IS_STANDALONE && queryParamOptions.embedProvider) {
const providerId = queryParamOptions.embedProvider;
this.embedProvider.iframed = true;
this.embedProvider.iogLink = false;
switch (providerId) {
case "armorgames": {
this.embedProvider = new ArmorgamesEmbedProvider();
this.embedProvider.id = "armorgames";
break;
}
case "iogames.space": {
this.embedProvider = new IogamesSpaceEmbedProvider();
this.embedProvider.id = "iogames.space";
this.embedProvider.iogLink = true;
break;
}
case "miniclip": {
this.embedProvider = new MiniclipEmbedProvider();
this.embedProvider.id = "miniclip";
break;
}
case "gamedistribution": {
this.embedProvider = new GamedistributionEmbedProvider();
this.embedProvider.id = "gamedistribution";
this.embedProvider.externalLinks = false;
this.embedProvider.adProvider = GamedistributionAdProvider;
break;
}
case "kongregate": {
this.embedProvider = new KongregateEmbedProvider();
this.embedProvider.id = "kongregate";
break;
}
case "crazygames": {
this.embedProvider = new CrazygamesEmbedProvider();
this.embedProvider.id = "crazygames";
break;
}
@@ -62,27 +66,9 @@ export class PlatformWrapperImplBrowser extends PlatformWrapperInterface {
}
}
logger.log("Embed provider:", this.embedProvider.getId());
logger.log("Embed provider:", this.embedProvider.id);
return super.initialize().then(() => {
// SENTRY
if (!G_IS_DEV && false) {
logger.log(this, "Loading sentry");
const sentryTag = document.createElement("script");
sentryTag.src = "https://browser.sentry-cdn.com/5.7.1/bundle.min.js";
sentryTag.setAttribute("integrity", "TODO_SENTRY");
sentryTag.setAttribute("crossorigin", "anonymous");
sentryTag.addEventListener("load", this.onSentryLoaded.bind(this));
document.head.appendChild(sentryTag);
}
});
}
/**
* @returns {EmbedProvider}
*/
getEmbedProvider() {
return this.embedProvider;
return super.initialize().then(() => this.initializeAdProvider());
}
onSentryLoaded() {
@@ -151,7 +137,7 @@ export class PlatformWrapperImplBrowser extends PlatformWrapperInterface {
}
getId() {
return "browser@" + this.embedProvider.getId();
return "browser@" + this.embedProvider.id;
}
getUiScale() {
@@ -173,16 +159,15 @@ export class PlatformWrapperImplBrowser extends PlatformWrapperInterface {
openExternalLink(url, force = false) {
logger.log("Opening external:", url);
// if (force || this.embedProvider.getSupportsExternalLinks()) {
window.open(url);
// } else {
// // Do nothing
// alert("This platform does not allow opening external links. You can play on the website directly to open them.");
// }
}
getSupportsAds() {
return this.embedProvider.getSupportsAds();
if (force || this.embedProvider.externalLinks) {
window.open(url);
} else {
// Do nothing
alert(
"This platform does not allow opening external links. You can play on https://shapez.io directly to open them.\n\nClicked Link: " +
url
);
}
}
performRestart() {
@@ -218,16 +203,18 @@ export class PlatformWrapperImplBrowser extends PlatformWrapperInterface {
initializeAdProvider() {
if (G_IS_DEV && !globalConfig.debug.testAds) {
logger.log("Ads disabled in local environment");
return Promise.resolve();
}
// First, detect adblocker
return this.detectAdblock().then(hasAdblocker => {
if (hasAdblocker) {
logger.log("Adblock detected");
return;
}
const adProvider = this.embedProvider.getAdProvider();
const adProvider = this.embedProvider.adProvider;
this.app.adProvider = new adProvider(this.app);
return this.app.adProvider.initialize().catch(err => {
logger.error("Failed to initialize ad provider, disabling ads:", err);