Boothの購入履歴から累計散財額を計算するツール

お手軽鬱ボタン。Boothの購入履歴の総額を計算できます。同じセッションだけしか計算結果は保存できません。

// ==UserScript==
// @name         Boothの購入履歴から累計散財額を計算するツール
// @namespace    https://x.com/zerukuVRC
// @version      1.4
// @description  お手軽鬱ボタン。Boothの購入履歴の総額を計算できます。同じセッションだけしか計算結果は保存できません。
// @author       zeruku
// @match        https://accounts.booth.pm/orders*
// @grant        GM_getValue
// @grant        GM_setValue
// @license      MIT
// ==/UserScript==

//  コードがながーい!
//     ٩(๑`^´๑)۶

(function () {
  ///                                       ///
  /// *===== URLパラメーターの初期設定 =====* ///
  ///                                       ///

  var currentURL = new URL(window.location.href);
  var autoCalculate = currentURL.searchParams.get("auto") === "1";

  var changed = false;

  if (currentURL.searchParams.get("total") === null) {
    currentURL.searchParams.set("total", 0);
    changed = true;
  }
  if (currentURL.searchParams.get("auto") === null) {
    currentURL.searchParams.set("auto", autoCalculate ? "1" : "0");
    changed = true;
  }
  if (currentURL.searchParams.get("page") === null) {
    currentURL.searchParams.set(
      "page",
      currentURL.searchParams.get("page")
        ? currentURL.searchParams.get("page")
        : "1"
    );
    changed = true;
  }
  if (changed) {
    window.location.href = currentURL.href;
  }

  ///                                      ///
  /// *===== プログレス表示部分の定義 =====* ///
  ///                                      ///

  var progressText = document.createElement("div");
  progressText.style.position = "fixed";
  progressText.style.bottom = "100px";
  progressText.style.left = "10px";
  progressText.style.color = "#fc4d50";
  // ʕ´•ﻌ•`ʔ.。o(これいるの?)
  progressText.style.zIndex = "1000";

  ///                               ///
  /// *===== 除外ボタンの表示 =====* ///
  ///                              ///
  var item_elements = document.getElementsByClassName("l-row u-mb-0");

  var unifiedState = true;

  function updateExclusionList(itemId, isAdding) {
    var currentValue = GM_getValue("exclude_item_ids");

    if (isAdding) {
      GM_setValue("exclude_item_ids", currentValue + ` ${itemId}`);
    } else {
      GM_setValue("exclude_item_ids", currentValue.replace(` ${itemId}`, ""));
    }
  }

  for (let i = 0; i < item_elements.length; i++) {
    var currentItem = item_elements[i];
    var newExcludeButton = document.createElement("button");

    newExcludeButton.id = `excludeButton${i}`;
    newExcludeButton.style = `
            margin-left: -3px;
            color: #ffffff;
            border: none;
            font-size: 12px;
            padding: 10px 6px;

            background: ${
              String(GM_getValue("exclude_item_ids")).indexOf(
                currentItem.firstChild.firstChild.href.match(/\d+$/g)[0]
              ) === -1
                ? "#808080"
                : "#e1362e"
            };
        `;

    newExcludeButton.textContent =
      String(GM_getValue("exclude_item_ids")).indexOf(
        currentItem.firstChild.firstChild.href.match(/\d+$/g)[0]
      ) === -1
        ? "除外する"
        : "除外解除";
    newExcludeButton.className =
      String(GM_getValue("exclude_item_ids")).indexOf(
        currentItem.firstChild.firstChild.href.match(/\d+$/g)[0]
      ) === -1
        ? "ex_false"
        : "ex_true";

    newExcludeButton.addEventListener("click", function (event) {
      var clickedButton = document.querySelector(`#excludeButton${i}`);

      if (event.ctrlKey) {
        unifiedState = !unifiedState;

        for (let j = 0; j < item_elements.length; j++) {
          var otherButton = document.querySelector(`#excludeButton${j}`);
          otherButton.style.background = unifiedState ? "#e1362e" : "#808080";
          otherButton.textContent = unifiedState ? "除外解除" : "除外する";
          otherButton.className = unifiedState ? "ex_true" : "ex_false";

          updateExclusionList(
            otherButton.parentElement.firstChild.href.match(/\d+$/g)[0],
            unifiedState
          );
        }
      } else {
        if (clickedButton.className == "ex_true") {
          clickedButton.style.background = "#808080";
          clickedButton.textContent = "除外する";
          updateExclusionList(
            clickedButton.parentElement.firstChild.href.match(/\d+$/g)[0],
            false
          );
          clickedButton.className = "ex_false";
        } else {
          clickedButton.style.background = "#e1362e";
          clickedButton.textContent = "除外解除";
          updateExclusionList(
            clickedButton.parentElement.firstChild.href.match(/\d+$/g)[0],
            true
          );
          clickedButton.className = "ex_true";
        }
      }
    });

    currentItem.firstChild.appendChild(newExcludeButton);
  }

  ///                                               ///
  /// *===== 除外設定の全リセットショートカット =====* ///
  ///                                               ///
  var keysPressed = {};

  document.addEventListener("keydown", function (event) {
    keysPressed[event.key] = true;

    if (keysPressed["Shift"] && keysPressed["E"] && keysPressed["L"]) {
      keysPressed["Shift"] = false;
      keysPressed["E"] = false;
      keysPressed["L"] = false;
      if (confirm("除外設定を全てリセットしますか?")) {
        GM_setValue("exclude_item_ids", "");
        window.location.href = window.location.href;
      }
    }
  });

  document.addEventListener("keyup", function (event) {
    keysPressed[event.key] = false;
  });

  ///                                                  ///
  /// *=====    商品のID、バリエーションを取得    =====* ///
  ///                                                 ///
  /// Tips: バリエーションを取得して                    ///
  ///       後の関数で購入したバリエーションを確定させて  ///
  ///       値段を決定する                             ///
  ///                                                 ///
  /**
   * 
   * @param {HTMLElement} item_element
   * @returns 
   */
  function collectItemInfo(item_element) {
    var url = item_element.firstChild.href;
    var item_id = url.match(/\d+$/g);

    // 除外設定
    if (String(GM_getValue("exclude_item_ids")).indexOf(item_id) !== -1) {
      return "exclude";
    }

    var item_variation =
      (item_element.parentElement.children[1].children[1].innerText.match(
        /\(.*\)$/g
      ) || [null])[0];
    if (item_variation) {
      item_variation = item_variation.replace(/^\(/, "").replace(/\)$/, "");
    }
    /** @type {HTMLAnchorElement} */
    var order_element = item_element.parentElement.parentElement.querySelector(
      ".l-orders-index-line-item-actions a"
    );
    var order_id = Number(order_element.href.match(/\d+$/)[0]);
    return {
      item_id: item_id[0],
      item_variation: item_variation,
      order_id,
    };
  }

  ///                               ///
  /// *===== 商品の価格を取得 =====* ///
  ///                              ///
  function fetchItemPrice(order_id) {
    return new Promise((resolve, reject) => {
      var xhr = new XMLHttpRequest();
      xhr.withCredentials = true;
      xhr.open("GET", "https://accounts.booth.pm/orders/" + order_id, true);
      xhr.setRequestHeader("Accept", "text/html");
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
          if (xhr.status === 200) {
            var matched = xhr.responseText.match(/お支払金額.*?¥\s*([\d,]+)/);
            if (matched) {
              resolve({
                item_price: Number(matched[1].replace(/,/g, "")),
              });
            } else {
              resolve({
                item_price: undefined,
              });
            }
          } else if (xhr.status === 404) {
            resolve("商品が削除されたか、非公開にされています");
          } else {
            reject("リクエストエラー: ステータスコード " + xhr.status);
          }
        }
      };
      xhr.send();
    });
  }

  ///                                                          ///
  /// *===== 自動化の際、次のページにリダイレクトさせる関数 =====* ///
  ///                                                          ///
  function processPageParamAndRedirect(url) {
    var parsedURL = new URL(url);
    var pageParam = parsedURL.searchParams.get("page");
    var currentPage = parseInt(pageParam, 10);
    var nextPage = currentPage + 1;
    parsedURL.searchParams.set("page", nextPage.toString());
    window.location.href = parsedURL.href;
  }

  ///                                                  ///
  /// *===== 自動化の際、終了したら1ページ目に転送 =====* ///
  ///                                                  ///
  function pageReset() {
    var parsedURL = new URL(window.location.href);
    parsedURL.searchParams.set("page", "1");
    parsedURL.searchParams.set("auto", "0");
    window.location.href = parsedURL.href;
  }

  ///                         ///
  /// *===== メイン関数 =====* ///
  ///                         ///
  var item_list = [];

  async function main() {
    var url = new URL(window.location.href);

    // 計算を開始したら、ボタンを無効化する
    var button = document.querySelector(".booth-total-price-button");
    button.disabled = true;
    button.style.cursor = "wait";

    // 購入履歴ページの購入したアイテムを取得
    var item_list_elements = Array.from(
      document.querySelectorAll('[class="l-col-auto"]')
    );
    item_list = item_list_elements.map(collectItemInfo);

    // 除外設定
    if (item_list.every((v) => v == "exclude") && item_list.length !== 0) {
      processPageParamAndRedirect(window.location.href);
    } else if (item_list.length === 0) {
      alert("計算が終了しました");
      pageReset();
    }
    item_list = item_list.filter((element) => !(element == "exclude"));
    var order_id_uniq = {};
    item_list = item_list.filter(function (item) {
      if (order_id_uniq[item.order_id]) {
        return false;
      } else {
        order_id_uniq[item.order_id] = true;
        return true;
      }
    });
    var last_order_id = url.searchParams.get("last_order_id");
    if (last_order_id) {
      last_order_id = Number(last_order_id);
      item_list = item_list.filter(function (item) {
        return item.order_id !== last_order_id;
      });
    }

    // 変数定義
    var price_list = [];
    var totalItems = item_list.length;
    var completedItems = 0;

    // プログレス表示
    progressText.textContent = `計算中... : ${completedItems}/${totalItems}`;
    document.body.appendChild(progressText);

    for (let i = 0; i < item_list.length; i++) {
      // 変数定義
      var item_info = item_list[i];
      var order_id = item_info.order_id;
      try {
        // アイテムの価格を取得
        var item_price = await fetchItemPrice(order_id);
        price_list.push(item_price.item_price);
      } catch (error) {
        console.error(error);
      }
      completedItems++;

      // プログレス表示
      progressText.textContent = `進行中: ${completedItems}/${totalItems}`;

      ///                   **--- 重要! --- **                      ///
      ///  この遅延は、Boothのサーバーに負荷をかけないために存在します   ///
      ///   意図的に時間を変えたり、削除して処理速度を早めるのは禁止です ///
      await new Promise((resolve) => setTimeout(resolve, 900));
    }
    // 価格の合計を計算
    price_list = price_list.filter((element) => !(element == undefined)); // 価格情報がなければ除外
    var total_price = price_list.reduce(function (a, b) {
      return a + b;
    });

    // totalパラメーターに合計金額を追加
    var existingTotal = parseFloat(url.searchParams.get("total")) || 0;

    var newTotal = existingTotal + total_price;

    url.searchParams.set("total", newTotal);
    url.searchParams.set("last_order_id", item_list[item_list.length - 1].order_id);

    if (!autoCalculate) {
      // 自動化が無効の場合
      // アラートを表示
      alert(
        `このページの合計金額: ${total_price}円\n今までの合計金額: ${newTotal}円`
      );
      window.location.href = url.href;

      // 一応二度押せないようにする
      progressText.textContent = "";
      button.disabled = true;
      button.textContent = "計算済み";
    }
    // 自動化が有効の場合
    else {
      // 次のページにそのまま転送、アラートを表示しない
      processPageParamAndRedirect(url);
    }
  }

  // 合計金額をtotalパラメーターから取得
  // TODO: まだ最適化の余地あり?面倒くさいかも ꜀( ꜆ᐢ. ̫.ᐢ)꜆ パタ
  var total_price = new URL(window.location.href).searchParams.get("total");

  ///                                  ///
  /// *===== 金額計算ボタンの表示 =====* ///
  ///                                  ///
  function addButton() {
    const button = document.createElement("button");
    button.innerText = "金額計算";
    button.classList.add("booth-total-price-button");
    button.style.background = "#fc4d50";
    button.style.color = "#ffffff";
    button.style.borderRadius = "20px";
    button.style.padding = "10px 15px";
    button.style.border = "none";
    button.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1)";
    button.style.cursor = "pointer";
    button.style.position = "fixed";
    button.style.bottom = "10px";
    button.style.left = "10px";
    button.style.zIndex = "1000";
    button.addEventListener("mouseover", () => {
      button.style.background = "#ff6669";
    });
    button.addEventListener("mouseout", () => {
      button.style.background = "#fc4d50";
    });
    button.onclick = main;
    document.body.appendChild(button);
  }
  addButton();

  ///                                  ///
  /// *===== 数値リセットの関数   =====* ///
  /// *===== リセットボタンの表示 =====* ///
  ///                                  ///
  function resetTotal() {
    var url = new URL(window.location.href);
    url.searchParams.set("total", 0);
    url.searchParams.set("auto", 0);

    if (!confirm("累計金額をリセットしますか?")) {
      return;
    }

    window.location.href = url.href;
  }

  function addResetButton() {
    const resetButton = document.createElement("button");
    resetButton.innerText = "累計金額をリセット";
    resetButton.classList.add("booth-reset-button");
    resetButton.style.background = "#0077B5";
    resetButton.style.color = "#ffffff";
    resetButton.style.borderRadius = "20px";
    resetButton.style.padding = "10px 15px";
    resetButton.style.border = "none";
    resetButton.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1)";
    resetButton.style.cursor = "pointer";
    resetButton.style.position = "fixed";
    resetButton.style.bottom = "10px";
    resetButton.style.left = "280px";
    resetButton.style.zIndex = "1000";
    resetButton.addEventListener("mouseover", () => {
      resetButton.style.background = "#005588";
    });
    resetButton.addEventListener("mouseout", () => {
      resetButton.style.background = "#0077B5";
    });
    resetButton.onclick = resetTotal;
    document.body.appendChild(resetButton);
  }
  addResetButton();

  function openTweetTab(total_price) {
    const tweetText = `私がBoothで使用した合計金額は、『${Number(
      total_price
    ).toLocaleString()}円』でした!\n\n#私がBoothに使った金額`;
    // ( ´~`).。 (いずれx.comにしないといけないのかな...?)
    const tweetURL =
      "https://twitter.com/intent/tweet?text=" + encodeURIComponent(tweetText);
    window.open(tweetURL, "_blank");
  }

  ///                                  ///
  /// *===== ツイートボタンの表示 =====* ///
  ///                                  ///
  function addTweetButton(total_price) {
    const tweetButton = document.createElement("button");
    tweetButton.innerText = "Twitterに共有";
    tweetButton.style.background = "#1DA1F2";
    tweetButton.style.color = "#fff";
    tweetButton.style.borderRadius = "20px";
    tweetButton.style.padding = "10px 15px";
    tweetButton.style.border = "none";
    tweetButton.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1)";
    tweetButton.style.cursor = "pointer";
    tweetButton.style.position = "fixed";
    tweetButton.style.bottom = "60px";
    tweetButton.style.left = "280px";
    tweetButton.style.zIndex = "1000";
    tweetButton.addEventListener("mouseover", () => {
      tweetButton.style.background = "#1A91DA";
    });
    tweetButton.addEventListener("mouseout", () => {
      tweetButton.style.background = "#1DA1F2";
    });
    tweetButton.onclick = function () {
      const tweetText = `私がBoothで使用した合計金額は、『${Number(
        total_price
      ).toLocaleString()}円』でした!\n\n#私がBoothに使った金額`;
      // ( ´~`).。 (いずれx.comにしないといけないのかな...?)
      const tweetURL =
        "https://twitter.com/intent/tweet?text=" +
        encodeURIComponent(tweetText);
      window.open(tweetURL, "_blank");
    };
    document.body.appendChild(tweetButton);
  }
  addTweetButton(total_price);

  ///                            ///
  /// *===== 自動化の開始 =====*  ///
  ///   ただのパラメーター変更!   ///
  ///                            ///
  function startAuto() {
    var url = new URL(window.location.href);
    url.searchParams.set("auto", 1);
    window.location.href = url.href;
  }

  ///                            ///
  /// *===== 自動化の停止 =====*  ///
  ///   ただのパラメーター変更!   ///
  ///                            ///
  function stopAuto() {
    var url = new URL(window.location.href);
    url.searchParams.set("auto", 0);
    window.location.href = url.href;
  }

  ///                                 ///
  /// *===== 自動化ボタンの表示 =====* ///
  ///                                ///
  function addAutoButton() {
    const autoButton = document.createElement("button");
    autoButton.innerText = "自動計算開始!";
    autoButton.style.background = "#1b7f8c";
    autoButton.style.color = "#fff";
    autoButton.style.borderRadius = "20px";
    autoButton.style.padding = "10px 15px";
    autoButton.style.border = "none";
    autoButton.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1)";
    autoButton.style.cursor = "pointer";
    autoButton.style.position = "fixed";
    autoButton.style.bottom = "10px";
    autoButton.style.left = "120px";
    autoButton.style.zIndex = "1000";
    if (autoCalculate) {
      autoButton.addEventListener("mouseover", () => {
        autoButton.style.background = "#c00b3c";
      });
      autoButton.addEventListener("mouseout", () => {
        autoButton.style.background = "#f30f4c";
      });
      autoButton.innerText = "自動計算を停止";
      autoButton.style.background = "#f30f4c";
      autoButton.onclick = stopAuto;
    } else {
      autoButton.addEventListener("mouseover", () => {
        autoButton.style.background = "#22a1b2";
      });
      autoButton.addEventListener("mouseout", () => {
        autoButton.style.background = "#1b7f8c";
      });
      autoButton.onclick = startAuto;
    }
    document.body.appendChild(autoButton);
  }
  addAutoButton();

  ///                             ///
  /// *===== 参考資料の表示 =====* ///
  ///                             ///
  function typicalPrice(total_price) {
    total_price = Number(total_price);
    if (total_price >= 114381200000000) {
      return "日本の国家予算をまかなえていました!";
    }
    if (total_price >= 23760000000000) {
      return "イーロン・マスクよりお金持ちでした!";
    }
    if (total_price >= 9000000000000) {
      return "映画「シン・ゴジラ」の被害額を一人で賠償できました!";
    }
    if (total_price >= 1652283360000) {
      return "Google社の時価総額を超えていました!";
    }
    if (total_price >= 1510160000000) {
      return "Discordを買収できていたかもしれません!";
    }
    if (total_price >= 639000000000) {
      return "映画「名探偵コナン 紺青の拳」の被害額を一人で賠償できました!";
    }
    if (total_price >= 395000000000) {
      return "イージス艦を一隻買えました!";
    }
    if (total_price >= 90804000000) {
      return "マインクラフトの金ブロック1個が買えました!";
    }
    if (total_price >= 1250000000) {
      return "VRChatの推定時価総額を超えていました!";
    }
    if (total_price >= 1208280000) {
      return "GTA5のバイク「オプレッサー MkⅡ」を1台買えました!";
    }
    if (total_price >= 332277000) {
      return "GTA5の潜水艦「コサトカ」を1艇買えました!";
    }
    if (total_price >= 143600000) {
      return "首都圏の新築マンション1戸が買えました!";
    }
    if (total_price >= 53200000) {
      return "USJの夜間貸し切りが出来ました!";
    }
    if (total_price >= 8920000) {
      return "新車のベルファイアが買えました!";
    }
    if (total_price >= 7336000) {
      return "エンジニアの平均年収を超えていました!";
    }
    if (total_price >= 6116279) {
      return "コンビニ1軒の全商品を購入できていました!";
    }
    if (total_price >= 5000000) {
      return "クロマグロ1尾が買えました!";
    }
    if (total_price >= 4610000) {
      return "サラリーマンの平均年収を超えていました!";
    }
    if (total_price >= 3214800) {
      return "東京大学理Ⅲの1年の学費をまかなえていました!";
    }
    if (total_price >= 2750000) {
      return "新型プリウスの新車が買えました!";
    }
    if (total_price >= 2361000) {
      return "40人規模の結婚式を挙げられました!相手は付属しません";
    }
    if (total_price >= 1548000) {
      return "中古車1台が買えました!";
    }
    if (total_price >= 1500000) {
      return "ゲーセンのmaimai筐体が買えました!";
    }
    if (total_price >= 1386000) {
      return "GeeScorpion(超高級ゲーミングチェア)が買えました!";
    }
    if (total_price >= 1180872) {
      return "ペッパーくんが一人買えました!";
    }
    if (total_price >= 1111400) {
      return "大学生の1年の生活費をまかなえていました!";
    }
    if (total_price >= 1000000) {
      return "ゲーセンの太鼓の達人の新筐体が買えました!";
    }
    if (total_price >= 940000) {
      return "ゲーセンにあるポップンミュージックの旧筐体が買えました!";
    }
    if (total_price >= 917540) {
      return "鹿児島駅前から札幌駅前までタクシーで移動できました!";
    }
    if (total_price >= 800000) {
      return "ゲーセンのダンエボの筐体が買えました!";
    }
    if (total_price >= 770000) {
      return "Valorantの全スキンが買えました!";
    }
    if (total_price >= 650000) {
      return "ゲーセンのProject Divaの筐体が買えました!";
    }
    if (total_price >= 588450) {
      return "超ハイスペックゲーミングパソコンが1台買えました!";
    }
    if (total_price >= 540000) {
      return "公園にある4人乗りブランコが買えました!";
    }
    if (total_price >= 493450) {
      return "大阪駅前から青森駅までタクシーで移動できました!";
    }
    if (total_price >= 460000) {
      return "公園にあるジャングルジムが買えました!";
    }
    if (total_price >= 400000) {
      return "Valve Index VRフルキット + ハイスペックゲーミングパソコンが買えました!";
    }
    if (total_price >= 359777) {
      return "Nvidia Quadro RTX 5000が買えました!";
    }
    if (total_price >= 319800) {
      return "Nvidia RTX 4090が買えました!";
    }
    if (total_price >= 310000) {
      return "公園にある2人乗りブランコが買えました!";
    }
    if (total_price >= 280000) {
      return "公園にあるうんていが買えました!";
    }
    if (total_price >= 250000) {
      return "4泊6日ハワイ旅行ができました!";
    }
    if (total_price >= 219800) {
      return "iPhone 15 Pro Max 512GBが買えました!";
    }
    if (total_price >= 198000) {
      return "iMacを1台買えました!";
    }
    if (total_price >= 165980) {
      return "Valve Index VRフルキットが買えました!";
    }
    if (total_price >= 159800) {
      return "iPhone 15 Pro 128GBが買えました!";
    }
    if (total_price >= 150000) {
      return "公園にある鉄棒が1欄買えました!";
    }
    if (total_price >= 149000) {
      return "キングサイズのベッドが買えました!";
    }
    if (total_price >= 147000) {
      return "このツールの作者の貯金額以上でした......";
    }
    if (total_price >= 139800) {
      return "iPhone 15 Plusが買えました!";
    }
    if (total_price >= 124800) {
      return "iPad Pro 11インチが買えました!";
    }
    if (total_price >= 104000) {
      return "東京都の平均家賃1ヶ月分をまかなえました!";
    }
    if (total_price >= 96800) {
      return "Meta Quest 3 512GBが買えました!";
    }
    if (total_price >= 82800) {
      return "Valve Index HMDが買えました!";
    }
    if (total_price >= 74800) {
      return "Meta Quest 3 128GBが買えました!";
    }
    if (total_price >= 53900) {
      return "Meta Quest 2 256GBが買えました!";
    }
    if (total_price >= 49000) {
      return "PICO 4が買えました!";
    }
    if (total_price >= 47300) {
      return "Meta Quest 2 128GBが買えました!";
    }
    if (total_price >= 38410) {
      return "一人暮らしの一ヶ月の食費がまかなえました!";
    }
    if (total_price >= 32890) {
      return "Yogibo Maxが買えました!";
    }
    if (total_price >= 17490) {
      return "ジェラピケのパジャマが買えました!";
    }
    if (total_price >= 9100) {
      return "カイジの月給を超えていました!";
    }
    if (total_price >= 7900) {
      return "ディズニーランドで1日遊べていました!";
    }
    if (total_price >= 5368) {
      return "焼肉食べ放題に行けました!";
    }
    if (total_price >= 4748) {
      return "モンエナ355mlが24本買えました!";
    }
    if (total_price >= 3905) {
      return "ストゼロ500mlが24本買えました!";
    }
    if (total_price >= 1999) {
      return "ダイの大冒険が買えました!";
    }
    if (total_price >= 1500) {
      return "VRChat Plusに1ヶ月加入できました!";
    }
    if (total_price >= 1280) {
      return "YouTube Premiumに1ヶ月加入できました!";
    }
    if (total_price >= 700) {
      return "スタバのフラペチーノが飲めました!";
    }
    if (total_price >= 300) {
      return "ファミマのアイスコーヒーLサイズが飲めました!";
    }
    if (total_price >= 220) {
      return "ファミチキが1個買えました!";
    }
    if (total_price >= 100) {
      return "ボールペンが1本買えました!";
    }
    if (total_price >= 20) {
      return "もやしが1袋買えました!";
    }
    if (total_price >= 3) {
      return "レジ袋Mサイズ1枚しか買えませんでした......";
    }
    return "何も買えませんでした。";
  }

  ///                             ///
  /// *===== 累計金額の表示 =====* ///
  ///                             ///
  function setTotalPrice(total_price) {
    var totalText = document.createElement("div");
    totalText.style.position = "fixed";
    totalText.style.bottom = "60px";
    totalText.style.left = "10px";
    totalText.style.backgroundColor = "#333";
    totalText.style.color = "#fff";
    totalText.style.padding = "6px 18px";
    totalText.style.borderRadius = "20px";
    totalText.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1";
    totalText.style.border = "none";
    totalText.style.zIndex = "1000";
    totalText.style.cursor = "pointer";
    totalText.textContent =
      "累計金額: " + Number(total_price).toLocaleString() + "円";
    totalText.addEventListener("mouseover", () => {
      totalText.style.background = "#444";
    });
    totalText.addEventListener("mouseout", () => {
      totalText.style.background = "#333";
    });
    totalText.onclick = function () {
      if (
        confirm(
          `もし『${Number(
            total_price
          ).toLocaleString()}円』あれば...\n${typicalPrice(
            total_price
          )}\n\nOKを押すと、この文章を入れてツイートします。`
        )
      ) {
        const tweetText =
          `私がBoothで使用した合計金額は、『${Number(
            total_price
          ).toLocaleString()}円』でした!\n` +
          `もし${Number(
            total_price
          ).toLocaleString()}円あれば...\n『${typicalPrice(
            total_price
          )}』\n\n` +
          `#私がBoothに使った金額`;
        // ( ´~`).。 (いずれx.comにしないといけないのかな...?)
        const tweetURL =
          "https://twitter.com/intent/tweet?text=" +
          encodeURIComponent(tweetText);
        window.open(tweetURL, "_blank");
      }
    };
    document.body.appendChild(totalText);
  }
  setTotalPrice(total_price);

  ///                             ///
  /// *===== スタート!!! =====* ///
  ///      - ̗̀ ( ˶'ᵕ'˶) ̖́-          ///
  if (autoCalculate) {
    main();
  }
})();