espn_nba_fantasy 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 95c1266ad0e17fe8005d0a2ae6d4c708d96f2a3bc32f552e8e7e982a8a7094a9
4
+ data.tar.gz: 3e4850b64d6045defc7f213930a6826437c665e1867e2c9f194562ed1323c14f
5
+ SHA512:
6
+ metadata.gz: a4c6f37cc975b0b7098f4a5a7c59c4fd6788e90fd2db4d14c079d3db59dba9644273f08ddf8034b042c26e86871ddaf7b44fed3b781bd66de9e5953e90b2557b
7
+ data.tar.gz: 4ab893440cdd0c8fa580e6247949e4b4dfead8543469d1d94a9275dc6bab25f7e6017797f929a3957a7fdd9c56f17916ebc8467b4b3b56029d2d6f96ceb79ff4
@@ -0,0 +1,10 @@
1
+ module CalculateStats
2
+
3
+ def add_calculated_stats(stats)
4
+ stats['AFG%'] = (stats['3PTM']*0.5+stats['FGM'])/(stats['FGA'])
5
+ stats['A/TO'] = stats['AST']/(stats['TO'])
6
+ stats['FT%'] = stats['FTM']/(stats['FTA'])
7
+ stats
8
+ end
9
+
10
+ end
@@ -0,0 +1,64 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+ require_relative 'constants'
4
+ require_relative 'team'
5
+ require_relative 'player_finder'
6
+
7
+ class League
8
+
9
+ include PlayerFinder
10
+
11
+ attr_accessor :teams, :stat_data
12
+
13
+ def initialize(league_id, year, s2, sw)
14
+ @uri = "https://fantasy.espn.com/apis/v3/games/fba/seasons/#{year}/segments/0/leagues/#{league_id}?view=mTeam&view=mRoster&view=mMatchup&view=mSettings&view=mStandings"
15
+ @cookies = {'espn_s2': "#{s2}", 'SWID': "#{sw}"}
16
+ @data = JSON.parse(RestClient.get(@uri, {cookies: @cookies}))
17
+ @teams = make_team_objects
18
+ @stat_data = make_stat_data
19
+ end
20
+
21
+ def team_list
22
+ @teams.map{|r| [r.name, r.team_id]}
23
+ end
24
+
25
+ def findplayer(team_name, str)
26
+ team = teams.select{|t| t.name == team_name}.first
27
+ return "No team named #{team_name}" unless team
28
+
29
+ find_players(team.players, str) || "#{str} cannot be found in #{team_name}'s roster"
30
+ end
31
+
32
+ private
33
+
34
+ def make_team_objects
35
+ @data['teams'].map{|team| Team.new(team, self)}
36
+ end
37
+
38
+ def make_stat_data
39
+ stats = {}
40
+ teams.each do |team|
41
+ team.teamstats.each do |stat, value|
42
+ stats[stat] ? stats[stat] << value : stats[stat] = [value]
43
+ end
44
+ end
45
+ calculate_league_stats(stats)
46
+ end
47
+
48
+ def calculate_league_stats(s)
49
+ calc = {}
50
+ s.each do |stat, values|
51
+ avg = (values.sum/values.length).to_f
52
+ calc["#{stat} Average"] = avg
53
+ calc["#{stat} Standard Deviation"] = std_dev(avg, values)
54
+ end
55
+ calc
56
+ end
57
+
58
+ def std_dev(mean, values)
59
+ sum = values.inject(0){|accum, i| accum +(i-mean)**2 }
60
+ variance = sum/(values.length - 1).to_f
61
+ Math.sqrt(variance)
62
+ end
63
+
64
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'constants'
2
+ require_relative 'calculate_stats'
3
+
4
+ class Player
5
+
6
+ include CalculateStats
7
+
8
+ attr_reader :name, :player_id, :position, :stats, :team
9
+
10
+ def initialize(player, team)
11
+ @name = player['fullName']
12
+ @player_id = player['id']
13
+ @position = POSITION_MAP[player['defaultPositionId']-1]
14
+ @stats = stat_card_maker(player)
15
+ @team = team
16
+ end
17
+
18
+ private
19
+
20
+ def to_s
21
+ "Player: #{name} | Position: #{position} | Stats: #{stats}"
22
+ end
23
+
24
+ def stat_card_maker(player)
25
+ avgstats = player['stats'].first['averageStats']
26
+ statcard = avgstats ? avgstats.transform_keys!{ |k| STATS_MAP[k] }.slice(*STATS) : EMPTY_STATS
27
+ calculate_stats(statcard)
28
+ end
29
+
30
+ def calculate_stats(s)
31
+ s['FGA'] = s['FGA'] + 0.0001
32
+ s['TO'] = s['TO'] + 0.00001
33
+ s['FTA'] = s['FTA'] + 0.00001
34
+ add_calculated_stats(s)
35
+ end
36
+
37
+ end
@@ -0,0 +1,7 @@
1
+ module PlayerFinder
2
+
3
+ def find_players(arr, matcher)
4
+ arr.select{|p| p.name.downcase == matcher.downcase}.first
5
+ end
6
+
7
+ end
@@ -0,0 +1,67 @@
1
+ require_relative 'constants'
2
+ require_relative 'player'
3
+ require_relative 'calculate_stats'
4
+ require_relative 'player_finder'
5
+
6
+ class Team
7
+
8
+ include CalculateStats
9
+ include PlayerFinder
10
+
11
+ attr_accessor :roster, :players, :name, :teamstats, :league, :team_id
12
+
13
+ def initialize(obj, league)
14
+ @name = obj['name']
15
+ @team_id = obj['id']
16
+ @players = roster_maker(obj)
17
+ @roster = roster_names
18
+ @teamstats = make_team_stats(@players)
19
+ @league = league
20
+ end
21
+
22
+ def trade_players(to_trade = [], to_receive = [], other_team_name)
23
+ other_team = league.teams.select{|team| team.name == other_team_name}.first
24
+ return "No team named #{other_team_name}" unless other_team
25
+ own_players = to_trade.map{|player| find_players(players, player)}
26
+ other_players = to_receive.map{|player| find_players(other_team.players, player)}
27
+ return "This trade included players not one of the specified teams" if (own_players.include?(nil)|| other_players.include?(nil))
28
+ {'Trading:' => own_players.map{|p| p.name},
29
+ 'Receiving:' => other_players.map{|p| p.name}}.merge(new_team_stats(own_players, other_players))
30
+
31
+ end
32
+
33
+ private
34
+
35
+ def to_s
36
+ "Team Name: #{name} | Roster: #{roster_names}"
37
+ end
38
+
39
+ def roster_names
40
+ players.map(&:name)
41
+ end
42
+
43
+ def stat_differences(old, new)
44
+ new.map {|stat, val| [stat, val - old[stat]]}.to_h
45
+ end
46
+
47
+ def new_team_stats(own, others)
48
+ new_ros = players.dup
49
+ others.each{|other| new_ros << other}
50
+ own.each {|p| new_ros.delete_at(new_ros.index(p))}
51
+ newstats = make_team_stats(new_ros)
52
+ {'Before:' => teamstats, 'After:' => newstats, 'Changes:' => stat_differences(teamstats, newstats) }
53
+ end
54
+
55
+ def roster_maker(obj)
56
+ obj['roster']['entries'].map {|e| Player.new(e['playerPoolEntry']['player'], self)}
57
+ end
58
+
59
+ def make_team_stats(ros)
60
+ stats = {}
61
+ ros.each do |player|
62
+ player.stats.each {|stat, value| stats[stat] ? stats[stat] += value : stats[stat] = value}
63
+ end
64
+ add_calculated_stats(stats)
65
+ end
66
+
67
+ end
@@ -0,0 +1,4 @@
1
+ require 'espn_nba_fantasy/constants'
2
+ require 'espn_nba_fantasy/player'
3
+ require 'espn_nba_fantasy/league'
4
+ require 'espn_nba_fantasy/team'
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: espn_nba_fantasy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Usborn Ocampo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-06-22 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A way to get your league, team, and player information from your ESPN
14
+ NBA Fantasy League
15
+ email: usborn116@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/espn_nba_fantasy.rb
21
+ - lib/espn_nba_fantasy/calculate_stats.rb
22
+ - lib/espn_nba_fantasy/league.rb
23
+ - lib/espn_nba_fantasy/player.rb
24
+ - lib/espn_nba_fantasy/player_finder.rb
25
+ - lib/espn_nba_fantasy/team.rb
26
+ homepage: https://rubygems.org/gems/espn_nba_fantasy
27
+ licenses:
28
+ - UO
29
+ metadata: {}
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubygems_version: 3.4.14
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: A way to get your league, team, and player information from your ESPN NBA
49
+ Fantasy League
50
+ test_files: []