Greasy Fork is available in English.
Calculate and display total prices for each category in inventory
当前为
// ==UserScript==
// @name [MWI]Inventory Category Price Calculator
// @name:zh-CN [银河奶牛]库存分类价格计算器
// @namespace https://cnb.cool/shenhuanjie/skyner-cn/tamper-monkey-script/mwi-inventory-category-price-calculator
// @version 1.0.0
// @description Calculate and display total prices for each category in inventory
// @description:zh-CN 计算并显示库存中每个分类的总价格
// @author shenhuanjie
// @license MIT
// @match https://www.milkywayidle.com/game*
// @icon https://www.milkywayidle.com/favicon.svg
// @grant none
// @homepage https://cnb.cool/shenhuanjie/skyner-cn/tamper-monkey-script/mwi-inventory-category-price-calculator
// @supportURL https://cnb.cool/shenhuanjie/skyner-cn/tamper-monkey-script/mwi-inventory-category-price-calculator/-/issues
// ==/UserScript==
(function() {
'use strict';
// 判断用户语言环境
const isChinese = navigator.language.includes('zh');
const messages = {
zh: {
scriptStarted: '库存分类价格计算器已启动',
dataRefreshed: '数据已刷新'
},
en: {
scriptStarted: 'Inventory Category Price Calculator has been started',
dataRefreshed: 'Data has been refreshed'
}
};
function getMessage(key, replacements = {}) {
const lang = isChinese ? 'zh' : 'en';
let message = messages[lang][key];
for (const [placeholder, value] of Object.entries(replacements)) {
message = message.replace(`{${placeholder}}`, value);
}
return message;
}
console.log(getMessage('scriptStarted'));
// 初始化数据
let categoryPrices = {};
let originalCategoryNames = new Set();
// 安全获取类名列表的函数
function getClassList(element) {
if (typeof element.className === 'string') {
return element.className.split(' ');
} else if (element.className && typeof element.className.baseVal === 'string') {
return element.className.baseVal.split(' ');
}
return [];
}
// 解析价格字符串(支持 k/M 后缀)
function parsePrice(priceStr) {
const match = priceStr.match(/^(\d+(?:\.\d+)?)([kM])?$/);
if (!match) return 0;
const value = parseFloat(match[1]);
const multiplier = match[2] === 'k' ? 1000 : match[2] === 'M' ? 1000000 : 1;
return value * multiplier;
}
// 数字格式化函数(移除货币符号)
function formatNumber(value) {
return new Intl.NumberFormat('en-US', {
minimumFractionDigits: 0,
maximumFractionDigits: 0
}).format(value);
}
// 提取原始分类名称
function extractOriginalCategories() {
originalCategoryNames.clear();
const labelElements = document.querySelectorAll(`[class^="Inventory_label__"] span`);
labelElements.forEach(label => {
const text = label.textContent;
const category = text.includes(':') ? text.split(':')[0] : text;
originalCategoryNames.add(category);
});
}
// 主处理函数
function processInventoryData() {
// 提取原始分类名称
extractOriginalCategories();
// 重置数据
categoryPrices = {};
// 获取所有带有 class 属性的元素
const elements = document.querySelectorAll('[class]');
// 遍历所有元素,检查它们的类名
elements.forEach(element => {
getClassList(element).forEach(className => {
if (className.startsWith('Item_itemContainer__')) {
const priceElement = element.querySelector('#script_stack_price');
const price = priceElement ? priceElement.textContent : '0';
const inventoryItemGridElement = element.closest('[class^="Inventory_itemGrid__"]');
const labelElement = inventoryItemGridElement?.querySelector('[class^="Inventory_label__"] span');
// 获取原始分类名称
let category = '未知分类';
if (labelElement) {
const text = labelElement.textContent;
category = text.includes(':') ? text.split(':')[0] : text;
}
// 累加价格
const parsedPrice = parsePrice(price);
if (parsedPrice > 0 && originalCategoryNames.has(category)) {
categoryPrices[category] = (categoryPrices[category] || 0) + parsedPrice;
}
}
});
});
// 更新分类标签
const labelElements = document.querySelectorAll(`[class^="Inventory_label__"] span`);
labelElements.forEach(label => {
const text = label.textContent;
const category = text.includes(':') ? text.split(':')[0] : text;
if (originalCategoryNames.has(category)) {
const value = categoryPrices[category] || 0;
label.textContent = value > 0 ? `${category}:${formatNumber(value)}` : category;
}
});
// console.log(getMessage('dataRefreshed'));
}
// 初始处理
processInventoryData();
// 添加点击事件监听
document.addEventListener('click', processInventoryData);
})();