// ==UserScript==
// @name Buff Tools 网易Buff助手
// @namespace https://github.com/hanpanapn/buff-tools
// @version 0.6.4
// @description buff tools
// @author hanpanpan@outlook.com
// @match https://buff.163.com/*
// @match https://bbs.tampermonkey.net.cn/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=163.com
// @run-at document-end
// @grant none
// @notice 2022-08-09 更新了steam服务器不稳定时的提示信息被隐藏的bug,优化了查询
// @downloadURL https://update.greasyfork.icu/scripts/448786/Buff%20Tools%20%E7%BD%91%E6%98%93Buff%E5%8A%A9%E6%89%8B.user.js
// @updateURL https://update.greasyfork.icu/scripts/448786/Buff%20Tools%20%E7%BD%91%E6%98%93Buff%E5%8A%A9%E6%89%8B.meta.js
// ==/UserScript==
(function () {
'use strict';
//
function addXMLRequestCallback(callback) {
var oldSend, i;
if (XMLHttpRequest.callbacks) {
// we've already overridden send() so just add the callback
XMLHttpRequest.callbacks.push(callback);
} else {
// create a callback queue
XMLHttpRequest.callbacks = [callback];
// store the native send()
oldSend = XMLHttpRequest.prototype.send;
// override the native send()
XMLHttpRequest.prototype.send = function () {
// process the callback queue
// the xhr instance is passed into each callback but seems pretty useless
// you can't tell what its destination is or call abort() without an error
// so only really good for logging that a request has happened
// I could be wrong, I hope so...
// EDIT: I suppose you could override the onreadystatechange handler though
for (i = 0; i < XMLHttpRequest.callbacks.length; i++) {
XMLHttpRequest.callbacks[i](this);
}
// call the native send()
oldSend.apply(this, arguments);
}
}
}
let addMenuItem = () => {
let nav = document.querySelector('.nav ul')
if (!nav) {
return
}
//增加一个菜单
let marketName = document.createElement('li')
marketName.id = 'u_title'
let title = document.createElement('a')
// 菜单里面的输入框
let inT = document.createElement('input')
inT.id = 'inT'
inT.style.width = '260px'
inT.value = getQueryVariable('search') ? decodeURI(getQueryVariable('search')) : (document.title.split('_')[0] == 'CS:GO饰品市场' ? '' : document.title.split('_')[0])
title.appendChild(inT)
// 菜单里面的按钮
let btnSearch = document.createElement('button')
btnSearch.innerText = 'GO'
btnSearch.style.width = '51px'
btnSearch.style.height = '29px'
btnSearch.onclick = () => {
if (location.href.indexOf('https://buff.163.com/market/csgo#tab=selling') != -1) {
//列表页 点击调查询方法
let sin = document.querySelector("input[name*='search']")
sin.value = document.getElementById('inT').value
let btnS = document.getElementById('search_btn_csgo')
btnS && btnS.click()
} else {
//从其他页面调转过来,页面会直接刷新,不用手动调查询接口
location.href = 'https://buff.163.com/market/csgo#tab=selling&page_num=1&search=' + document.getElementById('inT').value
}
}
title.appendChild(btnSearch)
// 菜单里面的按钮
let btnSearchIGXE = document.createElement('button')
btnSearchIGXE.innerText = 'IGXE'
btnSearchIGXE.style.width = '51px'
btnSearchIGXE.style.height = '29px'
btnSearchIGXE.onclick = () => {
window.open('https://www.igxe.cn/market/csgo?sort=3&keyword=' + document.getElementById('inT').value, '_blank')
}
title.appendChild(btnSearchIGXE)
marketName.appendChild(title)
let u_title = document.getElementById('u_title')
if (u_title) {
nav.removeChild(u_title)
}
nav.appendChild(marketName)
}
let setBtnPageFun = () => {
let page = document.querySelector('.simple-pagination')
let goodIdDom = document.querySelector('.btn-supply-buy')
let nav = document.querySelector('.nav ul')
if (!goodIdDom || !page) {
return
}
let btn10 = document.createElement('li')
if (getQueryVariable('page_num') == 10) {
btn10.classList.add('active')
}
let goodId = goodIdDom.getAttribute('data-goodsid')
btn10.innerHTML = '第10页'
page.appendChild(btn10)
let btn20 = document.createElement('li')
if (getQueryVariable('page_num') == 20) {
btn20.classList.add('active')
}
btn20.innerHTML = '第20页'
page.appendChild(btn20)
let btn30 = document.createElement('li')
if (getQueryVariable('page_num') == 30) {
btn30.classList.add('active')
}
btn30.innerHTML = '第30页'
page.appendChild(btn30)
let btn50 = document.createElement('li')
if (getQueryVariable('page_num') == 50) {
btn50.classList.add('active')
}
btn50.innerHTML = '第50页'
page.appendChild(btn50)
}
let getQueryVariable = (variable) => {
var query = window.location.href;
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) { return pair[1]; }
}
return (false);
}
let fixedHeader = () => {
//所有游戏列表 不要切换其他游戏,隐藏调
let switcher = document.getElementById('j_game-switcher')
switcher && switcher.remove()
let header = document.querySelector('.header')
header.style.position = 'fixed'
header.style.width = '100%'
header.style.zIndex = '99'
header.style.background = '#1a2132'
let msg = document.getElementById('notice-wrapper')
if (msg) {
msg.style.position = 'fixed'
msg.style.zIndex = '99'
msg.style.top = '70px'
msg.style.width = '100%'
msg.style.backgroundColor = '#1a2132'
}
let logo = document.querySelector('.logo')
if (logo) {
logo.style.marginLeft = 'auto'
logo.style.marginRight = 'auto'
}
//.market-list 微调
let marketlist = document.querySelector('.market-list')
if (marketlist) {
marketlist.style.marginTop = '40px'
}
}
let setBtnPage = () => {
addXMLRequestCallback(function (xhr) {
xhr.addEventListener("load", function () {
if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseURL.indexOf('https://buff.163.com/api/market/goods/sell_order?game=csgo') != -1) {
setBtnPageFun()
}
});
});
}
setBtnPage()
fixedHeader()
addMenuItem()
window.addEventListener('hashchange',
function (e) {
console.log('url change')
setBtnPageFun()
}, false);
setTimeout(() => {
addMenuItem()
setBtnPageFun()
}, 1000)
})();