sorare-rewards 1.0.0 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 253e18e26532e141a2fa48969f8484d6c7f92f399cf4eecc248b5017978e6747
4
- data.tar.gz: c7ed9fd27b8a78240a492eb0d75df26e5fb34b55a5a96b3a46b4cc74cc845d59
3
+ metadata.gz: f6897c498226e4f66e5b2a8aa93cd8b46478cc5d48d445950313224fae955922
4
+ data.tar.gz: 6a317d2b7767bb86bba95b485516923c1f4fe04780507d068b8d5ebd4a34a836
5
5
  SHA512:
6
- metadata.gz: d3ef4eae789a0f616c270f8d08eb16d87d5964cd4b8c99a0501fe78ed02347942cb205baea2cc0b299822d9f158e6e2548915bd9d13917cf392ec8ebb4ff9be6
7
- data.tar.gz: bbb905bf57270350136d28946ef963e841efc5acd780db50d90d0bcef4bfdee11fd7488df00d1bddcb5ce96981bbab64bad8177e3e699dd8b09d816518445cd6
6
+ metadata.gz: d0000887adec07808ab805e1045b196cd413015dd4e99a0b7df65fcf08a6cdf1f7cadd34c976a8da21cbbe72b583f5166e970a624645f02e64c5a77dbc1b119b
7
+ data.tar.gz: 72f565145aade90fc49552c1940da0e6f93f9e4f80dc179fb90ff9c20ed2c287ab241e5755bab1f750b3e9a8f4a61425b262729cf0e326465be201a35dfdfccc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sorare-rewards (1.0.0)
4
+ sorare-rewards (1.1.1)
5
5
  activesupport (~> 6.1)
6
6
  interactor (~> 3.0)
7
7
  json (~> 2)
@@ -23,12 +23,15 @@ GEM
23
23
  i18n (1.8.10)
24
24
  concurrent-ruby (~> 1.0)
25
25
  interactor (3.1.2)
26
+ io-wait (0.1.0)
26
27
  json (2.5.1)
27
28
  minitest (5.14.4)
28
29
  net-http (0.1.1)
29
30
  net-protocol
30
31
  uri
31
- net-protocol (0.1.0)
32
+ net-protocol (0.1.1)
33
+ io-wait
34
+ timeout
32
35
  ostruct (0.2.0)
33
36
  parallel (1.20.1)
34
37
  parser (3.0.1.0)
@@ -67,6 +70,7 @@ GEM
67
70
  rubocop (~> 1.0)
68
71
  rubocop-ast (>= 1.1.0)
69
72
  ruby-progressbar (1.11.0)
73
+ timeout (0.1.1)
70
74
  tzinfo (2.0.4)
71
75
  concurrent-ruby (~> 1.0)
72
76
  unicode-display_width (2.0.0)
@@ -1,3 +1,29 @@
1
+ limited: &limited
2
+ tier_0:
3
+ - pct: 0
4
+ - pct: 0
5
+ - pct: 0
6
+ - pct: 0
7
+ - pct: 0.33
8
+ tier_1:
9
+ - pct: 0
10
+ - pct: 0
11
+ - pct: 0
12
+ - pct: 0
13
+ - pct: 0.33
14
+ tier_2:
15
+ - pct: 0
16
+ - pct: 0
17
+ - pct: 0
18
+ - pct: 0
19
+ - pct: 0.8
20
+ tier_3:
21
+ - pct: 0
22
+ - pct: 0
23
+ - pct: 0
24
+ - pct: 0
25
+ - pct: 1
26
+
1
27
  rare: &rare
2
28
  tier_0:
3
29
  - cards_per_loop: 0
@@ -44,21 +70,27 @@ super_rare: &super_rare
44
70
 
45
71
  leagues:
46
72
  global-all_star:
73
+ limited: *limited
47
74
  rare: *rare
48
75
  super_rare: *super_rare
49
76
  global-under_twenty_one:
77
+ limited: *limited
50
78
  rare: *rare
51
79
  super_rare: *super_rare
52
80
  champion-europe:
81
+ limited: *limited
53
82
  rare: *rare
54
83
  super_rare: *super_rare
55
84
  challenger-europe:
85
+ limited: *limited
56
86
  rare: *rare
57
87
  super_rare: *super_rare
58
88
  champion-asia:
89
+ limited: *limited
59
90
  rare: *rare
60
91
  super_rare: *super_rare
61
92
  champion-america:
93
+ limited: *limited
62
94
  rare: *rare
63
95
  super_rare: *super_rare
64
96
  special-weekly:
@@ -12,7 +12,7 @@ module Sorare
12
12
  @config = config
13
13
  end
14
14
 
15
- %w[cooldown limits prize_pool_currency].each do |key|
15
+ %w[cooldown limits prize_pool_currency rewards_ratio_per_cards_in_circulation].each do |key|
16
16
  define_method(key) do
17
17
  config[key]
18
18
  end
@@ -17,10 +17,8 @@ module Sorare
17
17
  end
18
18
 
19
19
  def allocate_and_format!
20
- allocations = allocate!
21
-
22
- allocations.keys.index_with do |rarity|
23
- allocations[rarity].first.keys.index_with do |division|
20
+ each_rarity_allocation do |rarity|
21
+ (allocations[rarity].first || {}).keys.index_with do |division|
24
22
  allocations[rarity].each_with_index.map do |qualified_allocations, tier|
25
23
  [Sorare::Rewards.configuration.transform_tier.call(tier), qualified_allocations[division]]
26
24
  end.to_h
@@ -28,8 +26,12 @@ module Sorare
28
26
  end
29
27
  end
30
28
 
31
- def allocate!
32
- (config || {}).keys.index_with do |rarity|
29
+ def each_rarity_allocation(&block)
30
+ allocations.keys.index_with(&block)
31
+ end
32
+
33
+ def allocations
34
+ @allocations ||= (config || {}).keys.index_with do |rarity|
33
35
  ComputeForRarity.call!(**context.to_h, supply: supply[rarity], config: config[rarity]).rarity_allocations
34
36
  end
35
37
  end
@@ -85,7 +85,7 @@ module Sorare
85
85
  end
86
86
 
87
87
  def check_config!
88
- return if config && [0, 1].include?(config.sum { |q| q['pct'] || 0 })
88
+ return if config
89
89
 
90
90
  context.fail!(error: 'Invalid config')
91
91
  end
@@ -15,7 +15,13 @@ module Sorare
15
15
  def call
16
16
  context.fail!(error: 'Invalid config') unless config
17
17
 
18
- context.rarity_allocations = supply.each_with_index.map do |tier_supply, tier|
18
+ context.rarity_allocations = allocations
19
+ end
20
+
21
+ def allocations
22
+ return [] unless supply
23
+
24
+ supply.each_with_index.map do |tier_supply, tier|
19
25
  ComputeForQuality.call!(
20
26
  **context.to_h,
21
27
  supply: tier_supply,
@@ -32,7 +32,7 @@ module Sorare
32
32
 
33
33
  def pick_if_available!
34
34
  player = picker.pick
35
- return if picker.player_counter[player] > game_week.player(player).supply(league, rarity).ceil
35
+ return if picker.player_counter[player] > game_week.player(player).pickable_supply(league, rarity)
36
36
 
37
37
  cards_picked.push(player)
38
38
  end
@@ -16,16 +16,14 @@ module Sorare
16
16
  def call
17
17
  context.rarity_supply = []
18
18
 
19
- context.rewardable = compute_rewardable_supply!
19
+ context.rewardable = rewardable_supply
20
20
  distribute_in_tiers!
21
21
  end
22
22
 
23
- def compute_rewardable_supply!
24
- total_supply = supply.keys.sum do |player|
25
- player_supply(player)
26
- end
23
+ def rewardable_supply
24
+ total_float_supply = supply.keys.sum { |player| player_supply(player) }
27
25
 
28
- rounded_supply(total_supply)
26
+ round_and_cap_supply(total_float_supply)
29
27
  end
30
28
 
31
29
  def distribute_in_tiers!
@@ -43,12 +41,15 @@ module Sorare
43
41
  end
44
42
  end
45
43
 
46
- def player_supply(slug)
47
- game_week.player(slug).supply(league, rarity)
44
+ def round_and_cap_supply(float_supply)
45
+ [
46
+ float_supply.floor + remaining_supply(float_supply.modulo(1)), # Supply limit
47
+ league.cards_in_circulation_limit(rarity) # Circulation limit
48
+ ].compact.min
48
49
  end
49
50
 
50
- def rounded_supply(float_supply)
51
- float_supply.floor + remaining_supply(float_supply.modulo(1))
51
+ def player_supply(slug)
52
+ game_week.player(slug).reward_pool_supply_contribution(league, rarity)
52
53
  end
53
54
 
54
55
  def remaining_supply(reward_probability)
@@ -17,12 +17,18 @@ module Sorare
17
17
  @game_week = game_week
18
18
  end
19
19
 
20
- %w[playing_rate prize_pools].each do |key|
20
+ %w[playing_rate prize_pools cards_in_circulation].each do |key|
21
21
  define_method(key) do
22
22
  config[key]
23
23
  end
24
24
  end
25
25
 
26
+ def cards_in_circulation_limit(rarity)
27
+ return unless cards_in_circulation&.dig(rarity) && game_week.config.rewards_ratio_per_cards_in_circulation
28
+
29
+ (cards_in_circulation[rarity] * game_week.config.rewards_ratio_per_cards_in_circulation).floor
30
+ end
31
+
26
32
  def each_division_prize_pools
27
33
  prize_pools.each_with_index do |prize_pool, index|
28
34
  return to_enum(:each_division_prize_pools) unless block_given?
@@ -25,11 +25,18 @@ module Sorare
25
25
  @game_data.present?
26
26
  end
27
27
 
28
- def supply(league, rarity)
28
+ def reward_pool_supply_contribution(league, rarity)
29
29
  return 0 unless playing? && remaining_games_for_supply.positive?
30
30
 
31
31
  [
32
- uncapped_supply_for_game_week(league, rarity), # Remaining supply
32
+ uncapped_supply_for_game_week(league, rarity),
33
+ pickable_supply(league, rarity)
34
+ ].min
35
+ end
36
+
37
+ def pickable_supply(league, rarity)
38
+ [
39
+ overall_supply(league, rarity), # Remaining supply
33
40
  available_during_cooldown(league, rarity), # Cooldown limit
34
41
  @config.distribution_limit(rarity) # Hard limit
35
42
  ].min
@@ -52,10 +59,12 @@ module Sorare
52
59
  end
53
60
 
54
61
  def rewarded_during_cooldown(league, rarity)
55
- (rewards&.dig(league) || []).count { |at| (Time.parse(at) + @config.cooldown_since(rarity)) < Time.now }
62
+ (@game_data&.dig(league.name, rarity) || []).count do |at|
63
+ (Time.parse(at) + @config.cooldown_since(rarity)) > Time.now
64
+ end
56
65
  end
57
66
 
58
- %w[rewards remaining_games_for_supply remaining_games].each do |key|
67
+ %w[remaining_games_for_supply remaining_games].each do |key|
59
68
  define_method(key) do
60
69
  @game_data&.dig(key)
61
70
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sorare
4
4
  module Rewards
5
- VERSION = '1.0.0'
5
+ VERSION = '1.1.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorare-rewards
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - pierre
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-08 00:00:00.000000000 Z
11
+ date: 2021-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport