Greasy Fork is available in English.
POE2 trade 繁体化 - 放课后
当前为
// ==UserScript==
// @name POE2 trade 繁体
// @namespace http://tampermonkey.net/
// @version 1.8
// @description POE2 trade 繁体化 - 放课后
// @author 放课后
// @match https://www.pathofexile.com/trade2/*
// @grant GM_xmlhttpRequest
// @license MIT
// @run-at document-start
// @require https://scriptcat.org/lib/637/1.4.3/ajaxHooker.js#sha256=y1sWy1M/U5JP1tlAY5e80monDp27fF+GMRLsOiIrSUY=
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
(async () => {
'use strict';
const applyState = GM_getValue('applyState') ? GM_getValue('applyState') : 1
window.addEventListener('load', function() {
document.addEventListener('click', function(event) {
if (event.target.closest('.applyTw')) {
event.preventDefault(); // 阻止默认行为
const applyState = GM_getValue('applyState') || 1;
GM_setValue('applyState', applyState === 1 ? 2 : 1);
localStorage.clear();
location.reload();
}
});
// 查找目标 ul 元素
const tabList = document.querySelector('ul.nav.nav-tabs.account');
if (!tabList) {
console.error('未找到目标元素');
return; // 如果找不到目标元素,退出
}
// 创建应用按钮
const applyLi = document.createElement('li');
applyLi.role = 'presentation';
applyLi.className = 'applyTw'
applyLi.style.float = 'right';
applyLi.style.height = '32px';
const applyLink = document.createElement('a');
applyLink.href = '#';
applyLink.innerHTML = `<span>${applyState == 1 ? '已应用繁体化':'未应用繁体化'}</span>`;
applyLi.appendChild(applyLink);
// 将按钮添加到 ul 元素中
tabList.appendChild(applyLi);
});
const dataMap = {}
if(applyState == 2) return
ajaxHooker.hook(request => {
request.response = res => {
const responseText = res.responseText;
const response = JSON.parse(responseText);
if (request.url.includes('api/trade2/fetch') && dataMap['stats'] && dataMap['stats'].length) {
response.result.forEach(item => {
if(item.item.extended.hashes){
const keys = Object.keys(item.item.extended.hashes)
keys.forEach(key => {
const mods = item.item.extended.hashes[key]
const entry = dataMap['stats'].find(a => a.id == key)
const modTexts = item.item[key+'Mods']
if(entry && entry.entries && modTexts){
let index = 0
const newModTexts = mods.map(m => {
const oldText = modTexts[index++]
const mod = entry.entries.find(a => a.id == m[0])
if(mod){
let newModText = mod.text
const values = oldText.match(/\d*\.\d+|\d+/g)
if(values){
let i = 0
values.forEach(v => {
newModText = newModText.replace(/#/,values[i++])
})
}
if(newModText.match(/增加/) && oldText.match(/reduced/)){
newModText = newModText.replace(/增加/,'降低')
}
return `${newModText}(${ oldText})`
console.log(values)
}
return oldText
})
item.item[key+'Mods'] = newModTexts
}
})
}
})
res.responseText = JSON.stringify(response);
}else if (request.url.includes('api/trade2/data')){
const key = request.url.split('/').pop();
if(key == 'items'){
const result = response.result
res.responseText = new Promise(resolve => {
GM_xmlhttpRequest({
method: 'GET',
url: 'https://p2.710421059.xyz/enTradeItems2Tw.json',
onload: function(response1) {
if (response1.status === 200) {
try {
const enTradeItems2Tw = JSON.parse(response1.responseText);
for (let i = 0; i < result.length; i++) {
try {
result[i].label = enTradeItems2Tw[i].label;
} catch (e) {
console.error(`Error processing item ${i}:`, e);
}
if (result[i].entries) {
for (let j = 0; j < result[i].entries.length; j++) {
const find = enTradeItems2Tw[i].entries.find(a => a.type === result[i].entries[j].type && (result[i].entries[j].name ? a.name === result[i].entries[j].name : true));
if (find) {
result[i].entries[j].text = find.text;
}
}
}
}
dataMap[key] = result
response.result = result
resolve(JSON.stringify(response));
} catch (e) {
console.error(e)
resolve(responseText);
}
} else {
resolve(responseText);
}
},
onerror: function(error) {
resolve(responseText);
}
});
});
}else if(key == 'stats'){
const statMap = {}
const deald = []
const result = response.result
const twUrl = 'https://pathofexile.tw'+request.url
res.responseText = new Promise(resolve => {
GM_xmlhttpRequest({
method: 'GET',
url: twUrl,
onload: function(response1) {
if (response1.status === 200) {
const twStat = JSON.parse(response1.responseText)
result.forEach((type) => {
const findTwType = twStat.result.find((twType) => twType.id === type.id)
if (findTwType) {
type.entries.forEach((entry) => {
const findTwEntry = findTwType.entries.find((twEntry) => twEntry.id === entry.id)
if (findTwEntry) {
if (entry.option && entry.option.options && entry.text.indexOf('#') > -1) {
if (!findTwEntry.option && findTwEntry.option.options) {
entry.option.options.forEach((o) => {
const findTwOption = findTwEntry.option.options.find((twOption) => twOption.id === o.id)
if (findTwOption) {
o.text = findTwOption.text
}
})
}
} else {
entry.text = findTwEntry.text
deald.push(entry.id)
statMap[entry.id.split('.')[1]] = entry.text
}
}
})
}
})
result.forEach((type) => {
type.entries.forEach((entry) => {
if (deald.indexOf(entry.id) === -1) {
if (statMap[entry.id.split('.')[1]]) {
entry.text = statMap[entry.id.split('.')[1]]
}
}
})
})
response.result = result
dataMap[key] = result
resolve(JSON.stringify(response));
} else {
resolve(responseText);
}
},
onerror: function(error) {
resolve(responseText);
}
});
});
}else{
const twUrl = 'https://pathofexile.tw'+request.url
res.responseText = new Promise(resolve => {
GM_xmlhttpRequest({
method: 'GET',
url: twUrl,
onload: function(response) {
if (response.status === 200) {
try {
const data = JSON.parse(response.responseText);
dataMap[key] = data.result
resolve(response.responseText);
} catch (e) {
resolve(responseText);
}
} else {
resolve(responseText);
}
},
onerror: function(error) {
resolve(responseText);
}
});
});
}
}
};
});
})();