您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Track preordered non-MFC items on collection screen
当前为
// ==UserScript== // @name Add non-MFC figure // @namespace https://tharglet.me.uk // @version 1.7 // @description Track preordered non-MFC items on collection screen // @author Tharglet // @match https://myfigurecollection.net/users.v4.php?*mode=view&*tab=collection&* // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // ==/UserScript== //Polyfill for GM_addStyle for Greasemonkey... if(typeof GM_addStyle == 'undefined') { GM_addStyle = (aCss) => { 'use strict'; let head = document.getElementsByTagName('head')[0]; if (head) { let style = document.createElement('style'); style.setAttribute('type', 'text/css'); style.textContent = aCss; head.appendChild(style); return style; } return null; }; } GM_addStyle(` .non-mfc-item__tray-icon { border: green 1px solid; display: block; margin: 8px; padding: 1px; } .non-mfc-item__icon-container { float: left; margin-bottom: 20px; } .non-mfc-item__tray-icon img { width: 60px; height: 60px; border-radius: 2px; } .non-mfc-item__edit, .non-mfc-item__delete { display: inline-block; } .non-mfc-item__edit span, .non-mfc-item__delete span { font-size: 16px; margin: 0 4px; } `); (function() { 'use strict'; let BASE_COUNT = 0; var isUsersPreorderPage = () => { const urlParams = new URLSearchParams(window.location.search); const status = urlParams.get("status"); if(status == 1) { 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; } } else { return false; } }; var additionalFigures = JSON.parse(GM_getValue("additionalFigures", "[]")); var resetNonMfcItemForm = () => { $("#non-mfc-item__form-title").text('Add non-MFC figure'); $("#addNonMfcItem").text("Add"); $("#nonMfcItemEditId").val(""); $("#nonMfcItemName").val(""); $("#nonMfcItemImage").val(""); $("#nonMfcItemLink").val(""); $("#nonMfcItemReleaseDate").val(""); } 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(); $(".non-mfc-item__icon").remove(); $(".non-mfc-item__edit").remove(); $(".non-mfc-item__delete").remove(); $(".non-mfc-item__year-header").remove(); if(additionalFigures.length > 0) { //update item count let totalFigureCount = BASE_COUNT + additionalFigures.length; $('.listing-link-toggle.on .count').text(totalFigureCount); $('.listing-count-value').get(0).lastChild.nodeValue = `${totalFigureCount} items`; //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="non-mfc-item__icon item-icon"> <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 non-mfc-item__icon'><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(`<span class='non-mfc-item__icon-container'> ${figureThumb.replace('item-icon', 'non-mfc-item__tray-icon')} <a href="#" class='non-mfc-item__edit' title="Edit" data-index="${idx}"><span class="tiny-icon-only icon-pencil-square-o" data-index="${idx}"></span></a> <a href="#" class='non-mfc-item__delete' title="Delete" data-index="${idx}"><span class="tiny-icon-only icon-trash-o" data-index="${idx}"></span></a> </span>`); 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 non-mfc-item__year-header" id='nhi_${idx}'>${figYear}-${figMonth}</li></h3>` $(heading).before(newHeading + linkLine); } else { const newHeading = `<h3 class="non-mfc-item__year-header" id='nhi_${idx}'>${figYear}-${figMonth}</h3>` $(heading).before(newHeading + figureThumb); } dateHeadings.splice(idx, 0, $(`#nhi_${idx}`)); toAppend = false; } } }); //Append if trailing if(toAppend) { const newHeading = `<h3 class="non-mfc-item__year-header" id='nhi_${idx}'>${figYear}-${figMonth}</h3>` $('.item-group-by:last').after('<div class="item-group-by">' + newHeading + figureThumb + '</div>'); dateHeadings.push($(`#nhi_${idx}`)); } } 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); } } }); $('.non-mfc-item__delete').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(); resetNonMfcItemForm(); } }); $('.non-mfc-item__edit').click((evt) => { evt.preventDefault(); var figToEdit = additionalFigures[$(evt.target).attr("data-index")]; $("#non-mfc-item__form-title").text(`Editing ${figToEdit.name}`); $("#addNonMfcItem").text("Edit"); $("#nonMfcItemEditId").val($(evt.target).attr("data-index")); $("#nonMfcItemName").val(figToEdit.name); $("#nonMfcItemImage").val(figToEdit.image); $("#nonMfcItemLink").val(figToEdit.link); $("#nonMfcItemReleaseDate").val(figToEdit.date); $([document.documentElement, document.body]).animate({ scrollTop: $("#non-mfc-item__section").offset().top - 100 }, 200); }); $("#cancelNonMfcItem").click((evt) => { evt.preventDefault(); if(confirm("Are you sure you want to cancel?")) { resetNonMfcItemForm(); } }); } } $().ready(() => { BASE_COUNT = parseInt($('.listing-link-toggle.on .count').text()); if(isUsersPreorderPage()) { const addSection = `<section id='non-mfc-item__section'> <h2 id='non-mfc-item__form-title'>Add non-MFC figure</h2> <div class='form'> <input type='hidden' id='nonMfcItemEditId' value=''/> <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> <button id='cancelNonMfcItem'>Cancel</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(); const editId = $("#nonMfcItemEditId").val(); if(image && link && date && name) { if(date.match(/^\d{4}-0[1-9]|1[0-2]$/)) { if(editId) { additionalFigures[editId] = { name: name, image: image, link: link, date: date } } else { 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(); resetNonMfcItemForm(); } else { alert("Please enter a valid date in YYYY-MM format"); } } else { alert("Please fill in all mandatory fields"); } }); } }); })();