From f54eb75788e99d46155bb7cd5e5eea477ad7cf5a Mon Sep 17 00:00:00 2001 From: Dultus Date: Sat, 7 Dec 2024 13:46:04 +0100 Subject: [PATCH] Init --- Extension/API.js | 53 ++++++++++++++ Extension/HR-Collector_Icon.png | Bin 0 -> 44384 bytes Extension/background.js | 58 +++++++++++++++ Extension/content.js | 89 +++++++++++++++++++++++ Extension/horse.js | 72 +++++++++++++++++++ Extension/init.html | 9 +++ Extension/manifest.json | 25 +++++++ Extension/ui.js | 121 ++++++++++++++++++++++++++++++++ 8 files changed, 427 insertions(+) create mode 100644 Extension/API.js create mode 100644 Extension/HR-Collector_Icon.png create mode 100644 Extension/background.js create mode 100644 Extension/content.js create mode 100644 Extension/horse.js create mode 100644 Extension/init.html create mode 100644 Extension/manifest.json create mode 100644 Extension/ui.js diff --git a/Extension/API.js b/Extension/API.js new file mode 100644 index 0000000..9904fd5 --- /dev/null +++ b/Extension/API.js @@ -0,0 +1,53 @@ +async function ping(){ + fetch ('http://127.0.0.1:5180/api/ping') + .then(data => { + console.log(data); + }); +} +async function setBaseDataHorseAPI(id, basedata) { + try { + console.log("Setting horse data"); + console.log("ID:", id); // Log ID to ensure it's received correctly + console.log("Basedata:", basedata); // Log the entire horse data to check + + const url = `http://127.0.0.1:5180/api/setHorseBasicData/id=${id}`; + + // Wait for the API call to complete + const response = await fetch(url, { + method: 'POST', + body: JSON.stringify(basedata), + headers: { + 'Content-Type': 'application/json' + } + }); + + const data = await response; // Wait for the response from the API + console.log("API Response:", data); // Log the response from the API + + } catch (error) { + console.error("Error setting horse data: " + error.message); + } +} +async function getHorseAPI(id) { + var horseData; + const url = 'http://127.0.0.1:5180/api/getHorseInfo/id=' + id; + await fetch(url) + .then(response => response.json()) + .then(data => { + horseData = data; + }); + return horseData; +} +async function setHorsePedigreeAPI(id, pedigreeData) +{ + const url = `http://127.0.0.1:5180/api/setHorsePedigree/id=${id}`; + const response = await fetch(url, { + method: 'POST', + body: JSON.stringify(pedigreeData), + headers: { + 'Content-Type': 'application/json' + } + }); + const data = await response; + return data; +} \ No newline at end of file diff --git a/Extension/HR-Collector_Icon.png b/Extension/HR-Collector_Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..513831f34591889905c79667031ebd2881e5a0a8 GIT binary patch literal 44384 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 { + if (message.action === "updateHorseData") { + updateHorseButton(); // Call the function + } +}); + +async function updateHorseButton() { + console.log("Updating horse data"); + + // Query the active tab + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + if (tabs.length === 0) { + console.error("No active tab found."); + return; + } + + const activeTabId = tabs[0].id; + + // First: Get horse basic data + chrome.tabs.sendMessage( + activeTabId, + { action: "getHorseBasicData" }, + async function (response) { + if (!response || !response.success) { + console.error("Failed to get horse data from content script."); + return; + } + + console.log("Horse data received:", response.data); + const horseData = response.data; + + // Check if horse exists via API + const existingHorse = await getHorseAPI(horseData.id); + if (!existingHorse || existingHorse.message === "Horse not found") { + console.warn("Horse not found in the API."); + return; + } + + // Update horse data in the API + await setBaseDataHorseAPI(horseData.id, horseData); + + // Second: Get horse current data + chrome.tabs.sendMessage(activeTabId, { action: "getHorseCurrentData", data: { id: horseData.id } }, function (currentDataResponse) + { + if (!currentDataResponse) { + console.error("Failed to get current horse data."); + return; + } + + console.log("Current horse data received:", currentDataResponse); + } + ); + } + ); + }); +} diff --git a/Extension/content.js b/Extension/content.js new file mode 100644 index 0000000..cd7afe5 --- /dev/null +++ b/Extension/content.js @@ -0,0 +1,89 @@ +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + if (request.action === "getHorseBasicData") { + try { + console.log("Getting horse data"); + + const idString = document.querySelector('.right:nth-child(2)').innerText.replace('#', ''); + // Convert the ID to BigInt + const id = BigInt(idString); // Converts to BigInt, equivalent to ulong in C# + + // Convert BigInt to string before sending + const idStringForResponse = id.toString(); // Convert to string to prevent serialization issues + const horseData = { + id: idStringForResponse || "", // Stelle sicher, dass die ID vorhanden ist + age: parseInt(document.querySelector('.right:nth-child(6)').innerText, 10) || 0, // Alter muss eine Zahl sein + name: document.title.replace(/ - Horse Reality.*$/, '') || "Unknown", // Name darf nicht leer sein + gender: document.querySelector('img.icon16')?.alt || "Unknown", // Geschlecht prüfen + breed: document.querySelector('.right:nth-child(4)')?.innerText || "Unknown", // Rasse prüfen + link: window.location.href || "" // Link sicherstellen + }; + + + console.log("Horse data gathered:", horseData); + + // Sending response back to background script + sendResponse({ success: true, data: horseData }); + + } catch (error) { + console.error("Error gathering horse data: " + error.message); + sendResponse({ success: false, message: "Error gathering horse data: " + error.message }); + } + } + else if (request.action === "getHorseCurrentData") + { + console.log("Getting current horse selected tab data"); + var selectedTab = getTabselText(); + console.log("Selected tab:", selectedTab); + if (selectedTab === "Summary") + { + var relatedHorses = Array.from(document.querySelectorAll('.pedigree a')).map(link => link.href); + var response = setHorsePedigreeAPI(request.data.id, relatedHorses); + console.log("Response from API:", response); + sendResponse({ success: true, data: response }); + } + else if (selectedTab === "Training") + { + var training = document.querySelector('.top:nth-child(8)') ? document.querySelector('.top:nth-child(8)').innerText : document.querySelector('.top:nth-child(6)').innerText; + var response = setHorseTrainingAPI(request.data.id, training); + console.log("Response from API:", response); + sendResponse({ success: true, data: response }); + } + else if (selectedTab === "Genetics") + { + const colorGenetics = Array.from(document.querySelectorAll('.genetic_result')).map(x => x.innerText); + const geneticPotential = Array.from(document.querySelectorAll('.genetic_stats')) + .map(x => x.innerText.trim()) + .filter(value => !isNaN(value) && value !== "") + .map(value => parseFloat(value)); + const totalGeneticPotential = (Array.from(document.querySelectorAll('.top div')).find(el => el.innerText.includes('GP'))?.innerText || "").replace("GP total: ", "").trim(); + + var response = setHorseGeneticsAPI(request.data.id, colorGenetics); + console.log("Response from API:", response); + sendResponse({ success: true, data: response }); + } + else if (selectedTab === "Achievements") + { + var genetics = Array.from(document.querySelectorAll('.genetic_stats')).map(x => x.innerText).filter(text => /poor|below average|average|good|very good/i.test(text)); + var response = setHorseGeneticsAPI(request.data.id, genetics); + console.log("Response from API:", response); + } + else if (selectedTab === "Health") + { + var health = [...document.querySelector("#tab_health2 p").innerText.matchAll(/:\s*(\w+)/g)].map(match => match[1]); + var response = setHorseHealthAPI(request.data.id, health); + console.log("Response from API:", response); + } + else + { + console.error("Unknown or no tab selected."); + } + } + return true; // This is necessary to allow asynchronous response +}); +function getTabselText() { + const tabElement = document.querySelector('div.tabsel'); + if (tabElement) { + return tabElement.textContent.trim(); + } + return null; +} \ No newline at end of file diff --git a/Extension/horse.js b/Extension/horse.js new file mode 100644 index 0000000..f5d2da6 --- /dev/null +++ b/Extension/horse.js @@ -0,0 +1,72 @@ +// Modell für ein Pferd +var globalHorse = { + // Basic + id: null, // ID of the horse + age: null, // age of the horse + horse_name: null, // name of the horse + gender: null, // gender of the horse + breed: null, // breed of the horse + link: null, // link to the horse's page + + // Summary, Pedigree + relatedIds: [], // IDs of related horses + // Training + training: null, // training of the horse e.g. Basic Training + // Genetics + GP: 0, // GP of the horse + features: {}, // features of the horse e.g. Dressage, Driving, Endurance etc. + // Genes + Extension: null, // Extension gene of the horse + Agouti: null, // Agouti gene of the horse + Grey: null, // Grey gene of the horse + Cream: null, // Cream gene of the horse + Dun: null, // Dun gene of the horse + Champagne: null, // Champagne gene of the horse + Silver: null, // Silver gene of the horse + Mushroom: null, // Mushroom gene of the horse + Frame: null, // Frame gene of the horse + Appaloosa: null, // Appaloosa gene of the horse + PATN1: null, // PATN1 gene of the horse + MITF: null, // MITF gene of the horse + SW2: null, // SW2 gene of the horse + KIT: null, // KIT gene of the horse + + RAB: null, // RAB gene of the horse + Seal: null, // Seal gene of the horse + Flaxen: null, // Flaxen gene of the horse + + // Achievements + conformation: {}, // conformation of the horse e.g. Walk, Trot, Canter, Gallop, Jumping, Dressage + shortConformation : null, // Short conformation of the horse (e.g. 12VG) + maxShowResult: 0, // max show result of the horse + minShowResult: 0, // min show result of the horse + maxCompetitionResult: 0, // max competition result of the horse + minCompetitionResult: 0, // min competition result of the horse + + // Health + fertility: null, // fertility of the horse + colicRestance: null, // colic resistance of the horse + hoofQuality: null, // hoof quality of the horse + backProblems: null, // back problems of the horse + respiratoryDisease: null, // respiratory disease of the horse + resistanceToLameness: null, // resistance to lameness of the horse +}; + +function createNewHorse(id, age, horse_name, gender, breed, link) { + globalHorse = new globalHorse(); +} + + +// Funktion zum Setzen von Daten +function setHorseData(id, age, horse_name, gender, breed, link) { + globalHorse.id = id; + globalHorse.age = age; + globalHorse.horse_name = horse_name; + globalHorse.gender = gender; + globalHorse.breed = breed; + globalHorse.link = link; +} + +function getHorseData() { + return globalHorse; +} \ No newline at end of file diff --git a/Extension/init.html b/Extension/init.html new file mode 100644 index 0000000..277a7fc --- /dev/null +++ b/Extension/init.html @@ -0,0 +1,9 @@ + + + + + +

+ + + diff --git a/Extension/manifest.json b/Extension/manifest.json new file mode 100644 index 0000000..759108f --- /dev/null +++ b/Extension/manifest.json @@ -0,0 +1,25 @@ +{ + "manifest_version": 3, + "name": "Horse Reality Data Downloader", + "version": "0.0.1", + "permissions": ["tabs", "activeTab", "downloads", "storage"], + "background": { + "service_worker": "background.js" + }, + "content_scripts": [ + { + "matches": ["https://www.horsereality.com/*"], + "js": [ + "content.js", + "ui.js", + "API.js" + ] + } + ], + "host_permissions": [ + "http://127.0.0.1:5180/*" + ], + "content_security_policy": { + "extension_pages": "script-src 'self'; object-src 'self'; connect-src http://127.0.0.1:5180" + } +} diff --git a/Extension/ui.js b/Extension/ui.js new file mode 100644 index 0000000..d7134bf --- /dev/null +++ b/Extension/ui.js @@ -0,0 +1,121 @@ +// Warten, bis das DOM vollständig geladen ist +document.addEventListener("DOMContentLoaded", function () { + // Suche nach dem Element mit der Klasse 'horse_banner' + const banner = document.querySelector('.horse_banner'); + if (banner) { + // Erstelle das container div + const div = document.createElement('div'); + div.className = 'collector_ui'; + Object.assign(div.style, { + position: 'absolute', + right: '-160px', + top: '20px', + zIndex: '1', + padding: '10px', + backgroundColor: '#FFFFFFD9', + width: '120px', + minHeight: '50px', + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + gap: '10px' // Abstand zwischen Button und Tabelle + }); + + // Erstelle den Button + const updateHorseButton = document.createElement('updateHorseButton'); + updateHorseButton.textContent = 'Update Horse'; + Object.assign(updateHorseButton.style, { + padding: '10px 15px', + backgroundColor: '#ffa200', + color: '#fff', + border: 'none', + borderRadius: '5px', + cursor: 'pointer', + alignSelf: 'stretch', // Button auf volle Breite dehnen + transition: 'background-color 0.3s ease' // Übergang für den Hover-Effekt + }); + updateHorseButton.addEventListener("click", function() { + chrome.runtime.sendMessage({ action: "updateHorseData" }); + }); + + // Hover-Effekt hinzufügen + updateHorseButton.addEventListener('mouseenter', function () { + updateHorseButton.style.backgroundColor = '#bf8700'; // Hover-Farbe + }); + updateHorseButton.addEventListener('mouseleave', function () { + updateHorseButton.style.backgroundColor = '#ffa200'; // Originalfarbe + }); + + // Flex-Container für die Tabelle + const table = document.createElement('div'); + Object.assign(table.style, { + display: 'flex', + flexDirection: 'column', + width: '100%', + gap: '12px' // Abstand zwischen den Zeilen + }); + + // Beschriftungen und Emoji-Elemente + const rows = [ + { label: 'Basic', emojiId: 'emojiBasic', emoji: '❌' }, + { label: 'Summary', emojiId: 'emojiSummary', emoji: '❌' }, + { label: 'Training', emojiId: 'emojiTraining', emoji: '❌' }, + { label: 'Genetics', emojiId: 'emojiGenetics', emoji: '❌' }, + { label: 'Achievements', emojiId: 'emojiAchievements', emoji: '❌' }, + { label: 'Health', emojiId: 'emojiHealth', emoji: '❌' }, + ]; + + // Erstelle Zeilen für jede Beschriftung + rows.forEach(row => { + const rowDiv = document.createElement('div'); + Object.assign(rowDiv.style, { + display: 'flex', + justifyContent: 'space-between', // Beschriftung links, Emoji rechts + width: '100%' + }); + + // Linkes Element für die Beschriftung + const labelCell = document.createElement('div'); + labelCell.textContent = row.label; + labelCell.style.flex = '1'; // Beschriftung auf der linken Seite + + // Rechtes Element für das Emoji + const emojiCell = document.createElement('div'); + const emojiSpan = document.createElement('span'); + emojiSpan.id = row.emojiId; + emojiSpan.textContent = row.emoji; + emojiCell.appendChild(emojiSpan); + emojiCell.style.flex = '0'; // Emoji auf der rechten Seite + + // Zeile zur Tabelle hinzufügen + rowDiv.appendChild(labelCell); + rowDiv.appendChild(emojiCell); + table.appendChild(rowDiv); + }); + const infoTextLoaded = document.createElement('p'); + infoTextLoaded.textContent = '✅ Loaded'; + infoTextLoaded.justifyContent = 'space-between'; + infoTextLoaded.width = '100%'; + const infoTextDynamic = document.createElement('p'); + infoTextDynamic.textContent = '☑️ Dynamic'; + infoTextDynamic.justifyContent = 'space-between'; + infoTextDynamic.width = '100%'; + const infoTextNeedRefresh = document.createElement('p'); + infoTextNeedRefresh.textContent = '🔄 Needs Refresh'; + infoTextNeedRefresh.justifyContent = 'space-between'; + infoTextNeedRefresh.width = '100%'; + const infoTextNotLoaded = document.createElement('p'); + infoTextNotLoaded.textContent = '❌ Not Loaded'; + infoTextNotLoaded.justifyContent = 'space-between'; + infoTextNotLoaded.width = '100%'; + + // Button oben hinzufügen, dann die Tabelle + div.appendChild(updateHorseButton); + div.appendChild(table); + div.appendChild(infoTextLoaded); + div.appendChild(infoTextDynamic); + div.appendChild(infoTextNotLoaded); + div.appendChild(infoTextNeedRefresh); + banner.appendChild(div); + } +});