Greasy Fork

Greasy Fork is available in English.

POE2 trade 繁体

POE2 trade 繁体化 - 放课后

当前为 2024-12-12 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==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);
                            }
                        });
                    });
                }

            }
        };
    });
})();