User:Dagger/Widget drafts/API recipe unlocks.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-unlockedon").length == 0) return;

  $.when(API.fetch("characters")).then(function(data) {
    $(".api-unlockedon").each(function() {
     var recipeIds = this.getAttribute("data-recipeid").split(",").map(function(id) { return parseInt(id); });
      if (recipeIds.some(isNaN)) { return; }

      // If they were specified, parse out the recipe's disciplines.
      var recipeJobs = this.getAttribute("data-disciplines") || [];
      if (recipeJobs.length)
        recipeJobs = recipeJobs.replace(/\s/g, "").toLowerCase().split(/,/);

      // Construct a list of characters with this recipe unlocked.
      var characters = [];
      recipeIds.forEach(function(recipeId) {
        data.forEach(function(char) {
          if (char.recipes.indexOf(recipeId) == -1) return;

          // Mark whether the character has the discipline active. This only works when there's only
          // one recipeId (because otherwise we'd need some way to specify the crafting discipline
          // for each recipeId -- or look it up on the API, but that's even more queries to do.).
          var hasActive = true;
          if (recipeIds.length == 1 && recipeJobs.length)
            hasActive = recipeJobs.some(function(job) {
              return char.activeCrafting.indexOf(job) != -1;
            });
          
          // Add this character to the list, but only if they're not already in it.
          if (!characters.some(function(charEntry) { return charEntry.name == char.name }))
            characters.push({name: char.name, age: char.age, active: hasActive, });
        });
      });

      // Add the list to the page.
      if (characters.length) {
        var fragment = document.createDocumentFragment();
        // Sort chars that have the crafting profession active to the top.
        characters.sort(function(a, b) {
          return b.active - a.active || b.age - a.age;
        }).forEach(function(character) {
          $("<span/>", {
            class: character.active ? "api-craftingactive" : "api-craftinginactive",
            text: character.name,
          }).appendTo(fragment);
          $("<br/>").appendTo(fragment);
        });
        $(this).empty().append(fragment);
      } else {
        $(this).html("<i>No characters</i>");
      }
    });
  }, function onFail(f) {
    $(".api-unlockedon").html("<i>API Error</i>").attr("title", JSON.stringify(f));
    API.log("Error:", f);
  });
});