outo anser

Automated message sender with advanced settings, restart, stop, and progress

// ==UserScript==
// @name           outo anser
// @description    Automated message sender with advanced settings, restart, stop, and progress
// @version        1.0
// @author         User9064, javad
// @license        MIT
// @match          *://gartic.io/*
// @namespace https://greasyfork.org/users/1302740
// ==/UserScript==

let m_s, a_i, m_a, m_z, m_b;

// Default messages array
const defaultMessages = [
    "مرغ", "گرگ", "چنگال", "یخچال ", "کمد",
    "توپ", "لاک پشت", "انار", "هندوانه", "آشپز",
    "آش", "آب", "پيتزا", "دلستر", "نوشابه",
    "توت فرنگی", "کتلت", "کباب", "کباب کوبیده", "طوطی",
    "موز", "فیل", "جوجه کباب", "عنکبوت", "مداد",
    "خودکار", "خرما", "نارگیل", "لیوان", "کفش",
    "جوراب", "سیم", "تلویزیون", "کامپیوتر", "خواننده",
    "کلاغ", "قاشق", "چنگال", "گربه", "میمون",
    "موش", "موش کور", "حلزون", "کاکتوس", "عقاب",
    "شمع", "درخت", "مسجد", "دست", "لباس",
    "شلوار", "خانه", "لامپ", "املت", "جوجه",
    "بخاری", "خوک", "گوسفند", "عکاس", "بوفالو",
    "زنبور", "هواپیما", "اره ماهی", "ژله", "آلبالو",
    "گیلاس", "شغال", "پا", "شکلات", "مگس",
    "مورچه خوار", "گل", "عروسک", "گوزن", "مهندس",
    "سیب", "ساعت", "معلم", "ساندویچ", "همبرگر",
    "کوه", "کنترل", "جعبه", "بستنی", "پنیر",
    "ته چین", "ستاره", "ستاره دریایی", "کتاب", "ديوار",
    "گلدان", "کاهو", "صابون", "چشم", "گوش",
    "سوزن", "زرافه", "قندان", "دندانپزشک", "پنگوئن",
    "دلفین", "توپ", "ماکارونی", "دماغ", "رادیو",
    "مار", "مارماهی", "چاقو", "کلاه", "مسواک",
    "تخت", "پتو", "پروانه", "هات داگ", "سوسیس",
    "والیبال", "فوتبال", "پرستو", "میز", "صندلی",
    "شاهین", "لک لک", "مهندس برق", "مهندس برق", "",
    "", "", "", "", ""
];

let currentMessageIndex = 0;
let messageSpeed = 1000; // Default speed of 1000ms (1 second)
let messageCount = 70; // Default number of messages to send
let sendingInterval = null;
let messages = [...defaultMessages]; // Clone of the default messages
let isSending = false;

// Selectors
const f = x => document.querySelector(x),
    sendMessage = (inputSelector, message) => {
        a_i = document.querySelector(inputSelector);
        m_a = a_i.value;
        a_i.value = message + m_a;
        m_z = new Event("input", { bubbles: true });
        m_z.simulated = true;
        m_b = new Event("submit", { bubbles: true });
        m_b.simulated = true;
        m_s = a_i._valueTracker;
        m_s && m_s.setValue(m_a);
        a_i.dispatchEvent(m_z);
        a_i.form.dispatchEvent(m_b);
    };

// Start sending messages automatically
function startSendingMessages() {
    if (isSending) return;
    isSending = true;
    sendingInterval = setInterval(() => {
        sendMessage('input[name=answer]', messages[currentMessageIndex]);
        currentMessageIndex = (currentMessageIndex + 1) % messageCount; // Loop back to the first message after reaching the set number
    }, messageSpeed);
}

// Stop sending messages
function stopSendingMessages() {
    clearInterval(sendingInterval);
    sendingInterval = null;
    isSending = false;
}

// Restart sending messages from the beginning
function restartSendingMessages() {
    currentMessageIndex = 0; // Reset the message index
    startSendingMessages();
}

// Add a custom message to the list
function addCustomMessage(message) {
    if (message && !messages.includes(message)) {
        messages.push(message);
        messageCount = messages.length; // Update message count when new message is added
        GM_setValue('messages', messages);
        updateMessagesDisplay();
    }
}

// Function to update the message list display
function updateMessagesDisplay() {
    const messageList = document.getElementById('messageList');
    messageList.innerHTML = '';
    messages.forEach(msg => {
        const listItem = document.createElement('li');
        listItem.textContent = msg;
        messageList.appendChild(listItem);
    });
}

// Create the control panel
window.onload = function () {
    const container = document.createElement("div");
    container.style = `
        width: 160px;
        height: 400px;
        z-index: 99;
        position: fixed;
        top: 10px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        flex-direction: column;
        align-items: center;
        gap: 12px;
        background-color: #4e4e4a;
        border: 2px solid #2f4f4f;
        border-radius: 12px;
        padding: 15px;
        box-shadow: 0 5px 15px rgba(0,0,0,0.5);
        display: none; /* Hidden by default */
    `;
    document.body.appendChild(container);

    const startButton = document.createElement("button");
    startButton.style = `
        width: 120px;
        height: 35px;
        background-color: #fffff0;
        color: black;
        border-radius: 5px;
        border: 1px solid black;
        margin-top: 8px;
        font-weight: bold;
    `;
    startButton.textContent = "Start";
    startButton.addEventListener("mousedown", () => {
        startButton.disabled = true; // Disable the start button once it's clicked
        startSendingMessages();
    });
    container.appendChild(startButton);

    const stopButton = document.createElement("button");
    stopButton.style = `
        width: 120px;
        height: 35px;
        background-color: #fffff0;
        color: black;
        border-radius: 5px;
        border: 1px solid black;
        margin-top: 8px;
    `;
    stopButton.textContent = "Stop";
    stopButton.addEventListener("mousedown", stopSendingMessages);
    container.appendChild(stopButton);

    const restartButton = document.createElement("button");
    restartButton.style = `
        width: 120px;
        height: 35px;
        background-color: #fffff0;
        color: black;
        border-radius: 5px;
        border: 1px solid black;
        margin-top: 8px;
    `;
    restartButton.textContent = "Restart";
    restartButton.addEventListener("mousedown", restartSendingMessages);
    container.appendChild(restartButton);

    // Slider for adjusting message speed
    const speedLabel = document.createElement("label");
    speedLabel.textContent = "Speed";
    speedLabel.style = "color: #6dd7ff; font-size: 12px; margin-bottom: 5px;";
    container.appendChild(speedLabel);

    const speedSlider = document.createElement("input");
    speedSlider.type = "range";
    speedSlider.min = "100";
    speedSlider.max = "5000";
    speedSlider.value = messageSpeed; // Set the initial value to the current speed
    speedSlider.style = `
        width: 80px;
        height: 8px;
        margin-bottom: 8px;
    `;
    container.appendChild(speedSlider);

    const speedDisplay = document.createElement("span");
    speedDisplay.style = "color: #6dd7ff; font-size: 12px;";
    speedDisplay.textContent = `${messageSpeed} ms`;
    container.appendChild(speedDisplay);

    speedSlider.addEventListener("input", () => {
        messageSpeed = parseInt(speedSlider.value);
        speedDisplay.textContent = `${messageSpeed} ms`;
        GM_setValue('messageSpeed', messageSpeed);
        if (sendingInterval) {
            stopSendingMessages();
            startSendingMessages(); // Restart with the new speed
        }
    });

    // Load saved settings
    const savedSpeed = GM_getValue('messageSpeed', messageSpeed);
    messageSpeed = savedSpeed;
    speedSlider.value = savedSpeed; // Update slider to reflect saved speed
    speedDisplay.textContent = `${savedSpeed} ms`; // Update speed display

    const savedMessages = GM_getValue('messages', []);
    if (savedMessages.length) {
        messages = savedMessages;
        messageCount = messages.length; // Update message count with saved messages
        updateMessagesDisplay();
    }

    // Toggle button to show/hide the panel
    const toggleButton = document.createElement("button");
    toggleButton.style = `
        position: fixed;
        top: 10px;
        left: 10px;
        background-color: #fa8072;
        color: black;
        border: none;
        padding: 10px;
        border-radius: 50%;
        font-size: 20px;
    `;
    toggleButton.textContent = "+";
    toggleButton.addEventListener("click", () => {
        if (container.style.display === "none") {
            container.style.display = "flex";
            toggleButton.textContent = "Close ❌";
        } else {
            container.style.display = "none";
            toggleButton.textContent = "golScript";
        }
    });
    document.body.appendChild(toggleButton);
};