Kogama Keyboard Injector

Injects an Apple-like keyboard script into Kogama game pages automatically, including within iframes.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Kogama Keyboard Injector
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Injects an Apple-like keyboard script into Kogama game pages automatically, including within iframes.
// @author       YourName
// @match        *://www.kogama.com/*
// @match        *://friends.kogama.com/*
// @match        *://kogama.com.br/*
// @match        *://www.kogama.com.br/*
// @match        *://kogama.game/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Function to create and inject the keyboard script
    function injectKeyboardScript() {
        const script = document.createElement('script');
        script.textContent = `
            // Your custom keyboard script here
            
            // Create keyboard container
            const keyboardContainer = document.createElement('div');
            keyboardContainer.style.position = 'fixed';
            keyboardContainer.style.bottom = '20px';
            keyboardContainer.style.left = '50%';
            keyboardContainer.style.transform = 'translateX(-50%)';
            keyboardContainer.style.width = '95%';
            keyboardContainer.style.maxWidth = '1200px';
            keyboardContainer.style.height = '300px';
            keyboardContainer.style.backgroundColor = '#d4d4d4';  // Light grey background
            keyboardContainer.style.border = '1px solid #ccc';
            keyboardContainer.style.borderRadius = '15px';
            keyboardContainer.style.zIndex = '10000';
            keyboardContainer.style.display = 'none'; // Initially hidden
            keyboardContainer.style.padding = '10px';
            keyboardContainer.style.boxShadow = '0px 4px 15px rgba(0,0,0,0.2)';
            keyboardContainer.style.userSelect = 'none';
            keyboardContainer.style.fontFamily = 'sans-serif'; // Apple-like font
            document.body.appendChild(keyboardContainer);

            // Function to toggle keyboard visibility
            function toggleKeyboardVisibility() {
                if (keyboardContainer.style.display === 'none') {
                    keyboardContainer.style.display = 'block';
                } else {
                    keyboardContainer.style.display = 'none';
                }
            }

            // Detect if the user is on mobile or PC
            const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);

            if (isMobile) {
                // Mobile: Create open/close button
                const toggleButton = document.createElement('button');
                toggleButton.textContent = '⌨️ Open Keyboard';
                toggleButton.style.position = 'fixed';
                toggleButton.style.bottom = '330px';
                toggleButton.style.left = '10px';
                toggleButton.style.padding = '10px 20px';
                toggleButton.style.zIndex = '10001';
                toggleButton.style.backgroundColor = '#007aff';  // Apple blue color
                toggleButton.style.color = '#fff';
                toggleButton.style.border = 'none';
                toggleButton.style.borderRadius = '5px';
                toggleButton.style.fontSize = '16px';
                toggleButton.style.boxShadow = '0px 2px 5px rgba(0,0,0,0.2)';
                document.body.appendChild(toggleButton);

                // Toggle keyboard visibility when button is clicked
                toggleButton.addEventListener('click', () => {
                    toggleKeyboardVisibility();
                    toggleButton.textContent = keyboardContainer.style.display === 'none' ? '⌨️ Open Keyboard' : '⌨️ Close Keyboard';
                });
            } else {
                // PC: Listen for 'T' key press to toggle keyboard visibility
                document.addEventListener('keydown', (e) => {
                    if (e.key.toLowerCase() === 't') {
                        toggleKeyboardVisibility();
                    }
                });
            }

            // Draggable functionality for both cursor and touch
            let isDragging = false;
            let offsetX, offsetY;

            function startDrag(e) {
                isDragging = true;
                offsetX = e.clientX ? e.clientX - keyboardContainer.getBoundingClientRect().left : e.touches[0].clientX - keyboardContainer.getBoundingClientRect().left;
                offsetY = e.clientY ? e.clientY - keyboardContainer.getBoundingClientRect().top : e.touches[0].clientY - keyboardContainer.getBoundingClientRect().top;
            }

            function drag(e) {
                if (isDragging) {
                    const x = e.clientX ? e.clientX : e.touches[0].clientX;
                    const y = e.clientY ? e.clientY : e.touches[0].clientY;
                    keyboardContainer.style.left = \`\${x - offsetX}px\`;
                    keyboardContainer.style.top = \`\${y - offsetY}px\`;
                }
            }

            function stopDrag() {
                isDragging = false;
            }

            keyboardContainer.addEventListener('mousedown', startDrag);
            document.addEventListener('mousemove', drag);
            document.addEventListener('mouseup', stopDrag);

            keyboardContainer.addEventListener('touchstart', startDrag);
            document.addEventListener('touchmove', drag);
            document.addEventListener('touchend', stopDrag);

            // Keyboard keys array (including arrow keys and spacebar)
            const keys = [
                ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'],
                ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'],
                ['Z', 'X', 'C', 'V', 'B', 'N', 'M'],
                ['ArrowUp'],
                ['ArrowLeft', 'Space', 'ArrowRight'],
                ['ArrowDown']
            ];

            // Create key buttons
            keys.forEach(row => {
                const rowDiv = document.createElement('div');
                rowDiv.style.display = 'flex';
                rowDiv.style.justifyContent = 'center';
                rowDiv.style.marginBottom = '10px';

                row.forEach(key => {
                    const keyButton = document.createElement('button');
                    keyButton.textContent = key === 'Space' ? '' : key;
                    keyButton.style.flex = key === 'Space' ? '2' : 'none';
                    keyButton.style.padding = '15px';
                    keyButton.style.margin = '2px';
                    keyButton.style.borderRadius = '8px';
                    keyButton.style.fontSize = '18px';
                    keyButton.style.backgroundColor = '#ffffff';  // White keys
                    keyButton.style.border = '1px solid #ddd';
                    keyButton.style.boxShadow = '0px 2px 4px rgba(0,0,0,0.1)';
                    keyButton.style.fontFamily = 'Arial, sans-serif';
                    rowDiv.appendChild(keyButton);

                    // Key press event listener
                    keyButton.addEventListener('click', () => {
                        handleKeyPress(key);
                    });
                });

                keyboardContainer.appendChild(rowDiv);
            });

            // Handle key press (send key event to Kogama)
            function handleKeyPress(key) {
                const event = new KeyboardEvent('keydown', {
                    key: key === 'Space' ? ' ' : key,
                    code: \`Key\${key.toUpperCase()}\`,
                    keyCode: key === 'Enter' ? 13 : key.charCodeAt(0),
                    bubbles: true,
                    cancelable: true
                });

                document.dispatchEvent(event);

                // Custom API interaction for Kogama
                if (typeof kogamaAPI !== 'undefined') {
                    kogamaAPI.sendKey(key);  // Example, replace with actual API function
                }
            }

            // Kogama API integration (example, replace with actual API calls)
            const kogamaAPI = {
                sendKey: function(key) {
                    console.log(\`Sending key: \${key} to Kogama API\`);
                    // Implement actual Kogama API interaction here for movement and jumping
                }
            };

            // Ensure the keyboard works on dynamically loaded pages
            function checkForGamePage() {
                // Check if the game or other specific page is loaded
                const gameFrame = document.querySelector('iframe[src*="game"]');
                if (gameFrame) {
                    // Insert keyboard into game frame if it's loaded in an iframe
                    gameFrame.contentWindow.document.body.appendChild(keyboardContainer);
                } else {
                    // Attach to main document body if not in an iframe
                    document.body.appendChild(keyboardContainer);
                }
            }

            // Run check on page load
            checkForGamePage();

            // Run check when navigating between pages (using MutationObserver)
            const observer = new MutationObserver(checkForGamePage);
            observer.observe(document.body, { childList: true, subtree: true });
        `;
        document.body.appendChild(script);
    }

    // Inject the keyboard script when the page loads
    window.addEventListener('load', injectKeyboardScript);

    // Optionally, re-inject on navigation within the site (e.g., when navigating to different game pages)
    const observer = new MutationObserver(() => {
        injectKeyboardScript();
    });

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