Greasy Fork

银河奶牛放置-Fishpi增强

现在,你可以在挤奶的时候在鱼排聊天聊!

目前为 2025-03-28 提交的版本。查看 最新版本

// ==UserScript==
// @name         银河奶牛放置-Fishpi增强
// @namespace    https://github.com/HereIsYui
// @version      0.0.3
// @description  现在,你可以在挤奶的时候在鱼排聊天聊!
// @author       Yui
// @match        https://www.milkywayidle.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=milkywayidle.com
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @license MIT
// ==/UserScript==

(function () {
    'use strict';
    var tabMenu;
    var chatContent;
    var preSendBtn;
    var fishpiSendBtn;
    var preInput;
    var fishpiInput;
    var isFishpiPage = false;
    // 请填写你的鱼排 ApiKey
    var fishpiApiKey = "";
    addFishpiTab();
    GM_addStyle('.fishpi-content p{margin:0}')
    // 添加鱼排聊天室tab
    function addFishpiTab() {
        log('尝试加载Tab...');
        tabMenu = document.querySelector('.GamePage_chatPanel__mVaVt .MuiTabs-flexContainer');
        chatContent = document.querySelector('.Chat_tabsComponentContainer__3ZoKe .TabsComponent_tabPanelsContainer__26mzo');
        if (!tabMenu) {
            setTimeout(() => {
                addFishpiTab();
            }, 500);
            return;
        }
        log('加载Tab列表成功');
        let fishpiTab = document.createElement('button');
        fishpiTab.innerHTML = '<span class="MuiBadge-root TabsComponent_badge__1Du26 css-1rzb3uu">鱼排<span class="MuiBadge-badge MuiBadge-standard MuiBadge-invisible MuiBadge-anchorOriginTopRight MuiBadge-anchorOriginTopRightRectangular MuiBadge-overlapRectangular MuiBadge-colorInfo css-193k565">0</span></span><span class="MuiTouchRipple-root css-w0pj6f"></span>';
        fishpiTab.classList.add('MuiButtonBase-root', 'MuiTab-root', 'MuiTab-textColorPrimary', 'css-1q2h7u5', 'fishpi-tab');
        fishpiTab.addEventListener('click', () => {
            changeMenuTabToFish();
        })
        let list = tabMenu.children;
        for (let i = 0; i < list.length; i++) {
            let item = list[i];
            item.addEventListener('click', () => {
                changeMenuTabToOther();
                chatContent.children[i].classList.remove('TabPanel_hidden__26UM3');
            })
        }
        let fishpiContent = document.createElement('div');
        fishpiContent.innerHTML = '<div class="Chat_chatChannel__gQ-21"><div class="ChatHistory_chatHistory__1EiG3"></div></div>';
        fishpiContent.classList.add('TabPanel_tabPanel__tXMJF', 'TabPanel_hidden__26UM3', 'fishpi-content');
        tabMenu.appendChild(fishpiTab);
        chatContent.appendChild(fishpiContent);
        window.tabMenu = tabMenu;
        window.fishpiContent = fishpiContent;

        preSendBtn = document.querySelector('.Chat_chat__3DQkj .Button_button__1Fe9z.Button_fullWidth__17pVU');
        fishpiSendBtn = document.createElement('button');
        fishpiSendBtn.classList.add('Button_button__1Fe9z', 'Button_fullWidth__17pVU', 'fishpi_send_btn');
        fishpiSendBtn.innerHTML = "发送2";
        fishpiSendBtn.addEventListener('click', () => {
            fishpiSendMsg();
        })
        let btnBox = document.querySelector('.Chat_buttonContainer__1rw8b');
        fishpiSendBtn.style.display = 'none';
        btnBox.appendChild(fishpiSendBtn);

        preInput = document.querySelector('.Chat_chatInput__16dhX');
        fishpiInput = document.createElement('input');
        fishpiInput.classList.add('Chat_chatInput__16dhX', 'fishpi_input');
        fishpiInput.setAttribute('placeholder', '请输入消息...');
        fishpiInput.style.display = 'none';
        btnBox.parentElement.insertBefore(fishpiInput, btnBox);
        log('鱼排注入成功');
        if (fishpiApiKey != "") {
            initFishpiWS();
        } else {
            addTips();
        }
        window.addEventListener(
            "keydown",
            function (event) {
                if (event.key === "Enter" && isFishpiPage) {
                    // 阻止默认行为
                    event.preventDefault();
                    // 阻止事件冒泡
                    event.stopPropagation();
                    fishpiSendMsg()
                }
            },
            true,
        );
    };


    // 切换到fishpi聊天室
    function changeMenuTabToFish() {
        let list = tabMenu.children;
        for (let i = 0; i < list.length; i++) {
            let item = list[i];
            let contentItem = chatContent.children[i];
            item.classList.remove('Mui-selected');
            contentItem.classList.remove('TabPanel_hidden__26UM3');
            contentItem.classList.add('TabPanel_hidden__26UM3');
            if (item.innerHTML.indexOf('鱼排') > 0) {
                item.classList.add('Mui-selected')
                contentItem.classList.remove('TabPanel_hidden__26UM3');
            }
        }
        fishpiSendBtn.style.display = 'block';
        fishpiInput.style.display = 'block';
        preSendBtn.style.display = 'none';
        preInput.style.display = 'none';
        isFishpiPage = true;
        autoScrollToBottom(fishpiContent);
    }

    function changeMenuTabToOther() {
        let fishpiTab = document.querySelector('.fishpi-tab');
        if (fishpiTab) {
            fishpiTab.classList.remove('Mui-selected');
        }
        let fishpiContent = document.querySelector('.fishpi-content');
        if (fishpiContent) {
            fishpiContent.classList.add('TabPanel_hidden__26UM3');
        }

        fishpiSendBtn.style.display = 'none';
        fishpiInput.style.display = 'none';
        preSendBtn.style.display = 'block';
        preInput.style.display = 'block';
        isFishpiPage = false;
    }

    // 打印日志
    function log(text) {
        console.log(`%c[Fishpi] %c${text}`, 'color:#e59230;font-weight:bold;', 'color:#333;');
    }

    function autoScrollToBottom(element) {
        // 检查是否已经接近底部(避免不必要的滚动)
        element.scrollTop = element.scrollHeight;
    }


    /**
     * 以下是鱼排api
     */
    function getFishpiApikey(nameOrEmail, userPassword, mfaCode) {
        GM_xmlhttpRequest({
            method: "POST",
            url: "https://fishpi.cn/api/getKey",
            headers: {
                "Content-Type": "application/json",
            },
            data: JSON.stringify({
                nameOrEmail: nameOrEmail,
                userPassword: userPassword,
                mfaCode: mfaCode
            }),
            onload: function (res) {
                log(res);
            },
            onerror: function (error) {
                log(error);
            },
            ontimeout: function () {
                log("请求超时");
            }
        });
    }

    function initFishpiWS() {
        let ws = new WebSocket("wss://rhyus-wuan.fishpi.cn:10834?apiKey=" + fishpiApiKey);
        ws.onopen = function () {
            log("fishpi连接成功");

        };
        ws.onmessage = function (event) {
            let message = JSON.parse(event.data);
            if (message.type == "msg") {
                log(message.content)
                let msgObj = document.createElement('div');
                msgObj.innerHTML = `<span class="ChatMessage_timestamp__1iRZO">[${message.time}] </span><span style="display: inline-block;"><span><span><span class="ChatMessage_name__1W9tB ChatMessage_clickable__58ej2"><div class="CharacterName_characterName__2FqyZ" translate="no"><div class="CharacterName_name__1amXp" data-name="Kingofntr"><span>${message.userNickname != "" ? message.userNickname : message.userName}</span></div><div class="CharacterName_gameMode__2Pvw8"></div></div></span><span>: </span></span></span></span><span>${message.content}</span>`;
                msgObj.classList.add('ChatMessage_chatMessage__2wev4');
                msgObj.style = 'display:flex;align-items:center;';
                let fishpiContent = document.querySelector('.fishpi-content .ChatHistory_chatHistory__1EiG3');
                let fishpiChatContent = document.querySelector('.fishpi-content .ChatHistory_chatHistory__1EiG3');
                fishpiChatContent.appendChild(msgObj);
                autoScrollToBottom(fishpiContent);
            }
        };
    }

    function fishpiSendMsg() {
        let msg = document.querySelector('.fishpi_input');
        if (fishpiApiKey == "") {
            msg.value = "";
            addTips();
            return;
        }
        if (msg.value != "") {
            GM_xmlhttpRequest({
                method: "POST",
                url: "https://fishpi.cn/chat-room/send",
                headers: {
                    "Content-Type": "application/json",
                },
                data: JSON.stringify({
                    content: msg.value,
                    apiKey: fishpiApiKey,
                    client: 'IceNet/milk小分队',
                }),
                onload: function (res) {
                    msg.value = "";
                },
            })
        }
        msg.value = "";
    }

    function addTips() {
        let msgObj = document.createElement('div');
        msgObj.innerHTML = `<span class="ChatMessage_timestamp__1iRZO">[${new Date().toLocaleString()}] </span><span style="display: inline-block;"><span><span><span class="ChatMessage_name__1W9tB ChatMessage_clickable__58ej2"><div class="CharacterName_characterName__2FqyZ" translate="no"><div class="CharacterName_name__1amXp" data-name="Kingofntr"><span>YuiNet</span></div><div class="CharacterName_gameMode__2Pvw8"></div></div></span><span>: </span></span></span></span><span style="color:red;font-widget:bold">请先到插件中填写自己的ApiKey,填写好后请刷新页面</span>`;
        msgObj.classList.add('ChatMessage_chatMessage__2wev4');
        msgObj.style = 'display:flex;align-items:center;';
        let fishpiContent = document.querySelector('.fishpi-content .ChatHistory_chatHistory__1EiG3');
        let fishpiChatContent = document.querySelector('.fishpi-content .ChatHistory_chatHistory__1EiG3');
        fishpiChatContent.appendChild(msgObj);
        autoScrollToBottom(fishpiContent);
    }
})();