lib/sportradar/api/basketball/nba/game.rb in sportradar-api-0.9.59 vs lib/sportradar/api/basketball/nba/game.rb in sportradar-api-0.10.0

- old
+ new

@@ -1,267 +1,30 @@ module Sportradar module Api module Basketball class Nba - class Game < Data - attr_accessor :response, :id, :home_id, :away_id, :score, :scoring, :status, :scheduled, :venue, :broadcast, :clock, :duration, :attendance, :quarter, :team_stats, :player_stats, :changes, :media_timeouts - @all_hash = {} - # def self.new(data, **opts) - # existing = @all_hash[data['id']] - # if existing - # existing.update(data, **opts) - # existing - # else - # @all_hash[data['id']] = super - # end - # end - # def self.all - # @all_hash.values - # end + class Game < Sportradar::Api::Basketball::Game - def initialize(data, **opts) - @response = data - @api = opts[:api] - # @season = opts[:season] - @updates = {} - @changes = {} - - @score = {} - @team_stats = {} - @player_stats = {} - @scoring_raw = Scoring.new(data, game: self) - @teams_hash = {} - @quarters_hash = {} - - @id = data['id'] - - update(data, **opts) - end - def timeouts - {} - end + # NBA specific - def overview - Overview.new(self) + def team_class + Team end - def tied? - @score[away_id].to_i == @score[home_id].to_i + def period_class + Quarter end - def points(team_id) - team_id.is_a?(Symbol) ? @score[@team_ids[team_id]].to_i : @score[team_id].to_i - end - def stats(team_id) - team_id.is_a?(Symbol) ? @team_stats[@team_ids[team_id]].to_i : @team_stats[team_id].to_i - end - def scoring - @scoring_raw.scores + def period_name + 'quarter' end - def update_score(score) - @score.merge!(score) - end - def update_stats(team, stats) - @team_stats.merge!(team.id => stats.merge!(team: team)) - end - def update_player_stats(player, stats) - @player_stats.merge!(player.id => stats.merge!(player: player)) - end + alias :quarter :period + alias :quarters :periods - def parse_score(data) - update_score(data.dig('home', 'id') => data.dig('home', 'points').to_i) - update_score(data.dig('away', 'id') => data.dig('away', 'points').to_i) - end - def clock_seconds - return unless @clock - m,s = @clock.split(':') - m.to_i * 60 + s.to_i - end - - def update(data, source: nil, **opts) - # via pbp - @status = data['status'] if data['status'] - @coverage = data['coverage'] if data['coverage'] - @home_id = data['home_team'] if data['home_team'] # GUID - @away_id = data['away_team'] if data['away_team'] # GUID - @home_points = data['home_points'].to_i if data['home_points'] - @away_points = data['away_points'].to_i if data['away_points'] - - @scheduled = Time.parse(data["scheduled"]) if data["scheduled"] - @venue = Venue.new(data['venue']) if data['venue'] - @broadcast = Broadcast.new(data['broadcast']) if data['broadcast'] - @home = Team.new(data['home'], api: api, game: self) if data['home'] - @away = Team.new(data['away'], api: api, game: self) if data['away'] - - @duration = data['duration'] if data['duration'] - @clock = data['clock'] if data['clock'] - @attendance = data['attendance'] if data['attendance'] - @lead_changes = data['lead_changes'] if data['lead_changes'] - @times_tied = data['times_tied'] if data['times_tied'] - - @team_ids = { home: @home_id, away: @away_id} - - update_score(@home_id => @home_points.to_i) if @home_points - update_score(@away_id => @away_points.to_i) if @away_points - parse_score(data['scoring']) if data['scoring'] - @scoring_raw.update(data, source: source) - - create_data(@teams_hash, data['team'], klass: Team, api: api, game: self) if data['team'] - end - - def home - @teams_hash[@home_id] || @home - end - - def away - @teams_hash[@away_id] || @away - end - - def box - @box ||= get_box - end - def pbp - if !future? && quarters.empty? - get_pbp - end - @pbp ||= quarters - end - def plays - quarters.flat_map(&:plays) - end - def summary - @summary ||= get_summary - end - alias :events :plays - - def quarters - @quarters_hash.values - end - - - # tracking updates - def remember(key, object) - @updates[key] = object - end - def not_updated?(key, object) - @updates[key] == object - end - def changed?(key) - @changes[key] - end - def check_newness(key, new_object) - @changes[key] = !not_updated?(key, new_object) - remember(key, new_object) - end - - # url paths - def path_base - "games/#{ id }" - end - def path_box - "#{ path_base }/boxscore" - end - def path_pbp - "#{ path_base }/pbp" - end - def path_summary - "#{ path_base }/summary" - end - - # status helpers - def postponed? - 'postponed' == status - end - def future? - ['scheduled', 'delayed', 'created'].include? status - end - def started? - ['inprogress', 'halftime', 'delayed'].include? status - end - def finished? - ['complete', 'closed'].include? status - end - def completed? - 'complete' == status - end - def closed? - 'closed' == status - end - - # data retrieval - def sync - g.get_pbp - g.get_box - g.get_summary if finished? - end - - def get_box - api_res = api.get_data(path_box) - data = api_res['game'] - ingest_box(data) - end - - def ingest_box(data) - update(data, source: :box) - @quarter = data.delete('quarter').to_i - check_newness(:box, @clock) - data - end - - def get_pbp - api_res = api.get_data(path_pbp) - data = api_res['game'] - ingest_pbp(data) - end - - def ingest_pbp(data) - update(data, source: :pbp) - quarter_data = if data['quarter'] - @quarter = data['quarter'].first.to_i - quarts = data['quarter'][1..-1] - quarts.is_a?(Array) && (quarts.size == 1) ? quarts[0] : quarts - else - @quarter = nil - [] - end - if data['overtime'] - extra_quarters = data['overtime'].is_a?(Hash) ? [data['overtime']] : data['overtime'] - quarter_data.concat(extra_quarters) - end - set_pbp(quarter_data) - @pbp = @quarters_hash.values - check_newness(:pbp, plays.last) - data - end - - def get_summary - api_res = api.get_data(path_summary) - data = api_res['game'] - ingest_summary(data) - end - - def ingest_summary(data) - update(data, source: :summary) - @quarter = data.delete('quarter').to_i - check_newness(:box, @clock) - data - end - - def set_pbp(data) - create_data(@quarters_hash, data, klass: Quarter, api: api, game: self) - @plays = nil # to clear empty array empty - @quarters_hash - end - def api @api || Sportradar::Api::Basketball::Nba.new end - - KEYS_PBP = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "scoring"] - - KEYS_BOX = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "team"] - end end end end end @@ -269,11 +32,11 @@ __END__ ss = sr.schedule; sd = sr.daily_schedule; sr = Sportradar::Api::Basketball::Nba.new -sd = sr.daily_schedule(Date.yesterday) -sd = sr.daily_schedule(Date.new(2017, 1, 20)) +sd = sr.daily_schedule(Date.yesterday); +sd = sr.daily_schedule(Date.new(2017, 1, 20)); g = sd.games.first; box = g.get_box; pbp = g.get_pbp; g.quarters.size g.plays.size \ No newline at end of file