Gota.io auto invite

Script for auto add players to your party

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name            Gota.io auto invite
// @name:ru         Gota.io авто инвайтер
// @namespace       Gota.io script by Madzal
// @author          Madzal
// @version         3
// @homepage        http://gota.io/web
// @supportURL      http://www.YouTube.com/user/madzal777
// @description     Script for auto add players to your party
// @description:ru  Скрипт для авто добавления игроков в твою команду
// @icon            data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZ
// @match           http://gota.io/web/
// @exclude         file://*
// @run-at          document-end
// @encoding        utf-8
// @grant           none
// @noframes
// @license         MIT //
// ==/UserScript==

(function() {
    'use strict'; // Enforce strict mode for cleaner code

    let observer = null; // To hold the MutationObserver instance

    function handlePlayerInvite(node) {
        // Check if the inserted node is a chat message containing a canvas
        // This assumes chat messages for player IDs are structured in a predictable way
        const canvas = node.querySelector("canvas[data-player-id]");
        if (canvas) {
            const playerid = canvas.getAttribute("data-player-id");
            const partyCanvas = document.getElementById("party-canvas");

            // Ensure partyCanvas exists and has the correct height before sending an invite
            if (partyCanvas && partyCanvas.height !== 205) {
                console.log('Sending invite to player - ' + playerid);
                // Ensure 'player' and 'Packet' objects are available in the page context.
                // If they are not, you might need to use 'unsafeWindow.player' or 'unsafeWindow.Packet'
                // However, since @grant none is used, the script runs in the page context by default.
                if (typeof player !== 'undefined' && typeof Packet !== 'undefined' && typeof Packet.sendPartyAction !== 'undefined') {
                    player.sendPacket(new Packet.sendPartyAction(0, playerid));
                } else {
                    console.warn("Gota.io game objects (player or Packet) not found. Cannot send invite.");
                }
            }
        }
    }

    function startAutoInvite() {
        const chatBody = document.getElementById("chat-body");
        if (!chatBody) {
            console.error("Chat body element not found. Auto invite cannot start.");
            return;
        }

        // Options for the observer (which mutations to observe)
        const config = { childList: true, subtree: true };

        // Callback function to execute when mutations are observed
        const callback = (mutationsList, observerInstance) => {
            for (const mutation of mutationsList) {
                if (mutation.type === 'childList') {
                    for (const addedNode of mutation.addedNodes) {
                        // Check if the added node is an element and not just text
                        if (addedNode.nodeType === 1) { // Node.ELEMENT_NODE
                            handlePlayerInvite(addedNode);
                        }
                    }
                }
            }
        };

        // Create a new MutationObserver instance
        observer = new MutationObserver(callback);

        // Start observing the target node for configured mutations
        observer.observe(chatBody, config);
        console.log("Auto invite started. Monitoring chat for new players.");

        // Disable the start button and enable the stop button
        document.getElementById("start_invite").disabled = true;
        document.getElementById("stop_invite").disabled = false;
    }

    function stopAutoInvite() {
        if (observer) {
            observer.disconnect(); // Stop observing
            observer = null;
            console.log("Auto invite stopped.");
        }
        // Disable the stop button and enable the start button
        document.getElementById("start_invite").disabled = false;
        document.getElementById("stop_invite").disabled = true;
    }

    // --- Script Initialization ---

    // Create buttons
    const startButton = document.createElement("input");
    startButton.className = "gota-btn";
    startButton.type = "button";
    startButton.value = "Start Auto Invite";
    startButton.id = "start_invite";
    startButton.addEventListener("click", startAutoInvite, false);

    const stopButton = document.createElement("input");
    stopButton.className = "gota-btn";
    stopButton.type = "button";
    stopButton.value = "Stop Script";
    stopButton.id = "stop_invite";
    stopButton.addEventListener("click", stopAutoInvite, false);
    stopButton.disabled = true; // Initially disabled until invite starts

    // Append buttons to the Gota.io UI
    const mainTop = document.getElementsByClassName("main-top")[0];
    if (mainTop) {
        const mydiv = document.createElement("div");
        mydiv.className = "main-version";
        mydiv.style.margin = "15px";
        mydiv.appendChild(startButton);
        mydiv.appendChild(stopButton);
        mainTop.appendChild(mydiv);
    } else {
        console.error("Could not find '.main-top' element to append buttons.");
    }
})();