Greasy Fork

Greasy Fork is available in English.

227229 bot

很喜欢jg的一句话,明天下午东南亚单排

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

// ==UserScript==
// @name         227229 bot
// @namespace    http://tampermonkey.net/
// @version      2.3
// @description  很喜欢jg的一句话,明天下午东南亚单排
// @author       Reesedog
// @match        https://www.douyu.com/227229*
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
    "use strict";

    // 弹幕模板部分 ==============================================================================================================
    // 定义弹幕模板
    const templates = [
        "一直为这些五千分的细节沾沾自喜,我",
        "(不可思议)(假装自责),(自暴自弃)(切屏封人)",
        "下一个搞 吗,收到鸡哥收到",
        "第一天,第二天,第三天,4000+",
        "唔,",
        // 根据需要添加更多模板
        // todo: "(emoji+词语)x5",
    ];

    const cosplayGroups = {
        "CP组": ["烈女不怕死丶"],
        "偶像组": ["徐志雷Burning"],
        "仇人组": ["yyfyyf", "yyfyyf", "LGD_y", "LGD_Faithbian", "张宁xiao8", "Maybeee222"],
        "皮套组": ["七海nana7mi", "阿梓梓梓梓丶"],
        "mdy组:": ["ameame", "SetsuRy", "kaka胡良智", "inflame丶hyz", "ctyzzz", "September猫", "Ori曾焦阳","节奏魔王oldeLeVeN", "嘟嘟Lzk", "阿发ava", "xmxm211"],
        "永远幻念": ["幻像踩花", "AI猫雷"]
    };


    // 创建浮动窗口
    let floatWindow = document.createElement("div");
    floatWindow.style.display = "flex";
    floatWindow.style.position = "fixed";
    floatWindow.style.top = "30%";
    floatWindow.style.right = "0";
    floatWindow.style.transform = "translateY(-50%)";
    floatWindow.style.backgroundColor = "white";
    floatWindow.style.border = "1px solid black";
    floatWindow.style.padding = "10px";
    floatWindow.style.zIndex = "10000";
    floatWindow.style.flexDirection = "column"; // 添加这一行来使元素竖向排列

    document.body.appendChild(floatWindow);

    // 创建模板下拉菜单
    let templateMenu = document.createElement("select");
    templateMenu.style.width = "323px";

    // 添加模板占位符选项
    let placeholderOption = document.createElement("option");
    placeholderOption.value = "";
    placeholderOption.textContent = "弹幕模板";
    placeholderOption.disabled = true;
    placeholderOption.selected = true;
    templateMenu.appendChild(placeholderOption);

    // 添加模板选项
    templates.forEach((template) => {
        let option = document.createElement("option");
        option.value = template;
        option.textContent = template;
        templateMenu.appendChild(option);
    });

    // 创建cosplay下拉菜单
    let cosplay = document.createElement("select");
    cosplay.style.width = "323px";

    // 添加cosplay占位符选项
    let cosplayPlaceHolder = document.createElement("option");
    cosplayPlaceHolder.value = "";
    cosplayPlaceHolder.textContent = "cosplay";
    cosplayPlaceHolder.disabled = true;
    cosplayPlaceHolder.selected = true;
    cosplay.appendChild(cosplayPlaceHolder);

    // 添加分组和选项
    for (let group in cosplayGroups) {
        let optgroup = document.createElement("optgroup");
        optgroup.label = group;
        cosplayGroups[group].forEach((username) => {
            let option = document.createElement("option");
            option.value = username;
            option.textContent = username;
            optgroup.appendChild(option);
        });
        cosplay.appendChild(optgroup);
    }
    // contentContainer.appendChild(cosplay);
    // contentContainer.appendChild(templateMenu);


    // 创建输入框
    let inputField = document.createElement("textarea");
    inputField.rows = 4;
    inputField.cols = 70;

    inputField.style.width = "200px";
    // inputField.style.marginLeft = "10px";
    // contentContainer.appendChild(inputField);

    // 创建发送按钮
    let sendButton = document.createElement("button");
    sendButton.textContent = "发送";
    sendButton.style.marginLeft = "10px";
    sendButton.style.paddingLeft = "10px";
    sendButton.style.paddingRight = "10px";
    sendButton.style.border = "1px solid black";
    // contentContainer.appendChild(sendButton);

    // 创建折叠/展开按钮
    let toggleButton = document.createElement("button");
    toggleButton.textContent = "🤡";
    toggleButton.style.backgroundColor = "orange";
    toggleButton.style.border = "none";
    toggleButton.style.color = "white";
    toggleButton.style.fontSize = "16px";
    toggleButton.style.padding = "0px 10px 5px 10px";
    toggleButton.style.cursor = "pointer";
    toggleButton.style.marginLeft = "10px";
    floatWindow.appendChild(toggleButton);

    // 定义发送弹幕的函数
    function sendDanmu(content) {
        let textarea = document.querySelector("textarea.ChatSend-txt");
        if (textarea) {
            textarea.value = content;
            textarea.focus();
            let sendButton = document.querySelector(".ChatSend-button");
            if (sendButton) {
                sendButton.click(); // 点击发送按钮提交弹幕
            }
        }
    }

    // 发送按钮点击事件
    sendButton.onclick = function () {
        if(cosplay.value!=""){
            sendDanmu("@" + cosplay.value + ":" + inputField.value);
        }else{
            sendDanmu(inputField.value);
        }
    };

    sendButton.addEventListener("click", function() {
        window.scrollTo(0, 0); // 滚动到页面顶部
    });

    // 下拉菜单变更事件
    templateMenu.onchange = function () {
        inputField.value = templateMenu.value;
    };

    // 折叠/展开按钮点击事件
    toggleButton.onclick = function () {
        if (contentContainer.style.display === "none") {
            contentContainer.style.display = "block";
            toggleButton.textContent = "×";
        } else {
            contentContainer.style.display = "none";
            toggleButton.textContent = "🤡";
        }
    };

    // 创建浮窗容器
    let contentContainer = document.createElement("div");
    contentContainer.style.paddingTop = "5px";
    contentContainer.style.display = "none";
    floatWindow.appendChild(contentContainer);

    // 创建表格
    let table = document.createElement("table");
    contentContainer.appendChild(table);

    // 创建第一行:Cosplay下拉菜单
    let row1 = document.createElement("tr");
    let cell1_1 = document.createElement("td");
    cell1_1.textContent = "Cosplay:";
    row1.appendChild(cell1_1);

    let cell1_2 = document.createElement("td");
    cell1_2.appendChild(cosplay);
    row1.appendChild(cell1_2);

    table.appendChild(row1);

    // 创建第二行:弹幕模板下拉菜单
    let row2 = document.createElement("tr");
    let cell2_1 = document.createElement("td");
    cell2_1.textContent = "弹幕模板:";
    row2.appendChild(cell2_1);

    let cell2_2 = document.createElement("td");
    cell2_2.appendChild(templateMenu);
    row2.appendChild(cell2_2);

    table.appendChild(row2);


    // 创建第三行:输入框和发送按钮
    let row3 = document.createElement("tr");

    let cell3_1 = document.createElement("td");
    cell3_1.textContent = "输入弹幕:";
    row3.appendChild(cell3_1);

    let cell3_2 = document.createElement("td");
    cell3_2.style.display = "flex";
    cell3_2.appendChild(inputField);

    inputField.style.marginRight = "10px";
    cell3_2.appendChild(sendButton);

    row3.appendChild(cell3_2);
    table.appendChild(row3);

    // 拖动逻辑
    let isDragging = false;
    let mouseDownX, mouseDownY, initX, initY;
    let mouse_throttle_flag = false;
    let mouse_throttle;

    floatWindow.onmousedown = function (e) {
        if (contentContainer.style.display === "none") {
            // 如果窗口是折叠状态,允许拖动
            isDragging = true;
            mouseDownX = e.pageX;
            mouseDownY = e.pageY;
            initX = floatWindow.offsetLeft;
            initY = floatWindow.offsetTop;

            // 禁止文本选择
            document.body.style.userSelect = "none";

            document.addEventListener("mousemove", onMouseMove);
            document.addEventListener("mouseup", onMouseUp);
        }
    };

    function onMouseMove(e) {
        if (isDragging) {
            if (!mouse_throttle_flag) {
                mouse_throttle_flag = true;
                mouse_throttle = setTimeout(() => {
                    mouse_throttle_flag = false;
                    let mouseMoveX = e.pageX,
                        mouseMoveY = e.pageY;
                    floatWindow.style.right =
                        window.innerWidth - mouseMoveX + mouseDownX - initX - 70 + "px";
                    floatWindow.style.top = mouseMoveY - mouseDownY + initY + "px";
                    floatWindow.style.transform = "none";
                }, 5);
            }
        }
    }

    function onMouseUp() {
        isDragging = false;

        // 恢复文本选择
        document.body.style.userSelect = "";

        document.removeEventListener("mousemove", onMouseMove);
        document.removeEventListener("mouseup", onMouseUp);
    }

    // +1 部分 ==============================================================================================================
    function addButtonToContainer() {
        // 查找按钮容器
        let container = document.querySelector(".btnscontainer-4e2ed0");
        if (!container) return;

        // 检查容器中是否已经存在 +1 按钮
        if (container.querySelector(".plus-one-button")) return;

        // 创建一个分隔符
        let separator = document.createElement("p");
        separator.className = "sugun-e3fbf6";
        separator.textContent = "|";
        container.appendChild(separator);

        // 以与现有按钮相同的样式创建 +1 按钮
        let button = document.createElement("div");
        button.className = "labelfisrt-407af4 plus-one-button"; // 为 +1 按钮添加一个特定的类名
        button.textContent = "+1";
        container.appendChild(button);

        // 为 +1 按钮设置点击事件
        button.onclick = function () {
            let textContent =
                hoveredElement.querySelector(".text-edf4e7").textContent;
            sendDanmu(textContent);
        };

        button.addEventListener("click", function() {
            window.scrollTo(0, 0); // 滚动到页面顶部
        });
    }

    let hoveredElement = null;

    // 当鼠标悬停在具有特定类的元素上时,显示 +1 按钮
    document.addEventListener("mouseover", function (event) {
        // 检查容器中是否已经存在 +1 按钮,防止hoverElement不一致
        let container = document.querySelector(".btnscontainer-4e2ed0");
        if (!container) return;
        if (container.querySelector(".plus-one-button")) return;

        if (event.target.classList.contains("danmuItem-f8e204")) {
            hoveredElement = event.target;
            addButtonToContainer();
        }
    });

    // 防复读部分 ==============================================================================================================
    // 创建一个数组用于维护弹幕的顺序
    const danmuArray = [];

    // 初始化弹幕屏蔽状态
    let blockDanmu = false;

    // 创建按钮
    const button = document.createElement("div");
    button.style.position = "fixed";
    button.style.right = "0";
    button.style.bottom = "40%";
    button.style.backgroundColor = "orange";
    button.style.padding = "10px";
    button.style.cursor = "pointer";
    button.style.zIndex = "10000";
    button.textContent = "屏蔽复读";
    document.body.appendChild(button);

    // 为按钮添加点击事件监听器
    button.addEventListener("click", () => {
        blockDanmu = !blockDanmu;
        button.textContent = blockDanmu ? "开启复读" : "屏蔽复读";
    });

    // 定义一个函数,用于开始观察弹幕容器
    function observeDanmuContainer() {
        const danmuContainer = document.querySelector(".comment-37342a");
        if (danmuContainer) {
            // 创建 MutationObserver 实例,用于观察弹幕容器的变化
            const observer = new MutationObserver((mutations) => {
                mutations.forEach((mutation) => {
                    mutation.addedNodes.forEach((node) => {
                        if (node.nodeType === Node.ELEMENT_NODE) {
                            const textElement = node.querySelector(".text-edf4e7");
                            if (textElement) {
                                const danmuText = textElement.textContent;
                                if (blockDanmu && danmuArray.includes(danmuText)) {
                                    // 如果弹幕已经出现过,则隐藏该弹幕
                                    node.style.display = "none";
                                } else {
                                    // 如果 danmuArray 的长度达到了 50,则删除最旧的弹幕
                                    if (danmuArray.length >= 50) {
                                        danmuArray.shift();
                                    }
                                    // 将新弹幕添加到数组中
                                    danmuArray.push(danmuText);
                                }
                            }
                        }
                    });
                });
            });

            // 配置观察器选项
            const config = { childList: true, subtree: true, attributes: true };

            // 开始观察弹幕容器
            observer.observe(danmuContainer, config);

            // 清除定时器,停止尝试观察
            clearInterval(intervalId);
        }
    }

    // 每隔一秒尝试开始观察弹幕容器
    const intervalId = setInterval(observeDanmuContainer, 1000);

    // 折跃部分 ==============================================================================================================

    // 创建折跃按钮
    const tpButton = document.createElement("div");
    tpButton.style.position = "fixed";
    tpButton.style.right = "0";
    tpButton.style.bottom = "33%";
    tpButton.style.backgroundColor = "orange";
    tpButton.style.padding = "10px";
    tpButton.style.cursor = "pointer";
    tpButton.style.zIndex = "10000";
    tpButton.textContent = "下播折跃";
    document.body.appendChild(tpButton);

    // 发送弹幕,和主播说一声再见
    tpButton.addEventListener("click", () => {
        sendDanmu("下播4000+");
    });

    // 转到白石直播间,听鸡哥RPG求饶
    tpButton.addEventListener("click", function() {
        setTimeout(function() {
            window.location.href = "https://live.bilibili.com/859376";
        }, 500);
    });

})();