acpc_table_manager 3.0.18 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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