diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd4d3f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ + +node_modules + +package-lock.json diff --git a/README.md b/README.md index 54979d8..f423192 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,17 @@ # SichtDerDinge_Sortierer +Diese Dokumentation beschreibt die Funktionen und den Aufbau des SichtDerDinge-Sortierers. + +## Bestandteile + +### Extension + +Die Extension wird benutzt, um das HTML der Sicht der Dinge an den Server zu senden. + +### Server + +Der Server parsed das HTML und fragt in der Redis-Instanz die Werte ab. Das Ergebnis wird dann als HTML dargestellt. + +### Redis + +Redis hält die Informationen über Verkaufspreise und Realwert aller Items. diff --git a/extension/background.js b/extension/background.js new file mode 100644 index 0000000..3c8dd18 --- /dev/null +++ b/extension/background.js @@ -0,0 +1,18 @@ +browser.tabs.onActivated.addListener((activeInfo) => { + browser.tabs.executeScript(tabId, { + code: 'document.documentElement.outerHTML' + }).then(result => { + const html = result[0]; + fetch('http://localhost:3000/notify', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ html }) + }).catch(err => { + console.error('Error sending HTML:', err); + }); + }).catch(err => { + console.error('Error fetching HTML:', err); + }); +}); diff --git a/extension/manifest.json b/extension/manifest.json new file mode 100644 index 0000000..a992440 --- /dev/null +++ b/extension/manifest.json @@ -0,0 +1,11 @@ +{ +"manifest_version": 2, +"name": "Firefox Tab Monitor", +"version": "1.0", +"permissions": [ +"tabs" +], +"background": { +"scripts": ["background.js"], +"persistent": true +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dbd1e28 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "sichtderdinge_sortierer", + "version": "1.0.0", + "description": "Sortiert die Items der Sicht der Dinge nach Einkaufspreis und Realwert", + "main": "index.mjs", + "scripts": { + "watch": "webpack --watch --progress --colors --config webpack.conf.js", + "dev": "webpack --progress --mode development", + "prod": "NODE_ENV=production webpack -p --config webpack.conf.js" + }, + "repository": { + "type": "git", + "url": "https://forgejo.nuhp.de/bwe/SichtDerDinge_Sortierer.git" + }, + "author": "bwe", + "license": "MIT", + "dependencies": { + "cheerio": "^1.2.0", + "redis": "^5.11.0" + } +} diff --git a/src/.index.mjs.kate-swp b/src/.index.mjs.kate-swp new file mode 100644 index 0000000..944bace Binary files /dev/null and b/src/.index.mjs.kate-swp differ diff --git a/src/index.mjs b/src/index.mjs new file mode 100644 index 0000000..fe3a498 --- /dev/null +++ b/src/index.mjs @@ -0,0 +1,50 @@ +import { createServer } from "node:http"; +import { createClient } from "redis"; +import cheerio from "cheerio"; + +const redis = createClient(); +await redis.connect(); + +const server = createServer((req, res) => { + if (req.method === "POST" && req.url === "/notify") { + let body = ""; + req.on("data", chunk => (body += chunk)); + + req.on("end", async () => { + // 1️⃣ HTML parsen + const $ = cheerio.load(body); + const items = $(".item").map((i, el) => $(el).text()).get(); + + const results = []; + + // 2️⃣ Redis abfragen (Set pro Item) + for (const item of items) { + const setMembers = await redis.sMembers(`item:${item}`); + + if (setMembers.length === 2) { + // Angenommen: [verkaufspreis, realwert] + const [verkaufspreisStr, realwertStr] = setMembers; + const verkaufspreis = parseInt(verkaufspreisStr, 10); + const realwert = parseInt(realwertStr, 10); + + results.push({ item, verkaufspreis, realwert }); + } + } + + // 3️⃣ Sortieren & Top 5 + const topVerkaufspreis = [...results].sort((a, b) => b.verkaufspreis - a.verkaufspreis).slice(0, 5); + const topRealwert = [...results].sort((a, b) => b.realwert - a.realwert).slice(0, 5); + + // 4️⃣ JSON-Antwort + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ topVerkaufspreis, topRealwert }, null, 2)); + }); + + return; + } + + res.writeHead(404); + res.end(); +}); + +server.listen(3000, () => console.log("Server läuft auf http://localhost:3000"));