ChatGLM 插嘴功能

当你在chatglm的对话框里按下enter建时,如果ai仍在说话,会自动停止ai发言并发送你的消息

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

You will need to install an extension such as Tampermonkey to install this script.

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

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         ChatGLM 插嘴功能
// @namespace    http://tampermonkey.net/
// @version      0.9
// @description  当你在chatglm的对话框里按下enter建时,如果ai仍在说话,会自动停止ai发言并发送你的消息
// @author       You
// @match        https://chatglm.cn/*
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
  "use strict";
  //点击新建对话也终止输出
  const hookNewButton = () => {
    {
      const element = document.getElementsByClassName("add-session-icon")[0];
      if (!element) {
        setTimeout(() => hookNewButton(), 0);
        return;
      }

      element.style.pointEvents = "none"
      const cover = document.createElement("div");
      cover.className = "el-tooltip add-session-icon";
      cover.setAttribute("tabindex", "0");
      cover.setAttribute("aria-describedby", element.getAttribute("aria-describedby"));
      let dataTag = "";
      {
        const dataTagStart = element.outerHTML.indexOf("data-v-");
        const dataTagEnd = element.outerHTML.indexOf("=", dataTagStart);
        dataTag = element.outerHTML.substring(dataTagStart, dataTagEnd)
      }
      cover.setAttribute(dataTag, "1");
      element.parentElement.appendChild(cover);
      cover.onclick = () => {
        stopOutput()
        setTimeout(() => element.click(), 0);
      }
    }
  };




  hookNewButton();
  function bindEventToTextarea() {
    // 获取页面中的第一个<textarea>元素
    var textarea = document.querySelector("textarea");
    if (textarea) {
      // 清除之前可能绑定的事件监听器
      textarea.removeEventListener("keydown", handleKeyDown);
      // 重新绑定事件监听器
      textarea.addEventListener("keydown", handleKeyDown);
    }
  }

  function handleKeyDown(event) {
    // 检查是否是单个Enter键按下,并且事件的目标元素是<textarea>
    if (
      event.key === "Enter" &&
      event.keyCode === 13 &&
      !event.shiftKey &&
      !event.ctrlKey &&
      !event.altKey &&
      !event.metaKey &&
      event.target.tagName === "TEXTAREA"
    ) {
      console.debug(event);
      stopOutput();
    }
  }
  function stopOutput() {
    // 查找类名为"btn stop"的按钮
    var stopButton = document.querySelector(".btn.stop");
    // 如果找到了按钮,并且按钮文本包含"停止生成",则触发click事件
    if (stopButton && stopButton.textContent.includes("停止生成")) {
      stopButton.click();
    }
  }
  // 使用setInterval每隔一秒重新绑定事件监听器
  setInterval(bindEventToTextarea, 1000);

  // 初始绑定
  bindEventToTextarea();
})();