User:Dagger/Widget drafts/API item counts.js
From Guild Wars 2 Wiki
Jump to navigationJump to search
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
$(function() { if (!window.API || $(".api-youhave").length == 0) return; $.when(API.fetch("characters"), API.fetch("account/materials"), API.fetch("account/bank") ).then(function(charData, materialsData, bankData) { $(".api-youhave").each(function() { function isWanted(id) { return itemIds.indexOf(id) != -1; } var output = []; var total = 0; var itemIds = this.getAttribute("data-itemid").split(",").map(function(id) { return parseInt(id); }); if (itemIds.some(isNaN)) { return; } // Count materials. itemIds.forEach(function(itemId) { if (materialsData[itemId] && materialsData[itemId].count) { output.push(materialsData[itemId].count + " in materials"); total += materialsData[itemId].count; } }); // Count bank. var bankCount = 0; bankData.forEach(function (item) { if (item && isWanted(item.id)) bankCount += item.count; }); if (bankCount) output.push(bankCount + " in bank"); total += bankCount; // Count character inventories. charData.forEach(function(character) { if (!character.bags) return; var count = 0; character.bags.forEach(function(bag) { if (!bag || !bag.inventory) return; // Count equipped bags too. if (isWanted(bag.id)) count += 1; bag.inventory.forEach(function(item) { if (item && isWanted(item.id)) count += item.count; }); }); if (count) output.push(count + " on "+ character.name); total += count; }); // Count character equipment. This ends up kinda weird because there's // not enough room to write "2 equipped on <char name>" without it wrapping, // so instead we just show "On <char name>", with no way to tell if there's // multiple of the same item equipped. But that's fairly rare anyway. // // It's also not really clear if this should take transmutation into // account or not (but currently it doesn't; base items only). charData.forEach(function(character) { if (!character.equipment) return; var count = 0; character.equipment.forEach(function(slot) { if (slot && isWanted(slot.id)) count++; }); if (count) output.push("On " + character.name); total += count; }); // Convert array to HTML and add it to the page. if (output.length) { var fragment = document.createDocumentFragment(); output.forEach(function(line) { fragment.appendChild(document.createTextNode(line)); fragment.appendChild(document.createElement("br")); }); // Add a total at the bottom. Takes up quite a bit of space and isn't // always very useful... /*if (output.length > 1) { fragment.appendChild(document.createElement("hr")); fragment.appendChild(document.createTextNode(total + " in total")); }*/ $(this).empty().append(fragment); } else { $(this).text("None"); } }); }, function onFail(f) { $(".api-youhave").html("<i>API Error</i>").attr("title", JSON.stringify(f)); API.log("Error: ", f); }); });