From 274fcb6608d9facbab60b3d9dc634e4c84a29376 Mon Sep 17 00:00:00 2001
From: Marcel <marcel.kehrberg@student.reutlingen-university.de>
Date: Mon, 10 Mar 2025 03:35:49 +0100
Subject: [PATCH] Addon jetzt auch in git

---
 BrowserAddon/app.js        |   0
 BrowserAddon/background.js | 135 +++++++++++++++++++++++++++++++++++++
 BrowserAddon/content.js    |  51 ++++++++++++++
 BrowserAddon/manifest.json |  25 +++++++
 BrowserAddon/popup.html    |  21 ++++++
 BrowserAddon/vOG.xpi       | Bin 0 -> 3732 bytes
 6 files changed, 232 insertions(+)
 create mode 100644 BrowserAddon/app.js
 create mode 100644 BrowserAddon/background.js
 create mode 100644 BrowserAddon/content.js
 create mode 100644 BrowserAddon/manifest.json
 create mode 100644 BrowserAddon/popup.html
 create mode 100644 BrowserAddon/vOG.xpi

diff --git a/BrowserAddon/app.js b/BrowserAddon/app.js
new file mode 100644
index 0000000..e69de29
diff --git a/BrowserAddon/background.js b/BrowserAddon/background.js
new file mode 100644
index 0000000..1a2993f
--- /dev/null
+++ b/BrowserAddon/background.js
@@ -0,0 +1,135 @@
+let socket;
+let trackingAktiv = false;
+let isConnected = false;
+let distraktions;
+
+function connectWebSocket() {
+    if (isConnected) {
+        console.log("Bereits verbunden.");
+        return;
+    }
+
+    // Versuche, eine Verbindung herzustellen
+    socket = new WebSocket("ws://localhost:8080");
+
+    // Timeout für die Verbindung (z.B. 5 Sekunden)
+    let connectionTimeout = setTimeout(() => {
+        console.log("Verbindung timeout, Server reagiert nicht.");
+        socket.close();  // Schließt den WebSocket
+        isConnected = false; // Setzt isConnected auf false
+    }, 5000); // Timeout nach 5 Sekunden
+
+    socket.onopen = function() {
+        console.log("Verbunden mit der WPF-Anwendung.");
+        clearTimeout(connectionTimeout);
+        isConnected = true; // Markiere als verbunden
+        socket.send("Hallo vom Addon");
+    };
+
+    // Empfang von Nachrichten
+    socket.onmessage = function(event) {
+        const message = parseMessage(event.data);
+        console.log("Nachricht empfangen: ", message);
+        //navigator.clipboard.writeText(message);
+
+        if(message.action === "sendJsonContent") {
+           //navigator.clipboard.writeText(message);
+           distraktions = createDistractionList(message);
+        }
+
+        if (message.action === "startTracking" && message.status === true) {
+            console.log("Tracking gestartet.");
+            addTabListeners();
+            trackingAktiv = true;
+        } else if (message.action === "stopTracking" && message.status === false) {
+            console.log("Tracking gestoppt.");
+            removeTabListeners();
+            trackingAktiv = false;
+        }
+    };
+
+    socket.onclose = function() {
+        console.log("Verbindung geschlossen.");
+        isConnected = false;
+        // Versuche, nach einer kurzen Zeit erneut eine Verbindung herzustellen
+        setTimeout(connectWebSocket, 5000); // 5 Sekunden warten, bevor erneut versucht wird
+    };
+
+    socket.onerror = function(error) {
+        console.error("WebSocket Fehler:", error);
+        socket.close(); // Schließe den Socket, um den Fehler zu behandeln und es erneut zu versuchen
+    };
+
+}
+
+connectWebSocket();
+addTabListeners();
+
+function createDistractionList(message) {
+    const result = {};
+    for (content in message) {
+        const distractingUrls = message["content"]["Games"].filter(item => item.distracting).map(item => item.url);
+        
+        if (distractingUrls.length > 0) {
+            result[content] = distractingUrls;
+        }
+    }
+    return result;
+}
+
+function parseMessage(message) {
+    try {
+        return JSON.parse(message);
+    } catch {
+        return message;
+    }
+}
+
+
+// Funktion zum Hinzufügen der Event-Listener
+function addTabListeners() {
+    browser.tabs.onCreated.addListener(handleTabCreated);
+    browser.tabs.onUpdated.addListener(handleTabUpdated);
+    browser.tabs.onActivated.addListener(handlerTabActiv);
+    console.log("Tab-Listener hinzugefügt.");
+}
+
+// Funktion zum Entfernen der Event-Listener
+function removeTabListeners() {
+    browser.tabs.onCreated.removeListener(handleTabCreated);
+    browser.tabs.onUpdated.removeListener(handleTabUpdated);
+    browser.tabs.onActivated.removeListener(handlerTabActiv);
+    console.log("Tab-Listener entfernt.");
+}
+
+function handleTabCreated(tab) {
+    checkUrl(tab.url, tab.tabId);
+};
+
+
+function handleTabUpdated(tabId, changeInfo, tab) {
+    if (changeInfo.status === 'complete') {
+        checkUrl(tab.url, tabId);
+    }
+};
+
+function handlerTabActiv(activeInfo) {
+    browser.tabs.get(activeInfo.tabId).then((tab) => {
+        checkUrl(tab.url, tab.tabId);
+    });
+}
+
+
+function checkUrl(url, tabId) {
+    for (content in distraktions.content) {
+    //const content = "youtube.com";
+        if (url.includes(distraktions["content"][content])) {
+            socket.send(`Distraktion Bemerkt: ${url}`);
+
+            browser.tabs.query({ active: true, currentWindow: true }).then((tabs) => {
+                const activeTab = tabs[0];
+                browser.tabs.sendMessage(activeTab.id, { action: "showOverlay", tabId: tabId });
+            });
+        }
+    }
+};
\ No newline at end of file
diff --git a/BrowserAddon/content.js b/BrowserAddon/content.js
new file mode 100644
index 0000000..97a7aa5
--- /dev/null
+++ b/BrowserAddon/content.js
@@ -0,0 +1,51 @@
+function showOverlay() {  
+    // Erstelle das Overlay
+    let overlay = document.createElement('div');
+    overlay.style.position = 'fixed';
+    overlay.style.top = '0';
+    overlay.style.left = '0';
+    overlay.style.width = '100vw';
+    overlay.style.height = '100vh';
+    overlay.style.backgroundColor = 'rgba(70, 65, 65, 0.8)';
+    overlay.style.zIndex = '9999';
+    overlay.style.display = 'flex';  // Wende Flexbox auf das Overlay an
+    overlay.style.justifyContent = 'center';  // Horizontale Zentrierung
+    overlay.style.alignItems = 'center';      // Vertikale Zentrierung
+    //overlay.style.pointerEvents = 'none'; // Klicks durchlassen, wenn nötig
+    //document.body.appendChild(overlay);
+
+    // Erstelle das Text-Element
+    let overlayText = document.createElement('div');
+    overlayText.innerText = "Diese Seite wird von CoFlow geblockt";
+    overlayText.style.textAlign  = "Center";
+    overlayText.style.color = 'red';
+    overlayText.style.fontSize = '40px';
+    overlayText.style.padding = '5rem';
+    overlayText.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
+    overlayText.style.borderRadius = '10px';
+
+    // Füge den Text zum Overlay hinzu
+    overlay.appendChild(overlayText);
+
+    // Füge das Overlay zum Body hinzu
+    document.body.appendChild(overlay);
+
+    document.body.style.overflow = 'hidden';
+    document.documentElement.style.overflow = 'hidden';
+}
+
+chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
+    if (message.action === "showOverlay") {
+        showOverlay();
+        pauseVideo();
+    }
+});
+
+// Funktion zum Pausieren des Videos im Ziel-Tab
+function pauseVideo(tabId) {
+    let video = document.querySelector('video');
+    if (video && !video.paused) {
+        video.pause(); // Pausiert das Video
+        console.log('Video auf Tab ' + document.title + ' pausiert.');
+    }
+}
diff --git a/BrowserAddon/manifest.json b/BrowserAddon/manifest.json
new file mode 100644
index 0000000..1252b8c
--- /dev/null
+++ b/BrowserAddon/manifest.json
@@ -0,0 +1,25 @@
+{
+    "manifest_version": 3,
+    "name": "URL-Kopierer",
+    "version": "1.0",
+    "description": "Kopiert die URL des aktiven Tabs in die Zwischenablage.",
+    "permissions": ["tabs", "activeTab", "scripting", "clipboardWrite"],
+    "host_permissions": ["<all_urls>"],
+    "background": {
+    "scripts": ["background.js"],
+    "persistent": false
+  },
+    "action": {
+      "default_popup": "popup.html",
+      "default_icon": "icon.png"
+    },
+    "content_security_policy": {
+    "extension_pages": "script-src 'self'; object-src 'self'; connect-src 'self' ws://localhost:8080"
+  },
+  "content_scripts": [
+        {
+            "matches": ["<all_urls>"],
+            "js": ["content.js"]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/BrowserAddon/popup.html b/BrowserAddon/popup.html
new file mode 100644
index 0000000..a56e446
--- /dev/null
+++ b/BrowserAddon/popup.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>URL Kopierer</title>
+  <script src="app.js"></script>
+  <style>
+    body { font-family: Arial, sans-serif; margin: 10px; text-align: center; }
+    button { padding: 10px 20px; margin-top: 20px; cursor: pointer; }
+  </style>
+</head>
+<body>
+  <h1>URL kopieren</h1>
+  <button id="copy-url">Kopiere URL</button>
+
+  <!-- Overlay HTML -->
+<div id="block-overlay" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: black; z-index: 9999; pointer-events: auto; display: none;">
+  <!-- Optional: Text oder Ladebalken anzeigen -->
+</div>
+
+</body>
+</html>
diff --git a/BrowserAddon/vOG.xpi b/BrowserAddon/vOG.xpi
new file mode 100644
index 0000000000000000000000000000000000000000..220d0bc7702f6f8d3f72933bb053ea09f91adaa5
GIT binary patch
literal 3732
zcmai12T)U88V!URdT0_rRGPHVYY-5W-g{L6fdEnjLhro^NbdroqV$du>C!<2f(jZU
z(tB?|WywFgEAH<9@4Yi`-kUdb-o5YK^PTf)s{!$707Mrvm%+glaA|-5*8tWo&K@?-
z9#98&gf|HQ2M_!D&x?UR8Gx`vb=c08dDzaXbkHu%VA^F&fHLq|-T99%K$UtvKCpGc
zYh`UQK^$DCv84U^?u@SS`mnX#&vij@oap_;$C{(OHcQ2KU+1C&4(9w1@=|EHJ>_|-
zvhstT6+V5$u#cg8;6=E&eDGu3I7;`1t8HPVzGe)$hfVNxS7v%WeP}G1P}D2%X{!Ln
zif&i)O*Dkrq%rl%++^(boB|QJTJEYxNAB<~tC6*|%qGrn?(G)yr<DX@Uy+O{h04N>
z1UBCb1miege~Or4<*VO<rzDtoOG^ZcE1_H{->)H*Du-!%A}D;7jKm{Ja*SS(f@9(^
z#k}WQ#mW+_oyPpZv?|RMZTj?Ml^s$~d6i5h9YQ$c?eFU81x_fI_4bs!7M~Ts)hHZ=
za&X*zGt8{H#-UdJ#8E_3UCQV9^gM^pe{(55m_2J06ccOQqD-a5yV=o|^>Cs{Dp-;m
zfB7ttn(RJnRrUNp^qi!DZ7OkJ=ds2;o9{L6J0f6Zv`5O#=p*UV<7nlZ5ib+I|G_qL
z!@S6q$lX$6P<etifMbtImr0FT>)Sm-m2y|#6ATYozN5aO4@}B=_W*8XS`rTN=Q3Oj
zsU$qIf(hB>lBD@!p0+P}Vj8Flh)XsWn-1<Yi7^e~|17FPRT-Fw^1+(Vb97s^(@sMT
z1f4wciR-z=@F%YWSSD5;JR*zdJXJon7nV^l&KYsIe>L?`aV%e`o$DMy2H8C>q(h~I
zc%4~1w%w&+g>Z7hQOk^`1G*69;Z~5Ym_0w~tF$dZnJk-n{k?*r`kF6cKm3}?!BoU$
z?Np`YCqI&kC#3ccd>yM=#bgLMDfV+|=_>J+zGrexH@}f<!9--I?zRle5~(ZU?xj4B
z5b6)j?06#Q<Ncw#88)==>ch&H!(8#cL&-cJKR@{(dU$%qO+nAe@Y_o+w&NT1vEE1E
zd#PGFDj&r?zqpMUB8`_lEM8{_We|F()1uBCpN|RL44BhV&j|+Xvk19&e0o}|)s3``
z3-v7Y^g6@QRwE=j5%n(H!UX`_2mt`?e+$Ww>USZLT?om^(%IhD#vQ997w7+_B^v2p
zT0-ayIClt8B3ZX6()rD=Y43%?Q7mvRgHqLU?b%GSD@;?{Qrh}k8x{*TCFABZ-?Q@e
z;)A+b6<I37b=V*DCSr6<I*nEXCoL8A<wS#m0<vzIy=n_vxRrT$0yQIDBP-bLk05vG
z!JWGKfUT3rc7}4Ciqwx9U&scsx>KyZ-WDw%$M-NS7kHm5J}zmt#k+t(#>Tw2<Tj{!
zQ7qeux7e_vs>4MF32OWNesnmwuhlJ4eg(M?c?Pbg+^*Vd5MwOb6|Co(EWFdZpE++%
ziU-V;E7OIC6Pf!;pqu)NQy$fD-z{G<oIpWeqL^wdN<3KFXw~|}Mh`zSWjQf);yU!q
zNrsm79cMkPPhQ}m-qZ+(%XrbaiHsd(7iK&PEg0wn)_%A;>l9Z!<dm4_D*DWkCnBM}
zB0X*{l(Th7h^rAzsYdKU&O^1hb{_CFq|t>d&yzaP%6#&tuk^bUTr6`g8eh-u;{X8P
zF4+6UoL!Llf0aO27gvNU6z<{l=zq~B|FQkwB~U}RJz-3M23c8mz9|M4S2uO;vS-6n
zR;J;TpKJRRb3a+hVyY%@ly_#@C#F^o>e;>1Eu1n=vB5H(*AjFDuzr_0e^znUTr`Tr
z9gj(FpP%~7>hG2>@StQMzPzWJWR|*Xgc&q<TFO!lUlw}K$U4NxP=N4_ygvfVxl;*!
zI1fS-=+3j>v3VYSr6j{u$MTw4d*Ff#7>rKVjwDc&sv`~ypUy$2CfAlNrcFGIlE$t4
z{I={y@(wD}LoXVtk6}LL?DQ0mL%f}<pnv}Ltm%H|Gk5QS)Bu?;>l^_$r55Z2@%2Q^
zl-gJkSqy{sjws~Ye$s~N2>VM1$b?c3Xk=HEDmt2b(Lt#}#(d16jT`K4xyV<H4p3{A
z+LQ-XS}XIMOCr#>Ui@tF%AJ|{)267rC=5sG-GxCgQj}E18~jid&F$Tp=wG3LNt=2?
zTf!wtoLywcLu+iOLpRh)8ThzZ9iQ_|2qQuu!TqFM$gZwnmAV<DF>K`4R*$>Rn$b@S
z4f=ZeodwIU5AbDh^aZ~`zwvANAN&$rDAUr_^)KvA49l(Wz@PR8yf`I<L|FT~0Q__O
zIyHPG|E+f`OKV3vHy4ES!@mIc6#S+4JfrW<Q(`nN6iHqZl#zx6=3m9}L5y5U4SkbV
zPK0b0A^13|YCR1PvUZjG?|~0Z_HQ(=#H}UKu&Wv-+Y*qPv3>k_u(b)(4}qjA8<o83
zQJTN4mR{l3B4M%QPr@l+7t!GWHFCjU$aEN#5;m#mO;X1*67ldC;rDUKzlNZjcJ;LE
z>;g8yWN?pX-J^ktdre14X<&Sg2;;6#jH#K9_-3iK$#%UdZ~><Y)$tdzs5Ug7c#tCN
zA@BwF7&|$Rd&2zV^qsO<65}EyUs`vO+<H2UoQSrES)@-9Cd%*x^t8r`D>WYpX@yK-
z5J?06Pm0C`&bKPrAf}cxQ?nYl{6BDw#5O`|g~AQ$C>7A{#5c!L3hKOh$d-(xYvG;*
z3bEH?SZ;*zxurt9^Pz~Gn^A%)B!vQ3)t!#%muh;qdSvS&dKocKbf)vo6vi9ZVjs+X
z8#00khG+cT@)jU7nc=k{2=~5PI*3Ql*dN-VkD{iyI@@*}jBrlQ*jzi<p?~Ecm7XcK
zT_?wJtC4U#if78To|k!2OT8l65U=C&_z#@=*wCI&eugx-4OV2YOgOyr`ee#-YWHl1
z;lM@@MHy<I(N&{nNKB$A_XoNwx}j#X$HDYuL!)FVAlbJ{jnaLYwtVvP+$)>GP_9|(
z=t#6RTpaSaVTfLxL<N!RVjJ4W`?b&fC;M6X&o(xU$9fO-{GA`Ovv@ZYCY0DEs5ILU
z;~l$o#vukJce?JX63YLC!Qj^Cia~#<AFRa}%GwMSx0KNch1z|TRw5o+)ctDk68_G3
zGTe`%N^XS;Mu_q^PPeGZ>Z6lfGX9pgv0TT80+3(J>mm$}9<r8LH3`I}tp2)-Not}q
z^9R#R8;6!x%Z>rxR_X5V`0Chmu&ce{OkMU&K0BMYGh_Y$%ChGH8@@oYGaRS*(iF@p
z3mtg3RtrGhZ+P};!x-O&=W)@=gflot?6x;RxyYK$Z4Y!Kbdyy|SZxb3_+iva2qD*m
z0o=K8wswYFBYL6fp$#v*rROGPq>Nn6z>(~%+W3SW1SQf;*>5O)DwrUCauhDqBA>nV
zI~aSzz!+lJ8{9f+5lbJu{s7J98VgTZvw_^mEt<Q<cBl?#N_pcC^&KmV`eoj=#0J`k
zKrA?SkRvy(!L{}Fd-LMN(xl0vQ+0M~CgFpPs5jKoh4N;L?8wNic4E&fm2Yw@xIQL4
z{`kpVcKxM+WTv5+?#?#{m_>FSl6a>?IskdNEm`epp@LTE7h$ee$Z@cApRP4wV$qq)
z%lHP8MU6nv3nvZ5W(){nzgrT*Pc|beldo-rZExMS(_N+Mzf+r4M7=vPp_4x1+bSW(
zZhi$($`NqPJXV>r8aU>#eRWJv)y*%ln#~cm;WRZfXe(-N3=yM)AC}zlomQG;`0VaZ
z&Qe&WHO^u=ly!1{X1(^zWZie|nH-DMJ^5t^p?BI=vFP4@@E9#Kw=i6DlX8&dIIv0u
zX20TYcs*`y^!kzDK@EjJv@B{uO<$P4VPoO7vCE<X@L6O18~#EH(J;SfdYsR*OTR33
zO(?ERZ{xpqt9==o4cFcIA~@z#?UQ*eM{mfdWEl-@!<>4G!jRM)DDU^)B5vDjpU2h~
zBTd~T6-?hHymZQY0awvHNDxw>jS5tFdN3*_F@oN__2ZA`ZYDGaGN-DA$$){X&(STn
zS&~kSVzxP2fJ(bv=(7@KRW7b|@pp*mJVv%{$htwsi7z!TaG1fV?yctNa_QFIuB#Id
z1+Ysk&?$dbzX~dDiDnzuU2W0U;{T$d?}X|)Z7L^wzd`u^yPfPQ1-4|jAsQ@=@d1F>
zlvtz3!KDHI>UJ*2HxS^;KMOkm&=7*X{hQtgAAp1HeJ<l+L*M04LG~M-3J~yrBH#ri
zHUeIT#HNwUKKA<(fft+ln{0A{hs`FJ@&4t0|8g*b-<J530Pt5{c!7oW!pm4#&%69<
kf8Va;MIQcp2fTp9I-s^1{>5hj0Q`%Yd|}tCq}Zo_03jtO=>Px#

literal 0
HcmV?d00001

-- 
GitLab