class SmashRuby::Tournament

Constants

BASE_URL
M

Attributes

end_date[R]
entrants[R]
id[R]
name[R]
sets[R]
slug[R]
start_date[R]
venue_address[R]
venue_name[R]

Public Class Methods

find(slug) click to toggle source
# File lib/smash_ruby/tournament.rb, line 35
def self.find(slug)
  url = "#{BASE_URL}/#{slug}"
  response = SmashRuby::Request.get(url, slug, 'tournament')

  response.fmap do |result|
    new(result.dig('entities', 'tournament').merge('slug' => slug))
  end.value
end
new(attributes) click to toggle source
# File lib/smash_ruby/tournament.rb, line 17
def initialize(attributes)
  @id = attributes.dig('id')
  @name = attributes.dig('name')
  @slug = attributes.dig('slug')
  @start_date = Time.at(attributes.dig('startAt'))
  @end_date = Time.at(attributes.dig('endAt'))
  @venue_name = attributes.dig('venueName')
  @venue_address = attributes.dig('venueAddress')
end

Public Instance Methods

available_phases() click to toggle source
# File lib/smash_ruby/tournament.rb, line 31
def available_phases
  @available_phases ||= fetch_phases
end
fetch_complete_results_for_event(event) click to toggle source
# File lib/smash_ruby/tournament.rb, line 82
def fetch_complete_results_for_event(event)
  players = []

  available_phases.dig(event.to_sym).each do |phase|
    players << fetch_phase_results(event.to_sym, phase)
  end

  results = dedupe_and_combine_players(players)
  build_sets(results)
  results.values.sort_by(&:placement)
end
fetch_phase_results(event, phase) click to toggle source
# File lib/smash_ruby/tournament.rb, line 44
def fetch_phase_results(event, phase)
  get_id(event, phase.name).fmap do |id|
    players = []
    if phase.pools.empty?
      url = "#{BASE_URL}/#{slug}/event/#{event}/phase_groups?expand[]=results&filter={\"phaseId\": \"#{id}\"}&getSingleBracket=true"
      players << get_player_results(url)
    else
      phase.pools.each do |pool|
        url = "#{BASE_URL}/#{slug}/event/#{event}/phase_groups?expand[]=results&filter={\"phaseId\": \"#{id}\", \"id\": \"#{pool.id}\"}&getSingleBracket=true"
        players << get_player_results(url)
      end
    end

    players.flatten
  end.value
end
get_player_results(url) click to toggle source
# File lib/smash_ruby/tournament.rb, line 61
def get_player_results(url)
  response = SmashRuby::Request.get(url, slug, 'tournament')

  response.fmap do |result|
    data = result.dig('items', 'entities')
    standings = data.dig('standings')
    entrants = data.dig('entrants')

    players = []
    entrants.each do |e|
      standings.each do |s|
        if s.dig('id').include? e.dig('id').to_s
          players << SmashRuby::Player.new(s.merge(e))
        end
      end
    end

    players
  end.value
end
melee_results() click to toggle source
# File lib/smash_ruby/tournament.rb, line 27
def melee_results
  @melee_singles_results ||= fetch_singles
end

Private Instance Methods

build_sets(results) click to toggle source
# File lib/smash_ruby/tournament.rb, line 149
def build_sets(results)
  @sets ||= SmashRuby::SetService.perform(results, slug)
end
dedupe_and_combine_players(players) click to toggle source
# File lib/smash_ruby/tournament.rb, line 133
def dedupe_and_combine_players(players)
  clean_players = {}

  players.flatten.each do |p|
    if clean_players[p.id].nil?
      clean_players[p.id] = p
    else
      clean_players[p.id].losses += p.losses
      clean_players[p.id].losses.flatten!
    end
  end

  @entrants = clean_players.size
  clean_players
end
fetch_phases() click to toggle source
# File lib/smash_ruby/tournament.rb, line 96
def fetch_phases
  {
    'melee-singles': fetch_single_event('melee-singles'),
    'melee-doubles': fetch_single_event('melee-doubles')
  }
end
fetch_single_event(event) click to toggle source
# File lib/smash_ruby/tournament.rb, line 103
def fetch_single_event(event)
  url = "#{BASE_URL}/#{slug}/event/#{event}?expand[]=phase&expand[]=groups"
  response = SmashRuby::Request.get(url, slug, 'tournament')

  response.fmap do |result|
    result.dig('entities', 'phase').map do |phase|
      groups = result.dig('entities', 'groups')
      built_phase = SmashRuby::Phase.new(phase)
      built_phase.build_pools(groups)
      built_phase
    end
  end.value
end
get_id(event, phase) click to toggle source
# File lib/smash_ruby/tournament.rb, line 117
def get_id(event, phase)
  fetched_phase = available_phases[event.to_sym].select { |p| p.name == phase }.first

  if fetched_phase.nil?
    M.Left(
      SmashRuby::Errors::ErrorHandler.build_error(
        'phase',
        "Phase: #{phase} does not exist for #{event}",
        404
      )
    )
  else
    M.Right(fetched_phase.id)
  end
end