shithub: puzzles

Download patch

ref: 860d79c874db624f94b0210d6ed6de1055712fe2
parent: b0203e8f72df74783a5e216aa7cd1a8f307a4d41
author: Ben Harris <bjh21@bjh21.me.uk>
date: Thu Jan 5 16:20:19 EST 2023

kaios: Add hooks for the KaiAds API

The Kai Store makes display of advertisements provided by the KaiAds API
mandatory.  I don't want such adverts to be inconvenient for the users,
so I've just gone for adding a menu item that will display one.  This is
probably a little too crude, but it's good for testing things.

The actual KaiAds API code is not free software, so it's not included
here.  My intention is to add it by hand to the Zip files for Kai Store
uploads.  Without it, the advertising code does nothing.

--- a/cmake/platforms/emscripten.cmake
+++ b/cmake/platforms/emscripten.cmake
@@ -122,6 +122,8 @@
     install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}-manifest.webapp
       RENAME manifest.webapp
       DESTINATION kaios/${name})
+    install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/kaios/kaiads-glue.js
+      DESTINATION kaios/${name})
     if (HALIBUT)
       install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/help
         DESTINATION kaios/${name})
--- a/kaios/apppage.pl
+++ b/kaios/apppage.pl
@@ -13,7 +13,10 @@
 <meta http-equiv="Content-Type" content="text/html; charset=ASCII" />
 <meta name="theme-color" content="rgb(50,50,50)" />    
 <title>${displayname}</title>
+<!-- The KaiAds scripts are only present in Kai Store versions. -->
+<script src="kaiads.v5.min.js"></script>
 <script defer type="text/javascript" src="${name}.js"></script>
+<script defer type="text/javascript" src="kaiads-glue.js"></script>
 <!-- Override some defaults for small screens -->
 <script id="environment" type="application/json">
 { "PATTERN_DEFAULT": "10x10",
--- /dev/null
+++ b/kaios/kaiads-glue.js
@@ -1,0 +1,58 @@
+// Glue connecting Puzzles to the KaiAds API.
+//
+// The Kai Store requires that we support advertisements through
+// KaiAds.  To avoid polluting the Puzzles core with this, the
+// relevant code is largely confined to this file.  It can then be
+// included in builds that are destined for the Kai Store and left out
+// of others.  The main puzzle code, and the KaiAds API (as supplied
+// by Kai Technologies) should be loaded before this file.
+
+
+(function() {
+    // To run, we need to be on KaiOS with the KaiAds SDK and the
+    // Open Web Apps API.
+    if (!getKaiAd || !navigator.mozApps ||
+        navigator.userAgent.toLowerCase().indexOf('kaios') == -1) return;
+    // If those prerequisites are satisfied, install the button.
+    var advertbutton = document.createElement("button");
+    advertbutton.type = "button";
+    advertbutton.textContent = "Display an advert...";
+    advertbutton.disabled = true;
+    var advertli = document.createElement("li");
+    advertli.appendChild(advertbutton);
+    menuform.querySelector("ul").appendChild(advertli);
+    // Now work out whether we're installed from the Store (and hence
+    // want real adverts) or not (and hence want test ones).
+    var selfrequest = navigator.mozApps.getSelf();
+    selfrequest.onerror = function() {
+        console.log("Error getting own app record: ", selfrequest.error.name);
+        // Leave the button disabled.
+    };
+    selfrequest.onsuccess = function() {
+        var testmode = selfrequest.result.installOrigin !=
+            "app://kaios-plus.kaiostech.com";
+
+        advertbutton.addEventListener("click", function(e) {
+            // The KaiAds SDK provides this function.
+            getKaiAd({
+                publisher: 'dac9c115-ec42-4175-ac5e-47e118cc541b',
+                test: testmode ? 1 : 0,
+                timeout: 5000,
+                onready: function(ad) {
+                    ad.on('close', function () {
+                        // KaiAds adds inline styles to the body and doesn't
+                        // remove them, so we do it ourselves.
+                        document.body.style = '';
+                        onscreen_canvas.focus();
+                    });
+                    ad.call('display');
+                },
+                onerror: function(err) {
+                    alert(`Sorry; no advert available (KaiAds error ${err}).`);
+                    onscreen_canvas.focus(); // Close the menu.
+                }
+            });
+        });
+        advertbutton.disabled = false;
+    };
+})();
--- a/kaios/manifest.pl
+++ b/kaios/manifest.pl
@@ -56,5 +56,15 @@
     categories => ["games"],
     type => "web",
     cursor => JSON::PP::false,
+    # These permissions could be removed on builds without KaiAds,
+    # but that's a bit complicated.
+    permissions => {
+        mobiledata => {
+            description => "Required to display advertisements"
+        },
+        wifidata => {
+            description => "Required to display advertisements"
+        },
+    },
     $decvers ? (version => $decvers) : (),
 })