WoD N价显示

在市集和拍卖页面显示物品出售给NPC的价格,大致的利润等信息。

// ==UserScript==
// @name            WoD N价显示
// @icon            http://info.world-of-dungeons.org/wod/css/WOD.gif
// @namespace       WOD_Tools
// @description     在市集和拍卖页面显示物品出售给NPC的价格,大致的利润等信息。
// @author          Christophero
// @include         http*://*.world-of-dungeons.org/wod/spiel/trade/trade.php*
// @license         MIT License
// @require         https://code.jquery.com/jquery-3.3.1.min.js
// @connect         www.christophero.xyz
// @modifier        Christophero
// @version         2022.08.21.1
// ==/UserScript==

(function () {
  "use strict";

  if (!String.prototype.hasOwnProperty("replaceAll")) {
    String.prototype.replaceAll = function (s1, s2) {
      return this.replace(new RegExp(s1, "gm"), s2);
    };
  }
  const ifAuction = $('div.box_container>h1:contains("拍卖")').length;

  const $searchBtn = $('a:contains("开始搜索")');
  const $fetchNpcPriceBtn = $(
    '<button type="button" class="button">获取最新N价</button>'
  );
  // 拉取最新N价
  $fetchNpcPriceBtn.click(() => {
    fetch("https://www.christophero.xyz/wod/item/fetchAllNpcPrice", {
      method: "POST",
      headers: {
        "User-Agent": "Apipost client Runtime/+https://www.apipost.cn/",
        "Content-Type": "application/json",
      },
    })
      .then((response) => {
        return response.json();
      })
      .then((res) => {
        if (!(res && res.code === 200)) {
          alert("获取最新N价时出现问题");
          return;
        }
        const allItems = res.data;
        const priceMap = allItems
          .map((item) => {
            return { name: item.name, npcPrice: item.npcPrice };
          })
          .reduce((map, item) => {
            map[item.name] = item.npcPrice;
            return map;
          }, new Object());
        localStorage.setItem("priceMap", JSON.stringify(priceMap));
        alert("已获取最新N价");
      });
  });
  $searchBtn.after($fetchNpcPriceBtn);

  // 插入最新N价列
  const $trs = $("table.content_table>tbody>tr");
  let map = localStorage.getItem("priceMap");
  if (!map || !$trs.length) return;
  map = JSON.parse(map);
  $("table.content_table>thead>tr.header>th:eq(3)").after(
    $('<th class="">N价</th><th class="">利润</th>')
  );
  $("table.content_table>tfoot>tr.header>th:eq(3)").after(
    $('<th class="">N价</th><th class="">利润</th>')
  );
  $trs.each(function (i, tr) {
    const itemName = $(tr).find("td:eq(1) a").text();
    const $td = $(tr).find("td:eq(3)");
    if (!map.hasOwnProperty(itemName)) {
      $td.after(
        $(
          '<td align="right" nowrap="">-</td><td align="right" nowrap="">-</td>'
        )
      );
      return;
    }
    let npcPrice = map[itemName] || 0;
    const numStr = $(tr)
      .find("td:eq(1)")
      .text()
      .trim()
      .replace(itemName, "")
      .trim();
    if (numStr) {
      const numArr = numStr.replace(/^\(/, "").replace(/\)$/, "").split("/");
      npcPrice = Math.round(
        (parseFloat(npcPrice) * parseFloat(numArr[0])) / parseFloat(numArr[1])
      );
    }
    let price = 0;
    if ($(tr).find("td:eq(3) input").length) {
      price = parseFloat($(tr).find("td:eq(3) input").val());
    } else {
      price = parseFloat(
        $(tr)
          .find("td:eq(3)")
          .text()
          .replace(/^.+\n/, "")
          .replace(/无人出价$/, "")
          .replace(/来自.+$/, "")
          .replaceAll(",", "") || 0
      );
    }
    let diff = Math.floor((1 - 0.1) * price - npcPrice - (ifAuction ? 50 : 10));
    let rate = Math.round((diff * 100) / npcPrice);
    let $diffTd = $('<td align="right" nowrap="">-</td>');
    let diffColor = "#FFFFFF";
    if (diff > 50 && rate > 100) {
      diffColor = "#CC3333";
    } else if (diff > 50 && rate > 50) {
      diffColor = "#FFCF00";
    } else if (diff < 0) {
      diffColor = "#4dbb7c";
    }
    $diffTd.css("color", diffColor);
    $diffTd.text(`${diff}(${rate}%)`);
    $td.after($diffTd);
    $td.after(
      $(
        '<td align="right" nowrap="">' +
          npcPrice +
          '<img alt="" src="/wod/css//skins/skin-4/images/icons/lang/cn/gold.gif" title="金币" border="0"></td>'
      )
    );
  });
})();