Greasy Fork

Greasy Fork is available in English.

allie test

tab

当前为 2025-06-10 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/538683/1605097/allie%20test.js

Tabs.Chat = {
    tabOrder: 900,
    tabLabel: 'Chat',
    tabDisabled: false,
    myDiv: null,
    globalChatDiv: null,
    allianceChatDiv: null,
    inputDiv: null,
    userListDiv: null,
    currentChatType: 'global',

    init: function(div) {
        var t = Tabs.Chat;
        t.myDiv = div;
        t.createMainDiv();
        t.hookGameChat();
        t.updateUserList();
    },

    createMainDiv: function() {
        var t = Tabs.Chat;
        var m = '<DIV class=divHeader align=center>' + tx('CHAT') + '</div>';
        
        m += '<div id="pbChatTabs" style="margin-bottom:10px;">';
        m += '<button id="pbGlobalChatTab" class="tabActive">Global Chat</button>';
        m += '<button id="pbAllianceChatTab">Alliance Chat</button>';
        m += '</div>';
        
        m += '<div id="pbChatRoom" style="display:flex; height:500px; border:1px solid #888;">';
        m += '<div id="pbUserList" style="width:150px; border-right:1px solid #888; overflow-y:auto;"></div>';
        m += '<div style="flex-grow:1; display:flex; flex-direction:column;">';
        m += '<div id="pbGlobalChatContent" style="flex-grow:1; overflow-y:auto; padding:10px;"></div>';
        m += '<div id="pbAllianceChatContent" style="flex-grow:1; overflow-y:auto; padding:10px; display:none;"></div>';
        m += '<div id="pbChatInput" style="border-top:1px solid #888; padding:10px;"></div>';
        m += '</div>';
        m += '</div>';

        t.myDiv.innerHTML = m;
        
        t.globalChatDiv = ById('pbGlobalChatContent');
        t.allianceChatDiv = ById('pbAllianceChatContent');
        t.userListDiv = ById('pbUserList');
        t.inputDiv = ById('pbChatInput');

        ById('pbGlobalChatTab').addEventListener('click', function() { t.switchChatType('global'); });
        ById('pbAllianceChatTab').addEventListener('click', function() { t.switchChatType('alliance'); });

        t.cloneGameChatInput();
    },

    hookGameChat: function() {
        var t = Tabs.Chat;
        var gameChatContainer = document.querySelector('#mod_comm_list1');
        var gameAllianceChatContainer = document.querySelector('#mod_comm_list2');
        
        if (gameChatContainer && gameAllianceChatContainer) {
            var observerGlobal = new MutationObserver(function(mutations) {
                t.updateChat('global');
            });

            var observerAlliance = new MutationObserver(function(mutations) {
                t.updateChat('alliance');
            });

            observerGlobal.observe(gameChatContainer, { childList: true, subtree: true });
            observerAlliance.observe(gameAllianceChatContainer, { childList: true, subtree: true });
            
            t.updateChat('global');
            t.updateChat('alliance');
        } else {
            console.error('Could not find game chat containers');
        }
    },

    updateChat: function(chatType) {
        var t = Tabs.Chat;
        var gameChatContainer = (chatType === 'global') ? 
            document.querySelector('#mod_comm_list1') : 
            document.querySelector('#mod_comm_list2');
        var targetDiv = (chatType === 'global') ? t.globalChatDiv : t.allianceChatDiv;
        
        if (gameChatContainer && targetDiv) {
            targetDiv.innerHTML = gameChatContainer.innerHTML;
            targetDiv.scrollTop = targetDiv.scrollHeight;
        }
    },

    cloneGameChatInput: function() {
        var t = Tabs.Chat;
        var gameChatInput = document.querySelector('#mod_comm_input');
        if (gameChatInput) {
            var inputClone = gameChatInput.cloneNode(true);
            t.inputDiv.appendChild(inputClone);

            var chatTextArea = t.inputDiv.querySelector('textarea');
            var sendButton = t.inputDiv.querySelector('button');
            
            if (chatTextArea && sendButton) {
                chatTextArea.style.width = '100%';
                sendButton.style.width = '100%';
                sendButton.style.marginTop = '5px';

                chatTextArea.addEventListener('keypress', function(e) {
                    if (e.key === 'Enter' && !e.shiftKey) {
                        e.preventDefault();
                        t.sendChat();
                    }
                });

                sendButton.addEventListener('click', function() {
                    t.sendChat();
                });
            }
        } else {
            console.error('Could not find game chat input');
        }
    },

    sendChat: function() {
        var t = Tabs.Chat;
        var chatTextArea = t.inputDiv.querySelector('textarea');
        var originalChatTextArea = document.querySelector('#mod_comm_input textarea');
        var originalSendButton = document.querySelector('#mod_comm_input button');
        
        if (chatTextArea && originalChatTextArea && originalSendButton) {
            var message = chatTextArea.value.trim();
            if (message !== '') {
                // First, make sure we're on the right chat tab in the game
                var tabSelector = document.querySelector('#mod_comm_tabs');
                if (tabSelector) {
                    // Find the correct tab based on our current chat type
                    var tabIndex = (t.currentChatType === 'global') ? 0 : 1;
                    
                    // Try to select the tab in the game's interface
                    var tabToClick = document.querySelector('#mod_comm_tabs li:nth-child(' + (tabIndex + 1) + ')');
                    if (tabToClick) {
                        tabToClick.click();
                        
                        // Give the game a moment to switch tabs
                        setTimeout(function() {
                            // Now set the message and send it
                            originalChatTextArea.value = message;
                            
                            // Trigger input event to ensure the game recognizes the text
                            var inputEvent = new Event('input', { bubbles: true });
                            originalChatTextArea.dispatchEvent(inputEvent);
                            
                            // Focus the textarea (some games require this)
                            originalChatTextArea.focus();
                            
                            // Click the send button
                            originalSendButton.click();
                            
                            // Clear our textarea
                            chatTextArea.value = '';
                            
                            // Update our chat display after a short delay
                            setTimeout(function() {
                                t.updateChat(t.currentChatType);
                            }, 500);
                        }, 100);
                    } else {
                        // If we can't find the tab, try direct method
                        directSend();
                    }
                } else {
                    // If there's no tab selector, try direct method
                    directSend();
                }
                
                // Direct send method as fallback
                function directSend() {
                    originalChatTextArea.value = message;
                    
                    // Trigger input event
                    var inputEvent = new Event('input', { bubbles: true });
                    originalChatTextArea.dispatchEvent(inputEvent);
                    
                    originalChatTextArea.focus();
                    originalSendButton.click();
                    chatTextArea.value = '';
                    
                    setTimeout(function() {
                        t.updateChat(t.currentChatType);
                    }, 500);
                }
            }
        } else {
            console.error('Could not find necessary elements to send chat');
        }
    },

    switchChatType: function(chatType) {
        var t = Tabs.Chat;
        t.currentChatType = chatType;
        
        if (chatType === 'global') {
            t.globalChatDiv.style.display = 'block';
            t.allianceChatDiv.style.display = 'none';
            ById('pbGlobalChatTab').className = 'tabActive';
            ById('pbAllianceChatTab').className = '';
        } else {
            t.globalChatDiv.style.display = 'none';
            t.allianceChatDiv.style.display = 'block';
            ById('pbGlobalChatTab').className = '';
            ById('pbAllianceChatTab').className = 'tabActive';
        }
    },

    updateUserList: function() {
        var t = Tabs.Chat;
        // This is a placeholder function. You'll need to implement the actual user list retrieval
        // based on how your game manages online users.
        var onlineUsers = ['User1', 'User2', 'User3']; // Replace with actual online users
        
        var userListHTML = '<div class="divHeader">Online Users</div>';
        onlineUsers.forEach(function(user) {
            userListHTML += '<div class="chatUser">' + user + '</div>';
        });
        
        t.userListDiv.innerHTML = userListHTML;

        // Update the user list periodically
        setTimeout(t.updateUserList, 60000); // Update every minute
    }
};