H2P: 虎牙自动禁言

虎牙自动禁言

Install this script?
Author's suggested script

You may also like H2P: 斗鱼小工具.

Install this script
// ==UserScript==
// @name        H2P: 虎牙自动禁言
// @namespace   http://tampermonkey.net/
// @version     0.0.6
// @icon        https://a.msstatic.com/huya/h5player/room/2006231627/src/img/output/replay-fornotice-icon.png
// @description 虎牙自动禁言
// @author      H2P
// @compatible  chrome
// @require     https://greasyfork.org/scripts/411278-h2p-utils/code/H2P:%20utils.js?version=847435
// @require     https://greasyfork.org/scripts/411280-h2p-notify-util/code/H2P:%20notify%20util.js?version=847422
// @match       *://*.huya.com/*
// @note        2020.09.24-V0.0.06    修复虎牙禁言(禁言更新)
// ==/UserScript==

(($util, $H2P, $notifyMgr) => {
  'use strict';

  const HuyaMute = 'h2p-huya-config-mute';
  let config_mute_pre = {
    // 恶意刷屏
    EYiShuaPing: {
      time    : '1800',
      keyWords: [],
    },
    // 谩骂
    ManMa: {
      time    : '1800',
      keyWords: [],
    },
    // 刷广告
    ShuaGuangGao: {
      time    : '1800',
      keyWords: [],
    },
    // 色情
    SeQing: {
      time    : '1800',
      keyWords: [],
    }
  };
  let config_mute = {};
  Object.assign(config_mute, config_mute_pre);
  let config_mute_tmp = JSON.parse(localStorage.getItem(HuyaMute)) || {};
  Object.assign(config_mute, config_mute_tmp);
  for (let key in config_mute) { if (!(key in config_mute_pre)) { delete config_mute[key]; } }
  localStorage.removeItem(HuyaMute);
  localStorage.setItem(HuyaMute, JSON.stringify(config_mute));

  const muteTimes = ['300', '1800', '86400', '604800', '2592000', '31104000'];
  const muteTimes2 = ['5分钟', '30分钟', '1天', '7天', '1个月', '1年'];
  const muteTypes = ['恶意刷屏', '谩骂', '刷广告', '色情'];

  new Promise((resolve, reject) => {
    let style = document.createElement('style');
    style.innerHTML = `
      #h2p-huya-script {
        position        : fixed;
        top             : 60px;
        left            : 0;
        width           : 600px;
        height          : 325px;
        border-radius   : 0 0 10px 0;
        padding         : 10px;
        background      : #eeeeee;
        z-index         : 100000;
      }
      .h2p-huya-div {
        display         : flex;
        flex-flow       : row wrap;
        justify-content : space-between;
      }
      .h2p-huya-layer {
        justify-content : flex-start;
        width           : 140px;
      }
      .h2p-huya-textarea {
        width           : 130px;
        height          : 265px;
        padding         : 5px;
        margin          : 5px 0 0;
        resize          : none;
        font-size       : 10px;
        line-height     : 15px;
      }
      .h2p-huya-button {
        width           : 100%;
        height          : 25px;
        border          : none;
        border-radius   : 5px;
        background-color: #00deba;
        cursor          : pointer;
        outline         : none;
        transition      : all 0.5s;
      }
      .h2p-huya-button:hover {
        background-color: #00ccaa;
      }
      .h2p-huya-button-active {
        background-color: #99aaff;
        transition      : all 0.5s;
      }
      .h2p-huya-button-active:hover {
        background-color: #8899cc;
      }
    `;
    document.body.appendChild(style);

    let div = document.createElement('div');
    div.id = 'h2p-huya-script';
    div.style = 'display: none';
    div.innerHTML = `
      <div class="h2p-huya-div">
        <div class="h2p-huya-layer">
          <label>恶意刷屏:</label>
          <select id="h2p-huya-select-EYiShuaPing">
            <option value="300">5 分钟</option>
            <option value="1800">30 分钟</option>
            <option value="86400">1 天</option>
            <option value="604800">7 天</option>
            <option value="2592000">1 个月</option>
            <option value="31104000">1 年</option>
          </select>
          <textarea id="h2p-huya-textarea-EYiShuaPing" class="h2p-huya-textarea"></textarea>
        </div>
        <div class="h2p-huya-layer">
          <label>谩骂:</label>
          <select id="h2p-huya-select-ManMa">
            <option value="300">5 分钟</option>
            <option value="1800">30 分钟</option>
            <option value="86400">1 天</option>
            <option value="604800">7 天</option>
            <option value="2592000">1 个月</option>
            <option value="31104000">1 年</option>
          </select>
          <textarea id="h2p-huya-textarea-ManMa" class="h2p-huya-textarea"></textarea>
        </div>
        <div class="h2p-huya-layer">
          <label>刷广告:</label>
          <select id="h2p-huya-select-ShuaGuangGao">
            <option value="300">5 分钟</option>
            <option value="1800">30 分钟</option>
            <option value="86400">1 天</option>
            <option value="604800">7 天</option>
            <option value="2592000">1 个月</option>
            <option value="31104000">1 年</option>
          </select>
          <textarea id="h2p-huya-textarea-ShuaGuangGao" class="h2p-huya-textarea"></textarea>
        </div>
        <div class="h2p-huya-layer">
          <label>色情:</label>
          <select id="h2p-huya-select-SeQing">
            <option value="300">5 分钟</option>
            <option value="1800">30 分钟</option>
            <option value="86400">1 天</option>
            <option value="604800">7 天</option>
            <option value="2592000">1 个月</option>
            <option value="31104000">1 年</option>
          </select>
          <textarea id="h2p-huya-textarea-SeQing" class="h2p-huya-textarea"></textarea>
        </div>
      </div>
      <div class="h2p-huya-div">
        <button id="h2p-huya-button" class="h2p-huya-button">启动</button>
      </div>
    `;

    document.body.appendChild(div);

    resolve();
  })
  .then(() => {
    let div = $H2P('div#h2p-huya-script');
    div.addEventListener('change', (e) => {
      const target = e.target;
      if (target.tagName.toLowerCase() !== 'select') return;

      const value = target.selectedOptions[0].value;
      if (target.id === 'h2p-huya-select-EYiShuaPing') {
        config_mute.EYiShuaPing.time = value;
      } else if (target.id === 'h2p-huya-select-ManMa') {
        config_mute.ManMa.time = value;
      } else if (target.id === 'h2p-huya-select-ShuaGuangGao') {
        config_mute.ShuaGuangGao.time = value;
      } else if (target.id === 'h2p-huya-select-SeQing') {
        config_mute.SeQing.time = value;
      }

      localStorage.setItem(HuyaMute, JSON.stringify(config_mute));
    });

    div.addEventListener('input', (e) => {
      const target = e.target;
      if (target.tagName.toLowerCase() !== 'textarea') return;

      const value = target.value;
      if (target.id === 'h2p-huya-textarea-EYiShuaPing') {
        config_mute.EYiShuaPing.keyWords = value.split('\n');
      } else if (target.id === 'h2p-huya-textarea-ManMa') {
        config_mute.ManMa.keyWords = value.split('\n');
      } else if (target.id === 'h2p-huya-textarea-ShuaGuangGao') {
        config_mute.ShuaGuangGao.keyWords = value.split('\n');
      } else if (target.id === 'h2p-huya-textarea-SeQing') {
        config_mute.SeQing.keyWords = value.split('\n');
      }

      localStorage.setItem(HuyaMute, JSON.stringify(config_mute));
    });

    let button = $H2P('button#h2p-huya-button');
    button.addEventListener('click', () => {
      button.classList.toggle('h2p-huya-button-active');
      button.textContent = button.classList.contains('h2p-huya-button-active') ? '启动中' : '启动';
      setINVL_checkMsg();
    });
  })
  .then(() => {
    // 显示设置的禁言时长
    for (let i = 0; i < muteTimes.length; i++) {
      if (config_mute.EYiShuaPing.time === muteTimes[i]) {
        $H2P('select#h2p-huya-select-EYiShuaPing').selectedIndex = i;
      }
      if (config_mute.ManMa.time === muteTimes[i]) {
        $H2P('select#h2p-huya-select-ManMa').selectedIndex = i;
      }
      if (config_mute.ShuaGuangGao.time === muteTimes[i]) {
        $H2P('select#h2p-huya-select-ShuaGuangGao').selectedIndex = i;
      }
      if (config_mute.SeQing.time === muteTimes[i]) {
        $H2P('select#h2p-huya-select-SeQing').selectedIndex = i;
      }
    }
    // 显示禁言内容
    $H2P('textarea#h2p-huya-textarea-EYiShuaPing').value = Array.isArray(config_mute.EYiShuaPing.keyWords) ? config_mute.EYiShuaPing.keyWords.join('\n') : '';
    $H2P('textarea#h2p-huya-textarea-ManMa').value = Array.isArray(config_mute.ManMa.keyWords) ? config_mute.ManMa.keyWords.join('\n') : '';
    $H2P('textarea#h2p-huya-textarea-ShuaGuangGao').value = Array.isArray(config_mute.ShuaGuangGao.keyWords) ? config_mute.ShuaGuangGao.keyWords.join('\n') : '';
    $H2P('textarea#h2p-huya-textarea-SeQing').value = Array.isArray(config_mute.SeQing.keyWords) ? config_mute.SeQing.keyWords.join('\n') : '';
  })
  .then(() => {
    document.addEventListener('keydown', (e) => {
      if (e.shiftKey && e.which == $util.keyCode.j) {
        $H2P('div#h2p-huya-script').style.display = $H2P('div#h2p-huya-script').style.display === 'none' ? '' : 'none';
      }
    });
  })

  let checkMsg = null;
  let muteUser = null;
  let minDataID = -1;             // 检测弹幕开始编号
  function setINVL_checkMsg() {
    if (checkMsg) {
      window.clearInterval(checkMsg);
      window.clearInterval(muteUser);
      checkMsg = null;
      muteUser = null;
      return;
    }
    checkMsg = setInterval(() => {
      if (muteUser) { return; }
      let msgs = $H2P('ul#chat-room__list > li', false).filter(ele => Number(ele.getAttribute('data-id')) > minDataID);
      let index = -1;
      let timeIndex = -1;
      for (let i = 0; i < msgs.length; i++) {
        let ele = msgs[i];
        minDataID = Number(ele.getAttribute('data-id'));
        if (ele.querySelector('span.msg') && ele.querySelector('span.name.J_userMenu')) {
          let user = ele.querySelector('span.name.J_userMenu').textContent;
          let msg = ele.querySelector('span.msg').textContent.replace(/\s*/g, '');
          console.log(`检测[${user}]发的弹幕:${msg}`)
          // 判断是否存在满足禁言的弹幕
          for (let j = 0; j < config_mute.EYiShuaPing.keyWords.length && timeIndex < 0; j++) {
            let keyWord = config_mute.EYiShuaPing.keyWords[j];
            if (keyWord.length > 0 && msg.includes(keyWord)) {
              index = 0;
              timeIndex = muteTimes.indexOf(config_mute.EYiShuaPing.time);
              break;
            }
          }
          for (let j = 0; j < config_mute.ManMa.keyWords.length && timeIndex < 0; j++) {
            let keyWord = config_mute.ManMa.keyWords[j];
            if (keyWord.length > 0 && msg.includes(keyWord)) {
              index = 1;
              timeIndex = muteTimes.indexOf(config_mute.ManMa.time);
              break;
            }
          }
          for (let j = 0; j < config_mute.ShuaGuangGao.keyWords.length && timeIndex < 0; j++) {
            let keyWord = config_mute.ShuaGuangGao.keyWords[j];
            if (keyWord.length > 0 && msg.includes(keyWord)) {
              index = 2;
              timeIndex = muteTimes.indexOf(config_mute.ShuaGuangGao.time);
              break;
            }
          }
          for (let j = 0; j < config_mute.SeQing.keyWords.length && timeIndex < 0; j++) {
            let keyWord = config_mute.SeQing.keyWords[j];
            if (keyWord.length > 0 && msg.includes(keyWord)) {
              index = 3;
              timeIndex = muteTimes.indexOf(config_mute.SeQing.time);
              break;
            }
          }
        }
        if (timeIndex > -1) {
          ele.querySelector('span.name.J_userMenu').click();
          // 开始禁言
          muteUser = setInterval(() => {
            // 禁言后没有该按钮
            const ele_openMute = $H2P('div[class^=user-viewer-content] i[class^=mute-icon]');
            if (ele_openMute) {
              window.clearInterval(muteUser);
              muteUser = null;

              // 该用户已被禁言
              if (ele_openMute.nextSibling.textContent === '解除禁言') {

              } else if (ele_openMute.nextSibling.textContent === '禁止发言') {
                // 隐藏禁言选项框
                let style = document.createElement('style');
                style.id = 'h2p-huya-style-mute';
                style.innerHTML = `
                  #duya-header, #J_mainWrap, #J_roomBd,
                  .mod-sidebar, .duya-header-wrap {
                    z-index         : 99999;
                  }
                  #J_mainWrap, #main_col {
                    background-color: #f4f5f8;
                  }
                  .dlg {
                    display: none!important;
                  }
                `;
                !$H2P('style#h2p-huya-style-mute') && document.body.appendChild(style);

                ele_openMute.click();
                muteUser = setInterval(() => {
                  const muteTime = $H2P(`div[class^=mute-add] div[class^=form-item--]:nth-child(3) p[class^=radio--]`, false);
                  const muteType = $H2P(`div[class^=mute-add] div[class^=form-item--]:nth-child(4) p[class^=radio--]`, false);
                  if (muteTime) {
                    window.clearInterval(muteUser);
                    muteUser = null;

                    // 选择禁言时间和类型
                    muteTime[timeIndex].click();
                    muteType[index].click();
                    muteUser = setInterval(() => {
                      if ($H2P(`a[class^=modal-btn--]`)) {
                        window.clearInterval(muteUser);
                        muteUser = null;

                        console.log(`${new Date().$formatTime()}  --  【${ele.querySelector('span.name.J_userMenu').textContent}】【${muteTypes[index]}】:${ele.querySelector('span.msg').textContent.replace(/\s*/g, '')}  --  禁言【${muteTimes2[timeIndex]}】`);
                        $H2P(`a[class^=modal-btn--]`).click();
                        $H2P('style#h2p-huya-style-mute') && $H2P('style#h2p-huya-style-mute').remove();
                        $H2P('i[class^=ucard-x]').click(); // 关闭个人资料
                      }
                    }, 50);
                  }
                }, 50);
              }
            } else if ($H2P('i[class^=ucard-x]')) {
              window.clearInterval(muteUser);
              muteUser = null;

              console.log(`无法禁言 ${ele.querySelector('span.name.J_userMenu').textContent}`);
              $H2P('i[class^=ucard-x]').click();
            }
          }, 50);
          break;
        };
      }
    }, 500);
  }
})($util, $H2P, $notifyMgr);