sorare-rewards 1.2.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f64ea163ad5ed02120737f8a540b3c1a86cbfc4e2d472ff4906cf2ca836f060
4
- data.tar.gz: d9021d4ce7717b197408ee1e9e1da025e3af46f4f744862c987ea58654e9f191
3
+ metadata.gz: e8b73fbf4bff9af80575de83f2d3d726fa91a4d587892fb9d06eb88bf28e006f
4
+ data.tar.gz: e8d9949c62b554da58ba80ba1cb7c849bc5ba8cc6e5a565fac89fa316f961c48
5
5
  SHA512:
6
- metadata.gz: eafcc27cb84b5974e901b8246fd49a9f351b7e88b784274eb2a3dc0b1086f6b11a6d96611b20790b42c92e83ac97e4abb6dadfa3b2f928f2c66db161451c86c4
7
- data.tar.gz: db9da4a9da91484dd38a71afa544cc324d7c1e724a85cebe154453fa381c376c8c028ad3f4494e533cd6480657c6d6b9a6a2c2b6cef6e1be6f96fa2f57516222
6
+ metadata.gz: ce1fc376f8102f8df7ded7337f235f64393ed954e122b978051a9efbf6b9d70f2548f5ada427af8a070152495ba4206277f680c3a2cbcf6097a3cba2db4af48f
7
+ data.tar.gz: a338114ad5c95083d4e674880fae0a5b9285ccae2ae73d3358c908fb5a4551271590976a92fdbe79dc58b830b88e164eca3bc7384673dbde51a4db537add85e0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,29 @@
1
+ ## [1.4.1] - 2021-12-14
2
+
3
+ ### Fixes
4
+
5
+ - Fix an issue where the `config` was null when accessed on a `GameWeek` with no loaded data
6
+
7
+ ## [1.4.0] - 2021-12-14
8
+
9
+ ### Added
10
+
11
+ - Added support for rarity based `rewards_ratio_per_cards_in_circulation`
12
+
13
+ ## [1.3.0] - 2021-11-02
14
+
15
+ ### Breaking
16
+
17
+ - Removed rewards method from `GameWeek` (`card_rewards`, `cards_picked`, `reward_allocations`, `prize_pools`, `card_allocations`)
18
+ - `Picker` has been renamed to `CardPicker`
19
+
20
+ ### Added
21
+
22
+ - Added a `GameWeekRewards` class that provides all rewards related methods
23
+ - Added a way to pick cards with a custom `card_allocations`
24
+
1
25
  ## [1.2.0] - 2021-11-02
26
+
2
27
  ### Added
28
+
3
29
  - Enable cross leagues cooldown using `per_league` configuration flag
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sorare-rewards (1.2.0)
4
+ sorare-rewards (1.4.1)
5
5
  activesupport (~> 6.1.4)
6
6
  interactor (~> 3.1.2)
7
7
  json (~> 2)
@@ -20,7 +20,7 @@ GEM
20
20
  ast (2.4.2)
21
21
  concurrent-ruby (1.1.9)
22
22
  diff-lcs (1.4.4)
23
- i18n (1.8.10)
23
+ i18n (1.8.11)
24
24
  concurrent-ruby (~> 1.0)
25
25
  interactor (3.1.2)
26
26
  io-wait (0.1.0)
@@ -29,7 +29,7 @@ GEM
29
29
  net-http (0.1.1)
30
30
  net-protocol
31
31
  uri
32
- net-protocol (0.1.1)
32
+ net-protocol (0.1.2)
33
33
  io-wait
34
34
  timeout
35
35
  ostruct (0.4.0)
@@ -73,9 +73,9 @@ GEM
73
73
  tzinfo (2.0.4)
74
74
  concurrent-ruby (~> 1.0)
75
75
  unicode-display_width (2.1.0)
76
- uri (0.10.1)
76
+ uri (0.11.0)
77
77
  yaml (0.2.0)
78
- zeitwerk (2.5.0)
78
+ zeitwerk (2.5.1)
79
79
 
80
80
  PLATFORMS
81
81
  ruby
@@ -90,4 +90,4 @@ DEPENDENCIES
90
90
  sorare-rewards!
91
91
 
92
92
  BUNDLED WITH
93
- 2.2.22
93
+ 2.2.30
data/README.md CHANGED
@@ -10,15 +10,14 @@ gem 'sorare-rewards'
10
10
 
11
11
  And then execute:
12
12
 
13
- $ bundle install
13
+ $ bundle install
14
14
 
15
15
  Or install it yourself as:
16
16
 
17
- $ gem install sorare-rewards
17
+ $ gem install sorare-rewards
18
18
 
19
19
  ## Usage
20
20
 
21
-
22
21
  First you need to load a game week
23
22
 
24
23
  ```ruby
@@ -27,21 +26,37 @@ game_week = Sorare::Rewards::GameWeek.new(hash: 'QmbwCo1fuhRN1T2DyEQtETefsBH6yCj
27
26
 
28
27
  Game Week's `hash` and `salt` can be retrieved using the GQL API, the salt is made public after the rewards have been distributed.
29
28
 
30
-
31
- To compute the number of rewards for the game week :
29
+ To compute rewards for a game week :
32
30
 
33
31
  ```ruby
34
- # Card rewards :
35
- game_week.card_allocations
32
+ rewards = Sorare::Rewards::GameWeekRewards.new(game_week: game_week)
33
+
34
+ # Cards allocations :
35
+ rewards.card_allocations
36
36
 
37
- # Eth rewards :
38
- game_week.prize_pools
37
+ # Cards :
38
+ rewards.cards
39
+
40
+ # Prize pools :
41
+ rewards.prize_pools
39
42
  ```
40
43
 
41
- To get the cards rewarded for a GameWeek :
44
+ By default it uses the computed card allocations to pick the rewards. To override it :
42
45
 
43
46
  ```ruby
44
- game_week.cards_picked
47
+ card_allocations = {
48
+ 'global_all-star' => {
49
+ 'D1' => {
50
+ 'rare' => {
51
+ 'tier_0' => 1,
52
+ ...
53
+ }
54
+ }
55
+ }
56
+ }
57
+
58
+ rewards = Sorare::Rewards::GameWeekRewards.new(game_week: game_week, card_allocations: card_allocations)
59
+
45
60
  ```
46
61
 
47
62
  ## Development
@@ -50,7 +65,6 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
50
65
 
51
66
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
52
67
 
53
-
54
68
  ## License
55
69
 
56
70
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -4,8 +4,8 @@ require 'active_support/core_ext/module/delegation'
4
4
 
5
5
  module Sorare
6
6
  module Rewards
7
- # Picker allows to randomly pick a card
8
- class Picker
7
+ # CardPicker allows to randomly pick a card
8
+ class CardPicker
9
9
  attr_accessor :cards, :player_counter
10
10
 
11
11
  delegate :length, to: :cards
@@ -6,13 +6,10 @@ require 'active_support/core_ext/module/delegation'
6
6
 
7
7
  module Sorare
8
8
  module Rewards
9
- # GameWeek stores the reward data of a game week
9
+ # GameWeek stores the data of a game week
10
10
  class GameWeek
11
11
  attr_reader :salt
12
12
 
13
- delegate :card_allocations, :prize_pools, to: :reward_allocations
14
- delegate :cards_picked, to: :card_rewards
15
-
16
13
  def initialize(data: nil, hash: nil, salt: nil)
17
14
  @uri = URI("#{Sorare::Rewards.configuration.gateway}#{hash}")
18
15
  @data = data
@@ -30,7 +27,7 @@ module Sorare
30
27
  end
31
28
 
32
29
  def config
33
- @config ||= GameWeekConfig.new(@data['config'])
30
+ @config ||= GameWeekConfig.new(data['config'])
34
31
  end
35
32
 
36
33
  def supply_for(league, rarity: nil, player: nil)
@@ -48,16 +45,6 @@ module Sorare
48
45
  end
49
46
  end
50
47
 
51
- def reward_allocations
52
- raise 'Salt required' unless salt
53
-
54
- @reward_allocations ||= Sorare::Rewards::Build.call!(game_week: self, salt: salt)
55
- end
56
-
57
- def card_rewards
58
- @card_rewards ||= Sorare::Rewards::Pick.call!(reward_allocations.to_h)
59
- end
60
-
61
48
  def league(name)
62
49
  raise 'Unknown league' unless (leagues || {})[name]
63
50
 
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sorare
4
+ module Rewards
5
+ # GameWeekRewards stores rewards related data for a specified GameWeek, salt,
6
+ # And a card allocations hash
7
+ # {
8
+ # 'global-all_star' => {
9
+ # 'D1' => {
10
+ # 'rare' => { 'tier_0' => 0, 'tier_1' => 1 }
11
+ # }
12
+ # }
13
+ # }
14
+ class GameWeekRewards
15
+ attr_reader :game_week, :salt, :card_allocations
16
+
17
+ MISSING_PARAMETER = '%s parameter required'
18
+
19
+ def initialize(game_week:, salt: nil, card_allocations: nil)
20
+ @game_week = game_week
21
+ @salt = salt || game_week.salt
22
+ @card_allocations = card_allocations || computed_card_allocations
23
+ end
24
+
25
+ def cards
26
+ @cards ||= Sorare::Rewards::Pick.call!(
27
+ salt: salt,
28
+ game_week: game_week,
29
+ card_allocations: card_allocations
30
+ ).cards_picked
31
+ end
32
+
33
+ def prize_pools
34
+ @prize_pools ||= reward_allocations.prize_pools
35
+ end
36
+
37
+ def reward_allocations
38
+ validate!(:salt)
39
+
40
+ @reward_allocations ||= Sorare::Rewards::Build.call!(game_week: game_week, salt: salt)
41
+ end
42
+
43
+ def computed_card_allocations
44
+ Transposer.transpose_allocations(reward_allocations.card_allocations)
45
+ end
46
+
47
+ private
48
+
49
+ def validate!(field)
50
+ raise format(MISSING_PARAMETER, field) unless send(field)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -8,27 +8,26 @@ module Sorare
8
8
  class Build
9
9
  include Interactor
10
10
 
11
- delegate :game_week, :salt, to: :context
11
+ delegate :game_week, to: :context
12
12
 
13
13
  def call
14
14
  context.card_allocations = allocate!
15
15
  context.prize_pools = prize_pools!
16
- context.prize_pool_currency = game_week.config.prize_pool_currency
17
16
  end
18
17
 
19
18
  def game_week_supply
20
- @game_week_supply ||= Supply::ComputeForGameWeek.call!(game_week: game_week, salt: salt)
19
+ @game_week_supply ||= Supply::ComputeForGameWeek.call!(game_week: game_week)
21
20
  .game_week_supply
22
21
  end
23
22
 
24
23
  def allocate!
25
24
  Allocations::ComputeForGameWeek.call!(
26
- game_week: game_week, supply: game_week_supply, salt: salt
25
+ supply: game_week_supply, public_seed: game_week.public_seed, salt: game_week.salt
27
26
  ).game_week_allocations
28
27
  end
29
28
 
30
29
  def prize_pools!
31
- PrizePools::ComputeForGameWeek.call!(game_week: game_week, salt: salt).prize_pools
30
+ PrizePools::ComputeForGameWeek.call!(game_week: game_week).prize_pools
32
31
  end
33
32
  end
34
33
  end
@@ -10,8 +10,8 @@ module Sorare
10
10
  # PickForDivision picks the rewards for a given division
11
11
  # Receive a list of pickers for each tiers and quality
12
12
  # {
13
- # 'rare' => { 'tier_0' => Picker, 'tier_1' => Picker },
14
- # 'super_rare' => { 'tier_0' => Picker, 'tier_1' => Picker }
13
+ # 'rare' => { 'tier_0' => CardPicker, 'tier_1' => CardPicker },
14
+ # 'super_rare' => { 'tier_0' => CardPicker, 'tier_1' => CardPicker }
15
15
  # }
16
16
  # And a reward allocations
17
17
  # {
@@ -9,7 +9,7 @@ module Sorare
9
9
  # PickForDivisionAndRarity picks the rewards for a given division and rarity
10
10
  # Receive a list of pickers for each tiers
11
11
  # {
12
- # 'tier_0' => Picker, 'tier_1' => Picker
12
+ # 'tier_0' => CardPicker, 'tier_1' => CardPicker
13
13
  # }
14
14
  # A game week data
15
15
  # And a reward allocations
@@ -19,7 +19,7 @@ module Sorare
19
19
  class PickForGameWeek
20
20
  include Interactor
21
21
 
22
- delegate :game_week, :allocations, :salt, :picks, to: :context
22
+ delegate :game_week, :allocations, :picks, to: :context
23
23
 
24
24
  def call
25
25
  context.cards_picked = pick!
@@ -17,8 +17,9 @@ module Sorare
17
17
  class PickForLeague
18
18
  include Interactor
19
19
 
20
- delegate :salt, :league, :allocations, :pickers, to: :context
20
+ delegate :league, :allocations, :pickers, to: :context
21
21
  delegate :game_week, to: :league
22
+ delegate :public_seed, :salt, to: :game_week
22
23
 
23
24
  def call
24
25
  context.pickers = {}
@@ -48,7 +49,7 @@ module Sorare
48
49
  end
49
50
 
50
51
  def initialize_tier_picker(players, rarity, tier)
51
- pickers[rarity][tier] = Picker.new(game_week.public_seed, salt)
52
+ pickers[rarity][tier] = CardPicker.new(public_seed, salt)
52
53
 
53
54
  players.each do |slug, _|
54
55
  pickers[rarity][tier].add_player(slug, player_supply(rarity, slug))
@@ -11,8 +11,8 @@ module Sorare
11
11
  # And a reward allocations
12
12
  # {
13
13
  # 'global-all_star' => {
14
- # 'rare' => {
15
- # 'D1' => { 'tier_0' => 0, 'tier_1' => 1 }
14
+ # 'D1' => {
15
+ # 'rare' => { 'tier_0' => 0, 'tier_1' => 1 }
16
16
  # }
17
17
  # }
18
18
  # }
@@ -27,13 +27,9 @@ module Sorare
27
27
  context.cards_picked = Sorare::Rewards::Cards::PickForGameWeek.call!(
28
28
  **context.to_h,
29
29
  salt: salt,
30
- allocations: transposed_allocations
30
+ allocations: Sorare::Rewards::GameWeekAllocations.new(card_allocations)
31
31
  ).cards_picked
32
32
  end
33
-
34
- def transposed_allocations
35
- Sorare::Rewards::GameWeekAllocations.new(Transposer.transpose_allocations(card_allocations))
36
- end
37
33
  end
38
34
  end
39
35
  end
@@ -10,7 +10,7 @@ module Sorare
10
10
  class ComputeForGameWeek
11
11
  include Interactor
12
12
 
13
- delegate :salt, :game_week, :game_week_supply, to: :context
13
+ delegate :game_week, :game_week_supply, to: :context
14
14
 
15
15
  def call
16
16
  context.game_week_supply = game_week_supply!
@@ -31,7 +31,7 @@ module Sorare
31
31
  end
32
32
 
33
33
  def randomizer
34
- @randomizer ||= Sorare::Rewards::Random.new(game_week.public_seed, salt)
34
+ @randomizer ||= Sorare::Rewards::Random.new(game_week.public_seed, game_week.salt)
35
35
  end
36
36
  end
37
37
  end
@@ -24,9 +24,17 @@ module Sorare
24
24
  end
25
25
 
26
26
  def cards_in_circulation_limit(rarity)
27
- return unless cards_in_circulation&.dig(rarity) && game_week.config.rewards_ratio_per_cards_in_circulation
27
+ return unless cards_in_circulation&.dig(rarity) && rewards_ratio_per_cards_in_circulation_for_rarity(rarity)
28
28
 
29
- (cards_in_circulation[rarity] * game_week.config.rewards_ratio_per_cards_in_circulation).floor
29
+ (cards_in_circulation[rarity] * rewards_ratio_per_cards_in_circulation_for_rarity(rarity)).floor
30
+ end
31
+
32
+ def rewards_ratio_per_cards_in_circulation_for_rarity(rarity)
33
+ if game_week.config.rewards_ratio_per_cards_in_circulation.is_a?(Hash)
34
+ return game_week.config.rewards_ratio_per_cards_in_circulation[rarity]
35
+ end
36
+
37
+ game_week.config.rewards_ratio_per_cards_in_circulation
30
38
  end
31
39
 
32
40
  def each_division_prize_pools
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sorare
4
4
  module Rewards
5
- VERSION = '1.2.0'
5
+ VERSION = '1.4.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.2.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - pierre
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-02 00:00:00.000000000 Z
11
+ date: 2021-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -150,7 +150,7 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: 2.5.0
153
- description:
153
+ description:
154
154
  email:
155
155
  - pierre@sorare.com
156
156
  executables: []
@@ -172,10 +172,12 @@ files:
172
172
  - data.patch
173
173
  - lib/sorare/rewards.rb
174
174
  - lib/sorare/rewards/allocation_configuration.yml
175
+ - lib/sorare/rewards/card_picker.rb
175
176
  - lib/sorare/rewards/configuration.rb
176
177
  - lib/sorare/rewards/game_week.rb
177
178
  - lib/sorare/rewards/game_week_allocations.rb
178
179
  - lib/sorare/rewards/game_week_config.rb
180
+ - lib/sorare/rewards/game_week_rewards.rb
179
181
  - lib/sorare/rewards/interactor.rb
180
182
  - lib/sorare/rewards/interactors/allocations/compute_for_game_week.rb
181
183
  - lib/sorare/rewards/interactors/allocations/compute_for_league.rb
@@ -197,7 +199,6 @@ files:
197
199
  - lib/sorare/rewards/interactors/tiers/qualify_players.rb
198
200
  - lib/sorare/rewards/interactors/tiers/qualify_supply.rb
199
201
  - lib/sorare/rewards/league.rb
200
- - lib/sorare/rewards/picker.rb
201
202
  - lib/sorare/rewards/player.rb
202
203
  - lib/sorare/rewards/prize_pool_configuration.yml
203
204
  - lib/sorare/rewards/random.rb
@@ -210,7 +211,7 @@ licenses:
210
211
  metadata:
211
212
  homepage_uri: https://gitlab.com/sorare/sorare-rewards
212
213
  source_code_uri: https://gitlab.com/sorare/sorare-rewards
213
- post_install_message:
214
+ post_install_message:
214
215
  rdoc_options: []
215
216
  require_paths:
216
217
  - lib
@@ -225,8 +226,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
226
  - !ruby/object:Gem::Version
226
227
  version: '0'
227
228
  requirements: []
228
- rubygems_version: 3.2.22
229
- signing_key:
229
+ rubygems_version: 3.2.3
230
+ signing_key:
230
231
  specification_version: 4
231
232
  summary: '["Sorare", "reward", "allocation", "algorithm"]'
232
233
  test_files: []