Board Game Geek - One page auction geeklists

Loads all geeklist items into a single view simmilar to Peyo61's external tool.

目前为 2022-08-26 提交的版本。查看 最新版本

// ==UserScript==
// @name         Board Game Geek - One page auction geeklists
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Loads all geeklist items into a single view simmilar to Peyo61's external tool.
// @author       Kempeth @ boardgamegeek
// @match        https://boardgamegeek.com/geeklist/301669/essen-2022-no-shipping-auction-list-post-your-own
// @match        https://boardgamegeek.com/geeklist/301669/essen-2022-no-shipping-auction-list-post-your-own?page=*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=boardgamegeek.com
// @grant        none
// @license      MIT
// ==/UserScript==

var btnConvert;
var btnItems;
var progressFull;
var progressEmpty;
var geeklistid;
var itemList;
var firstItem;

(function() {
    'use strict';

    // Your code here...

    //window.setTimeout(addButtons, 2000);
    window.addEventListener('load', init, false);
})();

function retry(f)
{
    window.setTimeout(f, 500);
}

function init()
{
    var els = document.getElementsByTagName('gg-geeklist-page-ui');//gg-geeklist-items-ui
    console.log(els);
    if (els.length == 0) { retry(init); return; }

    els = els[0].getElementsByTagName('header');
    console.log(els);
    if (els.length == 0) { retry(init); return; }

    els = els[0].getElementsByTagName('nav');
    console.log(els);
    if (els.length == 0) { retry(init); return; }

    var el = els[0];
    btnConvert = document.createElement('button');
    btnConvert.innerHTML = "One Page Auction";
    btnConvert.className = "btn btn-warning";
    btnConvert.onclick = convert;
    el.append(btnConvert);
}

function setProgress(done, total)
{
    var percentage = done * 100.0 / total;
    progressFull.style.width = percentage + '%';
    progressEmpty.style.width = (100 - percentage) + '%';
    progressFull.setAttribute('aria-valuemax', total);
    progressFull.setAttribute('aria-valuenow', done);
    if (percentage > 50)
    {
        progressFull.innerHTML = done + ' / ' + total;
        progressEmpty.innerHTML = '';
    }
    else
    {
        progressEmpty.innerHTML = done + ' / ' + total;
        progressFull.innerHTML = '';
    }
}

function convert()
{
    var els = document.getElementsByTagName('gg-geeklist-page-ui');
    console.log(els);
    if (els.length == 0) { retry(convert); return; }

    els = els[0].getElementsByTagName('div');
    console.log(els);
    if (els.length == 0) { retry(convert); return; }

    var footerNav = els[0].getElementsByTagName('nav');
    console.log(footerNav);
    if (els.length == 0) { retry(convert); return; }
    footerNav = footerNav[footerNav.length - 1];

    els = els[0].getElementsByTagName('header');
    console.log(els);
    if (els.length == 0) { retry(convert); return; }

    els = els[0].getElementsByTagName('nav');
    console.log(els);
    if (els.length == 0) { retry(convert); return; }
    var headerNav = els[0];

    els = document.getElementsByTagName('gg-geeklist-items-ui');
    console.log(els);
    if (els.length == 0) { retry(convert); return; }

    els = els[0].getElementsByTagName('div');
    console.log(els);
    if (els.length == 0) { retry(convert); return; }
    itemList = els[0];

    // remove header items
    for (var child of headerNav.childNodes)
    {
        if (child.tagName != 'GG-THUMBS-GEEKGOLD-GIVEN' && child.tagName != 'GG-SUBSCRIPTION-BUTTON')
        {
            headerNav.removeChild(child);
        }
    }
    // add header items
    var progress = document.createElement('div');
    progress.className = "progress";
    progress.style.height = "32px";
    progress.style.width = "256px";
    headerNav.appendChild(progress);

    progressFull = document.createElement('div');
    progressFull.className = "progress-bar";
    progressFull.setAttribute('role', 'progressbar');
    progressFull.setAttribute('aria-valuemin', 0);
    progressFull.setAttribute('aria-valuemax', 0);
    progressFull.setAttribute('aria-valuenow', 0);
    progressFull.style.width = '0%';
    progressFull.innerHTML = '';
    progress.appendChild(progressFull);

    progressEmpty = document.createElement('div');
    progressEmpty.className = "progress-bar bg-secondary";
    progressEmpty.setAttribute('role', 'progressbar');
    progressEmpty.style.width = '100%';
    progressEmpty.innerHTML = '0 / ???';
    progress.appendChild(progressEmpty);

    var btn = document.createElement('button');
    btn.innerHTML = "Refresh";
    btn.className = "btn btn-primary";
    headerNav.appendChild(btn);

    // remove convert button
    btnConvert.parentNode.removeChild(btnConvert);

    // remove geeklist items
    //itemList.innerHTML = '';

    firstItem = itemList.childNodes[0];
    itemList.className = "tw-grid tw-gap-2";

    // remove footer nav
    //footerNav.parentNode.removeChild(footerNav);
    footerNav.innerHTML = '';

    geeklistid = window.location.pathname.split('/')[2];

    fetchPage(1);
}

function loaddata()
{
    fetch("https://api.geekdo.com/api/listitems?page=1&listid=" + geeklistid)
        .then(response => response.json())
        .then(
        data => {
            if (data.data.length < data.pagination.perPage)
            {
                console.log("last page");
            }
            else
            {
                console.log("more pages");
            }
            var nr = (data.pagination.pageid - 1) * data.pagination.perPage + 1;
            for (var item of data.data)
            {
                //console.log(item);
                makeRow(nr, item);
                nr++;
            }
            setProgress(nr, data.pagination.total);
            console.log(data);
        }
    );
}

function fetchPage(page)
{
    var url = "https://api.geekdo.com/api/listitems?page=" + page + "&listid=" + geeklistid;

    fetch(url)
        .then(response => response.json())
        .then(
        data => {
            console.log(data);

            var nr = (data.pagination.pageid - 1) * data.pagination.perPage;
            for (var item of data.data)
            {
                nr++;
                makeRow(nr, item);
            }
            setProgress(nr, data.pagination.total);

            if (data.data.length < data.pagination.perPage)
            {
                console.log("last page");
            }
            else
            {
                console.log("more pages");
                fetchPage(page + 1);
            }
        }
    );
}

function makeRow(nr, item)
{
    var row = document.createElement('span');
    row.className = "tw-relative tw-flex tw-flex-wrap tw-items-center tw-gap-x-1.5 tw-gap-y-2 tw-rounded-md tw-border tw-border-gray-400 tw-bg-gray-100 tw-p-2";
    var thingtype = item.item.href.split('/')[1];
    row.innerHTML = "<a href=\"/geeklist/" + geeklistid + "/test?itemid=" + item.id + "#" + item.id + "\">" + nr +
        ".</a> " +
        (thingtype == "boardgame" ? "Boardgame" : thingtype == "boardgameexpansion" ? "Expansion" : "Other") +
        " <gg-item-link-ui classes=\"link-text-color\"><a href=\""+
        item.item.href +
        "\" target=\"_blank\" class=\"link-text-color\">" +
        encodeWithTextNode(item.item.name) +
        "</a></gg-item-link-ui>";
    itemList.insertBefore(row, firstItem);
}

function encodeWithTextNode(htmlstring) {
	let textarea = document.createElement('textarea');
	let text = document.createTextNode(htmlstring);
	textarea.appendChild(text);
	return textarea.innerHTML;
}













QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址