class RestGW2::ItemDetail

Attributes

detail[R]
skins[R]
stats[R]
upgrades[R]

Public Instance Methods

fill(item) click to toggle source
# File lib/rest-gw2/client/item_detail.rb, line 20
def fill item
  return item unless item

  s = item['skin']
  u = item['upgrades']
  f = item['infusions']
  t = item['stats']

  # Items might not have details, but they could still have upgrades!
  # Blame ANet for not populating whitelist for existing items.
  item.merge(detail[item['id']] || {}).merge(
    'count' => item['count'] || 1,
    'skin' => s && skins.dig(s, 0),
    'upgrades' => u && u.flat_map(&upgrades.method(:[])),
    'infusions' => f && f.flat_map(&upgrades.method(:[])),
    'stats' => t && stats[t['id']].merge(t))
end
populate() click to toggle source
# File lib/rest-gw2/client/item_detail.rb, line 9
def populate
  detail_promises = item_detail_group_by_id(raw)
  upgrades_promises = extract_items_in_slots('upgrades', 'infusions')
  stats_promises = [expand_stats_detail]

  @detail = detail_promises_to_map(detail_promises)
  @upgrades = detail_promises_to_map(upgrades_promises)
  @stats = detail_promises_to_map(stats_promises)
  @skins = client.all_skins.flatten.group_by{ |s| s['id'] }
end

Private Instance Methods

detail_promises_to_map(promises) click to toggle source

this is probably a dirty way to workaround converting hashes to arrays

# File lib/rest-gw2/client/item_detail.rb, line 75
def detail_promises_to_map promises
  promises.flat_map(&:itself).map(&:to_a).flatten.group_by{ |i| i['id'] }.
    inject({}){ |r, (id, v)| r[id] = v.inject(&:merge); r }
end
expand_stats_detail() click to toggle source

wiki.guildwars2.com/wiki/API:2/itemstats

# File lib/rest-gw2/client/item_detail.rb, line 67
def expand_stats_detail
  raw.map{ |i| i && i.dig('stats', 'id') }.
    compact.uniq.each_slice(100).map do |ids|
      client.get('v2/itemstats', :ids => ids.join(','))
    end
end
extract_items_in_slots(*slots) click to toggle source

Returns Array[Promise[Array]]

# File lib/rest-gw2/client/item_detail.rb, line 53
def extract_items_in_slots *slots
  items = raw.flat_map do |i|
    if i
      i.values_at(*slots).flatten.compact.map do |id|
        {'id' => id}
      end
    else
      []
    end
  end
  item_detail_group_by_id(items)
end
item_detail_group_by_id(items) click to toggle source

Returns Array[Promise[Array]] wiki.guildwars2.com/wiki/API:2/items wiki.guildwars2.com/wiki/API:2/commerce/prices

# File lib/rest-gw2/client/item_detail.rb, line 43
def item_detail_group_by_id items
  items.map{ |i| i && i['id'] }.compact.each_slice(100).map do |slice|
    q = {:ids => slice.join(',')}
    [client.get('v2/items', q),
     client.get('v2/commerce/prices', q,
       {:error_detector => false}.merge(opts))]
  end
end