sportradar-api 0.9.24 → 0.9.25
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.env.sample +1 -1
- data/Gemfile.lock +2 -2
- data/README.md +1 -1
- data/lib/sportradar/api.rb +23 -1
- data/lib/sportradar/api/basketball.rb +21 -0
- data/lib/sportradar/api/basketball/bio.rb +33 -0
- data/lib/sportradar/api/basketball/broadcast.rb +15 -0
- data/lib/sportradar/api/basketball/nba.rb +123 -0
- data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
- data/lib/sportradar/api/basketball/nba/division.rb +29 -0
- data/lib/sportradar/api/basketball/nba/game.rb +263 -0
- data/lib/sportradar/api/basketball/nba/hierarchy.rb +46 -0
- data/lib/sportradar/api/basketball/nba/overview.rb +64 -0
- data/lib/sportradar/api/basketball/nba/player.rb +146 -0
- data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
- data/lib/sportradar/api/basketball/nba/record.rb +34 -0
- data/lib/sportradar/api/basketball/nba/schedule.rb +32 -0
- data/lib/sportradar/api/basketball/nba/scoring.rb +89 -0
- data/lib/sportradar/api/basketball/nba/season.rb +42 -0
- data/lib/sportradar/api/basketball/nba/team.rb +166 -0
- data/lib/sportradar/api/basketball/overview.rb +74 -0
- data/lib/sportradar/api/basketball/play.rb +65 -0
- data/lib/sportradar/api/basketball/plays.rb +38 -0
- data/lib/sportradar/api/basketball/plays/assist.rb +11 -0
- data/lib/sportradar/api/basketball/plays/base.rb +88 -0
- data/lib/sportradar/api/basketball/plays/block.rb +11 -0
- data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +8 -0
- data/lib/sportradar/api/basketball/plays/delay.rb +9 -0
- data/lib/sportradar/api/basketball/plays/ejection.rb +9 -0
- data/lib/sportradar/api/basketball/plays/end_period.rb +15 -0
- data/lib/sportradar/api/basketball/plays/flagrant_one.rb +9 -0
- data/lib/sportradar/api/basketball/plays/flagrant_two.rb +9 -0
- data/lib/sportradar/api/basketball/plays/foul.rb +14 -0
- data/lib/sportradar/api/basketball/plays/free_throw_made.rb +20 -0
- data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +20 -0
- data/lib/sportradar/api/basketball/plays/jumpball.rb +9 -0
- data/lib/sportradar/api/basketball/plays/kickball.rb +9 -0
- data/lib/sportradar/api/basketball/plays/lineup_change.rb +9 -0
- data/lib/sportradar/api/basketball/plays/offensive_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/official_timeout.rb +9 -0
- data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
- data/lib/sportradar/api/basketball/plays/open_tip.rb +9 -0
- data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/rebound.rb +15 -0
- data/lib/sportradar/api/basketball/plays/review.rb +8 -0
- data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/shot_made.rb +21 -0
- data/lib/sportradar/api/basketball/plays/shot_miss.rb +21 -0
- data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
- data/lib/sportradar/api/basketball/plays/team_timeout.rb +9 -0
- data/lib/sportradar/api/basketball/plays/technical_foul.rb +11 -0
- data/lib/sportradar/api/basketball/plays/three_point_made.rb +11 -0
- data/lib/sportradar/api/basketball/plays/three_point_miss.rb +8 -0
- data/lib/sportradar/api/basketball/plays/timeout.rb +15 -0
- data/lib/sportradar/api/basketball/plays/turnover.rb +16 -0
- data/lib/sportradar/api/basketball/plays/tv_timeout.rb +9 -0
- data/lib/sportradar/api/basketball/plays/two_point_made.rb +11 -0
- data/lib/sportradar/api/basketball/plays/two_point_miss.rb +8 -0
- data/lib/sportradar/api/basketball/profile.rb +48 -0
- data/lib/sportradar/api/basketball/season.rb +20 -0
- data/lib/sportradar/api/basketball/venue.rb +53 -0
- data/lib/sportradar/api/data.rb +42 -0
- data/lib/sportradar/api/mma.rb +195 -0
- data/lib/sportradar/api/mma/event.rb +111 -0
- data/lib/sportradar/api/mma/fight.rb +107 -0
- data/lib/sportradar/api/mma/fighter.rb +95 -0
- data/lib/sportradar/api/mma/judge.rb +70 -0
- data/lib/sportradar/api/mma/league.rb +63 -0
- data/lib/sportradar/api/mma/referee.rb +70 -0
- data/lib/sportradar/api/mma/result.rb +68 -0
- data/lib/sportradar/api/mma/roster.rb +72 -0
- data/lib/sportradar/api/mma/schedule.rb +53 -0
- data/lib/sportradar/api/mma/score.rb +83 -0
- data/lib/sportradar/api/mma/venue.rb +72 -0
- data/lib/sportradar/api/ncaafb.rb +185 -0
- data/lib/sportradar/api/ncaafb/drive.rb +89 -0
- data/lib/sportradar/api/ncaafb/game.rb +161 -0
- data/lib/sportradar/api/ncaafb/play.rb +39 -0
- data/lib/sportradar/api/ncaafb/player.rb +61 -0
- data/lib/sportradar/api/ncaafb/quarter.rb +37 -0
- data/lib/sportradar/api/ncaafb/season.rb +71 -0
- data/lib/sportradar/api/ncaafb/team.rb +69 -0
- data/lib/sportradar/api/ncaafb/week.rb +33 -0
- data/lib/sportradar/api/nfl.rb +6 -0
- data/lib/sportradar/api/nfl/conference.rb +2 -1
- data/lib/sportradar/api/request.rb +1 -0
- data/lib/sportradar/api/version.rb +1 -1
- metadata +81 -2
@@ -0,0 +1,42 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Nba
|
5
|
+
class Season < Basketball::Season
|
6
|
+
attr_accessor :response
|
7
|
+
|
8
|
+
def initialize(data, **opts)
|
9
|
+
@response = data
|
10
|
+
@api = opts[:api]
|
11
|
+
|
12
|
+
@id = response['id']
|
13
|
+
@name = response['name']
|
14
|
+
@alias = response['alias']
|
15
|
+
@games_hash = {}
|
16
|
+
|
17
|
+
update_games(data.dig('season_schedule', 'games', 'game'))
|
18
|
+
end
|
19
|
+
|
20
|
+
def games
|
21
|
+
@games_hash.values
|
22
|
+
end
|
23
|
+
|
24
|
+
def year
|
25
|
+
2016
|
26
|
+
end
|
27
|
+
|
28
|
+
def update_games(data)
|
29
|
+
create_data(@games_hash, data, klass: Game, api: @api, season: self)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
__END__
|
39
|
+
|
40
|
+
sd = sr.daily_schedule;
|
41
|
+
sr = Sportradar::Api::Nba.new
|
42
|
+
ss = sr.schedule;
|
@@ -0,0 +1,166 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Nba
|
5
|
+
class Team < Data
|
6
|
+
attr_accessor :response, :id, :market, :name, :alias, :full_name, :venue, :records, :player_stats, :team_stats
|
7
|
+
@all_hash = {}
|
8
|
+
def self.new(data, **opts)
|
9
|
+
existing = @all_hash[data['id']]
|
10
|
+
if existing
|
11
|
+
existing.update(data, **opts)
|
12
|
+
existing
|
13
|
+
else
|
14
|
+
@all_hash[data['id']] = super
|
15
|
+
end
|
16
|
+
end
|
17
|
+
def self.all
|
18
|
+
@all_hash.values
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(data, **opts)
|
22
|
+
@response = data
|
23
|
+
@api = opts[:api]
|
24
|
+
@games_hash = {}
|
25
|
+
@players_hash = {}
|
26
|
+
@player_stats = {}
|
27
|
+
@records = {}
|
28
|
+
|
29
|
+
case response
|
30
|
+
when String
|
31
|
+
@id = response
|
32
|
+
when Hash
|
33
|
+
@id = data['id']
|
34
|
+
update(response, **opts)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def profile
|
39
|
+
Profile.new(self)
|
40
|
+
end
|
41
|
+
|
42
|
+
def update(data, **opts)
|
43
|
+
handle_names(data)
|
44
|
+
|
45
|
+
@venue = Venue.new(data['venue']) if data['venue']
|
46
|
+
|
47
|
+
@alias = data['alias'] if data['alias']
|
48
|
+
@points = data['points'].to_i if data['points']
|
49
|
+
@home = data['home'] == 'true' if data['home']
|
50
|
+
@away = data['away'] == 'true' if data['away']
|
51
|
+
@scoring = data.dig('scoring', 'quarter') if data.dig('scoring', 'quarter')
|
52
|
+
|
53
|
+
parse_records(data) if data['records']
|
54
|
+
parse_players(data.dig('players', 'player'), opts[:game]) if data.dig('players', 'player')
|
55
|
+
parse_stats(data['statistics']) if data['statistics']
|
56
|
+
if opts[:game]
|
57
|
+
add_game(opts[:game])
|
58
|
+
opts[:game].update_score(id => @points) if @points
|
59
|
+
opts[:game].update_stats(self, @stats) if @stats
|
60
|
+
end
|
61
|
+
end
|
62
|
+
def handle_names(data)
|
63
|
+
# need to do some more work here
|
64
|
+
@name = data['name'] if data['name']
|
65
|
+
if data['name'] && !data.key?('market')
|
66
|
+
@full_name = data['name']
|
67
|
+
if @full_name.split.size > 1
|
68
|
+
@market = @full_name.split[0..-2].join(' ')
|
69
|
+
@name = @full_name.split.last
|
70
|
+
end
|
71
|
+
elsif data['name'] && data['market']
|
72
|
+
@market = data['market']
|
73
|
+
@full_name = [@market, data['name']].join(' ')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def record(type = 'overall')
|
78
|
+
@records[type]
|
79
|
+
end
|
80
|
+
|
81
|
+
def games
|
82
|
+
@games_hash.values
|
83
|
+
end
|
84
|
+
def add_game(game)
|
85
|
+
@games_hash[game.id] = game.id if game
|
86
|
+
end
|
87
|
+
|
88
|
+
def parse_stats(data)
|
89
|
+
@stats = data
|
90
|
+
end
|
91
|
+
|
92
|
+
def players
|
93
|
+
get_roster if @players_hash.empty?
|
94
|
+
@players_hash.values
|
95
|
+
end
|
96
|
+
alias :roster :players
|
97
|
+
def parse_players(data, game)
|
98
|
+
create_data(@players_hash, data, klass: Player, api: api, team: self, game: game)
|
99
|
+
end
|
100
|
+
def update_player_stats(player, stats, game = nil)
|
101
|
+
game ? game.update_player_stats(player, stats) : @player_stats.merge!(player.id => stats.merge!(player: player))
|
102
|
+
end
|
103
|
+
|
104
|
+
def get_roster
|
105
|
+
data = api.get_data(path_roster)['team']
|
106
|
+
update(data)
|
107
|
+
end
|
108
|
+
|
109
|
+
def get_season_stats
|
110
|
+
data = api.get_data(path_season_stats).dig('season', 'team')
|
111
|
+
parse_season_stats(data)
|
112
|
+
end
|
113
|
+
|
114
|
+
def parse_records(data)
|
115
|
+
@records['overall'] = Record.new(data, type: 'overall')
|
116
|
+
data['records'].each { |type, record| @records[type] = Record.new(record, type: type) }
|
117
|
+
end
|
118
|
+
|
119
|
+
def parse_season_stats(data)
|
120
|
+
@team_stats = data.dig('team_records')
|
121
|
+
update(data)
|
122
|
+
create_data(@players_hash, data.dig('player_records', 'player'), klass: Player, api: api, team: self)
|
123
|
+
data
|
124
|
+
end
|
125
|
+
|
126
|
+
def path_base
|
127
|
+
"teams/#{ id }"
|
128
|
+
end
|
129
|
+
def path_base_stats(season_year = api.default_year, nba_season = api.default_season)
|
130
|
+
"seasontd/#{season_year}/#{nba_season}/teams/#{id}/"
|
131
|
+
end
|
132
|
+
def path_roster
|
133
|
+
"#{ path_base }/profile"
|
134
|
+
end
|
135
|
+
def path_season_stats
|
136
|
+
"#{ path_base_stats }/statistics"
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
def api
|
141
|
+
@api || Sportradar::Api::Basketball::Nba.new
|
142
|
+
end
|
143
|
+
|
144
|
+
KEYS_SCHEDULE = ["name", "alias", "id", "__content__"]
|
145
|
+
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
__END__
|
153
|
+
ss = sr.schedule;
|
154
|
+
sd = sr.daily_schedule;
|
155
|
+
sr = Sportradar::Api::Basketball::Nba.new
|
156
|
+
lh = sr.league_hierarchy;
|
157
|
+
t = lh.teams.first;
|
158
|
+
ss = t.get_season_stats;
|
159
|
+
g = sd.games.last;
|
160
|
+
t = g.home;
|
161
|
+
Sportradar::Api::Basketball::Nba::Team.all.size
|
162
|
+
|
163
|
+
|
164
|
+
# week_count = ss.weeks.count;
|
165
|
+
# w1 = ss.weeks.first;
|
166
|
+
# w1 = ss.weeks(1);
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Overview < Data
|
5
|
+
attr_accessor :game, :home_id, :away_id, :clock, :quarter, :status, :home, :away, :scoring, :venue, :scheduled, :broadcast
|
6
|
+
|
7
|
+
def initialize(game)
|
8
|
+
# @game = game
|
9
|
+
@id = game.id
|
10
|
+
@score = game.score
|
11
|
+
@home_id = game.home_id
|
12
|
+
@away_id = game.away_id
|
13
|
+
@home_full = game.home.full_name
|
14
|
+
@away_full = game.away.full_name
|
15
|
+
@team_ids = game.instance_variable_get(:@team_ids)
|
16
|
+
@status = game.status
|
17
|
+
@clock = game.clock
|
18
|
+
@quarter = game.quarter.to_i
|
19
|
+
@broadcast = game.broadcast
|
20
|
+
@scheduled = game.scheduled
|
21
|
+
@timeouts = game.timeouts
|
22
|
+
@scoring = game.scoring
|
23
|
+
@duration = game.duration
|
24
|
+
@attendance = game.attendance
|
25
|
+
|
26
|
+
@venue = OpenStruct.new(name: game.venue.name, city: game.venue.city, location: game.venue.location)
|
27
|
+
@home = OpenStruct.new(id: game.home.id, alias: game.home.alias, name: game.home.name, full_name: game.home.full_name)
|
28
|
+
@away = OpenStruct.new(id: game.away.id, alias: game.away.alias, name: game.away.name, full_name: game.away.full_name)
|
29
|
+
rescue => e
|
30
|
+
binding.pry
|
31
|
+
end
|
32
|
+
|
33
|
+
def points(team_id)
|
34
|
+
team_id.is_a?(Symbol) ? @score[@team_ids[team_id]].to_i : @score[team_id].to_i
|
35
|
+
end
|
36
|
+
|
37
|
+
def scoring(quarter)
|
38
|
+
@scoring
|
39
|
+
end
|
40
|
+
|
41
|
+
# status helpers
|
42
|
+
def future?
|
43
|
+
['scheduled', 'delayed'].include? status
|
44
|
+
end
|
45
|
+
def started?
|
46
|
+
['inprogress', 'halftime', 'delayed'].include? status
|
47
|
+
end
|
48
|
+
def finished?
|
49
|
+
['completed', 'closed'].include? status
|
50
|
+
end
|
51
|
+
def closed?
|
52
|
+
'closed' == status
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
__END__
|
62
|
+
|
63
|
+
ss = sr.schedule;
|
64
|
+
sr = Sportradar::Api::Nba.new
|
65
|
+
sd = sr.daily_schedule;
|
66
|
+
g = sd.games.last;
|
67
|
+
g.overview
|
68
|
+
box = g.get_box;
|
69
|
+
pbp = g.get_pbp;
|
70
|
+
g.quarters.size
|
71
|
+
g.plays.size
|
72
|
+
|
73
|
+
Sportradar::Api::Nba::Team.all.size # => 32 - includes all star teams
|
74
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Play < Data
|
5
|
+
attr_accessor :response, :id, :clock, :event_type, :description, :statistics, :score, :team_id, :player_id, :quarter, :updated, :location, :possession, :on_court
|
6
|
+
alias :type :event_type
|
7
|
+
# @all_hash = {}
|
8
|
+
# def self.new(data, **opts)
|
9
|
+
# existing = @all_hash[data['id']]
|
10
|
+
# if existing
|
11
|
+
# existing.update(data, **opts)
|
12
|
+
# existing
|
13
|
+
# else
|
14
|
+
# klass = subclass(data['event_type'])
|
15
|
+
# @all_hash[data['id']] = klass.new(data, **opts) rescue (puts data['event_type']; binding.pry)
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
def self.new(data, **opts)
|
19
|
+
klass = subclass(data['event_type'])
|
20
|
+
klass.new(data, **opts) rescue (puts data['event_type']; binding.pry)
|
21
|
+
end
|
22
|
+
# def self.all
|
23
|
+
# @all_hash.values
|
24
|
+
# end
|
25
|
+
|
26
|
+
def self.subclass(event_type)
|
27
|
+
{
|
28
|
+
"opentip" => OpenTip,
|
29
|
+
"twopointmiss" => TwoPointMiss,
|
30
|
+
"rebound" => Rebound,
|
31
|
+
"threepointmiss" => ThreePointMiss,
|
32
|
+
"twopointmade" => TwoPointMade,
|
33
|
+
"threepointmade" => ThreePointMade,
|
34
|
+
"turnover" => Turnover,
|
35
|
+
"personalfoul" => PersonalFoul,
|
36
|
+
"jumpball" => Jumpball,
|
37
|
+
"teamtimeout" => TeamTimeout,
|
38
|
+
"shootingfoul" => ShootingFoul,
|
39
|
+
"freethrowmade" => FreeThrowMade,
|
40
|
+
"freethrowmiss" => FreeThrowMiss,
|
41
|
+
"lineupchange" => LineupChange,
|
42
|
+
"offensivefoul" => OffensiveFoul,
|
43
|
+
"endperiod" => EndPeriod,
|
44
|
+
"openinbound" => OpenInbound,
|
45
|
+
"officialtimeout" => OfficialTimeout,
|
46
|
+
"kickball" => Kickball,
|
47
|
+
"tvtimeout" => TvTimeout,
|
48
|
+
"clearpathfoul" => ClearPathFoul,
|
49
|
+
"technicalfoul" => TechnicalFoul,
|
50
|
+
"review" => Review,
|
51
|
+
"defensivethreeseconds" => DefensiveThreeSeconds,
|
52
|
+
"flagrantone" => FlagrantOne,
|
53
|
+
"flagranttwo" => FlagrantTwo,
|
54
|
+
"delay" => Delay,
|
55
|
+
"ejection" => Ejection,
|
56
|
+
}[event_type]
|
57
|
+
end
|
58
|
+
|
59
|
+
SHOT_TYPES = %w[driving pullup step back fadeaway putback floating finger roll turnaround reverse alley-oop]
|
60
|
+
|
61
|
+
PLAY_TYPES = %w[clearpathfoul defensivethreeseconds delay ejection endperiod flagrantone flagranttwo freethrowmade freethrowmiss jumpball kickball offensivefoul officialtimeout openinbound opentip personalfoul possession rebound review shootingfoul teamtimeout technicalfoul threepointmade threepointmiss turnover tvtimeout twopointmade twopointmiss warning]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'play'
|
2
|
+
|
3
|
+
require_relative 'plays/base'
|
4
|
+
require_relative 'plays/timeout'
|
5
|
+
require_relative 'plays/foul'
|
6
|
+
require_relative 'plays/end_period'
|
7
|
+
require_relative 'plays/assist'
|
8
|
+
require_relative 'plays/block'
|
9
|
+
require_relative 'plays/shot_made'
|
10
|
+
require_relative 'plays/shot_miss'
|
11
|
+
require_relative 'plays/free_throw_made'
|
12
|
+
require_relative 'plays/free_throw_miss'
|
13
|
+
require_relative 'plays/jumpball'
|
14
|
+
require_relative 'plays/kickball'
|
15
|
+
require_relative 'plays/lineup_change'
|
16
|
+
require_relative 'plays/offensive_foul'
|
17
|
+
require_relative 'plays/official_timeout'
|
18
|
+
require_relative 'plays/open_inbound'
|
19
|
+
require_relative 'plays/open_tip'
|
20
|
+
require_relative 'plays/personal_foul'
|
21
|
+
require_relative 'plays/rebound'
|
22
|
+
require_relative 'plays/shooting_foul'
|
23
|
+
require_relative 'plays/team_timeout'
|
24
|
+
require_relative 'plays/three_point_made'
|
25
|
+
require_relative 'plays/three_point_miss'
|
26
|
+
require_relative 'plays/steal'
|
27
|
+
require_relative 'plays/turnover'
|
28
|
+
require_relative 'plays/tv_timeout'
|
29
|
+
require_relative 'plays/two_point_made'
|
30
|
+
require_relative 'plays/two_point_miss'
|
31
|
+
require_relative 'plays/clear_path_foul'
|
32
|
+
require_relative 'plays/technical_foul'
|
33
|
+
require_relative 'plays/review'
|
34
|
+
require_relative 'plays/defensive_three_seconds'
|
35
|
+
require_relative 'plays/flagrant_one'
|
36
|
+
require_relative 'plays/flagrant_two'
|
37
|
+
require_relative 'plays/delay'
|
38
|
+
require_relative 'plays/ejection'
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Play
|
5
|
+
class Base < Data
|
6
|
+
attr_accessor :response, :id, :clock, :event_type, :description, :statistics, :score, :team_id, :player_id, :quarter, :updated, :location, :possession, :on_court
|
7
|
+
alias :type :event_type
|
8
|
+
|
9
|
+
def initialize(data, **opts)
|
10
|
+
@response = data
|
11
|
+
@api = opts[:api]
|
12
|
+
|
13
|
+
@quarter = opts[:quarter].number.to_i rescue opts[:quarter].to_i
|
14
|
+
@id = data['id']
|
15
|
+
|
16
|
+
update(data)
|
17
|
+
end
|
18
|
+
|
19
|
+
# def game
|
20
|
+
# quarter.game
|
21
|
+
# end
|
22
|
+
|
23
|
+
def scoring_play?
|
24
|
+
points.nonzero?
|
25
|
+
end
|
26
|
+
def timeout?
|
27
|
+
false
|
28
|
+
end
|
29
|
+
def media_timeout?
|
30
|
+
false
|
31
|
+
end
|
32
|
+
def quarter_break?
|
33
|
+
false
|
34
|
+
end
|
35
|
+
def halftime?
|
36
|
+
false
|
37
|
+
end
|
38
|
+
def base_key
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def points
|
43
|
+
0
|
44
|
+
end
|
45
|
+
|
46
|
+
def ==(other)
|
47
|
+
id == other.id && description == other.description
|
48
|
+
end
|
49
|
+
|
50
|
+
def clock_seconds
|
51
|
+
m,s = @clock.split(':')
|
52
|
+
m.to_i * 60 + s.to_i
|
53
|
+
end
|
54
|
+
def game_seconds
|
55
|
+
([quarter, 4].min * 720) + ([quarter - 4, 0].max * 300) - clock_seconds # seconds elapsed in game, will be wrong in overtime
|
56
|
+
end
|
57
|
+
|
58
|
+
def update(data, **opts)
|
59
|
+
@event_type = data['event_type'] # "lineupchange",
|
60
|
+
@clock = data['clock'] # "12:00",
|
61
|
+
@updated = data['updated'] # "2016-10-26T00:07:52+00:00",
|
62
|
+
@description = data['description'] # "Cavaliers lineup change (Richard Jefferson, Kyrie Irving, Mike Dunleavy, Channing Frye, LeBron James)",
|
63
|
+
@attribution = data['attribution'] # {"name"=>"Cavaliers", "market"=>"Cleveland", "id"=>"583ec773-fb46-11e1-82cb-f4ce4684ea4c", "team_basket"=>"left"},
|
64
|
+
@team_id = data.dig('attribution', "id")
|
65
|
+
@location = data['location'] # {"coord_x"=>"0", "coord_y"=>"0"},
|
66
|
+
@possession = data['possession'] # {"name"=>"Knicks", "market"=>"New York", "id"=>"583ec70e-fb46-11e1-82cb-f4ce4684ea4c"},
|
67
|
+
# @on_court = data['on_court'] # hash
|
68
|
+
parse_statistics(data) if data['statistics']
|
69
|
+
end
|
70
|
+
|
71
|
+
def parse_statistics(data)
|
72
|
+
return unless data['statistics']
|
73
|
+
@statistics = data['statistics']
|
74
|
+
stat = data.dig('statistics', base_key)
|
75
|
+
stat = stat[0] if stat.is_a?(Array) # sometimes SR has an array of identical assist hashes
|
76
|
+
@team = stat['team']
|
77
|
+
@team_id = @team['id'] if @team
|
78
|
+
@player = data['player']
|
79
|
+
@player_id = @player['id'] if @player
|
80
|
+
rescue => e
|
81
|
+
binding.pry
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|