[GC] - Bilge Dice Keyboard Controls & Tracking Enhancements

Keyboard controls for Bilge Dice. Streak tracking tweaked so the new in-game streak is displayed during gameplay. You can now press enter to start a game with a default Ante, which is set to 10 NP unless you change it.

// ==UserScript==
// @name        [GC] - Bilge Dice Keyboard Controls & Tracking Enhancements
// @namespace   https://greasyfork.org/en/users/1225524-kaitlin
// @match       https://www.grundos.cafe/games/bilgedice/*
// @license     MIT
// @version     2.3
// @grant       GM_getValue
// @grant       GM_setValue
// @author      Cupkait
// @icon        https://i.imgur.com/4Hm2e6z.png
// @description Keyboard controls for Bilge Dice. Streak tracking tweaked so the new in-game streak is displayed during gameplay. You can now press enter to start a game with a default Ante, which is set to 10 NP unless you change it.
// ==/UserScript==

const activeGame = document.querySelector("#bilge-dice-user-wrapper");
const gameStart = document.querySelector("form.mt-1");

//CHANGE BELOW TO HAVE ENTER DEFAULT TO A SPECIFIC ANTE AMOUNT
//** Don't set a default higher than you've unlocked or it won't work!
//1=10 NP, 2=50 NP,3=100 NP, 4=200 NP, 5=500 NP,6=1000 NP 
const defaultAnteIndex = 1;

function indexElements(elements) {
    if (elements) {
        elements.forEach((element, index) => {
            const key = (index + 1).toString();
            const label = document.createElement('label');
            label.textContent = key;
            label.style.fontWeight = 'bold';
            label.style.fontSize = '10px';
            label.style.color = 'black';
            label.style.background = 'EEEEEE';
            label.style.marginRight = '1px';
            element.parentNode.insertBefore(label, element);
        });
    }
}

function createPlayStreakDiv() {
    const playStreakDiv = document.createElement('div');
    playStreakDiv.textContent = `${GM_getValue("playStreak", "N/A")}`;
    return playStreakDiv;
}

function handleCheckboxEvent(key, checkboxes) {
    const index = parseInt(key) - 1;
    if (checkboxes.length > 0 && index < checkboxes.length) {
        checkboxes[index].checked = !checkboxes[index].checked;
        checkboxes[index].dispatchEvent(new Event('change', { bubbles: true }));
    }
}

function handleEnterKeyEvent(buttonSelector) {
    const button = document.querySelector(buttonSelector);
    if (button) {
        button.click();
    }
}

if (activeGame) {
    const pageContent = document.querySelector('#page_content');
    pageContent.appendChild(createPlayStreakDiv());
    indexElements(activeGame.querySelectorAll('input[type="checkbox"]'));

    const submitButton = document.querySelector("#bilge-dice-user-wrapper > form");

    const spaceText = document.createElement('p');
    spaceText.textContent = '(Press Space to Keep All)';
    spaceText.style.fontSize = '10px';
    spaceText.style.width = 'auto';
    spaceText.style.fontWeight = 'bold';
    spaceText.style.textAlign = 'center';

    submitButton.insertAdjacentElement('afterend', spaceText);

    document.addEventListener('keydown', event => {
        const key = event.key;

        if (key >= '1' && key <= '6') {
            handleCheckboxEvent(key, activeGame.querySelectorAll('input[type="checkbox"]'));
        }

        if (key === ' ') {
            event.preventDefault();
            const checkboxes = activeGame.querySelectorAll('input[type="checkbox"]');
            checkboxes.forEach(checkbox => {
                checkbox.checked = !checkbox.checked;
                checkbox.dispatchEvent(new Event('change', { bubbles: true }));
            });
        }

        if (key === 'Enter') {
            handleEnterKeyEvent('#bilge-dice-user-wrapper input[type="submit"]');
        }
    });
} else if (gameStart) {
    const playStreakElement = document.querySelector("#page_content > div:nth-child(6) > p:nth-child(1)");
    const playStreak = playStreakElement ? playStreakElement.textContent : null;

    if (playStreak) {
        GM_setValue("playStreak", playStreak);
    }

    const pageContent = document.querySelector('#page_content');
    pageContent.appendChild(createPlayStreakDiv());
    indexElements(gameStart.querySelectorAll('input[type="submit"]'));

    document.addEventListener('keydown', event => {
        const key = event.key;

        if (key >= '1' && key <= '6') {
            handleEnterKeyEvent('#page_content > div:nth-child(5) > form input[type="submit"]');
        }

        if (key === 'Enter') {
            const options = gameStart.querySelectorAll('input[type="submit"]');
            const selectedOption = options[defaultAnteIndex - 1];
            if (selectedOption) {
                selectedOption.click();
            }
        }
    });
} else {
    const pageContent = document.querySelector('#page_content');
    if (pageContent) {
        pageContent.appendChild(createPlayStreakDiv());
    }

    document.addEventListener('keydown', event => {
        if (event.key === 'Enter') {
            handleEnterKeyEvent('#page_content input[type="submit"]');
        }
    });
}