pepeW Spammer

Spamuj "pepeW" na kick.com z panelem, tłem, animacją, dragowaniem i przyciskiem start/stop w minimalizacji i obrazkiem

// ==UserScript==
// @name         pepeW Spammer
// @namespace    http://tampermonkey.net/
// @version      2.1
// @description  Spamuj "pepeW" na kick.com z panelem, tłem, animacją, dragowaniem i przyciskiem start/stop w minimalizacji i obrazkiem
// @author       Ty
// @match        https://kick.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const pepewImg = "https://i.pinimg.com/originals/02/06/8e/02068e2e1a90365496eebe40702f87d4.gif"; 

    const style = document.createElement("style");
    style.textContent = `
    @import url('https://fonts.googleapis.com/css2?family=Inter&display=swap');
    #pepewPanel {
        position: fixed;
        top: 12px;
        right: 12px;
        width: 320px;
        background: url('https://i.pinimg.com/originals/02/06/8e/02068e2e1a90365496eebe40702f87d4.gif') no-repeat center center / cover;
        border-radius: 12px;
        box-shadow: 0 8px 24px rgba(0, 255, 165, 0.3);
        font-family: 'Inter', sans-serif;
        color: #d0d0d0;
        user-select: none;
        z-index: 99999999;
        transition: height 0.3s ease, opacity 0.3s ease, background-color 0.5s ease;
        overflow: hidden;
        display: flex;
        flex-direction: column;
        cursor: default;
    }
    #pepewPanel::before {
        content: "";
        position: absolute;
        inset: 0;
        border-radius: 12px;
        background-color: rgba(0, 0, 0, 0.6);
        pointer-events: none;
        z-index: 0;
        backdrop-filter: brightness(0.75);
        transition: background-color 0.3s ease, backdrop-filter 0.3s ease;
    }
    #pepewPanel.minimized::before {
        background-color: rgba(0,0,0,0.4);
        backdrop-filter: brightness(0.8);
    }
    #pepewPanel.minimized {
        height: 40px !important;
        opacity: 0.95;
        cursor: pointer;
        background: transparent;
        display: flex !important;
        justify-content: space-between;
        align-items: center;
        padding: 0 12px;
        font-weight: 600;
        font-size: 16px;
        color: #00ffa0;
        text-shadow: 0 0 5px #00ffa0cc;
    }
    #pepewPanel.minimized #pepewPanelHeader,
    #pepewPanel.minimized #pepewPanelContent {
        display: none !important;
    }

    #minimizedPanelContent {
        display: none;
        width: 100%;
        justify-content: space-between;
        align-items: center;
        user-select: none;
        gap: 12px;
        z-index: 1;
        position: relative;
    }

    #minimizedPanelContent .label {
        flex-grow: 1;
        text-align: center;
        font-size: 15px;
        font-weight: bold;
        color: #00ffa0;
        text-shadow: 0 0 5px #00ffa0cc;
    }

    #minimizedStartStopBtn {
        background: #00ffa0;
        border: none;
        border-radius: 6px;
        padding: 4px 8px;
        font-weight: 600;
        cursor: pointer;
        color: #000;
        box-shadow: 0 0 5px #00ffa0cc;
        font-size: 14px;
        transition: background 0.3s ease;
        flex-shrink: 0;
    }
    #minimizedStartStopBtn:hover {
        background: #00cc80;
    }

    #minimizedPanelImage {
        width: 24px;
        height: 24px;
        flex-shrink: 0;
    }

    #pepewPanel #pepewPanelHeader {
        background: transparent;
        padding: 8px 12px;
        font-weight: 600;
        font-size: 16px;
        cursor: move;
        user-select: none;
        display: flex;
        justify-content: space-between;
        align-items: center;
        color: #00ffa0;
        text-shadow: 0 0 5px #00ffa0cc;
        position: relative;
        z-index: 1;
    }
    #pepewPanel #pepewPanelContent {
        display: flex;
        flex-direction: column;
        gap: 10px;
        padding: 12px;
        position: relative;
        z-index: 1;
    }
    #pepewPanel label {
        font-size: 14px;
        color: #a0a0a0;
    }
    #pepewPanel input[type="text"] {
        width: 100%;
        padding: 6px 8px;
        border-radius: 6px;
        border: none;
        font-family: 'Inter', sans-serif;
        font-size: 14px;
        background: #111;
        color: #eee;
        box-shadow: inset 0 0 5px #00ffa0cc;
    }
    #pepewPanel input[type="range"] {
        width: 100%;
    }
    #pepewPanel #pepewPanelContent > div {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 10px;
    }
    #pepewPanel button {
        background: #00ffa0;
        border: none;
        border-radius: 6px;
        padding: 8px 16px;
        font-weight: 600;
        cursor: pointer;
        color: #000;
        box-shadow: 0 0 8px #00ffa0cc;
        transition: background 0.3s ease;
    }
    #pepewPanel button:hover {
        background: #00cc80;
    }
    #pepewPanel #counterDisplay {
        font-size: 14px;
        color: #00ffa0;
        text-align: center;
        font-weight: 600;
        text-shadow: 0 0 5px #00ffa0cc;
    }
    `;
    document.head.appendChild(style);

    const panel = document.createElement("div");
    panel.id = "pepewPanel";
    panel.innerHTML = `
        <div id="pepewPanelHeader"><div>pepeW Spammer</div><button id="toggleMinimizeBtn">−</button></div>
        <div id="pepewPanelContent">
            <label for="messageInput">Wiadomość:</label>
            <input type="text" id="messageInput" value="pepeW" />
            <div><label>Min (s): <span id="minValDisplay">1.0</span></label><input type="range" id="minDelay" min="0" max="12" step="0.5" value="1" /></div>
            <div><label>Max (s): <span id="maxValDisplay">2.0</span></label><input type="range" id="maxDelay" min="0" max="12" step="0.5" value="2" /></div>
            <button id="startStopBtn">Start</button>
            <div id="counterDisplay">Wysłano wiadomości: 0</div>
        </div>
        <div id="minimizedPanelContent">
            <button id="minimizedStartStopBtn">Start</button>
            <div class="label">pepeW Spammer</div>
            <img id="minimizedPanelImage" src="${pepewImg}" alt="pepeW" />
        </div>
    `;
    document.body.appendChild(panel);

    // Elementy
    const input = document.getElementById("messageInput");
    const minSlider = document.getElementById("minDelay");
    const maxSlider = document.getElementById("maxDelay");
    const startStopBtn = document.getElementById("startStopBtn");
    const toggleMinimizeBtn = document.getElementById("toggleMinimizeBtn");
    const counterDisplay = document.getElementById("counterDisplay");
    const header = document.getElementById("pepewPanelHeader");
    const panelContent = document.getElementById("pepewPanelContent");
    const minimizedPanelContent = document.getElementById("minimizedPanelContent");
    const minimizedStartStopBtn = document.getElementById("minimizedStartStopBtn");

    let running = false;
    let timeoutId;
    let messageCount = 0;

    const updateSlidersDisplay = () => {
        document.getElementById("minValDisplay").textContent = minSlider.value;
        document.getElementById("maxValDisplay").textContent = maxSlider.value;
    };

    const updateMinimizedStartStopBtn = () => {
        minimizedStartStopBtn.textContent = running ? "Stop" : "Start";
    };

    const updateCounter = () => {
        counterDisplay.textContent = `Wysłano wiadomości: ${messageCount}`;
    };

    const sendMessage = msg => {
        const inputDiv = document.querySelector('div.editor-input[contenteditable="true"][data-testid="chat-input"]');
        if (!inputDiv) return false;
        inputDiv.focus();
        inputDiv.textContent = "";
        document.execCommand('insertText', false, msg);
        inputDiv.dispatchEvent(new Event('input', { bubbles: true }));
        inputDiv.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, key: 'Enter', code: 'Enter', which: 13, keyCode: 13 }));
        return true;
    };

    const getRandomDelay = () => {
        const min = parseFloat(minSlider.value);
        const max = parseFloat(maxSlider.value);
        return (Math.random() * (max - min) + min) * 1000;
    };

    const spamLoop = () => {
        if (!running) return;
        const msg = input.value.trim();
        if (!msg) return stopSpamming();
        if (sendMessage(msg)) {
            messageCount++;
            updateCounter();
        }
        timeoutId = setTimeout(spamLoop, getRandomDelay());
    };

    const startSpamming = () => {
        if (running) return;
        running = true;
        startStopBtn.textContent = "Stop";
        updateMinimizedStartStopBtn();
        spamLoop();
    };

    const stopSpamming = () => {
        running = false;
        startStopBtn.textContent = "Start";
        updateMinimizedStartStopBtn();
        clearTimeout(timeoutId);
    };

    startStopBtn.onclick = () => running ? stopSpamming() : startSpamming();
    minimizedStartStopBtn.onclick = e => {
        e.stopPropagation();
        running ? stopSpamming() : startSpamming();
    };

    toggleMinimizeBtn.onclick = e => {
        e.stopPropagation();
        const minimized = panel.classList.toggle("minimized");
        toggleMinimizeBtn.textContent = minimized ? "+" : "−";
        panelContent.style.display = minimized ? "none" : "flex";
        minimizedPanelContent.style.display = minimized ? "flex" : "none";
        header.style.display = minimized ? "none" : "flex";
        panel.style.cursor = minimized ? "pointer" : "default";
    };

    panel.onclick = () => {
        if (panel.classList.contains("minimized")) {
            panel.classList.remove("minimized");
            toggleMinimizeBtn.textContent = "−";
            panelContent.style.display = "flex";
            minimizedPanelContent.style.display = "none";
            header.style.display = "flex";
            panel.style.cursor = "default";
        }
    };

    // tutaj zmiana: zabezpieczenie wartości sliderów
    minSlider.oninput = () => {
        // jeśli min > max, ustaw max na min
        if (parseFloat(minSlider.value) > parseFloat(maxSlider.value)) {
            maxSlider.value = minSlider.value;
        }
        updateSlidersDisplay();
    };
    maxSlider.oninput = () => {
        // jeśli max < min, ustaw min na max
        if (parseFloat(maxSlider.value) < parseFloat(minSlider.value)) {
            minSlider.value = maxSlider.value;
        }
        updateSlidersDisplay();
    };

    // Drag
    let isDragging = false, dragStartX, dragStartY, startLeft, startTop;
    header.onmousedown = e => {
        isDragging = true;
        dragStartX = e.clientX;
        dragStartY = e.clientY;
        const rect = panel.getBoundingClientRect();
        startLeft = rect.left;
        startTop = rect.top;
        document.body.style.userSelect = "none";
    };
    document.onmousemove = e => {
        if (!isDragging) return;
        const newX = Math.max(0, Math.min(window.innerWidth - panel.offsetWidth, startLeft + (e.clientX - dragStartX)));
        const newY = Math.max(0, Math.min(window.innerHeight - panel.offsetHeight, startTop + (e.clientY - dragStartY)));
        panel.style.left = `${newX}px`;
        panel.style.top = `${newY}px`;
        panel.style.right = "auto";
        panel.style.bottom = "auto";
    };
    document.onmouseup = () => {
        isDragging = false;
        document.body.style.userSelect = "auto";
    };

    updateSlidersDisplay();
    updateMinimizedStartStopBtn();
})();