From f18f71a35af76fb2fe9a646f78584b268cb5a3eb Mon Sep 17 00:00:00 2001
From: Dominik Hebeler <dominik@suma-ev.de>
Date: Fri, 19 Jul 2024 14:47:21 +0200
Subject: [PATCH] add statistics regarding take tiles

---
 .../Http/Controllers/StatisticsController.php | 22 +++++++++++--
 .../app/Http/Controllers/TilesController.php  |  6 ++++
 metager/resources/js/startpage/tiles.js       |  6 ++++
 metager/resources/js/statistics.js            | 32 ++++++++++++++-----
 metager/resources/js/utility.js               |  6 +++-
 5 files changed, 60 insertions(+), 12 deletions(-)

diff --git a/metager/app/Http/Controllers/StatisticsController.php b/metager/app/Http/Controllers/StatisticsController.php
index e66c903cf..dc0c252c2 100644
--- a/metager/app/Http/Controllers/StatisticsController.php
+++ b/metager/app/Http/Controllers/StatisticsController.php
@@ -10,9 +10,6 @@ class StatisticsController extends Controller
 {
     public function pageLoad(Request $request)
     {
-        if (!config("metager.matomo.enabled") || config("metager.matomo.url") === null)
-            return;
-
         $params = [
             "idsite" => config("metager.matomo.site_id"),
             "token_auth" => config("metager.matomo.token_auth"),
@@ -30,6 +27,24 @@ class StatisticsController extends Controller
         $params["lang"] = $request->header("Accept-Language");
         $params = array_merge($http_params, $params);   // Merge arrays keeping our serverside defined options if key is set multiple times
 
+        self::LOG_STATISTICS($params);
+    }
+
+    public static function LOG_STATISTICS(array $params)
+    {
+        if (!config("metager.matomo.enabled") || config("metager.matomo.url") === null)
+            return;
+
+        $params = array_merge($params, [
+            "idsite" => config("metager.matomo.site_id"),
+            "token_auth" => config("metager.matomo.token_auth"),
+            "rand" => md5(microtime(true)),
+            "rec" => "1",
+            "send_image" => "0",
+            "cip" => \Request::ip(),
+            "_id" => substr(md5(\Request::ip() . now()->format("Y-m-d")), 0, 16)
+        ]);
+
         $url = config("metager.matomo.url") . "/matomo.php?" . http_build_query($params);
 
         // Submit fetch job to worker
@@ -47,4 +62,5 @@ class StatisticsController extends Controller
 
         Redis::rpush(\App\MetaGer::FETCHQUEUE_KEY, $mission);
     }
+
 }
diff --git a/metager/app/Http/Controllers/TilesController.php b/metager/app/Http/Controllers/TilesController.php
index 9cef7309b..d0a5f975b 100644
--- a/metager/app/Http/Controllers/TilesController.php
+++ b/metager/app/Http/Controllers/TilesController.php
@@ -25,6 +25,12 @@ class TilesController extends Controller
         $count = $request->input("count", 4);
         $tiles = [];
         $tiles = self::TAKE_TILES($ckey, $count);
+        StatisticsController::LOG_STATISTICS([
+            "e_c" => "Take Tiles",
+            "e_a" => "Load",
+            "e_n" => "Take Tiles",
+            "e_v" => sizeof($tiles),
+        ]);
         return response()->json($tiles);
     }
 
diff --git a/metager/resources/js/startpage/tiles.js b/metager/resources/js/startpage/tiles.js
index 9838eb2dd..891eb2821 100644
--- a/metager/resources/js/startpage/tiles.js
+++ b/metager/resources/js/startpage/tiles.js
@@ -1,3 +1,5 @@
+import { statistics } from "../statistics";
+
 (async () => {
     let tile_container = document.querySelector("#tiles");
     let tile_count = tile_container.querySelectorAll("a").length;
@@ -38,6 +40,10 @@
             let container = document.createElement("div");
             container.innerHTML = advertisements[i].html;
 
+            container.firstChild.addEventListener("click", e => {
+                statistics.takeTilesClick(e.target.closest("a").href);
+            });
+
             tile_container.appendChild(container.firstChild);
         }
     }
diff --git a/metager/resources/js/statistics.js b/metager/resources/js/statistics.js
index 4b2f8df60..02707a0a8 100644
--- a/metager/resources/js/statistics.js
+++ b/metager/resources/js/statistics.js
@@ -7,6 +7,18 @@ class Statistics {
     #load_time = new Date();
 
     constructor() {
+
+    }
+
+    #init() {
+        setTimeout(this.pageLoad.bind(this), 60000);
+        document.addEventListener("visibilitychange", this.pageLoad.bind(this));
+        document.querySelectorAll("a").forEach(anchor => {
+            anchor.addEventListener("click", e => this.pageLeave(e.target.closest("a").href));
+        });
+    }
+
+    registerPageLoadEvents() {
         let performance = window.performance.getEntriesByType('navigation')[0];
         try {
             let statistics_enabled = document.querySelector("meta[name=statistics-enabled]").content;
@@ -26,14 +38,6 @@ class Statistics {
         }
     }
 
-    #init() {
-        setTimeout(this.pageLoad.bind(this), 60000);
-        document.addEventListener("visibilitychange", this.pageLoad.bind(this));
-        document.querySelectorAll("a").forEach(anchor => {
-            anchor.addEventListener("click", e => this.pageLeave(e.target.closest("a").href));
-        });
-    }
-
     pageLeave(target) {
         let params = {};
 
@@ -96,5 +100,17 @@ class Statistics {
 
         navigator.sendBeacon("/stats/pl", new URLSearchParams(params));
     }
+
+    takeTilesClick(url) {
+        let params = {};
+        if (this.#load_complete && !overwrite_params.hasOwnProperty("link")) return;
+
+        params.e_c = "Take Tiles";
+        params.e_a = "Click";
+        params.e_n = "Take Tiles";
+        params.e_v = url;
+
+        navigator.sendBeacon("/stats/pl", new URLSearchParams(params));
+    }
 }
 export const statistics = new Statistics();
\ No newline at end of file
diff --git a/metager/resources/js/utility.js b/metager/resources/js/utility.js
index 1ffad047f..510896a17 100644
--- a/metager/resources/js/utility.js
+++ b/metager/resources/js/utility.js
@@ -73,4 +73,8 @@ function backButtons() {
       history.back();
     });
   });
-}
\ No newline at end of file
+}
+
+(async () => {
+  statistics.registerPageLoadEvents();
+})();
\ No newline at end of file
-- 
GitLab