A1xndrov / L3SYA_ADM1N_H31P3R

// ==UserScript==
// @name      L3SYA_ADM1N_H31P3R
// @namespace http://tampermonkey.net/
// @version   1.1
// @description Помощник Администратора Bot Lesya
// @author A1xndrov
// @copyright 2024, a1xndrov (https://vk.com/a1xndrov)
// @match   https://botlesya.ru/*
// @updateURL https://openuserjs.org/install/A1xndrov/L3SYA_ADM1N_H31P3R.user.js
// @license MIT
// ==/UserScript==

(function () {
    'use strict';

    const bodyElement = document.querySelector("body");
    bodyElement.style.backgroundImage = `url('https://sun9-20.userapi.com/impg/nboXPTHHElkkjkcuFMQ4uPQH_MN8QimWk1UyXw/861W26hhEmM.jpg?size=1920x1080&quality=95&sign=c9425b9a1867e29b2d121f88d099ed77&type=album')`;

    const ACCESS_TOKEN = ''; // Ваш токен ВК (Kate)
    const CHATID = 'user_id=000'; // Куда будет отправлять команды (Лс Леси (указывать: user_id=(ИД ЧАТА), Беседа Админская (указывать: chat_id=(ИД ЧАТА))

    let previousId = null;
    let nickname;

    const handleNode = async (node) => {
        if (node.nodeName === "A") {
            nickname = node.textContent;
        } else if (node.nodeType === Node.TEXT_NODE) {
            const regex = /(\d+)/;
            const matches = node.textContent.match(regex);
            if (matches && matches.length > 0) {
                const id = matches[0];
                if (id !== previousId && window.location.href !== 'https://botlesya.ru/') {
                    window.location.href = `https://botlesya.ru/ap/logs?id=${id}`;
                    previousId = id;
                };
            };
        };
    };

    const observer = new MutationObserver((mutationsList) => {
        mutationsList.forEach(mutation => {
            mutation.addedNodes.forEach(async node => {
                handleNode(node);
            });
        });
    });

    const config = { childList: true, subtree: true, characterData: true };
    observer.observe(document.body, config);

    const urlParams = new URLSearchParams(window.location.search);
    let id = urlParams.get('id');
    previousId = id;

    document.addEventListener('contextmenu', event => event.preventDefault());

    const style = {
        color: 'black',
        userSelect: 'none',
        fontWeight: 'bold',
    };

    const menuContainer = document.createElement('div');
    Object.assign(menuContainer.style, {
        display: 'none',
        position: 'fixed',
        top: '60px',
        right: '10px',
        backgroundColor: 'rgba(255, 255, 255, 0.8)',
        padding: '10px',
        height: 'auto',
        borderRadius: '10px',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
        transition: 'opacity 0.3s ease-in-out'
    });

    const MenuUser = document.createElement('p');
    MenuUser.innerHTML = id ? `👤 Меню игрока [ID: ${id}]` : 'Доступно только в логах игрока! ❌';
    Object.assign(MenuUser.style, {
        ...style,
        textAlign: 'center',
        top: '-10px',
        left: '50%',
        textShadow: '2px 2px 4px rgba(0, 0, 0, 0.2)',
        fontFamily: 'Arial Black, Gadget, sans-serif',
        fontSize: '10px',
    });

    menuContainer.appendChild(MenuUser);

    const helperButton = document.createElement('button');
    helperButton.innerHTML = 'Admin Helper ❄️';
    Object.assign(helperButton.style, {
        ...style,
        transition: 'transform 0.2s, box-shadow 0.2s',
        backgroundColor: 'rgba(255, 255, 255, 0.3)',
        border: 'none',
        padding: '10px 20px',
        borderRadius: '10px',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
        position: 'fixed',
        top: '10px',
        right: '10px',
        cursor: 'pointer',
        fontFamily: 'Arial, sans-serif'
    });

    const sendCaptchaText = document.createElement('p');
    sendCaptchaText.innerHTML = `🤖 Управление капчами:`;
    Object.assign(sendCaptchaText.style, {
        ...style,
        fontFamily: 'Arial Black, Gadget, sans-serif',
        textShadow: '2px 2px 4px rgba(0, 0, 0, 0.2)',
        fontSize: '10px',
    });

    menuContainer.appendChild(sendCaptchaText);

    const buttonActions = [
        { text: 'Баланс', action: 'Баланс' },
        { text: 'Банк', action: 'Банк' },
        { text: 'Рейтинг', action: 'Рейтинг' },
        { text: 'Биткоин', action: 'Биткоин' },
        { text: 'Никнейм', action: 'Ник' },
        { text: 'Текст', action: 'Текст' }
    ];

    for (let i = 0; i < Math.ceil(buttonActions.length / 3); i++) {
        const buttonRow = document.createElement('div');
        buttonRow.style.display = 'flex';
        buttonRow.style.justifyContent = 'center';

        for (let j = i * 3; j < Math.min(i * 3 + 3, buttonActions.length); j++) {
            const { text, action } = buttonActions[j];

            const menuButton = document.createElement('button');
            menuButton.innerHTML = text;
            Object.assign(menuButton.style, {
                ...style,
                backgroundColor: 'white',
                fontFamily: 'Arial, sans-serif',
                border: '2px solid white',
                padding: '10px 20px',
                borderRadius: '10px',
                margin: '5px',
                cursor: 'pointer',
                boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
                transition: 'transform 0.2s, box-shadow 0.2s',
                position: 'relative'
            });

            AddEffect(menuButton);

            menuButton.addEventListener('click', () => {
                let confirmcaptcha = confirm(`Вы действительно хотите выдать капчу игроку «${nickname}» [ID: ${id}] с типом «${action}»?`);
                if (confirmcaptcha) return MsgSend(`Капча ${id} ${action}`, `Капча «${action}» была успешно выслана игроку «${nickname}» [ID: ${id}]`);
            });

            buttonRow.appendChild(menuButton);
        };

        menuContainer.appendChild(buttonRow);
    };

    helperButton.addEventListener('click', () => {
        if (menuContainer.style.display === 'none' || menuContainer.style.display === '') {
            menuContainer.style.display = 'block';
            setTimeout(() => {
                menuContainer.style.opacity = '1';
            }, 50);
        } else {
            menuContainer.style.opacity = '0';
            setTimeout(() => {
                menuContainer.style.display = 'none';
            }, 300);
        };
    });

    const difficultyInput = document.createElement('input');
    difficultyInput.type = 'number';
    difficultyInput.placeholder = 'Лвл';
    Object.assign(difficultyInput.style, {
        ...style,
        padding: '8px',
        margin: '5px',
        float: 'left',
        borderRadius: '5px',
        fontFamily: 'Arial, sans-serif',
        backgroundColor: 'rgba(255, 255, 255, 0.7)',
        border: '1px solid white',
        width: '50px',
        height: '30px',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
    });

    difficultyInput.setAttribute('max', '8');
    difficultyInput.setAttribute('min', '1');

    AddEffect(difficultyInput);
    menuContainer.appendChild(difficultyInput);

    const daysInput = document.createElement('input');
    daysInput.type = 'number';
    daysInput.placeholder = 'Дни';
    Object.assign(daysInput.style, {
        ...style,
        marginLeft: '10px',
        padding: '8px',
        fontFamily: 'Arial, sans-serif',
        float: 'left',
        borderRadius: '5px',
        backgroundColor: 'rgba(255, 255, 255, 0.7)',
        border: '1px solid white',
        margin: '5px',
        width: '50px',
        height: '30px',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
    });

    daysInput.setAttribute('max', '3500');
    daysInput.setAttribute('min', '1');

    AddEffect(daysInput);
    menuContainer.appendChild(daysInput);

    const recaptchaButton = document.createElement('button');
    recaptchaButton.innerHTML = 'Выдать гугл-капчу';
    Object.assign(recaptchaButton.style, {
        ...style,
        transition: 'transform 0.2s, box-shadow 0.2s',
        backgroundColor: 'white',
        fontFamily: 'Arial, sans-serif',
        border: '2px solid white',
        float: 'left',
        padding: '10px 30px',
        borderRadius: '10px',
        display: 'block',
        margin: '4px',
        cursor: 'pointer',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
        position: 'relative'
    });

    recaptchaButton.addEventListener('click', async () => {

        if (difficultyInput.value === '' || daysInput.value === '') {
            return alert('Выдача гугл-капчи > Упс, вы не заполнили поля ❓');
        };

        if (daysInput.value > 3500 || daysInput.value < 1 || difficultyInput.value > 8 || difficultyInput.value < 1) {
            daysInput.value = '';
            difficultyInput.value = '';
            return alert('Выдача гугл-капчи > Упс, вы превысили максимально допустимый лимит ❓\nУровень капчи - минимальный: 1, максимальный: 8\nДни капчи - минимальный: 1, максимальный: 3500');
        };

        let confirmgcaptcha = confirm(`Выдача гугл-капчи > Вы действительно хотите выдать гугл-капчу игроку «${nickname}» [ID: ${id}] на ${daysInput.value}д > ${difficultyInput.value} лвл ❓`);

        if (confirmgcaptcha) {
            await MsgSend(`Гкапча${difficultyInput.value} ${id} ${daysInput.value}д`, `Выдача гугл-капчи > Была выдана успешно игроку «${nickname}» [ID: ${id}] > ${daysInput.value}д > ${difficultyInput.value} лвл 🥳`);
            daysInput.value = '';
            difficultyInput.value = '';
        } else {
            daysInput.value = '';
            difficultyInput.value = '';
        };
    });

    AddEffect(recaptchaButton);
    menuContainer.appendChild(recaptchaButton);

    const SetnickText = document.createElement('p');
    SetnickText.innerHTML = `🕶 Управление никнеймом:`;
    Object.assign(SetnickText.style, {
        ...style,
        fontFamily: 'Arial Black, Gadget, sans-serif',
        textShadow: '2px 2px 4px rgba(0, 0, 0, 0.2)',
        fontSize: '10px',
    });

    menuContainer.appendChild(SetnickText);

    const Setnick = document.createElement('input');
    Setnick.type = 'text';
    Setnick.placeholder = 'Новый никнейм';
    Object.assign(Setnick.style, {
        ...style,
        marginLeft: '5px',
        padding: '8px',
        fontFamily: 'Arial, sans-serif',
        float: 'left',
        borderRadius: '5px',
        backgroundColor: 'rgba(255, 255, 255, 0.7)',
        border: '1px solid white',
        margin: '5px',
        width: '125px',
        height: '30px',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
        clear: 'both',
    });

    AddEffect(Setnick);
    menuContainer.appendChild(Setnick);

    const SetnickButton = document.createElement('button');
    SetnickButton.innerHTML = 'Изменить никнейм';
    Object.assign(SetnickButton.style, {
        ...style,
        transition: 'transform 0.2s, box-shadow 0.2s',
        backgroundColor: 'white',
        fontFamily: 'Arial, sans-serif',
        border: '2px solid white',
        float: 'left',
        padding: '10px 22px',
        borderRadius: '10px',
        display: 'block',
        margin: '4px',
        cursor: 'pointer',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
        position: 'relative'
    });

    SetnickButton.addEventListener('click', async () => {

        if (Setnick.value === '') {
            return alert('Изменение никнейма > Упс, вы не заполнили поле ❓');
        };

        let confirmsetnick = confirm(`Изменение никнейма > Вы действительно хотите изменить никнейм игроку «${nickname}» [ID: ${id}] на «${Setnick.value}» ❓`);

        if (confirmsetnick) {
            await MsgSend(`Сетник ${id} ${Setnick.value}`, `Изменение никнейма > Вы успешно изменили никнейм игроку «${nickname}» [ID: ${id}] на «${Setnick.value}» 🥳`);
            Setnick.value = '';
            location.reload();
        } else {
            Setnick.value = '';
        };
    });

    AddEffect(SetnickButton);
    menuContainer.appendChild(SetnickButton);

    const BanText = document.createElement('p');
    BanText.innerHTML = `🚫 Управление блокировками:`;
    Object.assign(BanText.style, {
        ...style,
        fontFamily: 'Arial Black, Gadget, sans-serif',
        textShadow: '2px 2px 4px rgba(0, 0, 0, 0.2)',
        fontSize: '10px',
    });

    menuContainer.appendChild(BanText);

    const BanDays = document.createElement('input');
    BanDays.type = 'number';
    BanDays.placeholder = 'Дни';
    Object.assign(BanDays.style, {
        ...style,
        padding: '8px',
        margin: '5px',
        float: 'left',
        borderRadius: '5px',
        fontFamily: 'Arial, sans-serif',
        backgroundColor: 'rgba(255, 255, 255, 0.7)',
        border: '1px solid white',
        width: '60px',
        height: '30px',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
    });

    BanDays.setAttribute('min', '1');

    AddEffect(BanDays);
    menuContainer.appendChild(BanDays);

    const BanReason = document.createElement('input');
    BanReason.type = 'text';
    BanReason.placeholder = 'Причина';
    Object.assign(BanReason.style, {
        ...style,
        marginLeft: '10px',
        padding: '8px',
        fontFamily: 'Arial, sans-serif',
        float: 'left',
        borderRadius: '5px',
        backgroundColor: 'rgba(255, 255, 255, 0.7)',
        border: '1px solid white',
        margin: '5px',
        width: '60px',
        height: '30px',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
    });

    AddEffect(BanReason);
    menuContainer.appendChild(BanReason);

    const BanButton = document.createElement('button');
    BanButton.innerHTML = 'Выдать блокировку';
    Object.assign(BanButton.style, {
        ...style,
        transition: 'transform 0.2s, box-shadow 0.2s',
        backgroundColor: 'white',
        fontFamily: 'Arial, sans-serif',
        border: '2px solid white',
        float: 'left',
        padding: '10px 16px',
        borderRadius: '10px',
        margin: '4px',
        cursor: 'pointer',
        boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.2)',
        position: 'relative'
    });

    BanButton.addEventListener('click', async () => {
        let banDuration = !BanDays.value ? 'навсегда' : `на ${BanDays.value} дней`;
        let banReason = !BanReason.value ? 'Причина не указана' : BanReason.value;

        let confirmMessage = `Выдача блокировки > Вы действительно хотите выдать блокировку игрока «${nickname}» [ID: ${id}] ${banDuration} по причине: «${banReason}» ❓`;

        if (confirm(confirmMessage)) {
            let successMessage = `Бан ${id} ${!BanDays.value ? '' : `${BanDays.value}д`} ${BanReason.value}`;
            await MsgSend(successMessage, `Выдача блокировки > Блокировка была выдана успешно игроку «${nickname}» [ID: ${id}] ${banDuration} по причине: «${banReason}» 🥳`);
        }

        BanDays.value = '';
        BanReason.value = '';
    });

    AddEffect(BanButton);
    menuContainer.appendChild(BanButton);

    if (!id) {
        const menuButtons = menuContainer.querySelectorAll('button');
        menuButtons.forEach(button => {
            button.disabled = true;
            button.style.pointerEvents = 'none';
            button.style.filter = 'blur(5px)';
        });

        const inputFields = menuContainer.querySelectorAll('input');
        inputFields.forEach(input => {
            input.disabled = true;
            input.style.pointerEvents = 'none';
            input.style.filter = 'blur(5px)';
        });

        const elementsToDisable = [Setnick, BanDays, BanReason, sendCaptchaText, SetnickText, BanText, daysInput, difficultyInput];

        elementsToDisable.forEach(element => {
            element.disabled = true;
            element.style.filter = 'blur(5px)';
        });
    };

    AddEffect(helperButton);
    document.body.appendChild(helperButton);
    document.body.appendChild(menuContainer);

    async function MsgSend(Msg, Succeful) {
        fetch(`https://api.vk.com/method/messages.send?${CHATID}&message=${encodeURIComponent(Msg)}&access_token=${ACCESS_TOKEN}&v=5.131&random_id=0`, { method: 'GET' });
        return alert(Succeful);
    };

    function AddEffect(element) {
        element.addEventListener('mouseenter', () => {
            element.style.transition = 'transform 0.2s, box-shadow 0.2s';
            element.style.transform = 'scale(1.02)';
            element.style.boxShadow = '0 0 15px rgba(0, 0, 0, 0.3)';
        });

        element.addEventListener('mouseleave', () => {
            element.style.transition = 'transform 0.2s, box-shadow 0.2s';
            element.style.transform = 'scale(1)';
            element.style.boxShadow = '2px 2px 5px rgba(0, 0, 0, 0.2)';
        });
    };

    function clickButtons() {
        const autoOffButton = document.querySelector('.MuiButton-root.MuiButton-outlinedInfo');
        if (autoOffButton) {
            autoOffButton.click();
        };
    };
    setTimeout(clickButtons, 1000);

    function checkIdAndReload() {
        const urlParams = new URLSearchParams(window.location.search);
        id = urlParams.has('id') ? urlParams.get('id') : null;

        if (!window.location.href.startsWith('https://botlesya.ru/ap/logs') && id !== previousId) {
            location.reload();
        };

        previousId = id;
    };
    setInterval(checkIdAndReload, 100);
})();