espn_nba_fantasy 0.0.0

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 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: []