您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
HLTB times in Backloggd
// ==UserScript== // @name HLTB in Backloggd Lists // @namespace http://tampermonkey.net/ // @version 0.3.1 // @description HLTB times in Backloggd // @author Siev // @license MIT // @match *://www.backloggd.com/* // @match *://backloggd.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=backloggd.com // @grant GM_xmlhttpRequest // ==/UserScript== // TODO: fix the sorting in lists to be across pages let hltbUrl = "https://howlongtobeat.com/api/search/"; function sortList() { let getNodeTime = node => $(node).data('hltbTime'); let sortFunc = $("#sort-direction-btn > .fad").hasClass('fa-sort-down') ? (a,b) => getNodeTime(b) - getNodeTime(a) : (a,b) => getNodeTime(a) - getNodeTime(b); let arr = $('.toggle-fade').children().toArray().toSorted(sortFunc); $('.toggle-fade').append($(arr)); } // add the options for sorting the list by time $('[id=nav-interactables]').eq(1) .find('li.nav-item').last() .after(function() { return $(this).clone() }) .next() .click(function () { $("#sort-direction-btn") .click(function () { $('i', this).toggleClass(['fa-sort-up', 'fa-sort-down']); sortList(); }) .attr('href','javascript: void(0);'); $(this).parent().prev().contents().first()[0].data = ' HLTB Time '; sortList(); }) .find('a') .text('HLTB Time') .attr('href','javascript: void(0);'); // get time from HLTB function lookupGame(gameName, context, callback) { let hltbQuery = '{"searchType":"games","searchTerms":["'+gameName+'"],"size":100}'; GM_xmlhttpRequest({ context: context, method: "POST", url: hltbUrl, data: hltbQuery, headers: { "Content-Type": "application/json", "origin": "https://howlongtobeat.com", "referer": "https://howlongtobeat.com" }, onload: function (response) { var rawTime; var hltbTime; let game = response.context; // Grab response let hltb = JSON.parse(response.responseText); //Determine if data is present in response by checking the page count. If no data, set default HLTB button. let hltbPages = hltb['pageTotal']; if(hltbPages == 0) { hltbTime = "?"; } else { let hltbstring = JSON.stringify(hltb); //Make sure you have the right game_name (if possible, otherwise just use first result from response) let n = 0; let loop = hltb['count']; for (let i = 0; i < loop; i++) { let hltbName = hltb['data'][i]['game_name']; if (hltbName.toLowerCase() == gameName.toLowerCase()) { n = i; break; } } // convert and format time rawTime = hltb['data'][n]['comp_plus']; hltbTime = rawTime; hltbTime = hltbTime/60/60; // Convert to hours hltbTime = Math.round(hltbTime*2)/2; // Round to closes .5 hltbTime = hltbTime.toString().replace(".5","½"); // Convert .5 to ½ to be consistent with HLTB if (hltbTime[0] == '0') hltbTime = hltbTime.substr(1); } callback(rawTime, hltbTime, response.context); } }); } // showing the time under game cards $('.card').not('.overlay-hide').filter(function (i) { return !$(this).parent().parent().next().hasClass('coming-details') }).each(function (i, game) { let gameName = $('img', this).attr('alt'); lookupGame(gameName, game, function (raw, fmt, game) { //$(game).parent().parent().parent().data('hltbTime', raw); $(game).parents('.toggle-fade > div').data('hltbTime', raw); $(game).after("<div>" + fmt + " Hours</div>").next().css({ fontSize: '0.9rem', paddingLeft: '0.15rem' }); }) }); // showing the time in the game page let gameName = $("#title > div.col-12.pr-0 > div > div > h1").text(); lookupGame(gameName, 0, function (raw, fmt, context) { // clone the average score panel and change it to hltb time var panel = $('.side-section').eq(1).children().first().before(function(i) { return $(this).clone() }).prev(); panel.find('p').text('HLTB Time'); panel.find('h1').text(fmt); });