Kogama Keyboard Injector

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

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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 });
})();