- // ==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://gf.qytechs.cn/scripts/441206-idlepixel/code/IdlePixel+.js?anticache=20220905
- // @require https://gf.qytechs.cn/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);
-
- })();