commit 43b5094489de6c2a60eb4f43238a108efbf556b1 Author: kiu Date: Thu Oct 17 12:05:14 2024 +0200 version 0.2 diff --git a/background.js b/background.js new file mode 100644 index 0000000..1d97627 --- /dev/null +++ b/background.js @@ -0,0 +1,55 @@ +let socialMediaSites = { + "facebook.com": "timeSpentFacebook", + "x.com": "timeSpentTwitter", + "instagram.com": "timeSpentInstagram" +}; +let startTime = null; +let currentSite = null; + +// Quand une page de réseau social est visitée +chrome.webNavigation.onCompleted.addListener(function(details) { + let url = new URL(details.url); + if (Object.keys(socialMediaSites).some(site => url.hostname.includes(site))) { + startTime = new Date(); + currentSite = url.hostname; + } +}); + +// Quand l'utilisateur change d'onglet ou ferme un onglet +chrome.tabs.onActivated.addListener(saveTime); +chrome.tabs.onRemoved.addListener(saveTime); + +function saveTime() { + if (startTime && currentSite) { + const endTime = new Date(); + const timeSpent = (endTime - startTime) / 1000; // en secondes + + let siteKey = Object.keys(socialMediaSites).find(site => currentSite.includes(site)); + if (siteKey) { + let storageKey = socialMediaSites[siteKey]; + chrome.storage.local.get([storageKey], function(data) { + let totalTimeSpent = data[storageKey] || 0; + totalTimeSpent += timeSpent; + + chrome.storage.local.set({ [storageKey]: totalTimeSpent }, function() { + console.log(`Temps passé sur ${currentSite}: ${totalTimeSpent} secondes`); + }); + }); + } + + startTime = null; + currentSite = null; + } +} + +// Alarme pour garder le service worker actif +chrome.runtime.onInstalled.addListener(() => { + // Créer une alarme pour maintenir le service worker actif + chrome.alarms.create("keepAlive", { periodInMinutes: 1 }); +}); + +chrome.alarms.onAlarm.addListener((alarm) => { + if (alarm.name === "keepAlive") { + console.log("Service worker toujours actif."); + } +}); diff --git a/content.js b/content.js new file mode 100644 index 0000000..b23e0f8 --- /dev/null +++ b/content.js @@ -0,0 +1,59 @@ +// Barre de chargement à injecter +function createLoadingBar(percentage) { + const existingBar = document.getElementById('socialTimeBar'); + if (existingBar) { + existingBar.style.width = `${percentage}%`; + return; + } + + const barContainer = document.createElement('div'); + barContainer.style.position = 'fixed'; + barContainer.style.top = '0'; // Barre en haut de la page + barContainer.style.left = '0'; + barContainer.style.width = '100%'; + barContainer.style.height = '6px'; // Barre 3 fois moins épaisse + barContainer.style.backgroundColor = 'lightgray'; + barContainer.style.zIndex = '9999'; + + const bar = document.createElement('div'); + bar.id = 'socialTimeBar'; + bar.style.height = '100%'; + bar.style.width = `${percentage}%`; + bar.style.backgroundColor = 'green'; // Couleur verte + + // Ajout de graduations à 25%, 50%, 75% + for (let i = 25; i <= 75; i += 25) { + const marker = document.createElement('div'); + marker.style.position = 'absolute'; + marker.style.height = '100%'; + marker.style.width = '1px'; // Largeur des marques ajustée + marker.style.backgroundColor = 'black'; // Couleur des marques + marker.style.left = `${i}%`; // Position à chaque 25% + barContainer.appendChild(marker); + } + + barContainer.appendChild(bar); + document.body.appendChild(barContainer); +} + +// Fonction pour récupérer le temps passé et mettre à jour la barre +function updateLoadingBar() { + chrome.storage.local.get(['timeSpent', 'timeLimit'], function(data) { + if (chrome.runtime.lastError) { + console.error("Erreur de récupération chrome.storage:", chrome.runtime.lastError); + return; + } + + const totalTimeSpent = data.timeSpent || 0; + const timeLimit = data.timeLimit || 4 * 60 * 60; // 4 heures en secondes par défaut + const percentage = Math.min((totalTimeSpent / timeLimit) * 100, 100); + + createLoadingBar(percentage); + }); +} + +// Mettre à jour la barre toutes les 30 secondes +setInterval(updateLoadingBar, 30000); + +// Mettre à jour la barre au chargement initial +updateLoadingBar(); diff --git a/images/logo-128.png b/images/logo-128.png new file mode 100644 index 0000000..8b63d50 Binary files /dev/null and b/images/logo-128.png differ diff --git a/images/logo-16.png b/images/logo-16.png new file mode 100644 index 0000000..5684c15 Binary files /dev/null and b/images/logo-16.png differ diff --git a/images/logo-48.png b/images/logo-48.png new file mode 100644 index 0000000..8bc1e55 Binary files /dev/null and b/images/logo-48.png differ diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..56ac86d --- /dev/null +++ b/manifest.json @@ -0,0 +1,35 @@ +{ + "manifest_version": 3, + "name": "Social Media Time Tracker", + "version": "1.0", + "description": "Suivre le temps passé sur les réseaux sociaux avec une barre de chargement permanente.", + "permissions": [ + "activeTab", + "storage", + "webNavigation", + "scripting", + "alarms" + ], + "icons": { + "16": "images/logo-16.png", + "48": "images/logo-48.png", + "128": "images/logo-128.png" + }, + "background": { + "service_worker": "background.js" + }, + "action": { + "default_popup": "popup.html", + "default_icon": { + "16": "images/logo-16.png", + "48": "images/logo-48.png", + "128": "images/logo-128.png" + } + }, + "content_scripts": [ + { + "matches": [""], + "js": ["content.js"] + } + ] +} diff --git a/popup.html b/popup.html new file mode 100644 index 0000000..d76cbfc --- /dev/null +++ b/popup.html @@ -0,0 +1,113 @@ + + + + + + Paramètres d'utilisation + Graphique Chart.js + + + + + + + + + +

Temps limite d'utilisation

+ + + + + + + + + + + + + +

Mon graphique en camembert

+ + + + + + + diff --git a/popup.js b/popup.js new file mode 100644 index 0000000..21b4a78 --- /dev/null +++ b/popup.js @@ -0,0 +1,38 @@ +document.getElementById('saveSettings').addEventListener('click', function() { + const hours = document.getElementById('timeLimitHours').value; + const minutes = document.getElementById('timeLimitMinutes').value; + + const timeLimitInSeconds = (parseInt(hours) * 60 * 60) + (parseInt(minutes) * 60); + + chrome.storage.local.set({ timeLimit: timeLimitInSeconds }, function() { + alert('Temps limite mis à jour !'); + }); +}); + +// Fonction pour afficher le diagramme +function displayPieChart(data) { + const ctx = document.getElementById('socialMediaChart').getContext('2d'); + new Chart(ctx, { + type: 'pie', + data: { + labels: ['Facebook', 'Twitter', 'Instagram'], // Noms des réseaux sociaux + datasets: [{ + label: 'Temps passé (en secondes)', + data: [data.facebook, data.twitter, data.instagram], // Temps passé sur chaque réseau + backgroundColor: ['#3b5998', '#1DA1F2', '#E1306C'], // Couleurs personnalisées + hoverOffset: 4 + }] + } + }); +} + +// Simuler la récupération des données sur le temps passé (tu devrais les récupérer depuis chrome.storage.local) +chrome.storage.local.get(['timeSpentFacebook', 'timeSpentTwitter', 'timeSpentInstagram'], function(data) { + const timeSpentData = { + facebook: data.timeSpentFacebook || 0, + twitter: data.timeSpentTwitter || 0, + instagram: data.timeSpentInstagram || 0 + }; + + displayPieChart(timeSpentData); +});