Greasy Fork

虎牙直播挖宝

虎牙直播自动挖宝

目前为 2019-08-18 提交的版本。查看 最新版本

// ==UserScript==
// @name         虎牙直播挖宝
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  虎牙直播自动挖宝
// @author       睿智的河水
// @match        *://*.huya.com/*
// @grant        none
// ==/UserScript==

(function () {
  'use strict'
  var $ = window.$
  var styleData = `
    .room-chat-tool-gift {
      display: inline-block;
      width: 24px;
      height: 24px;
      margin-top: -2px;
      background: url("https://huyaimg.msstatic.com/cdnimage/actprop/20293_1__45_1547818438.jpg") center no-repeat;
      background-size: contain;
      opacity: .8;
      filter: grayscale(1);
    }
    .room-chat-tool-gift:hover {
      opacity: 1;
      filter: grayscale(0);
    }
    #gift-main {
      position: relative;
      height: 100%;
      display: flex;
      flex-direction: column;
    }
    #gift-list {
      height: 100%;
      overflow: auto;
      scroll-behavior: smooth;
    }
    #gift-list li {
      font-size: 12px;
      padding: 6px 0;
      margin: 0 10px;
      border-bottom: 1px solid #eee;
    }
    #gift-list li > div {
      display: block;
      margin: 3px 0px;
    }
    #gift-list li .time {
      color: #aaa;
    }
    #gift-list li .host {
      padding-left: 18px;
      margin-left: 3px;
      color: #f80;
      background: url(https://a.msstatic.com/huya/main3/assets/img/room/bussType_icon_c974b.png) left center no-repeat;
    }
    #gift-list li .info {
      color: #444;
    }
    #gift-list li .info i {
      font-style: normal;
      color: #3c9cfe;
    }
    #gift-list li .status {
      color: #999;
    }
    #gift-list li .winner {
      color: #d35757;
    }
    #gift-status {
      display: flex;
      align-items: baseline;
      font-size: 13px;
      padding: 6px;
      margin: 0 6px 6px;
      background: #f5f5f5;
      border: 1px solid #eee;
      border-radius: 3px;
    }
    #gift-status .time {
      color: #aaa;
      margin-right: 6px;
    }
    #gift-status .info {
      color: #999;
    }
    #gift-status .info i {
      font-style: normal;
      color: #f80;
    }
  `
  function localGet(key) {
    return JSON.parse(localStorage.getItem(key))
  }
  function localSet(key, val) {
    return localStorage.setItem(key, JSON.stringify(val))
  }
  function localRemove(key) {
    return localStorage.removeItem(key)
  }
  function updateGift(el, html, save = false) {
    var $giftEl = $('.chat-room__gift')
    var $giftMain = $('#gift-main')
    if (!$giftMain.length) {
      $giftMain = $('<div id="gift-main" class="chat-room__scroll"></div>')
      var $clearEl = $('<p class="clearBtn"><i></i><span>清除历史数据</span></p>')
      $clearEl.on('click', () => {
        $('#gift-list').html('')
        localRemove('giftHistory')
      })
      $giftMain.append($('<ul id="gift-list" class="gift-list"></ul>'))
      $giftMain.append($('<div id="gift-status" class="gift-status"></div>'))
      $giftMain.append($clearEl)
      $giftEl.append($giftMain)
    }

    switch (el) {
      case 'list':
        var $list = $('#gift-list')
        $list.append($(`<li>${html}</li>`))
        $list.scrollTop($list[0].scrollHeight)
        if (save) {
          var giftHistory = localGet('giftHistory') || []
          giftHistory.push(html)
          localSet('giftHistory', giftHistory)
        }
        break
      case 'status':
        var $status = $('#gift-status')
        $status.html(html)
        break
    }
  }
  function loopGift() {
    var date = new Date().toLocaleString('zh-Hans-CN')
    var $btn = $('#J_treasureChestContainer .btn-wrap .btn')
    if (!$btn.length) {
      updateGift('status', `<div class="time">[${date}]</div><div class="info">等待宝藏掉落...</div>`)
      requestAnimationFrame(loopGift)
      return
    }
    var btnVal = $btn.text()
    var nick = $('#J_treasureChestContainer .waitTips .nick').text()
    var gName = $('#J_treasureChestContainer .waitTips .aName').text()
    var number = $('#J_treasureChestContainer .num').text()

    if (/\d+:\d+/.test(btnVal)) {
      var [min, sec] = btnVal.split(':')
      var time = Number(min) * 60 + Number(sec)
      updateGift('status', `<div class="time">[${time}s]</div><div class="info">准备挖<i>${nick}</i>${gName},还剩${number}个</div>`)
    } else {
      if (btnVal === '领取') {
        setTimeout(() => {
          var status = $('#watchChat_pub .treasureChest-tips .tct-cont').text()
          var hostName = $('.host-name').text()
          var hostLink = window.TT.app.main + window.TT_ROOM_DATA.privateHost
          var cls = 'class="status"'
          if (/恭喜/.test(status)) {
            cls = 'class="status winner"'
          }
          updateGift('list', `<div class="time">[${date}] <a class="host" href="${hostLink}">${hostName}</a></div><div class="info"><i>${nick}</i>${gName}:</div><div ${cls}>${status}</div>`, true)
        }, 1000)
      } else {
        if (number > 0) {
          updateGift('status', `<div class="time">[${btnVal}]</div><div class="info">等待中,还剩${number}个</div>`)
        } else {
          updateGift('status', `<div class="time">[${btnVal}]</div><div class="info">当前宝藏已挖完</div>`)
        }
      }
    }
    $btn.trigger('click')
    requestAnimationFrame(loopGift)
  }
  $(document).ready(() => {
    if (!$('#chatRoom').length) {
      return
    }
    var $giftIcon = $('<i class="room-chat-tool room-chat-tool-gift" id="J-room-chat-gift" title="自动挖宝"></i>')
    var $chatRoom = $('#chatRoom')
    var $chatPanel = $('#chatRoom .chat-room__panel')
    var $giftPanel = $('<div class="chat-room__bd chat-room__gift chat-room__bd3"></div>')
    $('head').append($(`<style>${styleData}</style>`))
    $('.room-chat-tools').append($giftIcon)
    $giftPanel.height($chatPanel.height())
    $chatRoom.append($giftPanel)
    $giftIcon.on('click', () => {
      $chatPanel.toggle()
      $giftPanel.toggle()
      $('#gift-list').scrollTop($('#gift-list')[0].scrollHeight)
    })
    $('#J_playerMain').on('resize', () => {
      $giftPanel.height($chatPanel.height())
    })
    var giftHistory = localGet('giftHistory') || []
    if (giftHistory.length) {
      giftHistory.forEach(v => {
        updateGift('list', v)
      })
    }
    requestAnimationFrame(loopGift)
  })
})()