Add non-MFC figure

Track preordered non-MFC items on collection screen

目前為 2020-07-28 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Add non-MFC figure
// @namespace    https://tharglet.me.uk
// @version      1.3
// @description  Track preordered non-MFC items on collection screen
// @author       Tharglet
// @match        https://myfigurecollection.net/users.v4.php?*mode=view&*tab=collection&*
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==

(function() {
    'use strict';
    var isUserProfile = () => {
        let loggedInUser = $(".user-menu .handle");
        if(loggedInUser) {
            let userLink = loggedInUser.attr("href");
            if(userLink === "/session/signup") {
                return false;
            } else {
                let userParam;
                const windowLocation = window.location.href;
                if(windowLocation.startsWith("https://myfigurecollection.net/profile/")) {
                    userParam = windowLocation.match(/https:\/\/myfigurecollection\.net\/profile\/([^\/]*)/)[1];
                } else {
                    const urlParams = new URLSearchParams(window.location.search);
                    userParam = urlParams.get("username");
                }
                return userParam === userLink.substring("9");
            }
        } else {
            return false;
        }
    };

    var additionalFigures = JSON.parse(GM_getValue("additionalFigures", "[]"));
    var drawAdditionalFigures = () => {

        const urlParams = new URLSearchParams(window.location.search);
        const sortType = urlParams.get("sort") || "category";
        const output = urlParams.get("output");
        //Clear all additions before redo
        $("#nonMfcAdditions").remove();
        $(".nonMfcIcon").remove();
        $(".nonMfcDelete").remove();
        $(".nonMfcAddedyear").remove();
        if(additionalFigures.length > 0) {
            //Pre-add setup
            const addList = $("#nonMfcFigureList");
            let dateHeadings;
            if(sortType == "groupByReleaseDates") {
                if(output === "0") {
                    dateHeadings = $("li.listing-title");
                } else {
                    dateHeadings = $(".listing-item h3");

                }
            } else if(sortType.startsWith("groupBy")) {
                if(output === "0") {
                    $(".listing-toggles:last").after('<li id="nonMfcAdditions" class="listing-title">Non-MFC</li>');
                } else {
                    $(".listing-item .item-icons").prepend('<div class="item-group-by" id="nonMfcAdditions"><h3>Non-MFC</h3></div>');
                }

            }
            //Add icons to page and delete box
            additionalFigures.forEach((fig, idx) => {
                let linkLine;
                const figYear = fig.date.substring(0, 4);
                const figMonth = fig.date.substring(5);
                const figureThumb = `<span class="item-icon nonMfcIcon">
<a href="${fig.link}" class="tbx-tooltip item-root-0 item-category-1">
<img src="${fig.image}">
</a>
</span>`;
                if(output === "0") {
                    linkLine = `<div class='listing-item nonMfcIcon'><div class="stamp item-stamp">
<a href="/item/872779" class="tbx-tooltip">
<img class="stamp-icon" src="${fig.image}"</a><div class="stamp-anchor"><a class="tbx-tooltip item-category-1" href="${fig.link}">${fig.name}</a>
</div></div></div>`
                }
                addList.append(figureThumb + `<a href="#" class='nonMfcDelete' title="Delete" data-index="${idx}"><span class="tiny-icon-only icon-trash-o" data-index="${idx}"></span></a>`);
                let toAppend = true;
                if(sortType == "groupByReleaseDates") {
                    dateHeadings.each((idx, heading) => {
                        if(toAppend) {
                            const headingYear = $(heading).text().substring(0,4);
                            const headingMonth = $(heading).text().substring(5);
                            if(figYear == headingYear && figMonth == headingMonth) {
                                if(output === "0") {
                                    $(heading).after(linkLine);
                                } else {
                                    $(heading).after(figureThumb);
                                }
                                toAppend = false;
                            } else if(new Date(figYear, figMonth, 1) > new Date(headingYear, headingMonth, 1)) {
                                if(output === "0") {
                                    const newHeading = `<li class="listing-title nonMfcAddedyear" id='nhi_${idx}'>${figYear}-${figMonth}</li></h3>`
                                    $(heading).before(newHeading + linkLine);
                                } else {
                                    const newHeading = `<h3 class="nonMfcAddedyear" id='nhi_${idx}'>${figYear}-${figMonth}</h3>`
                                    $(heading).before(newHeading + figureThumb);
                                }
                                dateHeadings.splice(idx, 0, $(`#nhi_${idx}`));
                                toAppend = false;
                            }
                        }
                    });
                } else if(sortType.startsWith("groupBy")) {
                    if(output === "0") {
                        $("#nonMfcAdditions").after(linkLine)
                    } else {
                        $("#nonMfcAdditions h3").after(figureThumb);
                    }
                } else {
                    if(output === "0") {
                        $(".listing-toggles:last").after(linkLine);
                    } else {
                        $(".listing-item .item-icons").prepend(figureThumb);
                    }
                }
            });
            $('.nonMfcDelete').click((evt) => {
                evt.preventDefault();
                if(confirm("Delete this figure?")) {
                    additionalFigures.splice($(evt.target).attr("data-index"), 1);
                    additionalFigures.sort((a, b) => (a.date < b.date) ? 1 : -1);
                    GM_setValue("additionalFigures", JSON.stringify(additionalFigures));
                    drawAdditionalFigures();
                }
            });
        }
    }

    $().ready(() => {
        if(isUserProfile()) {
            const addSection = `<section>
<h2>Add non-MFC figure</h2>
<div class='form'>
<div class='bigchar form-field'>
<div class='form-label'>Figure name</div>
<div class='form-input'><input type='text' id='nonMfcItemName'/></div>
</div>
<div class='bigchar form-field'>
<div class='form-label'>Image URL *</div>
<div class='form-input'><input type='text' id='nonMfcItemImage'/></div>
</div>
<div class='bigchar form-field'>
<div class='form-label'>Item link *</div>
<div class='form-input'><input type='text' id='nonMfcItemLink'/></div>
</div>
<div class='bigchar form-field'>
<div class='form-label'>Release date (YYYY-MM) *</div>
<div class='form-input'><input type='text' id='nonMfcItemReleaseDate'/></div>
</div>
<div class='form-field'>
<div class='form-input'>
<button id='addNonMfcItem'>Add</button>
</div>
</div>
</div>
</section>
<section>
<h2>Added non-MFC figures</h2>
<div class='form'>
<div id='nonMfcFigureList' class='item-icons'>
</div>
</div>
</section>`
            $("#side section:last").after(addSection);
            drawAdditionalFigures();
            $("#addNonMfcItem").click((e) => {
                e.preventDefault();
                const name = $("#nonMfcItemName").val() || "Non-MFC figure";
                const image = $("#nonMfcItemImage").val();
                const link = $("#nonMfcItemLink").val();
                const date = $("#nonMfcItemReleaseDate").val();
                if(image && link && date && name) {
                    if(date.match(/^\d{4}-0[1-9]|1[0-2]$/)) {
                        additionalFigures.push({
                            name: name,
                            image: image,
                            link: link,
                            date: date
                        });
                        additionalFigures.sort((a, b) => (a.date < b.date) ? 1 : -1);
                        GM_setValue("additionalFigures", JSON.stringify(additionalFigures));
                        drawAdditionalFigures();
                        $("#nonMfcItemName").val("");
                        $("#nonMfcItemImage").val("");
                        $("#nonMfcItemLink").val("");
                        $("#nonMfcItemReleaseDate").val("");
                    } else {
                        alert("Please enter a valid date in YYYY-MM format");
                    }
                } else {
                    alert("Please fill in all mandatory fields");
                }
            });
        }
    });

})();