acpc_table_manager 3.0.18 → 4.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.
@@ -1,3 +1,3 @@
1
1
  module AcpcTableManager
2
- VERSION = '3.0.18'.freeze
2
+ VERSION = '4.0.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,143 +1,101 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acpc_table_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.18
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dustin Morrill
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-22 00:00:00.000000000 Z
11
+ date: 2017-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pony
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: origin
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.0'
41
- - !ruby/object:Gem::Dependency
42
- name: moped
43
15
  requirement: !ruby/object:Gem::Requirement
44
16
  requirements:
45
17
  - - "~>"
46
18
  - !ruby/object:Gem::Version
47
- version: '1.4'
19
+ version: '1.11'
48
20
  type: :runtime
49
21
  prerelease: false
50
22
  version_requirements: !ruby/object:Gem::Requirement
51
23
  requirements:
52
24
  - - "~>"
53
25
  - !ruby/object:Gem::Version
54
- version: '1.4'
55
- - !ruby/object:Gem::Dependency
56
- name: mongoid
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '3.1'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '3.1'
26
+ version: '1.11'
69
27
  - !ruby/object:Gem::Dependency
70
28
  name: redis
71
29
  requirement: !ruby/object:Gem::Requirement
72
30
  requirements:
73
31
  - - "~>"
74
32
  - !ruby/object:Gem::Version
75
- version: '3.2'
33
+ version: '3.3'
76
34
  type: :runtime
77
35
  prerelease: false
78
36
  version_requirements: !ruby/object:Gem::Requirement
79
37
  requirements:
80
38
  - - "~>"
81
39
  - !ruby/object:Gem::Version
82
- version: '3.2'
40
+ version: '3.3'
83
41
  - !ruby/object:Gem::Dependency
84
42
  name: acpc_poker_types
85
43
  requirement: !ruby/object:Gem::Requirement
86
44
  requirements:
87
- - - ">="
45
+ - - "~>"
88
46
  - !ruby/object:Gem::Version
89
- version: '0'
47
+ version: '7.8'
90
48
  type: :runtime
91
49
  prerelease: false
92
50
  version_requirements: !ruby/object:Gem::Requirement
93
51
  requirements:
94
- - - ">="
52
+ - - "~>"
95
53
  - !ruby/object:Gem::Version
96
- version: '0'
54
+ version: '7.8'
97
55
  - !ruby/object:Gem::Dependency
98
56
  name: acpc_dealer
99
57
  requirement: !ruby/object:Gem::Requirement
100
58
  requirements:
101
59
  - - "~>"
102
60
  - !ruby/object:Gem::Version
103
- version: '3.0'
61
+ version: '3.1'
104
62
  type: :runtime
105
63
  prerelease: false
106
64
  version_requirements: !ruby/object:Gem::Requirement
107
65
  requirements:
108
66
  - - "~>"
109
67
  - !ruby/object:Gem::Version
110
- version: '3.0'
68
+ version: '3.1'
111
69
  - !ruby/object:Gem::Dependency
112
70
  name: acpc_poker_player_proxy
113
71
  requirement: !ruby/object:Gem::Requirement
114
72
  requirements:
115
73
  - - "~>"
116
74
  - !ruby/object:Gem::Version
117
- version: '1.3'
75
+ version: '1.6'
118
76
  type: :runtime
119
77
  prerelease: false
120
78
  version_requirements: !ruby/object:Gem::Requirement
121
79
  requirements:
122
80
  - - "~>"
123
81
  - !ruby/object:Gem::Version
124
- version: '1.3'
82
+ version: '1.6'
125
83
  - !ruby/object:Gem::Dependency
126
84
  name: rusen
127
85
  requirement: !ruby/object:Gem::Requirement
128
86
  requirements:
129
- - - ">="
87
+ - - "~>"
130
88
  - !ruby/object:Gem::Version
131
- version: '0'
89
+ version: '0.1'
132
90
  type: :runtime
133
91
  prerelease: false
134
92
  version_requirements: !ruby/object:Gem::Requirement
135
93
  requirements:
136
- - - ">="
94
+ - - "~>"
137
95
  - !ruby/object:Gem::Version
138
- version: '0'
96
+ version: '0.1'
139
97
  - !ruby/object:Gem::Dependency
140
- name: process_runner
98
+ name: contextual_exceptions
141
99
  requirement: !ruby/object:Gem::Requirement
142
100
  requirements:
143
101
  - - "~>"
@@ -150,62 +108,34 @@ dependencies:
150
108
  - - "~>"
151
109
  - !ruby/object:Gem::Version
152
110
  version: '0.0'
153
- - !ruby/object:Gem::Dependency
154
- name: contextual_exceptions
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :runtime
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: '0'
167
111
  - !ruby/object:Gem::Dependency
168
112
  name: awesome_print
169
113
  requirement: !ruby/object:Gem::Requirement
170
114
  requirements:
171
- - - ">="
115
+ - - "~>"
172
116
  - !ruby/object:Gem::Version
173
- version: '0'
117
+ version: '1.7'
174
118
  type: :runtime
175
119
  prerelease: false
176
120
  version_requirements: !ruby/object:Gem::Requirement
177
121
  requirements:
178
- - - ">="
122
+ - - "~>"
179
123
  - !ruby/object:Gem::Version
180
- version: '0'
124
+ version: '1.7'
181
125
  - !ruby/object:Gem::Dependency
182
126
  name: zaru
183
127
  requirement: !ruby/object:Gem::Requirement
184
128
  requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- type: :runtime
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: '0'
195
- - !ruby/object:Gem::Dependency
196
- name: hescape
197
- requirement: !ruby/object:Gem::Requirement
198
- requirements:
199
- - - ">="
129
+ - - "~>"
200
130
  - !ruby/object:Gem::Version
201
- version: '0'
131
+ version: '0.1'
202
132
  type: :runtime
203
133
  prerelease: false
204
134
  version_requirements: !ruby/object:Gem::Requirement
205
135
  requirements:
206
- - - ">="
136
+ - - "~>"
207
137
  - !ruby/object:Gem::Version
208
- version: '0'
138
+ version: '0.1'
209
139
  - !ruby/object:Gem::Dependency
210
140
  name: bundler
211
141
  requirement: !ruby/object:Gem::Requirement
@@ -238,44 +168,30 @@ dependencies:
238
168
  name: minitest
239
169
  requirement: !ruby/object:Gem::Requirement
240
170
  requirements:
241
- - - ">="
242
- - !ruby/object:Gem::Version
243
- version: '0'
244
- type: :development
245
- prerelease: false
246
- version_requirements: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - ">="
249
- - !ruby/object:Gem::Version
250
- version: '0'
251
- - !ruby/object:Gem::Dependency
252
- name: mocha
253
- requirement: !ruby/object:Gem::Requirement
254
- requirements:
255
- - - ">="
171
+ - - "~>"
256
172
  - !ruby/object:Gem::Version
257
- version: '0'
173
+ version: '5.10'
258
174
  type: :development
259
175
  prerelease: false
260
176
  version_requirements: !ruby/object:Gem::Requirement
261
177
  requirements:
262
- - - ">="
178
+ - - "~>"
263
179
  - !ruby/object:Gem::Version
264
- version: '0'
180
+ version: '5.10'
265
181
  - !ruby/object:Gem::Dependency
266
182
  name: pry
267
183
  requirement: !ruby/object:Gem::Requirement
268
184
  requirements:
269
- - - ">="
185
+ - - "~>"
270
186
  - !ruby/object:Gem::Version
271
- version: '0'
187
+ version: '0.10'
272
188
  type: :development
273
189
  prerelease: false
274
190
  version_requirements: !ruby/object:Gem::Requirement
275
191
  requirements:
276
- - - ">="
192
+ - - "~>"
277
193
  - !ruby/object:Gem::Version
278
- version: '0'
194
+ version: '0.10'
279
195
  description: Backend components to the ACPC Poker GUI Client. Includes a player that
280
196
  saves states from the dealer to persistent storage, and components to start, stop,
281
197
  and manage match components.
@@ -284,6 +200,7 @@ email:
284
200
  executables:
285
201
  - acpc_proxy
286
202
  - acpc_table_manager
203
+ - acpc_testing_bot
287
204
  extensions: []
288
205
  extra_rdoc_files: []
289
206
  files:
@@ -298,18 +215,13 @@ files:
298
215
  - bin/setup
299
216
  - exe/acpc_proxy
300
217
  - exe/acpc_table_manager
218
+ - exe/acpc_testing_bot
301
219
  - lib/acpc_table_manager.rb
302
220
  - lib/acpc_table_manager/config.rb
303
- - lib/acpc_table_manager/dealer.rb
304
- - lib/acpc_table_manager/maintainer.rb
305
221
  - lib/acpc_table_manager/match.rb
306
- - lib/acpc_table_manager/match_slice.rb
307
- - lib/acpc_table_manager/match_view.rb
308
222
  - lib/acpc_table_manager/monkey_patches.rb
309
- - lib/acpc_table_manager/opponents.rb
310
- - lib/acpc_table_manager/proxy.rb
223
+ - lib/acpc_table_manager/proxy_utils.rb
311
224
  - lib/acpc_table_manager/simple_logging.rb
312
- - lib/acpc_table_manager/table_queue.rb
313
225
  - lib/acpc_table_manager/utils.rb
314
226
  - lib/acpc_table_manager/version.rb
315
227
  homepage: https://github.com/dmorrill10/acpc_table_manager
@@ -332,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
332
244
  version: '0'
333
245
  requirements: []
334
246
  rubyforge_project:
335
- rubygems_version: 2.6.11
247
+ rubygems_version: 2.5.1
336
248
  signing_key:
337
249
  specification_version: 4
338
250
  summary: Backend components to the ACPC Poker GUI Client
@@ -1,59 +0,0 @@
1
- require 'acpc_dealer'
2
- require 'timeout'
3
- require 'zaru'
4
- require_relative 'config'
5
- require_relative 'simple_logging'
6
-
7
- module AcpcTableManager
8
- module Dealer
9
- extend SimpleLogging
10
-
11
- @logger = nil
12
-
13
- # @return [Hash<Symbol, Object>] The dealer information
14
- # @note Saves the actual port numbers used by the dealer instance in +match+
15
- def self.start(match, port_numbers: nil)
16
- @logger ||= ::AcpcTableManager.new_log 'dealer.log'
17
- log __method__, match: match
18
-
19
- dealer_arguments = {
20
- match_name: match.sanitized_name,
21
- game_def_file_name: Shellwords.escape(match.game_definition_file_name),
22
- hands: Shellwords.escape(match.number_of_hands),
23
- random_seed: Shellwords.escape(match.random_seed.to_s),
24
- player_names: match.player_names.map { |name| Shellwords.escape(name.gsub(/\s+/, '_')) }.join(' '),
25
- options: match.dealer_options
26
- }
27
-
28
- log __method__, {
29
- match_id: match.id,
30
- match_name: match.name,
31
- dealer_arguments: dealer_arguments,
32
- log_directory: ::AcpcTableManager.config.match_log_directory,
33
- port_numbers: port_numbers,
34
- command: AcpcDealer::DealerRunner.command(dealer_arguments, port_numbers)
35
- }
36
-
37
- dealer_info = Timeout::timeout(3) do
38
- AcpcDealer::DealerRunner.start(
39
- dealer_arguments,
40
- ::AcpcTableManager.config.match_log_directory,
41
- port_numbers
42
- )
43
- end
44
-
45
- match.dealer_pid = dealer_info[:pid]
46
- match.port_numbers = dealer_info[:port_numbers].map { |e| e.to_i }
47
- match.save!
48
-
49
- log __method__, {
50
- match_id: match.id,
51
- match_name: match.name,
52
- dealer_pid: match.dealer_pid,
53
- saved_port_numbers: match.port_numbers
54
- }
55
-
56
- dealer_info
57
- end
58
- end
59
- end
@@ -1,31 +0,0 @@
1
- require_relative 'table_queue'
2
- require_relative 'simple_logging'
3
- using AcpcTableManager::SimpleLogging::MessageFormatting
4
-
5
- module AcpcTableManager
6
- class Maintainer
7
- include SimpleLogging
8
-
9
- def initialize(logger_ = AcpcTableManager.new_log('table_manager.log'))
10
- @logger = logger_
11
- log(__method__)
12
-
13
- @table_queues = {}
14
- ::AcpcTableManager.exhibition_config.games.keys.each do |game_definition_key|
15
- @table_queues[game_definition_key] = ::AcpcTableManager::TableQueue.new(game_definition_key)
16
- end
17
- maintain!
18
- end
19
-
20
- def maintain!
21
- log __method__, msg: "Starting maintenance"
22
-
23
- @table_queues.each do |key, queue|
24
- log(__method__, {queue: key})
25
- queue.check!
26
- end
27
-
28
- log __method__, msg: "Finished maintenance"
29
- end
30
- end
31
- end
@@ -1,194 +0,0 @@
1
- require 'mongoid'
2
- require_relative 'config'
3
-
4
- module AcpcTableManager
5
- class MatchSlice
6
- include Mongoid::Document
7
- include Mongoid::Timestamps::Updated
8
-
9
- embedded_in :match, inverse_of: :slices
10
-
11
- field :hand_has_ended, type: Boolean
12
- field :match_has_ended, type: Boolean
13
- field :seat_with_dealer_button, type: Integer
14
- field :seat_next_to_act, type: Integer
15
- field :state_string, type: String
16
- # Not necessary to be in the database, but more performant than processing on the
17
- # Rails server
18
- field :betting_sequence, type: String
19
- field :pot_at_start_of_round, type: Integer
20
- field :players, type: Array
21
- field :minimum_wager_to, type: Integer
22
- field :chip_contribution_after_calling, type: Integer
23
- field :pot_after_call, type: Integer
24
- field :is_users_turn_to_act, type: Boolean
25
- field :legal_actions, type: Array
26
- field :amount_to_call, type: Integer
27
- field :messages, type: Array
28
-
29
- def self.from_players_at_the_table!(patt, match_has_ended, match)
30
- match.slices.create!(
31
- hand_has_ended: patt.hand_ended?,
32
- match_has_ended: match_has_ended,
33
- seat_with_dealer_button: patt.dealer_player.seat.to_i,
34
- seat_next_to_act: if patt.next_player_to_act
35
- patt.next_player_to_act.seat.to_i
36
- end,
37
- state_string: patt.match_state.to_s,
38
- # Not necessary to be in the database, but more performant than processing on the
39
- # Rails server
40
- betting_sequence: betting_sequence(patt.match_state, patt.game_def),
41
- pot_at_start_of_round: pot_at_start_of_round(patt.match_state, patt.game_def).to_i,
42
- players: players(patt, match.player_names),
43
- minimum_wager_to: minimum_wager_to(patt.match_state, patt.game_def).to_i,
44
- chip_contribution_after_calling: chip_contribution_after_calling(patt.match_state, patt.game_def).to_i,
45
- pot_after_call: pot_after_call(patt.match_state, patt.game_def).to_i,
46
- all_in: all_in(patt.match_state, patt.game_def).to_i,
47
- is_users_turn_to_act: patt.users_turn_to_act?,
48
- legal_actions: patt.legal_actions.map { |action| action.to_s },
49
- amount_to_call: amount_to_call(patt.match_state, patt.game_def).to_i
50
- )
51
- end
52
-
53
- def self.betting_sequence(match_state, game_def)
54
- sequence = ''
55
- match_state.betting_sequence(game_def).each_with_index do |actions_per_round, round|
56
- actions_per_round.each_with_index do |action, action_index|
57
- adjusted_action = adjust_action_amount(
58
- action,
59
- round,
60
- match_state,
61
- game_def
62
- )
63
-
64
- sequence << if (
65
- match_state.player_acting_sequence(game_def)[round][action_index].to_i ==
66
- match_state.position_relative_to_dealer
67
- )
68
- adjusted_action.capitalize
69
- else
70
- adjusted_action
71
- end
72
- end
73
- sequence << '/' unless round == match_state.betting_sequence(game_def).length - 1
74
- end
75
- sequence
76
- end
77
-
78
- def self.pot_at_start_of_round(match_state, game_def)
79
- return 0 if match_state.round == 0
80
-
81
- match_state.players(game_def).inject(0) do |sum, pl|
82
- sum += pl.contributions[0..match_state.round - 1].inject(:+)
83
- end
84
- end
85
-
86
- # @return [Array<Hash>] Player information ordered by seat.
87
- # Each player hash should contain
88
- # values for the following keys:
89
- # 'name',
90
- # 'seat'
91
- # 'chip_stack'
92
- # 'chip_contributions'
93
- # 'chip_balance'
94
- # 'hole_cards'
95
- # 'winnings'
96
- def self.players(patt, player_names)
97
- player_names_queue = player_names.dup
98
- patt.players.map do |player|
99
- hole_cards = if !(player.hand.empty? || player.folded?)
100
- player.hand.to_acpc
101
- elsif player.folded?
102
- ''
103
- else
104
- '_' * patt.game_def.number_of_hole_cards
105
- end
106
-
107
- {
108
- 'name' => player_names_queue.shift,
109
- 'seat' => player.seat,
110
- 'chip_stack' => player.stack.to_i,
111
- 'chip_contributions' => player.contributions.map { |contrib| contrib.to_i },
112
- 'chip_balance' => player.balance,
113
- 'hole_cards' => hole_cards,
114
- 'winnings' => player.winnings.to_f
115
- }
116
- end
117
- end
118
-
119
- # Over round
120
- def self.minimum_wager_to(state, game_def)
121
- return 0 unless state.next_to_act(game_def)
122
-
123
- (
124
- state.min_wager_by(game_def) +
125
- chip_contribution_after_calling(state, game_def)
126
- ).ceil
127
- end
128
-
129
- # Over round
130
- def self.chip_contribution_after_calling(state, game_def)
131
- return 0 unless state.next_to_act(game_def)
132
-
133
- (
134
- (
135
- state.players(game_def)[
136
- state.next_to_act(game_def)
137
- ].contributions[state.round] || 0
138
- ) + amount_to_call(state, game_def)
139
- )
140
- end
141
-
142
- # Over round
143
- def self.pot_after_call(state, game_def)
144
- return state.pot(game_def) if state.hand_ended?(game_def)
145
-
146
- state.pot(game_def) + state.players(game_def).amount_to_call(state.next_to_act(game_def))
147
- end
148
-
149
- # Over round
150
- def self.all_in(state, game_def)
151
- return 0 if state.hand_ended?(game_def)
152
-
153
- (
154
- state.players(game_def)[state.next_to_act(game_def)].stack +
155
- (
156
- state.players(game_def)[state.next_to_act(game_def)]
157
- .contributions[state.round] || 0
158
- )
159
- ).floor
160
- end
161
-
162
- def self.amount_to_call(state, game_def)
163
- return 0 if state.next_to_act(game_def).nil?
164
-
165
- state.players(game_def).amount_to_call(state.next_to_act(game_def))
166
- end
167
-
168
- def users_turn_to_act?
169
- self.is_users_turn_to_act
170
- end
171
- def hand_ended?
172
- self.hand_has_ended
173
- end
174
- def match_ended?
175
- self.match_has_ended
176
- end
177
-
178
- private
179
-
180
- def self.adjust_action_amount(action, round, match_state, game_def)
181
- amount_to_over_hand = action.modifier
182
- if amount_to_over_hand.blank?
183
- action
184
- else
185
- amount_to_over_round = (
186
- amount_to_over_hand.to_i - match_state.players(game_def)[
187
- match_state.position_relative_to_dealer
188
- ].contributions_before(round).to_i
189
- )
190
- "#{action[0]}#{amount_to_over_round}"
191
- end
192
- end
193
- end
194
- end