WoD 耗材单价

市集和拍卖页面,针对耗材显示单价,省钱利器。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name          WoD 耗材单价
// @icon          http://info.world-of-dungeons.org/wod/css/WOD.gif
// @namespace     lgg
// @description   市集和拍卖页面,针对耗材显示单价,省钱利器。
// @include       https://*.world-of-dungeons.org/wod/spiel/trade/trade.php*
// @grant         none
// @modifier      Christophero
// @version       2022.08.21.1
// ==/UserScript==
// console.log('start1');
//* constants
let goldStr =
  '<img alt="" src="/wod/css//skins/skin-4/images/icons/lang/cn/gold.gif" title="金币" border="0">';
let PRICE_ATTRI_NAME = "lggAvPrice";
let PRICE_UNAVAILABLE = "lggBadPrice";
let CLASS_ROW = "row";

//* global lets
let tblBody = findTBodyElement();
let tblRowList = new Array();
let sortBtnElement;

//* main
for (let i = 0; i < tblBody.rows.length; i++) {
  row_i = tblBody.rows[i];
  let pricePU = genAveragePriceForConsumableGoods(row_i);
  row_i.setAttribute(PRICE_ATTRI_NAME, pricePU);
  tblRowList.push(row_i);
}

addSortBtn();
// sortRowByAveragePrice(tblRowList);

//* 找到商品列表table的<tbody>标签
function findTBodyElement() {
  let tableList = document.getElementsByClassName("content_table");
  let saleTable = tableList[0];
  let tableBodyList = saleTable.children;
  let tblBody;
  for (let i = tableBodyList.length - 1; i >= 0; i--) {
    if (tableBodyList[i].tagName == "TBODY") {
      tblBody = tableBodyList[i];
    }
  }
  return tblBody;
}

//* 给定某行物品<tr>,找到对应的耗材单价以及总价,插入平均价格,返回插入的平均价格
function genAveragePriceForConsumableGoods(trElement) {
  if (row_i.cells.length < 2) return;
  col_item = row_i.cells[1];
  col_price = row_i.cells[3];
  let itemCountStr = col_item.innerHTML.match(/\(\d+\/\d+\)/);
  itemCountStr = itemCountStr + "";
  if (itemCountStr != "null") {
    let itemCounts = itemCountStr.match(/\d+/);
    let itemPrice = col_price.textContent.replace(",", "").match(/\d+/);
    if (!itemPrice) {
      return PRICE_UNAVAILABLE;
    }
    let itemPricePerUse =
      parseFloat(itemPrice + "") / parseFloat(itemCounts + "");
    itemPricePerUse = itemPricePerUse.toFixed(4);
    // console.log('数量:' + itemCounts + ', 单价:' + itemPricePerUse + '/u');
    col_price.innerHTML =
      itemPricePerUse + goldStr + "/u &nbsp&nbsp&nbsp" + col_price.innerHTML;
    return itemPricePerUse;
  } else {
    return PRICE_UNAVAILABLE;
  }
}

//* 排序,两个row是<tr>,并且已经插入了PRICE_ATTRI_NAME属性
function rowCompare(row1, row2) {
  let p1 = row1.getAttribute(PRICE_ATTRI_NAME);
  let p2 = row2.getAttribute(PRICE_ATTRI_NAME);
  if (p1 == PRICE_UNAVAILABLE && p2 == PRICE_UNAVAILABLE) {
    return 0;
  } else if (p1 == PRICE_UNAVAILABLE) {
    return -1;
  } else if (p2 == PRICE_UNAVAILABLE) {
    return 1;
  }

  p1 = parseFloat(p1);
  p2 = parseFloat(p2);

  return p1 - p2;
}

function sortRowByAveragePrice() {
  //* 排序,重新输出
  tblRowList.sort(rowCompare);
  while (tblBody.hasChildNodes()) {
    tblBody.removeChild(tblBody.lastChild);
  }
  for (let i = 0; i < tblRowList.length; i++) {
    let suffixStr = i & 1;
    tblRowList[i].setAttribute("class", CLASS_ROW + suffixStr);
    tblBody.appendChild(tblRowList[i]);
  }
}

function addSortBtn() {
  let tableList = document.getElementsByClassName("content_table");
  let saleTable = tableList[0];
  let tableBodyList = saleTable.children;

  let tblHead;
  for (let i = tableBodyList.length - 1; i >= 0; i--) {
    if (tableBodyList[i].tagName == "THEAD") {
      tblHead = tableBodyList[i];
    }
  }
  if (!tblHead) return;
  let header;
  for (let i = 0; i < tblHead.children.length; i++) {
    let tmp = tblHead.children[i];
    if (tmp.className == "header") {
      //* 这里大小写敏感
      header = tmp;
    }
  }

  let thEl = header.children[3];
  let sortBtn = document.createElement("input");
  sortBtn.setAttribute("class", "button clickable");
  sortBtn.setAttribute("type", "button");
  sortBtn.setAttribute("value", "单价排序");
  sortBtn.addEventListener("click", function () {
    sortRowByAveragePrice();
    sortBtn.setAttribute("class", "button_disabled");
    sortBtn.setAttribute("disabled", "disabled");
  });
  thEl.appendChild(sortBtn);
}
// ㄟ( ▔, ▔ )ㄏ 版本有待完善