Bopimo Item Data Downloader

Adds a button to download item textures from Bopimo.com

2025-01-13 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         Bopimo Item Data Downloader
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Adds a button to download item textures from Bopimo.com
// @author       Teemsploit, Variant Tombstones, Evelyn
// @license      MIT
// @match        https://www.bopimo.com/items/*
// @run-at       document-start
// @grant        none
// ==/UserScript==

(function () {
  'use strict';

  function injectUI() {
    var buttonPanel = document.createElement('div');
    buttonPanel.id = "custom-download-panel";
    buttonPanel.className = "shop-card";
    buttonPanel.style = "position: fixed; z-index: 1000; padding: 1rem;";
    buttonPanel.style.bottom = "1rem";
    buttonPanel.style.right = "1rem";
    buttonPanel.innerHTML = `
      <button class="button" id="download-texture-btn">Download Texture</button>
      <button class="button" id="download-mesh-btn" style="margin-left: 10px;">Download Mesh</button>
      <p>Credits: Teemsploit & Variant Tombstones</p>
    `;
    document.body.appendChild(buttonPanel);
  }

  function makeButtonsDoStuffIGuess() {
    const textureButton = document.getElementById("download-texture-btn");
    const meshButton = document.getElementById("download-mesh-btn");

    if (textureButton) {
      textureButton.addEventListener("click", () => download('image'));
    }

    if (meshButton) {
      meshButton.addEventListener("click", () => download('mesh'));
    }
  }

  function download(type) {
    try {
      var imageUrl = document.querySelector('meta[property="og:image"]').getAttribute('content');
      if (!imageUrl) {
        alert('Image link not found.');
        return;
      }
      var assetUrl = imageUrl.replace("renders/thumbnail", "assets");

      // Fix: Proper comparison for the type
      if (type === 'mesh') {
        assetUrl = assetUrl.replace(".png", ".obj");
      }

      var parts = assetUrl.split("/");
      var fileName = parts[parts.length - 1];
      var link = document.createElement("a");
      link.setAttribute("href", assetUrl);
      link.setAttribute("download", fileName);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    } catch (err) {
      alert('An error occurred: ' + err);
    }
  }

  function waitForDomReady() {
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', makeButtonsDoStuffIGuess);
    } else {
      makeButtonsDoStuffIGuess();
    }
  }

  injectUI();

  waitForDomReady();
})();