您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Sends, receives, and displays CUSTOM websocket frames
// ==UserScript== // @name IdlePixel Custom Interactor // @namespace lbtechnology.info // @version 2.3.2 // @description Sends, receives, and displays CUSTOM websocket frames // @author Lux-Ferre // @license MIT // @match *://idle-pixel.com/login/play* // @grant none // @require https://greasyfork.org/scripts/441206-idlepixel/code/IdlePixel+.js?anticache=20220905 // @require https://greasyfork.org/scripts/491983-idlepixel-plugin-paneller/code/IdlePixel%2B%20Plugin%20Paneller.js?anticache=20240410 // ==/UserScript== (function() { 'use strict'; class CustomInteractorPlugin extends IdlePixelPlusPlugin { constructor() { super("custominteractor", { about: { name: GM_info.script.name, version: GM_info.script.version, author: GM_info.script.author, description: GM_info.script.description }, config: [ { id: "receiver", label: "Default account to send custom messages to.", type: "string", max: 20, default: "" }, { id: "textareaLines", label: "Number of messages to keep in pseudo-console (0 for all.) Under 30 will shrink console.", type: "integer", min: 0, max: 500, default: 0 }, { id: "ignorePluginList", label: "List of plugins to ignore customs from (comma separated.)", type: "string", max: 2000, default: "" }, { id: "defaultCommandList", label: "List of preset commands for the command dropdown (comma separated.)", type: "string", max: 2000, default: "" }, { id: "pluginOverride", label: "Overrides the plugin value in the custom message.", type: "string", max: 20, default: "" }, { id: "rememberCommand", label: "Remember last used command in pseudo-console?", type: "boolean", default: false } ] }); this.previous = ""; } createPanel(){ const maxRowNumber = this.getConfig("textareaLines") let rowNumber = maxRowNumber if (maxRowNumber >= 30 || maxRowNumber === 0){ rowNumber = 30 } IdlePixelPlus.addPanel("interactor", "Custom Message Interactor", function() { const content = ` <div> <div class="d-flex"> <div class="me-auto"> <label for='interactor_recipient' class="interactor-label">Recipient:  </label> <input type="text" id="interactor_recipient"> </div> <div class=""> <label for='interactor_plugin_overrride' class="interactor-label">Plugin Override:  </label> <input type="text" id="interactor_plugin_overrride"> </div> </div> <div class="d-flex"> <textarea id="customs_received" wrap="soft" class="w-100" rows="${rowNumber}" readonly>${'\n'.repeat(rowNumber)}</textarea> </div> <form onsubmit='event.preventDefault(); IdlePixelPlus.plugins.custominteractor.sendCustom()'> <datalist id="interactorCommandList"></datalist> <div class="d-flex flex-fill"> <div class="col-3"> <input type="text" class="w-100" list="interactorCommandList" id="interactor_command_in" placeholder="command"> </div> <div class="col-8"> <input type="text" class="w-100" id="interactor_payload_in" placeholder="payload"> </div> <div class="col-1"> <input type="submit" class="w-100" value="Send"> </div> </div> </form> </div> ` return content }); } onLogin(){ this.createPanel() this.setConfigValuesToUI() if ("ui-tweaks" in IdlePixelPlus.plugins){ this.applyTheme("UIT") } else { this.applyTheme("default") } Paneller.registerPanel("interactor", "Custom Interactor") } onConfigsChanged(){ this.setConfigValuesToUI() } onCustomMessageReceived(player, content, callbackId) { const customData = this.parseCustom(player, content, callbackId) const rawIgnoreList = this.getConfig("ignorePluginList").toLowerCase() const ignoreList = rawIgnoreList.split(','); if (ignoreList[0] === ""){ignoreList.shift()} if (ignoreList.includes(customData.plugin.toLowerCase())){ return } let IdString = "-1" if (customData.callbackId){ IdString = customData.callbackId } const output_string = `[${IdString}]${player}: ${customData.plugin}: ${customData.command}: ${customData.payload}` console.log(output_string) this.addToPseudoConsole(output_string) } setConfigValuesToUI(){ $("#interactor_recipient").val(this.getConfig("receiver")) $("#interactor_plugin_overrride").val(this.getConfig("pluginOverride")) const maxRows = this.getConfig("textareaLines") const textOutput = $("#customs_received") if (maxRows >=30 || maxRows === 0){ textOutput.attr("rows", 30) } else { textOutput.attr("rows", maxRows) } const commandDatalist = $("#interactorCommandList") let commandList = this.getConfig("defaultCommandList").split(",") if (commandList[0]===""){ commandList.shift() } commandDatalist.empty() commandList.forEach((command) => { commandDatalist.append(`<option value="${command}">`) }) } parseCustom(player, content, callbackId){ const customData = { player: player, callbackId: callbackId, anwinFormatted: false } const splitPayload = content.split(":") if(splitPayload.length >= 3){ customData.anwinFormatted = true customData.plugin = splitPayload[0] customData.command = splitPayload[1] customData.payload = splitPayload.slice(2).join(":") } else { customData.anwinFormatted = false customData.plugin = "unknown" customData.command = "unknown" customData.payload = content } return customData } addToPseudoConsole(output_string){ const textOutput = $("#customs_received") const lines = textOutput.val().split('\n') const maxLines = this.getConfig("textareaLines") lines.push(output_string) if(lines.length > maxLines && maxLines !== 0){ lines.shift() } if (lines[0] === "" && lines.length > 30){ lines.shift() } const newText = lines.join('\n') textOutput.val(newText) textOutput.scrollTop(textOutput[0].scrollHeight); } applyTheme(theme){ let backgroundColour = "#ffffff" let textColour = "#000000" let labelColour = "#000000" if (theme==="UIT"){ backgroundColour = IdlePixelPlus.plugins["ui-tweaks"].config["color-chat-area"] textColour = IdlePixelPlus.plugins["ui-tweaks"].config["font-color-chat-area"] labelColour = IdlePixelPlus.plugins["ui-tweaks"].config["font-color-panels"] } $(".interactor-label").css({"color": labelColour}) $("#customs_received").css({"color": textColour, "background-color": backgroundColour}) } sendCustom(){ const recipient = $("#interactor_recipient").val() const commandjQuery = $("#interactor_command_in") const command = commandjQuery.val() if (!this.getConfig("rememberCommand")){ commandjQuery.val("") } const datajQuery = $("#interactor_payload_in") const data = datajQuery.val() datajQuery.val("") let pluginValue = $("#interactor_plugin_overrride").val() if (pluginValue === ""){ pluginValue = "interactor" } let content = "" if (data !== ""){ content = `${pluginValue}:${command}:${data}` } else { content = `${pluginValue}:${command}` } const payload = { content: content, onResponse: function(player, content, callbackId) { return true; }, onOffline: function(player, content) { console.log(content) }, timeout: 2000 // callback expires after 2 seconds } IdlePixelPlus.sendCustomMessage(recipient, payload) } } const plugin = new CustomInteractorPlugin(); IdlePixelPlus.registerPlugin(plugin); })();