您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Fishing rewards sorting, logging and Discord Webhooks.
当前为
// ==UserScript== // @name [GC] - Underwater Fishing Data Logger // @namespace Grundo's Cafe // @match https://www.grundos.cafe/water/fishing/ // @grant GM.getValue // @grant GM.setValue // @grant GM.addStyle // @grant GM.notification // @grant GM.xmlHttpRequest // @version 1.3.3 // @license MIT // @author Cupkait // @icon https://i.imgur.com/4Hm2e6z.png // @description Fishing rewards sorting, logging and Discord Webhooks. // @require https://update.greasyfork.org/scripts/489454/1340536/%5BGC%5D%20-%20Underwater%20Fishing%20Prizes%20Library.js // ==/UserScript== const userName = /user=(.*?)"/g.exec(document.body.innerHTML)[1]; const buttonFishAll = document.querySelector('input[value="Fish with Everyone!"]'); const buttonFishOne = document.querySelector('input[value="Reel in Your Line"]'); var webHooks = GM.getValue("webHooks", []); if (window.location.href.endsWith('settings')) { document.querySelector('main').remove(); } async function getCurrentPetLevels() { try { const response = await fetch("/quickref/"); if (!response.ok) { throw new Error('Network response was not ok'); } const html = await response.text(); const parser = new DOMParser(); const doc = parser.parseFromString(html, "text/html"); const petList = doc.querySelector("#quickref_petlist").children; const petLevels = {}; Array.from(petList).forEach(pet => { const petrefName = pet.querySelector("a").getAttribute("href").match(/_name=(.*?)$/)[1]; const petFishingLevel = pet.querySelectorAll("span")[12].textContent.match(/Fishing : (.*?)$/)[1]; petLevels[petrefName] = petFishingLevel; }); sessionStorage.setItem('petLevels', JSON.stringify(petLevels)); } catch (error) { console.error("Error fetching data:", error); return null; } } async function collectFishingResults() { let displayResults = document.createElement("div"); displayResults.innerHTML = "Loading results... please wait."; displayResults.id = "displayResults"; displayResults.style.cssText = "color: green; text-align: center; link-color:green; font-size:14px; font-weight:bold;"; document.querySelector("div#page_content > main").insertAdjacentElement("beforebegin", displayResults); const resultsList = document.querySelectorAll('.center-items'); const resultsDiv = document.querySelector('.flex-column') let results = []; let highlights = false; const goodPrizes = document.createElement('div'); if (resultsList.length > 0) { displayResults.innerHTML = await `Your fishing results have been <a href="https://lookerstudio.google.com/reporting/ec18c798-ee62-4a7d-8315-5569c8de5ef6" target="_blank">submitted</a>.`; resultsList.forEach(result => { var name = result.querySelector('strong').textContent; var item = result.querySelector('p').textContent.match(/ a (.*?)!/)[1]; var cooldown = result.querySelectorAll('strong')[1].textContent; var image = result.querySelectorAll('img')[1].src; var newlevel = result.querySelectorAll("p")[1].textContent.includes("fishing level") ? result.querySelectorAll("p")[1].textContent.match(/\d+/)[0] : null; var storedLevels = JSON.parse(sessionStorage.getItem('petLevels')); var oldlevel = storedLevels && storedLevels[name]; results.push({ name, item, cooldown, image, oldlevel, newlevel }); sendResultToDatabase(name, oldlevel, newlevel, item, cooldown); const prize = prizes.find(prize => prize.item === item); if (prize) { highlights = true goodPrizes.append(result); generatePrizeWebhooks(name, oldlevel, item, image); } else { console.log("Prize sucked, no webhook sent.") }; }); if (highlights === true) { const fishingstyle = document.createElement('style'); fishingstyle.innerHTML = ` .center-items img { transform: translate3d(0, 0, 0); mix-blend-mode: multiply; } `; //document.head.appendChild(fishingstyle); goodPrizes.classList.add("center-items"); goodPrizes.style.backgroundColor = "#efef404f"; goodPrizes.style.border = "2px solid black" resultsDiv.insertAdjacentElement('beforebegin', goodPrizes); } } else { const resultSingle = document.querySelector('#page_content .center'); if (resultSingle) { var name = document.querySelectorAll('#userinfo a')[2].textContent; var item = resultSingle.querySelector("img").alt; var cooldown = resultSingle.querySelector('strong').textContent; var image = resultSingle.querySelector('img').src; var newlevel = resultSingle.querySelectorAll("p")[1].textContent.includes("fishing level") ? resultSingle.querySelectorAll("p")[1].textContent.match(/\d+/)[0] : null; var storedLevels = JSON.parse(sessionStorage.getItem('petLevels')); var oldlevel = storedLevels && storedLevels[name]; results.push({ name, item, cooldown, image, oldlevel, newlevel }); sendResultToDatabase(name, oldlevel, newlevel, item, cooldown); const prize = prizes.find(prize => prize.item === item); if (prize) { console.log("Valid prize identified.") generatePrizeWebhooks(name, oldlevel, item, image); } else { console.log("Prize sucked, no webhook sent.") }; }} } // Only collect results if you've actually attempted to fish. if (document.referrer.endsWith("/water/fishing/") && document.querySelector('main').textContent.includes("You reel in your line and get")) { collectFishingResults(); } //else {createFishHookSettings();} // Only fetch current fishing levels when you click the button to fish. if (buttonFishOne || buttonFishAll) { document.addEventListener("click", async function(event) { if (event.target === buttonFishOne || event.target === buttonFishAll) { event.preventDefault(); await getCurrentPetLevels(); event.target.form.submit(); } }); } function getTimestamp() { const currentDate = new Date(); const pstOffset = -8 * 60; // PST offset is UTC-8 const timestampPST = new Date(currentDate.getTime() + pstOffset * 60 * 1000); return timestampPST.toISOString().replace("T", " ").replace("Z", ""); } async function sendResultToDatabase(name, oldlevel, newlevel, item, cooldown) { let opts = { mode: "no-cors", referrer: "no-referrer", headers: { "Content-Type": "application/x-www-form-urlencoded", }, }; const logResponse = `https://docs.google.com/forms/d/e/1FAIpQLSdBhJS1NSxHCmy32BqH0DEdQRJci1IVPOWUFcaothsiZjXu-w/formResponse?usp=pp_url&entry.886049257=${userName}&entry.343654154=${name}&entry.1922136733=${oldlevel}&entry.693447328=${newlevel}&entry.881968876=${item}&entry.303510013=${cooldown}&entry.1110645895=`; try { await fetch(logResponse, opts); } catch (error) { // Do nothing } } async function generatePrizeWebhooks(name, oldlevel, item, image) { console.log("Webhook generated.") const webHooks = await GM.getValue("webHooks", []); const hook = { content: null, embeds: [ { description: `${item}?\nWhat a great prize!`, color: 9356588, author: { name: `${userName} took ${name} fishing...`, }, thumbnail: { url: `${image}`, }, }, ], username: "Underwater Fishing Prizes", avatar_url: "https://i.imgur.com/4Hm2e6z.png", attachments: [], }; for (const webhook of webHooks) { try { await sendMessage(hook, webhook); console.log("Message sent successfully."); } catch (error) { console.error("Error sending message:", error); } } } async function sendMessage(hook, webhook) { console.log("Webhook triggered."); return new Promise((resolve, reject) => { GM.xmlHttpRequest({ method: "POST", url: webhook, headers: { "Content-Type": "application/json" }, data: JSON.stringify(hook), onload: function(response) { if (response.status >= 200 && response.status < 300) { resolve(response.responseText); } else { reject(new Error(`Request failed with status ${response.status}`)); } }, onerror: function(error) { reject(error); } }); }); } async function createFishHookSettings() { const wrapperContainer = document.createElement("div"); wrapperContainer.id = "wrapContainer"; wrapperContainer.style.position = "relative"; wrapperContainer.style.borderBottom = "3px solid"; wrapperContainer.style.padding = "5px 10px 5px 0px"; wrapperContainer.style.height = "30px"; wrapperContainer.style.width = "100%"; wrapperContainer.style.top = "0px"; wrapperContainer.style.left = "0px"; wrapperContainer.style.backgroundColor = "#d2d0cc"; wrapperContainer.style.boxShadow = "5px 0 5px rgba(0, 0, 0, 0.5)"; const wrapperSettings = document.createElement("button"); wrapperSettings.textContent = "Fish Hook Settings"; wrapperSettings.id = "wrapSettings"; wrapperSettings.style.position = "relative"; wrapperSettings.style.fontSize = "12px"; wrapperSettings.style.fontWeight = "bold"; wrapperSettings.style.fontFamily = "courier"; wrapperSettings.style.padding = "0px"; wrapperSettings.style.width = "100%"; wrapperSettings.style.height = "auto"; wrapperSettings.style.border = "1px solid rgb(204, 204, 204)"; wrapperSettings.style.cursor = "pointer"; wrapperSettings.style.backgroundColor = "transparent"; const wrapperMenu = document.createElement("div"); wrapperMenu.id = "wrapMenu"; wrapperMenu.style.display = "none"; wrapperMenu.style.borderRadius = "15px 15px 15px 0px"; wrapperMenu.style.borderBottom = "3px solid"; wrapperMenu.style.position = "absolute"; wrapperMenu.style.width = "200px"; wrapperMenu.style.height = "250px"; wrapperMenu.style.bottom = "0%"; wrapperMenu.style.left = "100%"; wrapperMenu.style.margin = "-3px"; wrapperMenu.style.padding = "10px"; wrapperMenu.style.backgroundColor = "#d2d0cc"; wrapperMenu.style.boxShadow = "5px 0 5px rgba(0, 0, 0, 0.5)"; const firstButton = document.createElement("button"); firstButton.textContent = "Add a Webhook"; firstButton.id = "menubutton"; firstButton.style.height = "35px"; firstButton.style.width = "98%"; firstButton.style.margin = "5px 3px"; firstButton.style.backgroundColor = "transparent"; firstButton.style.borderRadius = "5px"; firstButton.style.boxShadow = "5px 0 5px rgba(0, 0, 0, 0.5)"; firstButton.addEventListener("click", addWebhook); wrapperMenu.appendChild(firstButton); wrapperContainer.appendChild(wrapperSettings); wrapperContainer.appendChild(wrapperMenu); document.getElementById("sb_edge").appendChild(wrapperContainer); wrapperSettings.addEventListener("click", () => { wrapperMenu.style.display = wrapperMenu.style.display === "none" ? "block" : "none"; }); async function addWebhook() { var newWebhook = prompt( "Paste one webhook URL to add to your script.\n\nIf you want to add multiple, do one at a time." ); if (newWebhook) { let webHooks = await GM.getValue("webHooks", []); if (!Array.isArray(webHooks)) { webHooks = []; } webHooks = [...new Set(webHooks)]; if (!webHooks.includes(newWebhook)) { webHooks.push(newWebhook); await GM.setValue("webHooks", webHooks); alert("Webhook added successfully!"); } else { webHooks = [...new Set(webHooks)]; await GM.setValue("webHooks", webHooks); alert("This webhook URL is already added."); } } } GM.addStyle(` #wrapContainer, #wrapSettings, #wrapMenu { background-color: #d2d0cc; } #wrapSettings { cursor: pointer; } #wrapMenu { display: none; border-radius: 15px 15px 15px 0px; border-bottom: 3px solid; position: absolute; width: 200px; height: 250px; bottom: 0%; left: 100%; margin: -3px; padding: 10px; box-shadow: 5px 0 5px rgba(0, 0, 0, 0.5); } `); } createFishHookSettings(); GM.addStyle(` #page_banner { display: flex; flex-direction: column; align-items: flex-end; } #hookButton { width: 480px; height:20px; display: flex; justify-content: flex-end; } .hookButton { display:block; height: 200px; width:500px; backgroundColor:blue; } `);