您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Quick Trade Button for YFT (Your Favorite Traders)
// ==UserScript== // @name Quick Trade Button for YFT // @namespace http://tampermonkey.net/ // @version 1.0 // @description Quick Trade Button for YFT (Your Favorite Traders) // @author DaoChauNghia[3029549] // @match https://www.torn.com/*php* // @icon https://www.google.com/s2/favicons?sz=64&domain=torn.com // @grant GM_setValue // @grant GM_getValue // ==/UserScript== // Quick Trade Button for YFT (Your Favorite Traders) - Advance Eddition: Quick Trade button in user menu list while in chat with your traderlist. // Go to their profile and add your favorite traders before using. (function () { 'use strict'; const controls = {}; controls.YFTlist = []; controls.YFTId = {}; //#region Ultilities const waitFor = (target, selector) => { return new Promise(resolve => { if (target.querySelector(selector)) { return resolve(target.querySelector(selector)); } const observer = new MutationObserver(mutations => { if (target.querySelector(selector)) { resolve(target.querySelector(selector)); observer.disconnect(); } }); observer.observe(target, { childList: true, subtree: true }); }); }; function NotificationYFT(message) { const notification = document.createElement("p"); notification.innerHTML = message; notification.style = "text-align: center; font-weight: bold; color: white; z-index: 9999; padding: 5px;"; document.querySelector("#profileroot > div > div > div > div:nth-child(1) > div.profile-right-wrapper.right > div.profile-buttons.profile-action > div > div.cont.bottom-round > div > div > div.empty-block").appendChild(notification); setTimeout(function () { notification.remove(); }, 1000); } // Function to save state using GM_setValue function GM_SaveData(controls) { GM_setValue('State', JSON.stringify(controls)); } // Function to load state using GM_getValue function GM_LoadData() { const storedControls = JSON.parse(GM_getValue('State', '{}')); controls.YFTId = storedControls.YFTId || {}; controls.YFTlist = storedControls.YFTlist || []; } //#endregion //#region createTradeButton GM_LoadData(controls); //console.log(controls); function createTradeButton(name) { const tradeButton = document.createElement("button"); tradeButton.type = "button"; tradeButton.classList.add("chat-box-options__button___O1B8v"); tradeButton.id = "TradeButton" + controls.YFTId[name]; tradeButton.addEventListener("click", function () { window.open("https://www.torn.com/trade.php#step=start&userID=" + controls.YFTId[name]); }); const tradeButtonDiv = document.createElement("div"); tradeButtonDiv.classList.add("chat-box-options__items___Vwu4d"); tradeButton.appendChild(tradeButtonDiv); const tradeButtonSvg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); tradeButtonSvg.setAttribute("width", "20"); tradeButtonSvg.setAttribute("height", "20"); tradeButtonSvg.setAttribute("fill", "none"); tradeButtonSvg.setAttribute("viewBox", "0 0 24 24"); tradeButtonSvg.setAttribute("xmlns", "http://www.w3.org/2000/svg"); tradeButtonSvg.classList.add("chat-box-options__icon___puJ7U"); tradeButtonSvg.innerHTML = '<path d="M 11.22 8.12 v 2.16 l -5.04 -5.04 l 5.04 -5.04 v 2.16 s 10.35 0 10.98 12.06 A 10.2861 10.2861 90 0 0 11.22 8.12 Z m -8.82 1.26 c 0.72 12.06 10.98 12.06 10.98 12.06 V 23.6 l 5.04 -5.04 l -5.04 -5.04 v 2.16 A 10.2861 10.2861 90 0 1 2.4 9.38 Z"></path>'; tradeButtonDiv.appendChild(tradeButtonSvg); const tradeButtonP = document.createElement("p"); tradeButtonP.classList.add("typography___Dc5WV", "body4", "color-#333333", "chat-box-options__label___QSXin"); tradeButtonP.innerHTML = "Trade!"; tradeButtonDiv.appendChild(tradeButtonP); return tradeButton; } function addTradeButtonToChat(chatElement) { const chatName = chatElement.parentNode.querySelector("div.chat-box-header___P15jw > button > p").innerText; if (controls.YFTlist.includes(chatName) && !chatElement.querySelector("#TradeButton" + controls.YFTId[chatName])) { const tradeButton = createTradeButton(chatName); const chatinfo = chatElement.querySelector("div:nth-child(1) > button:nth-child(1)"); chatinfo.after(tradeButton); } } // Function to be called when a new element is added function handleNewElements(mutations) { mutations.forEach((mutation) => { if (mutation.addedNodes && mutation.addedNodes.length > 0) { mutation.addedNodes.forEach((node) => { if (node.nodeType === 1 && node.matches(".chat-box-options___XoTAR")) { addTradeButtonToChat(node); } }); } }); } // Observe changes in the DOM const observer = new MutationObserver(handleNewElements); const chatListContainer = document.querySelector(".chat-app__chat-list-chat-box-wrapper___S7MmX"); observer.observe(chatListContainer, { childList: true, subtree: true }); //#endregion //#region addTradeListInProfile if (window.location.href.startsWith("https://www.torn.com/profiles.php")) { const profileID = window.location.href.split("XID=")[1]; const profileName = document.querySelector("#skip-to-content").innerText.split(" ")[0].split("'")[0]; //console.log(profileName); const favoriteTrader = document.createElement("a"); favoriteTrader.id = "button12-profile-" + profileID; favoriteTrader.classList.add("profile-button", "profile-button-YFT", "active"); favoriteTrader.setAttribute("aria-label", "YFT"); favoriteTrader.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" class="default___XXAGt profileButtonIcon" filter="" fill="yellow" stroke="#d4d4d4" stroke-width="0" width="46" height="46" viewBox="694.6 178 46 46"><path d="M 708.5246 202.2194 L 699.8984 194.9941 L 711.2526 194.1093 L 715 183 L 719.7313 194.1093 L 731.0117 194.9941 L 722.3854 202.2194 L 725.1871 213.2786 L 715.455 207.2329 L 705.7966 213.5735 L 708.5246 202.2194 m 6.4754 -6.2194 H 718 V 195 H 714 V 206 L 715 206 L 715 200 L 718 200 V 199 H 715 M 708 195 L 709 200 L 710 202 L 710 200 L 709 195 M 713 195 L 712 195 L 711 200 L 711 202 L 712 200 M 710 201 L 711 201 L 711 200 L 710 200 M 711 201 L 710 201 L 710 206 L 711 206 M 719 196 L 724 196 L 724 195 L 719 195 M 721 196 L 721 206 L 722 206 l 0 -10 Z"></path></svg>'; favoriteTrader.addEventListener("click", function () { if (controls.YFTlist.includes(profileName)) { controls.YFTlist.splice(controls.YFTlist.indexOf(profileName), 1); delete controls.YFTId[profileName]; favoriteTrader.classList.remove("active"); console.log(controls.YFTlist, controls.YFTId); GM_SaveData(controls); NotificationYFT("Removed " + profileName + " from your YFT list."); } else { controls.YFTlist.push(profileName); controls.YFTId[profileName] = profileID; favoriteTrader.classList.add("active"); console.log(controls.YFTlist, controls.YFTId); GM_SaveData(controls); NotificationYFT("Added " + profileName + " to your YFT list."); } }); waitFor(document.body, "#profile-container-description").then((profileDescription) => { var buttonlist = profileDescription.parentNode.querySelector("div.buttons-wrap > div > a:last-child"); buttonlist.after(favoriteTrader); }); } //#endregion })();