Greasy Fork

Greasy Fork is available in English.

ssby-自动匹配并自动离开

自动匹配脚本(增强版)

// ==UserScript==
// @name         ssby-自动匹配并自动离开
// @namespace    wwbnq
// @version      0.1
// @description  自动匹配脚本(增强版)
// @author       WWBNQ
// @match        *://*.shushubuyue.net/*
// @match        *://*.shushubuyue.com/*
// @match        *://*.unclenoway.net/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=shushubuyue.net
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    const GREETING = "你好!";

    // 打印日志函数
    function log(message) {
        console.log(`[SSBY-DEBUG] ${message}`);
    }

    function isPartnerLeftBySystemMessage() {
        const systemMessages = document.querySelectorAll('.sys-msg.sys-msg-red');
        for (const message of systemMessages) {
            const partnerInfo = message.querySelector("#partnerInfoText");
            if (partnerInfo && partnerInfo.innerText.trim() === "对方离开了。") {
                log("检测到系统消息:对方离开了。");
                return true;
            }
        }
        return false;
    }

    function isDisconnected() {
        const systemMessages = document.querySelectorAll('.sys-msg.sys-msg-red');
        for (const message of systemMessages) {
            const partnerInfo = message.querySelector("#partnerInfoText");
            if (partnerInfo && partnerInfo.innerText.trim() === "您断开了连线。") {
                log("检测到自身状态:您断开了连线。");
                return true;
            }
        }
        return false;
    }

    function stay() {
        try {
            const msgInput = document.querySelector("#msgInput");
            const sendButton = document.querySelector("a.button-link.msg-send");
            const rightMessageCount = document.querySelectorAll(".message.right").length;

            const isPartnerLeft = () => {
                const partnerInfo = document.querySelector("#partnerInfoText");
                const leftBySystem = isPartnerLeftBySystemMessage();
                if (!partnerInfo || partnerInfo.innerText.trim() === "对方离开了。" || leftBySystem) {
                    log("检测到对方已离开,准备处理离开逻辑。");
                    return true;
                }
                return false;
            };

            if (isPartnerLeft()) {
                handlePartnerLeft();
                return;
            }

            if (rightMessageCount !== 0) {
                log("已有发送的消息,无需再次发送问候语。");
                return;
            }

            if (!msgInput || !sendButton) {
                log("未找到消息输入框或发送按钮,准备处理离开逻辑。");
                handlePartnerLeft();
                return;
            }

            msgInput.value = GREETING;
            msgInput.dispatchEvent(new Event('input'));
            msgInput.dispatchEvent(new Event('change'));

            if (isPartnerLeft()) {
                handlePartnerLeft();
                return;
            }

            if (msgInput.value === GREETING) {
                log("发送问候语:" + GREETING);
                sendButton.click();
            }
        } catch (e) {
            log("stay 函数发生错误:" + e.message);
        }
    }

    function leave() {
        try {
            const leaveButton = document.querySelector("a.button-link.chat-control");
            if (leaveButton) {
                log("点击离开按钮。");
                leaveButton.click();

                // 检查是否存在二次确认的离开按钮
                setTimeout(() => {
                    const confirmLeaveButton = document.querySelector("span.actions-modal-button.actions-modal-button-bold.color-danger");
                    if (confirmLeaveButton && confirmLeaveButton.innerText === "离开") {
                        log("点击二次确认的离开按钮。");
                        confirmLeaveButton.click();
                    }
                }, 500); // 延迟500ms以确保弹窗加载完成
            }
        } catch (e) {
            log("leave 函数发生错误:" + e.message);
        }
    }

    function handlePartnerLeft() {
        try {
            let leaveButton = document.querySelector("span.chat-control");

            if (leaveButton && leaveButton.innerText === "离开") {
                log("检测到离开按钮,点击离开。");
                leaveButton.click();

                // 检查是否存在二次确认的离开按钮
                setTimeout(() => {
                    const confirmLeaveButton = document.querySelector("span.actions-modal-button.actions-modal-button-bold.color-danger");
                    if (confirmLeaveButton && confirmLeaveButton.innerText === "离开") {
                        log("点击二次确认的离开按钮。");
                        confirmLeaveButton.click();
                    }
                }, 500); // 延迟500ms以确保弹窗加载完成
            } else {
                // 检查是否满足重新开始的前置条件
                const disconnectedMessage = Array.from(document.querySelectorAll('.sys-msg.sys-msg-red')).find(message => {
                    const partnerInfo = message.querySelector("#partnerInfoText");
                    return partnerInfo && partnerInfo.innerText.trim() === "您断开了连线。";
                });

                if (disconnectedMessage) {
                    log("检测到断开连线消息,尝试点击重新开始按钮。");
                    // 精确定位“重新开始”按钮
                    const restartButton = document.querySelector(".bar-footer.msg-footer .chat-control");
                    if (restartButton && restartButton.innerText === "重新开始") {
                        log("点击重新开始按钮。");
                        restartButton.click();
                    }
                }
            }
        } catch (e) {
            log("handlePartnerLeft 函数发生错误:" + e.message);
        }
    }

    function init() {
        setInterval(() => {
            try {
                const tab = document.querySelector("#partnerInfoText");
                const tabText = tab ? tab.innerText.trim() : '';

                // 判断自身状态是否为“您断开了连线”
                if (isDisconnected()) {
                    log("检测到自身状态:您断开了连线,进入重新开始逻辑。");
                    handlePartnerLeft();
                    return;
                }

                if (tabText === "对方离开了。" || isPartnerLeftBySystemMessage()) {
                    log("检测到对方离开,进入离开处理逻辑。");
                    handlePartnerLeft();
                    return;
                }

                if (tabText.includes("女生")) {
                    log("检测到对方为女生,保持会话。");
                    stay();
                } else if (tabText.includes("男生")) {
                    log("检测到对方为男生,离开会话。");
                    leave();
                } else {
                    log("未知状态,等待进一步检测。");
                }
            } catch (e) {
                log("init 函数发生错误:" + e.message);
            }
        }, 500);
    }

    setTimeout(() => {
        log("初始化脚本...");
        init();
    }, 5000);
})();