Kindroid Mod

Modify background, sound notification, chat opacity, user and kin name on top.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Kindroid Mod
// @version      1.0
// @description  Modify background, sound notification, chat opacity, user and kin name on top.
// @author       TemPassion
// @homepageURL  https://github.com/TenPassion/kindroid-script
// @license      MIT
// @match        https://kindroid.ai/home
// @grant        GM_setValue
// @grant        GM_getValue
// @namespace http://tampermonkey.net/
// ==/UserScript==

(function () {
    'use strict';

    let optionsOpen = true;
    let selectedSoundButton = null;

    function changeText(elements) {
        const text1 = document.querySelector('.css-19hb772');
        const text2 = document.querySelector('.css-ppua9z');
        elements.forEach(function (element) {
            element.textContent =
                text1.textContent + ' x ' + text2.textContent + ' on Kindroid ';
        });
    }

    function changeBackground(imageURL) {
        const targetElement = document.querySelector('.css-1lvpjll');
        if (targetElement) {
            targetElement.style.backgroundImage = 'none';
            if (imageURL !== '') {
                targetElement.style.backgroundImage = `url("${imageURL}")`;
                targetElement.style.backgroundSize = 'cover';
                targetElement.style.backgroundRepeat = 'no-repeat';
            }
        }
    }

    function adjustOpacityTeti0a() {
        const opacityValue = GM_getValue('opacityValue', '0.9');
        const elementsToAdjust = document.querySelectorAll('.css-teti0a');
        elementsToAdjust.forEach(function (element) {
            element.style.opacity = opacityValue;
        });
    }

    function adjustOpacity100dd8p() {
        const opacityValue = GM_getValue('opacityValue', '0.9');
        const elementsToAdjust = document.querySelectorAll('.css-1dhayxc');
        elementsToAdjust.forEach(function (element) {
            element.style.opacity = opacityValue;
        });
    }

    function playNotificationSound(soundURL) {
        const audio = new Audio(soundURL);
        audio.play();
    }

    function applyOpacity(opacityValue) {
        GM_setValue('opacityValue', opacityValue);
        adjustOpacityTeti0a(opacityValue);
        adjustOpacity100dd8p(opacityValue);
    }

    function openOptions() {
        const customModal = document.getElementById('customModal');
        const enableNotificationsCheckbox = document.getElementById('enableNotifications');
        const enableNotifications = GM_getValue('enableNotifications', false); // Récupérer la valeur stockée
        enableNotificationsCheckbox.checked = enableNotifications; // Mettre à jour l'état de la case à cocher
        if (optionsOpen) {
            customModal.style.pointerEvents = 'auto';
            customModal.style.opacity = '1';
        } else {
            customModal.style.pointerEvents = 'none';
            customModal.style.opacity = '0';
        }
        optionsOpen = !optionsOpen;
    }

    function closeOptions() {
        const customModal = document.getElementById('customModal');
        customModal.style.pointerEvents = 'none';
        customModal.style.opacity = '0';
        optionsOpen = false;
    }

    function openBackgroundPopup() {
        const newImageURL = prompt('Enter the URL of the new background image:');
        if (newImageURL !== null) {
            GM_setValue('customImageURL', newImageURL);
            location.reload();
            changeBackground(newImageURL);
        }
    }

    function openSoundSelection() {
        const soundSelectionModal = document.getElementById('soundSelectionModal');
        soundSelectionModal.style.display = 'block';
    }

    function closeSoundSelection() {
        const soundSelectionModal = document.getElementById('soundSelectionModal');
        soundSelectionModal.style.display = 'none';

        // Sauvegarder le son sélectionné
        if (selectedSoundButton) {
            const soundURL = selectedSoundButton.getAttribute('data-sound');
            GM_setValue('selectedSoundURL', soundURL);
        }
    }

    const modalHTML = `
        <div id="customModal" style="position: fixed; bottom: 10px; right: 10px; background-color: #282828; padding: 20px; border: 2px solid #333; z-index: 9999; border-radius: 10px; color: white; opacity: 0; transition: opacity 0.3s ease-in-out;">
            <button id="closeModal" style="position: absolute; top: 10px; right: 10px; background-color: transparent; border: none; color: white; font-size: 20px; cursor: pointer;">✖</button>
            Adjust chat opacity: <input type="range" id="opacitySlider" min="0" max="1" step="0.1" value="0.9" style="width: 100%; background: linear-gradient(to left, #fe8484, #8b6dff); -webkit-appearance: none; height: 8px; border-radius: 5px;"><style>#opacitySlider::-webkit-slider-thumb{background-color:black !important;}</style><br>
            <label for="enableNotifications" style="margin-top: 10px; margin-bottom: 20px; display: block; cursor: pointer;">
                <input type="checkbox" id="enableNotifications" style="margin-right: 5px;"> Enable sound notifications 🔔
            </label>
            <button id="openSoundSelectionButton" style="background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px;">Select Notification Sound</button><br>
            <button id="optionsButton" style="background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px; margin-top: 10px;">Change Background</button><br>
            <button id="saveSettingsButton" style="background: linear-gradient(to right, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px; display: block; margin-top: 10px;">Save Settings 💾</button>
        </div>
    `;

    const soundSelectionHTML = `
        <div id="soundSelectionModal" style="display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: #282828; padding: 20px; border: 2px solid #333; z-index: 9999; border-radius: 10px; color: white;">
            <button id="closeSoundSelection" style="position: absolute; top: 10px; right: 10px; background-color: transparent; border: none; color: white; font-size: 20px; cursor: pointer;">✖</button>
            <h2 style="text-align: center;">Select Notification Sound</h2>
            <button class="soundOption" data-sound="https://www.myinstants.com/media/sounds/discord-notification.mp3" style="display: block; margin-bottom: 10px; background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px;">Discord Message</button>
            <button class="soundOption" data-sound="https://www.redringtones.com/wp-content/uploads/2018/06/iphone-ding-sound.mp3" style="display: block; margin-bottom: 10px; background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px;">iPhone Message</button>
            <button class="soundOption" data-sound="https://notificationsounds.com/storage/sounds/file-sounds-1192-message.mp3" style="display: block; margin-bottom: 10px; background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px;">Woman Message</button>
            <button class="soundOption" data-sound="https://notificationsounds.com/storage/sounds/file-sounds-1309-man-message.mp3" style="display: block; margin-bottom: 10px; background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px;">Man Message</button>
            <button class="soundOption" data-sound="https://notificationsounds.com/storage/sounds/file-sounds-1195-mmm.mp3" style="display: block; margin-bottom: 10px; background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px;">Woman Hmmm</button>
            <button class="soundOption" data-sound="https://notificationsounds.com/storage/sounds/file-sounds-1295-man-hmmm.mp3" style="display: block; margin-bottom: 10px; background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px;">Man Hmmm</button>
            <button class="soundOption" data-sound="https://notificationsounds.com/storage/sounds/file-sounds-1233-elegant.mp3" style="display: block; margin-bottom: 10px; background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px;">Elegant</button>
            <button class="soundOption" data-sound="https://notificationsounds.com/storage/sounds/file-sounds-1100-open-ended.mp3" style="display: block; margin-bottom: 10px; background: linear-gradient(to left, #fe8484, #8b6dff); border: none; color: white; cursor: pointer; padding: 10px 20px; border-radius: 5px;">Open Ended</button>
        </div>
    `;

    document.body.insertAdjacentHTML('beforeend', modalHTML);
    document.body.insertAdjacentHTML('beforeend', soundSelectionHTML);

    const closeModalButton = document.getElementById('closeModal');
    const optionsButton = document.getElementById('optionsButton');
    const opacitySlider = document.getElementById('opacitySlider');
    const customModal = document.getElementById('customModal');
    const enableNotificationsCheckbox = document.getElementById(
        'enableNotifications'
    );
    const saveSettingsButton = document.getElementById('saveSettingsButton');
    const openSoundSelectionButton = document.getElementById(
        'openSoundSelectionButton'
    );
    const closeSoundSelectionButton = document.getElementById(
        'closeSoundSelection'
    );
    const soundOptions = document.querySelectorAll('.soundOption');

    closeModalButton.addEventListener('click', closeOptions);

    optionsButton.addEventListener('click', () => {
        openOptions();
        openBackgroundPopup(); // Ouvre la popup URL lorsque vous cliquez sur "Change Background"
    });

    openSoundSelectionButton.addEventListener('click', openSoundSelection);
    closeSoundSelectionButton.addEventListener('click', closeSoundSelection);

    enableNotificationsCheckbox.addEventListener('change', () => {
        const isChecked = enableNotificationsCheckbox.checked;
        GM_setValue('enableNotifications', isChecked); // Sauvegarder la nouvelle valeur
    });


    saveSettingsButton.addEventListener('click', () => {
        const opacityValue = opacitySlider.value;
        GM_setValue('opacityValue', opacityValue);
        const isChecked = enableNotificationsCheckbox.checked;
        GM_setValue('enableNotifications', isChecked);
        location.reload();

        closeOptions();

        // Jouer le son des notifications avec le son sélectionné
        const selectedSoundURL = GM_getValue('selectedSoundURL', '');
        if (isChecked && selectedSoundURL !== '') {
            playNotificationSound(selectedSoundURL);
        }
    });

    opacitySlider.addEventListener('input', () => {
        const opacityValue = opacitySlider.value;
        applyOpacity(opacityValue);
    });

    const customImageButton = document.createElement('button');
    customImageButton.textContent = '😈';
    customImageButton.style.position = 'fixed';
    customImageButton.style.bottom = '10px';
    customImageButton.style.right = '10px';
    customImageButton.style.zIndex = '9999';
    customImageButton.style.color = 'white';
    customImageButton.style.backgroundColor = '#282828';
    customImageButton.style.border = 'none';
    customImageButton.style.borderRadius = '50%';
    customImageButton.style.padding = '10px';
    customImageButton.style.cursor = 'pointer';
    customImageButton.addEventListener('click', openOptions);

    document.body.appendChild(customImageButton);

    const customImageURL = GM_getValue('customImageURL', '');
    if (customImageURL !== '') {
        changeBackground(customImageURL);
    }

    const selectedSoundURL = GM_getValue('selectedSoundURL', '');
    if (selectedSoundURL !== '') {
        soundOptions.forEach(function (soundOption) {
            const soundURL = soundOption.getAttribute('data-sound');
            if (soundURL === selectedSoundURL) {
                soundOption.style.fontWeight = 'bold';
            }
        });
    }

    soundOptions.forEach(function (soundOption) {
        soundOption.addEventListener('click', function () {
            const soundURL = soundOption.getAttribute('data-sound');
            playNotificationSound(soundURL);
            soundOptions.forEach(function (option) {
                option.style.fontWeight = 'normal';
            });
            soundOption.style.fontWeight = 'bold';
            selectedSoundButton = soundOption;
        });
    });

    const observer = new MutationObserver(function (mutationsList, observer) {
        for (let mutation of mutationsList) {
            if (mutation.type === 'childList') {
                const elements = document.querySelectorAll('.chakra-text.css-s68iw5');
                if (elements.length > 0) {
                    changeText(elements);
                    changeBackground(customImageURL);
                    const opacityValue = document.querySelector(
                        'input[type="range"]'
                    ).value;
                    applyOpacity(opacityValue);
                    const enableNotifications = GM_getValue('enableNotifications', false);
                    if (enableNotifications) {
                        const removedElements = mutation.removedNodes;
                        removedElements.forEach(function (removedElement) {
                            if (
                                removedElement.classList &&
                                removedElement.classList.contains('css-1ulhpcc')
                            ) {
                                playNotificationSound(selectedSoundURL);
                            }
                        });
                        const newElements = mutation.addedNodes;
                        newElements.forEach(function (newElement) {
                            if (
                                newElement.classList &&
                                newElement.classList.contains('css-teti0a')
                            ) {
                                playNotificationSound(selectedSoundURL);
                            }
                        });
                    }
                }
            }
        }
    });

    observer.observe(document.body, { childList: true, subtree: true });
})();