fantasy_foobar 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/exe/fantasy_foobar +36 -0
- data/lib/fantasy_foobar.rb +21 -0
- data/lib/fantasy_foobar/app_flow.rb +31 -0
- data/lib/fantasy_foobar/data/teams.json +162 -0
- data/lib/fantasy_foobar/kickers_included.rb +27 -0
- data/lib/fantasy_foobar/players.rb +133 -0
- data/lib/fantasy_foobar/stats.rb +137 -0
- data/lib/fantasy_foobar/version.rb +3 -0
- metadata +123 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c83f0ff5bb7fea00c5a1c606c831b3edf0e0ade3f93d026a23574f68f0ffb594
|
4
|
+
data.tar.gz: 9557bd0f5bca7181e1f45683ef03238edd6d144500e8ee3e1bf763e68cf05a2a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 10c6fa46121ff14dd9ec99a3fb07708863687edc89abff39645ba26830cb48659a6f6ea89611dd1c093a05e8d42fd2ab5d563ba6721655c9c40193b50ca72623
|
7
|
+
data.tar.gz: bd2c18dd0d21e3f86fd1ee39f1d03963d76855dbea419a30c753107b37579bf67f25f46c318aa4b255e50b6b24c7cb3a897abbc139bcc1e6f250b4d0eef04639
|
data/exe/fantasy_foobar
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'fantasy_foobar'
|
4
|
+
require 'paint'
|
5
|
+
require 'json'
|
6
|
+
require 'net/http'
|
7
|
+
|
8
|
+
FILE_PATH = File.expand_path(File.dirname(__FILE__)).split('/exe')[0]
|
9
|
+
|
10
|
+
file = File.read "#{FILE_PATH}/lib/fantasy_foobar/data/teams.json"
|
11
|
+
TEAMS = JSON.parse(file)
|
12
|
+
|
13
|
+
CURRENT_TEAM = if File.exist?("#{FILE_PATH}/lib/fantasy_foobar/data/current_team.json")
|
14
|
+
JSON.parse(File.read("#{FILE_PATH}/lib/fantasy_foobar/data/current_team.json"))
|
15
|
+
else
|
16
|
+
[]
|
17
|
+
end
|
18
|
+
|
19
|
+
current_games = {}
|
20
|
+
url = 'http://www.nfl.com/liveupdate/scorestrip/ss.xml'
|
21
|
+
test_url = 'http://www.nfl.com/ajax/scorestrip?season=2017&seasonType=REG&week=11'
|
22
|
+
|
23
|
+
req = Net::HTTP.get_response(URI.parse(url)).body
|
24
|
+
doc = Nokogiri::XML(req)
|
25
|
+
|
26
|
+
doc.xpath('//g').each do |x|
|
27
|
+
eid = x.attribute('eid').value
|
28
|
+
current_games[x.attribute('h').value.to_s] = { 'eid' => eid, 'location' => 'home' }
|
29
|
+
current_games[x.attribute('v').value.to_s] = { 'eid' => eid, 'location' => 'away' }
|
30
|
+
end
|
31
|
+
|
32
|
+
File.write("#{FILE_PATH}/lib/fantasy_foobar/data/current_games.json", current_games.to_json)
|
33
|
+
CURRENT_GAMES = current_games.to_json
|
34
|
+
|
35
|
+
fantasy_foobar = FantasyFoobar::Team.new
|
36
|
+
fantasy_foobar.start_app
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'fantasy_foobar/app_flow'
|
2
|
+
require 'fantasy_foobar/players'
|
3
|
+
require 'fantasy_foobar/stats'
|
4
|
+
require 'fantasy_foobar/version'
|
5
|
+
require 'fantasy_foobar/kickers_included'
|
6
|
+
|
7
|
+
module FantasyFoobar
|
8
|
+
class Team
|
9
|
+
def start_app
|
10
|
+
if update_team?
|
11
|
+
remove_players if CURRENT_TEAM.any? && remove_players?
|
12
|
+
add_players if add_players?
|
13
|
+
|
14
|
+
File.write("#{FILE_PATH}/lib/fantasy_foobar/data/current_team.json", CURRENT_TEAM.to_json)
|
15
|
+
end
|
16
|
+
|
17
|
+
puts
|
18
|
+
print_stats
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
def add_players?
|
2
|
+
input = ''
|
3
|
+
while !input.casecmp('y').zero? && !input.casecmp('n').zero?
|
4
|
+
printf 'Would you like to add players to your team? (y/n) '
|
5
|
+
input = gets.chomp
|
6
|
+
end
|
7
|
+
|
8
|
+
input == 'y'
|
9
|
+
end
|
10
|
+
|
11
|
+
def remove_players?
|
12
|
+
input = ''
|
13
|
+
while !input.casecmp('y').zero? && !input.casecmp('n').zero?
|
14
|
+
printf 'Would you like to remove players from your team? (y/n) '
|
15
|
+
input = gets.chomp
|
16
|
+
end
|
17
|
+
|
18
|
+
input == 'y'
|
19
|
+
end
|
20
|
+
|
21
|
+
def update_team?
|
22
|
+
print_current_team
|
23
|
+
|
24
|
+
input = ''
|
25
|
+
while !input.casecmp('y').zero? && !input.casecmp('n').zero?
|
26
|
+
printf 'Would you like to update your current team? (y/n) '
|
27
|
+
input = gets.chomp
|
28
|
+
end
|
29
|
+
|
30
|
+
input == 'y'
|
31
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
{
|
2
|
+
"ARI": {
|
3
|
+
"name": "Arizona Cardinals",
|
4
|
+
"primary_color": "#97233F",
|
5
|
+
"secondary_color": "#101820"
|
6
|
+
},
|
7
|
+
"ATL": {
|
8
|
+
"name": "Atlanta Falcons",
|
9
|
+
"primary_color": "#A6192E",
|
10
|
+
"secondary_color": "#101820"
|
11
|
+
},
|
12
|
+
"BAL": {
|
13
|
+
"name": "Baltimore Ravens",
|
14
|
+
"primary_color": "#241773",
|
15
|
+
"secondary_color": "#D0B240"
|
16
|
+
},
|
17
|
+
"BUF": {
|
18
|
+
"name": "Buffalo Bills",
|
19
|
+
"primary_color": "#00338D",
|
20
|
+
"secondary_color": "#C8102E"
|
21
|
+
},
|
22
|
+
"CAR": {
|
23
|
+
"name": "Carolina Panthers",
|
24
|
+
"primary_color": "#0085CA",
|
25
|
+
"secondary_color": "#101820"
|
26
|
+
},
|
27
|
+
"CHI": {
|
28
|
+
"name": "Chicago Bears",
|
29
|
+
"primary_color": "#051C2C",
|
30
|
+
"secondary_color": "#DC4405"
|
31
|
+
},
|
32
|
+
"CIN": {
|
33
|
+
"name": "Cincinnati Bengals",
|
34
|
+
"primary_color": "#FC4C02",
|
35
|
+
"secondary_color": "#101820"
|
36
|
+
},
|
37
|
+
"CLE": {
|
38
|
+
"name": "Cleveland Browns",
|
39
|
+
"primary_color": "#382F2D",
|
40
|
+
"secondary_color": "#EB3300"
|
41
|
+
},
|
42
|
+
"DAL": {
|
43
|
+
"name": "Dallas Cowboys",
|
44
|
+
"primary_color": "#041E42",
|
45
|
+
"secondary_color": "#869397"
|
46
|
+
},
|
47
|
+
"DEN": {
|
48
|
+
"name": "Denver Broncos",
|
49
|
+
"primary_color": "#FC4C02",
|
50
|
+
"secondary_color": "#0C2340"
|
51
|
+
},
|
52
|
+
"DET": {
|
53
|
+
"name": "Detroit Lions",
|
54
|
+
"primary_color": "#0069B1",
|
55
|
+
"secondary_color": "#A2AAAD"
|
56
|
+
},
|
57
|
+
"GB": {
|
58
|
+
"name": "Green Bay Packers",
|
59
|
+
"primary_color": "#175E33",
|
60
|
+
"secondary_color": "#FFB81C"
|
61
|
+
},
|
62
|
+
"HOU": {
|
63
|
+
"name": "Houston Texans",
|
64
|
+
"primary_color": "#091F2C",
|
65
|
+
"secondary_color": "#A6192E"
|
66
|
+
},
|
67
|
+
"IND": {
|
68
|
+
"name": "Indianapolis Colts",
|
69
|
+
"primary_color": "#001489",
|
70
|
+
"secondary_color": "#FFFFFF"
|
71
|
+
},
|
72
|
+
"JAX": {
|
73
|
+
"name": "Jacksonville Jaguars",
|
74
|
+
"primary_color": "#D49F12",
|
75
|
+
"secondary_color": "#006073"
|
76
|
+
},
|
77
|
+
"KC": {
|
78
|
+
"name": "Kansas City Chiefs",
|
79
|
+
"primary_color": "#C8102E",
|
80
|
+
"secondary_color": "#FFB81C"
|
81
|
+
},
|
82
|
+
"LAC": {
|
83
|
+
"name": "Los Angeles Chargers",
|
84
|
+
"primary_color": "#0C2340",
|
85
|
+
"secondary_color": "#FFB81C"
|
86
|
+
},
|
87
|
+
"LA": {
|
88
|
+
"name": "Los Angeles Rams",
|
89
|
+
"primary_color": "#002244",
|
90
|
+
"secondary_color": "#FFFFFF"
|
91
|
+
},
|
92
|
+
"MIA": {
|
93
|
+
"name": "Miami Dolphins",
|
94
|
+
"primary_color": "#008E97",
|
95
|
+
"secondary_color": "#F58220"
|
96
|
+
},
|
97
|
+
"MIN": {
|
98
|
+
"name": "Minnesota Vikings",
|
99
|
+
"primary_color": "#512D6D",
|
100
|
+
"secondary_color": "#FFB81C"
|
101
|
+
},
|
102
|
+
"NE": {
|
103
|
+
"name": "New England Patriots",
|
104
|
+
"primary_color": "#0C2340",
|
105
|
+
"secondary_color": "#C8102E"
|
106
|
+
},
|
107
|
+
"NO": {
|
108
|
+
"name": "New Orleans Saints",
|
109
|
+
"primary_color": "#A28D5B",
|
110
|
+
"secondary_color": "#101820"
|
111
|
+
},
|
112
|
+
"NYG": {
|
113
|
+
"name": "New York Giants",
|
114
|
+
"primary_color": "#001E62",
|
115
|
+
"secondary_color": "#A6192E"
|
116
|
+
},
|
117
|
+
"NYJ": {
|
118
|
+
"name": "New York Jets",
|
119
|
+
"primary_color": "#0C371D",
|
120
|
+
"secondary_color": "#FFFFFF"
|
121
|
+
},
|
122
|
+
"OAK": {
|
123
|
+
"name": "Oakland Raiders",
|
124
|
+
"primary_color": "#101820",
|
125
|
+
"secondary_color": "#A5ACAF"
|
126
|
+
},
|
127
|
+
"PHI": {
|
128
|
+
"name": "Philadelphia Eagles",
|
129
|
+
"primary_color": "#064C53",
|
130
|
+
"secondary_color": "#D3A205"
|
131
|
+
},
|
132
|
+
"PIT": {
|
133
|
+
"name": "Pittsburgh Steelers",
|
134
|
+
"primary_color": "#FFB81C",
|
135
|
+
"secondary_color": "#101820"
|
136
|
+
},
|
137
|
+
"SF": {
|
138
|
+
"name": "San Francisco 49ers",
|
139
|
+
"primary_color": "#9B2743",
|
140
|
+
"secondary_color": "#896C4C"
|
141
|
+
},
|
142
|
+
"SEA": {
|
143
|
+
"name": "Seattle Seahawks",
|
144
|
+
"primary_color": "#001433",
|
145
|
+
"secondary_color": "#4DFF00"
|
146
|
+
},
|
147
|
+
"TB": {
|
148
|
+
"name": "Tampa Bay Buccaneers",
|
149
|
+
"primary_color": "#C8102E",
|
150
|
+
"secondary_color": "#FF8200"
|
151
|
+
},
|
152
|
+
"TEN": {
|
153
|
+
"name": "Tennessee Titans",
|
154
|
+
"primary_color": "#0C2340",
|
155
|
+
"secondary_color": "#4B92DB"
|
156
|
+
},
|
157
|
+
"WAS": {
|
158
|
+
"name": "Washington Redskins",
|
159
|
+
"primary_color": "#862633",
|
160
|
+
"secondary_color": "#FFCD00"
|
161
|
+
}
|
162
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'nfl_data'
|
2
|
+
|
3
|
+
module NflData
|
4
|
+
class PlayerParser
|
5
|
+
include ParserHelper
|
6
|
+
|
7
|
+
attr_reader :base_url
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@base_url = 'http://www.nfl.com/players/search?category=position&conferenceAbbr=null&playerType=current&conference=ALL&filter='
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_by_position(position)
|
14
|
+
if position == :all
|
15
|
+
{
|
16
|
+
quarterbacks: get('quarterback'),
|
17
|
+
runningbacks: get('runningback'),
|
18
|
+
wide_receivers: get('widereceiver'),
|
19
|
+
tight_ends: get('tightend'),
|
20
|
+
kickers: get('kicker')
|
21
|
+
}
|
22
|
+
else
|
23
|
+
{ position => get(position.to_s.gsub(/s|_/, '')) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
def add_player(player, players)
|
2
|
+
opts = players.find_all { |i| i['last_name'].casecmp(player).zero? }
|
3
|
+
unless opts.any?
|
4
|
+
puts
|
5
|
+
puts "Player with the last name '#{player}' does not exist"
|
6
|
+
return
|
7
|
+
end
|
8
|
+
selection = {}
|
9
|
+
|
10
|
+
puts
|
11
|
+
opts.each_with_index do |opt, i|
|
12
|
+
team = TEAMS[opt['team']]
|
13
|
+
primary_color = team['primary_color']
|
14
|
+
secondary_color = team['secondary_color']
|
15
|
+
stat_categories = stat_categories(opt['position'])
|
16
|
+
gsid = get_player_gsid(opt['profile_link'])
|
17
|
+
selection[(i + 1).to_s] = opt.merge(stat_categories).merge(gsid)
|
18
|
+
|
19
|
+
puts "#{i + 1}. #{Paint[opt['full_name'], :bright]} from the #{Paint[team['name'], secondary_color, primary_color, :bright]} "
|
20
|
+
end
|
21
|
+
|
22
|
+
puts
|
23
|
+
puts '----------------------------------------------------- 🏈'
|
24
|
+
|
25
|
+
selected_player = get_selected_player(selection)
|
26
|
+
|
27
|
+
if selected_player.nil?
|
28
|
+
puts
|
29
|
+
puts 'YOUR TEAM HAS NOT BEEN UPDATED'
|
30
|
+
return
|
31
|
+
end
|
32
|
+
|
33
|
+
CURRENT_TEAM << selected_player
|
34
|
+
|
35
|
+
puts
|
36
|
+
puts "You added #{Paint[CURRENT_TEAM.last['full_name'], :bright]} "
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_players
|
40
|
+
players = JSON.parse(NflData::API::Player.get_all)
|
41
|
+
player_pool = players['quarterbacks'] + players['wide_receivers'] + players['runningbacks'] + players['tight_ends'] + players['kickers']
|
42
|
+
print_current_team
|
43
|
+
|
44
|
+
input = 'y'
|
45
|
+
|
46
|
+
while input.casecmp('y').zero?
|
47
|
+
printf 'Add a player to your team: '
|
48
|
+
player = gets.chomp
|
49
|
+
add_player(player, player_pool)
|
50
|
+
|
51
|
+
inner_input = ''
|
52
|
+
while !inner_input.casecmp('y').zero? && !inner_input.casecmp('n').zero?
|
53
|
+
print_current_team
|
54
|
+
printf 'Add another player? (y/n) '
|
55
|
+
inner_input = gets.chomp
|
56
|
+
end
|
57
|
+
input = inner_input
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def bye_week?(player)
|
62
|
+
if JSON.parse(CURRENT_GAMES)[player['team']].nil?
|
63
|
+
puts "#{player['full_name']} does not have a game this week"
|
64
|
+
return true
|
65
|
+
end
|
66
|
+
false
|
67
|
+
end
|
68
|
+
|
69
|
+
def get_player_gsid(url)
|
70
|
+
req = Net::HTTP.get_response(URI.parse(url)).body
|
71
|
+
doc = Nokogiri::HTML(req)
|
72
|
+
|
73
|
+
gsid = doc.xpath("//comment()[contains(.,'GSIS ID')]").first.text.split('GSIS ID: ')[1].split("\n\t")[0]
|
74
|
+
|
75
|
+
{ 'gsid' => gsid }
|
76
|
+
end
|
77
|
+
|
78
|
+
def get_selected_player(selection)
|
79
|
+
puts
|
80
|
+
printf "Input number to confirm player above you'd like to add (enter any other value to cancel): "
|
81
|
+
player = gets.chomp
|
82
|
+
|
83
|
+
if player.to_i.zero?
|
84
|
+
return nil
|
85
|
+
end
|
86
|
+
|
87
|
+
selection[player]
|
88
|
+
end
|
89
|
+
|
90
|
+
def print_current_team
|
91
|
+
puts
|
92
|
+
CURRENT_TEAM.each_with_index do |player, i|
|
93
|
+
team = TEAMS[player['team']]
|
94
|
+
primary_color = team['primary_color']
|
95
|
+
secondary_color = team['secondary_color']
|
96
|
+
puts "#{i + 1}. #{Paint[player['full_name'], :bright]} from the #{Paint[team['name'], secondary_color, primary_color, :bright]} "
|
97
|
+
end
|
98
|
+
puts
|
99
|
+
end
|
100
|
+
|
101
|
+
def remove_player
|
102
|
+
printf "Input the number of player above you'd like to remove (enter any other value to cancel): "
|
103
|
+
player = gets.chomp
|
104
|
+
|
105
|
+
if player.to_i.zero?
|
106
|
+
puts
|
107
|
+
puts 'YOUR TEAM HAS NOT BEEN UPDATED'
|
108
|
+
return
|
109
|
+
end
|
110
|
+
|
111
|
+
unless CURRENT_TEAM.delete_at(player.to_i - 1)
|
112
|
+
puts
|
113
|
+
puts 'YOUR TEAM HAS NOT BEEN UPDATED'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def remove_players
|
118
|
+
input = 'y'
|
119
|
+
|
120
|
+
while input.casecmp('y').zero?
|
121
|
+
print_current_team
|
122
|
+
remove_player
|
123
|
+
|
124
|
+
inner_input = ''
|
125
|
+
while !inner_input.casecmp('y').zero? && !inner_input.casecmp('n').zero?
|
126
|
+
inner_input = 'n' && break unless CURRENT_TEAM.any?
|
127
|
+
print_current_team
|
128
|
+
printf 'Remove another player? (y/n) '
|
129
|
+
inner_input = gets.chomp
|
130
|
+
end
|
131
|
+
input = inner_input
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
STAT_LINE = {}
|
2
|
+
STAT_CACHE = {}
|
3
|
+
|
4
|
+
def calculate_points(stat_category, data)
|
5
|
+
case stat_category
|
6
|
+
when 'passing' then calculate_passing(data)
|
7
|
+
when 'rushing' then calculate_rushing(data)
|
8
|
+
when 'receiving' then calculate_receiving(data)
|
9
|
+
when 'kicking' then calculate_kicking(data)
|
10
|
+
when 'fumbles' then calculate_fumbles(data)
|
11
|
+
else 0
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def calculate_passing(data)
|
16
|
+
return 0 if data.empty?
|
17
|
+
(data['yds'] * 0.04) + (data['tds'] * 4) + (data['twoptm'] * 2) - (data['ints'] * 2)
|
18
|
+
end
|
19
|
+
|
20
|
+
def calculate_rushing(data)
|
21
|
+
return 0 if data.empty?
|
22
|
+
(data['yds'] * 0.1) + (data['tds'] * 6) + (data['twoptm'] * 2)
|
23
|
+
end
|
24
|
+
|
25
|
+
def calculate_receiving(data)
|
26
|
+
return 0 if data.empty?
|
27
|
+
(data['yds'] * 0.1) + (data['tds'] * 6) + (data['twoptm'] * 2) + (data['rec'] * 0.5)
|
28
|
+
end
|
29
|
+
|
30
|
+
def calculate_kicking(data)
|
31
|
+
return 0 if data.empty?
|
32
|
+
data['xpmade'] + (data['fgm'] * 3) - (data['fga'] - data['fgm'])
|
33
|
+
end
|
34
|
+
|
35
|
+
def calculate_fumbles(data)
|
36
|
+
return 0 if data.empty?
|
37
|
+
data['lost'] * -2
|
38
|
+
end
|
39
|
+
|
40
|
+
def find_or_create_statline(player)
|
41
|
+
STAT_LINE[player['gsid']] ||= {}
|
42
|
+
|
43
|
+
player['stat_categories'].each do |stat|
|
44
|
+
STAT_LINE[player['gsid']][stat] ||= {}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def print_player_feed(player)
|
49
|
+
return if bye_week?(player)
|
50
|
+
|
51
|
+
player_gsid = player['gsid']
|
52
|
+
team = TEAMS[player['team']]
|
53
|
+
primary_color = team['primary_color']
|
54
|
+
secondary_color = team['secondary_color']
|
55
|
+
STAT_CACHE[player_gsid] = {}
|
56
|
+
eid = JSON.parse(CURRENT_GAMES)[player['team']]['eid']
|
57
|
+
|
58
|
+
loop.with_index do |_, i|
|
59
|
+
begin
|
60
|
+
data = Net::HTTP.get_response(URI.parse("http://www.nfl.com/liveupdate/game-center/#{eid}/#{eid}_gtd.json")).body
|
61
|
+
JSON.parse(data)[eid]['drives'].each do |drive_key, drive_value|
|
62
|
+
STAT_CACHE[player_gsid][drive_key] ||= {}
|
63
|
+
|
64
|
+
next if drive_key == 'crntdrv'
|
65
|
+
drive_value['plays'].each do |play_key, play_value|
|
66
|
+
next if STAT_CACHE[player_gsid][drive_key][play_key]
|
67
|
+
STAT_CACHE[player_gsid][drive_key][play_key] = play_value['desc']
|
68
|
+
|
69
|
+
next unless play_value['players'][player_gsid]
|
70
|
+
puts Paint[play_value['desc'], secondary_color, primary_color, :bright]
|
71
|
+
player['stat_categories'].each do |stat_category|
|
72
|
+
updated_statline(player, data, stat_category)
|
73
|
+
end
|
74
|
+
updated_fantasy_points(player)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
rescue
|
78
|
+
i.zero? && (puts "#{player['full_name']}'s game has not yet started")
|
79
|
+
end
|
80
|
+
sleep 30
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def print_stats
|
85
|
+
threads = []
|
86
|
+
CURRENT_TEAM.each do |player|
|
87
|
+
threads << Thread.new(player) do |my_player|
|
88
|
+
find_or_create_statline(my_player)
|
89
|
+
print_player_feed(my_player)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
threads.each(&:join)
|
94
|
+
end
|
95
|
+
|
96
|
+
def stat_categories(pos)
|
97
|
+
categories = case pos
|
98
|
+
when 'QB' then { 'stat_categories' => %w[passing rushing fumbles] }
|
99
|
+
when 'K' then { 'stat_categories' => %w[kicking] }
|
100
|
+
when 'TE' then { 'stat_categories' => %w[receiving fumbles] }
|
101
|
+
else { 'stat_categories' => %w[receiving rushing fumbles] }
|
102
|
+
end
|
103
|
+
categories
|
104
|
+
end
|
105
|
+
|
106
|
+
def updated_fantasy_points(player)
|
107
|
+
points = 0
|
108
|
+
STAT_LINE[player['gsid']].each do |k,v|
|
109
|
+
points += calculate_points(k, v)
|
110
|
+
end
|
111
|
+
STAT_LINE[player['gsid']]['fantasy_points'] = points
|
112
|
+
puts "#{player['full_name']}: #{'%g' % ('%.1f' % points)} fantasy points"
|
113
|
+
end
|
114
|
+
|
115
|
+
def updated_statline(player, data, stat_category)
|
116
|
+
player_name = "#{player['first_name'][0]}.#{player['last_name']}"
|
117
|
+
player_gsid = player['gsid']
|
118
|
+
eid = JSON.parse(CURRENT_GAMES)[player['team']]['eid']
|
119
|
+
location = JSON.parse(CURRENT_GAMES)[player['team']]['location']
|
120
|
+
team_stat_category = JSON.parse(data)[eid][location]['stats'][stat_category]
|
121
|
+
return if team_stat_category.nil?
|
122
|
+
player_data = team_stat_category[player_gsid]
|
123
|
+
return if player_data.nil?
|
124
|
+
|
125
|
+
STAT_LINE[player_gsid] ||= {}
|
126
|
+
STAT_LINE[player_gsid][stat_category] = player_data
|
127
|
+
|
128
|
+
result = case stat_category
|
129
|
+
when 'passing' then "#{player_name}: #{player_data['cmp']}/#{player_data['att']} for #{player_data['yds']} yards with #{player_data['tds']} touchdowns and #{player_data['ints']} interceptions"
|
130
|
+
when 'rushing' then "#{player_name}: #{player_data['att']} attempts for #{player_data['yds']} yards and #{player_data['tds']} touchdowns"
|
131
|
+
when 'receiving' then "#{player_name}: #{player_data['rec']} receptions for #{player_data['yds']} yards and #{player_data['tds']} touchdowns"
|
132
|
+
when 'kicking' then "#{player_name}: #{player_data['fgm']}/#{player_data['fga']} in FGs and #{player_data['xpmade']}/#{player_data['xpa']} in extra points"
|
133
|
+
when 'fumbles' then "#{player_name}: #{player_data['lost']} fumble lost"
|
134
|
+
else ''
|
135
|
+
end
|
136
|
+
puts result
|
137
|
+
end
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fantasy_foobar
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Garvin
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-12-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nfl_data
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.12
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.12
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: paint
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.15'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.15'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '10.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '10.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
description:
|
84
|
+
email:
|
85
|
+
- chris.garvin@me.com
|
86
|
+
executables:
|
87
|
+
- fantasy_foobar
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- exe/fantasy_foobar
|
92
|
+
- lib/fantasy_foobar.rb
|
93
|
+
- lib/fantasy_foobar/app_flow.rb
|
94
|
+
- lib/fantasy_foobar/data/teams.json
|
95
|
+
- lib/fantasy_foobar/kickers_included.rb
|
96
|
+
- lib/fantasy_foobar/players.rb
|
97
|
+
- lib/fantasy_foobar/stats.rb
|
98
|
+
- lib/fantasy_foobar/version.rb
|
99
|
+
homepage: https://www.github.com/chrisgarvin/fantasy_foobar
|
100
|
+
licenses:
|
101
|
+
- MIT
|
102
|
+
metadata: {}
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
requirements: []
|
118
|
+
rubyforge_project:
|
119
|
+
rubygems_version: 2.7.3
|
120
|
+
signing_key:
|
121
|
+
specification_version: 4
|
122
|
+
summary: Live console view of your Fantasy Football teams stats
|
123
|
+
test_files: []
|