Stake.US plugin framework
此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.org/scripts/480138/1511853/StakeUs%2B.js
// ==UserScript== // @name StakeUsPlus // @namespace a // @version 1.2 // @description StakeUs plugin framework // @author diehard2k0 // @match *://stake.us/* // @grant none // ==/UserScript== (function() { const VERSION = '1.0.0'; const INFO = 'Plugin Management'; const LOCAL_STORAGE_KEY_DEBUG = 'debug'; // Utility function to log in a fancy way function logFancy(s, color="#00f7ff") { console.log("%cStakeUsPlus: %c"+s, `color: ${color}; font-weight: bold; font-size: 12pt;`, "color: black; font-weight: normal; font-size: 10pt;"); } // Define the StakeUsPlusPlugin and StakeUsPlus classes class StakeUsPlusPlugin { constructor(id, opts) { this.id = id; this.opts = opts; } } class StakeUsPlus { constructor() { this.version = VERSION; this.plugins = {}; this.panels = {}; this.debug = true; this.info = INFO; this.nextUniqueId = 1; this.customMessageCallbacks = {}; this.customChatCommands = { help: (command, data) => { console.log("help", command, data); } }; this.customChatHelp = {}; this.customDialogOptions = {}; if (localStorage.getItem(LOCAL_STORAGE_KEY_DEBUG) == "1") { this.debug = true; } } // Register a plugin registerPlugin(plugin) { if (!(plugin instanceof StakeUsPlusPlugin)) { throw new TypeError("StakeUsPlus.registerPlugin takes the following arguments: (plugin:StakeUsPlusPlugin)"); } if (plugin.id in this.plugins) { throw new Error(`StakeUsPlusPlugin with id "${plugin.id}" is already registered. Make sure your plugin id is unique!`); } this.plugins[plugin.id] = plugin; let versionString = plugin.opts && plugin.opts.about && plugin.opts.about.version ? ` (v${plugin.opts.about.version})` : ""; logFancy(`registered plugin "${plugin.id}"${versionString}`); } // Add a panel (e.g., plugin settings panel) addPanel(id, title, content) { if (typeof id !== "string" || typeof title !== "string" || (typeof content !== "string" && typeof content !== "function")) { throw new TypeError("StakeUsPlus.addPanel takes the following arguments: (id:string, title:string, content:string|function)"); } const panels = document.querySelector("#svelte > div.draggable.svelte-uhzn2f"); panels.append(` <div data-layout class="svelte-uhzn2f" id="panel-${id}"> <h1>${title}</h1> <hr> <div class="stakeusplus-panel-content"></div> </div> `); this.panels[id] = { id: id, title: title, content: content }; this.refreshPanel(id); } // Refresh a panel's content refreshPanel(id) { if (typeof id !== "string") { throw new TypeError("StakeUsPlus.refreshPanel takes the following arguments: (id:string)"); } const panel = this.panels[id]; if (!panel) { throw new TypeError(`Error rendering panel with id="${id}" - panel has not been added.`); } let content = panel.content; if (!["string", "function"].includes(typeof content)) { throw new TypeError(`Error rendering panel with id="${id}" - panel.content must be a string or a function returning a string.`); } if (typeof content === "function") { content = content(); if (typeof content !== "string") { throw new TypeError(`Error rendering panel with id="${id}" - panel.content must be a string or a function returning a string.`); } } const panelContent = document.querySelector(`#panel-${id} .stakeusplus-panel-content`); panelContent.innerHTML = content; } // Show modal showModal() { document.getElementById("pluginPanel").style.display = 'block'; // Show the modal } // Toggle plugin panel (e.g., visibility of a plugin settings panel) togglePluginPanel() { var pluginPanel = document.querySelector("#svelte > div.draggable.svelte-uhzn2f"); if (pluginPanel.style.display === "none") { console.log("Plugin Panel Turned On"); pluginPanel.style.display = "flex"; } else { console.log("Plugin Panel Turned Off"); pluginPanel.style.display = "none"; } } // Show the plugin modal and set up its draggable behavior initModal() { const pluginPanel = document.getElementById("pluginPanel"); const pluginPanelHeader = document.getElementById("pluginPanelHeader"); let isDragging = false; let offsetX, offsetY; // Make the header draggable pluginPanelHeader.addEventListener("mousedown", (e) => { isDragging = true; offsetX = e.clientX - pluginPanel.offsetLeft; offsetY = e.clientY - pluginPanel.offsetTop; document.addEventListener("mousemove", handleDrag); document.addEventListener("mouseup", () => { isDragging = false; document.removeEventListener("mousemove", handleDrag); }); }); // Handle the dragging movement function handleDrag(e) { if (isDragging) { pluginPanel.style.left = `${e.clientX - offsetX}px`; pluginPanel.style.top = `${e.clientY - offsetY}px`; } } } } // Modal HTML structure document.body.insertAdjacentHTML('beforeend', ` <div class="plugin-panel" id="pluginPanel"> <div class="plugin-panel-header" id="pluginPanelHeader">Plugin Settings</div> <div class="plugin-panel-content"> <p>Welcome to the plugin settings page!</p> <p>More content goes here.</p> </div> </div> `); // Styles for modal and draggable behavior const style = document.createElement('style'); style.innerHTML = ` .plugin-panel { display: none; position: absolute; top: 70px; left: 50%; transform: translateX(-50%); z-index: 9999; background-color: white; border: 1px solid #ccc; border-radius: 5px; padding: 10px; max-height: 300px; overflow-y: auto; cursor: move; } .plugin-panel-header { padding: 10px; background: #ddd; cursor: move; border-radius: 5px 5px 0 0; text-align: center; font-weight: bold; } .plugin-panel-content { padding: 10px; font-size: 14px; } `; document.head.appendChild(style); // Initialize the StakeUsPlus instance window.StakeUsPlusPlugin = StakeUsPlusPlugin; window.StakeUsPlus = new StakeUsPlus(); // Initialize modal dragging functionality window.StakeUsPlus.initModal(); // Example to show modal setTimeout(() => { window.StakeUsPlus.showModal(); }, 1000); })();