sorare-rewards 1.2.0 → 1.4.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 +4 -4
- data/CHANGELOG.md +26 -0
- data/Gemfile.lock +6 -6
- data/README.md +26 -12
- data/lib/sorare/rewards/{picker.rb → card_picker.rb} +2 -2
- data/lib/sorare/rewards/game_week.rb +2 -15
- data/lib/sorare/rewards/game_week_rewards.rb +54 -0
- data/lib/sorare/rewards/interactors/build.rb +4 -5
- data/lib/sorare/rewards/interactors/cards/pick_for_division.rb +2 -2
- data/lib/sorare/rewards/interactors/cards/pick_for_division_and_rarity.rb +1 -1
- data/lib/sorare/rewards/interactors/cards/pick_for_game_week.rb +1 -1
- data/lib/sorare/rewards/interactors/cards/pick_for_league.rb +3 -2
- data/lib/sorare/rewards/interactors/pick.rb +3 -7
- data/lib/sorare/rewards/interactors/supply/compute_for_game_week.rb +2 -2
- data/lib/sorare/rewards/league.rb +10 -2
- data/lib/sorare/rewards/version.rb +1 -1
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8b73fbf4bff9af80575de83f2d3d726fa91a4d587892fb9d06eb88bf28e006f
|
4
|
+
data.tar.gz: e8d9949c62b554da58ba80ba1cb7c849bc5ba8cc6e5a565fac89fa316f961c48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
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.
|
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.
|
76
|
+
uri (0.11.0)
|
77
77
|
yaml (0.2.0)
|
78
|
-
zeitwerk (2.5.
|
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.
|
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
|
-
|
13
|
+
$ bundle install
|
14
14
|
|
15
15
|
Or install it yourself as:
|
16
16
|
|
17
|
-
|
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
|
-
|
35
|
-
|
32
|
+
rewards = Sorare::Rewards::GameWeekRewards.new(game_week: game_week)
|
33
|
+
|
34
|
+
# Cards allocations :
|
35
|
+
rewards.card_allocations
|
36
36
|
|
37
|
-
#
|
38
|
-
|
37
|
+
# Cards :
|
38
|
+
rewards.cards
|
39
|
+
|
40
|
+
# Prize pools :
|
41
|
+
rewards.prize_pools
|
39
42
|
```
|
40
43
|
|
41
|
-
|
44
|
+
By default it uses the computed card allocations to pick the rewards. To override it :
|
42
45
|
|
43
46
|
```ruby
|
44
|
-
|
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
|
-
#
|
8
|
-
class
|
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
|
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(
|
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,
|
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
|
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
|
-
|
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
|
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' =>
|
14
|
-
# 'super_rare' => { 'tier_0' =>
|
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' =>
|
12
|
+
# 'tier_0' => CardPicker, 'tier_1' => CardPicker
|
13
13
|
# }
|
14
14
|
# A game week data
|
15
15
|
# And a reward allocations
|
@@ -17,8 +17,9 @@ module Sorare
|
|
17
17
|
class PickForLeague
|
18
18
|
include Interactor
|
19
19
|
|
20
|
-
delegate :
|
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] =
|
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
|
-
# '
|
15
|
-
# '
|
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:
|
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 :
|
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) &&
|
27
|
+
return unless cards_in_circulation&.dig(rarity) && rewards_ratio_per_cards_in_circulation_for_rarity(rarity)
|
28
28
|
|
29
|
-
(cards_in_circulation[rarity] *
|
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
|
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.
|
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
|
+
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.
|
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: []
|