// ==UserScript== // @name Board Game Geek - One page auction geeklists // @namespace http://tampermonkey.net/ // @version 0.13 // @description Loads all geeklist items into a single view simmilar to Peyo61's external tool. // @author Kempeth @ boardgamegeek // @match https://boardgamegeek.com/geeklist/* // @icon https://cf.geekdo-static.com/icons/favicon2.ico // @grant GM_setValue // @grant GM_getValue // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/450228/Board%20Game%20Geek%20-%20One%20page%20auction%20geeklists.user.js // @updateURL https://update.greasyfork.icu/scripts/450228/Board%20Game%20Geek%20-%20One%20page%20auction%20geeklists.meta.js // ==/UserScript== const FETCHLIMIT = 20000; const SUBNODE_LIMIT = 1000; var nodeBtnConvert; var nodeProgressFull; var nodeProgressEmpty; var nodeItemList; var geeklistid; var taggedItems = []; // list of ids var items = []; // data from api var currentUser = null; var progressData = { done: 0, total: 0}; (function() { 'use strict'; getCurrentUser(); //console.log('root function'); UT_extractEndDate(); init(); })(); function retry(f) { window.setTimeout(f, 500); } function init() { var els = document.getElementsByTagName('gg-geeklist-page-ui'); if (els.length == 0) { retry(init); return; } els = els[0].getElementsByTagName('header'); if (els.length == 0) { retry(init); return; } els = els[0].getElementsByTagName('nav'); if (els.length == 0) { retry(init); return; } var el = els[0]; nodeBtnConvert = document.createElement('button'); nodeBtnConvert.innerHTML = "One Page Auction"; nodeBtnConvert.className = "btn btn-warning"; nodeBtnConvert.onclick = convert; el.append(nodeBtnConvert); } function getCurrentUser() { fetch('https://boardgamegeek.com/api/users/current') .then(response => response.json()) .then( data => { if (data.loggedIn && data.userid > 0) { currentUser = data; } } ); } function updateProgressUI() { // This should ensure that the values are not changed during the execution of this method var copy = progressData; var percentage = copy.total > 0 ? (copy.done * 100.0 / copy.total) : 0; nodeProgressFull.style.width = percentage + '%'; nodeProgressEmpty.style.width = (100 - percentage) + '%'; nodeProgressFull.setAttribute('aria-valuemax', copy.total); nodeProgressFull.setAttribute('aria-valuenow', copy.done); if (percentage > 50) { nodeProgressFull.innerHTML = copy.done + ' / ' + copy.total; nodeProgressEmpty.innerHTML = ''; } else { nodeProgressEmpty.innerHTML = copy.done + ' / ' + copy.total; nodeProgressFull.innerHTML = ''; } } function setProgress(done, total) { progressData = { done: done, total: total }; } function setProgressAsync(done, total) { return new Promise(res => { setProgress(done, total); // res(); window.setTimeout(() => { res(); }, 0); }); } function convert() { var els = document.getElementsByTagName('gg-geeklist-page-ui'); if (els.length == 0) { retry(convert); return; } els = els[0].getElementsByTagName('div'); if (els.length == 0) { retry(convert); return; } var footerNav = els[0].getElementsByTagName('nav'); if (els.length == 0) { retry(convert); return; } footerNav = footerNav[footerNav.length - 1]; els = els[0].getElementsByTagName('header'); if (els.length == 0) { retry(convert); return; } els = els[0].getElementsByTagName('nav'); if (els.length == 0) { retry(convert); return; } var headerNav = els[0]; els = document.getElementsByTagName('gg-geeklist-items-ui'); if (els.length == 0) { retry(convert); return; } els = els[0].getElementsByTagName('div'); if (els.length == 0) { retry(convert); return; } nodeItemList = 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); nodeProgressFull = document.createElement('div'); nodeProgressFull.className = "progress-bar"; nodeProgressFull.setAttribute('role', 'progressbar'); nodeProgressFull.setAttribute('aria-valuemin', 0); nodeProgressFull.setAttribute('aria-valuemax', 0); nodeProgressFull.setAttribute('aria-valuenow', 0); nodeProgressFull.style.width = '0%'; nodeProgressFull.innerHTML = ''; progress.appendChild(nodeProgressFull); nodeProgressEmpty = document.createElement('div'); nodeProgressEmpty.className = "progress-bar bg-secondary"; nodeProgressEmpty.setAttribute('role', 'progressbar'); nodeProgressEmpty.style.width = '100%'; nodeProgressEmpty.innerHTML = '0 / ???'; progress.appendChild(nodeProgressEmpty); var btn = document.createElement('button'); btn.innerHTML = "Refresh"; btn.className = "btn btn-primary"; headerNav.appendChild(btn); // Sort Dropdown var ddSort = document.createElement('div'); ddSort.className = "dropdown"; headerNav.appendChild(ddSort); var ddSortBtn = document.createElement('button'); ddSortBtn.innerText = "Sort "; ddSortBtn.className = "btn btn-secondary dropdown-toggle"; ddSort.appendChild(ddSortBtn); var ddSortList = document.createElement('ul'); ddSortList.className = "dropdown-menu"; ddSort.appendChild(ddSortList); ddSortBtn.onclick = () => { ddSortList.style.display = (ddSortList.style.display == "block") ? "none" : "block"; }; ddSortBtn.onblur = () => { window.setTimeout(() => { ddSortList.style.display = "none"; }, 200); }; var ddSortPosted = document.createElement('li'); ddSortPosted.innerHTML = ""; ddSortPosted.onclick = () => { console.log('sorting by default', new Date()); sortBy(''); }; ddSortList.appendChild(ddSortPosted); var ddSortName = document.createElement('li'); ddSortName.innerHTML = ""; ddSortName.onclick = () => { console.log('sorting by name', new Date()); sortBy('name'); }; ddSortList.appendChild(ddSortName); var ddSortDate = document.createElement('li'); ddSortDate.innerHTML = ""; ddSortDate.onclick = () => { console.log('sorting by closing date', new Date()); sortBy('closing'); }; ddSortList.appendChild(ddSortDate); // Filter Dropdown var ddFilter = document.createElement('div'); ddFilter.className = "dropdown"; headerNav.appendChild(ddFilter); var ddFilterBtn = document.createElement('button'); ddFilterBtn.innerText = "Filter "; ddFilterBtn.className = "btn btn-secondary dropdown-toggle"; ddFilter.appendChild(ddFilterBtn); var ddFilterList = document.createElement('ul'); ddFilterList.className = "dropdown-menu"; ddFilter.appendChild(ddFilterList); ddFilterBtn.onclick = () => { ddFilterList.style.display = (ddFilterList.style.display == "block") ? "none" : "block"; }; ddFilterBtn.onblur = () => { window.setTimeout(() => { ddFilterList.style.display = "none"; }, 200); }; var ddFilterBoardgames = document.createElement('li'); ddFilterBoardgames.className = "dropdown-item"; ddFilterBoardgames.innerHTML = " " + ""; ddFilterList.appendChild(ddFilterBoardgames); document.getElementById('filterBoardgames').onclick = () => { window.setTimeout(() => { filterList(); }, 400); }; var ddFilterExpansions = document.createElement('li'); ddFilterExpansions.className = "dropdown-item"; ddFilterExpansions.innerHTML = " " + ""; ddFilterList.appendChild(ddFilterExpansions); document.getElementById('filterExpansions').onclick = () => { window.setTimeout(() => { filterList(); }, 400); }; var ddFilterDivider = document.createElement('li'); ddFilterDivider.innerHTML = "