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 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 literal 0 HcmV?d00001 -- GitLab