Skip to content

Commit 42b605e

Browse files
committed
Add support for TimerReset.
1 parent bf0ffa6 commit 42b605e

File tree

10 files changed

+53
-3
lines changed

10 files changed

+53
-3
lines changed

app/models/pitboss_entry.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ def entry_to_domain_event
3030
Game::PlayerDisconnected.new(data: { slot: value.to_i, game_id: game_name }),
3131
stream_name: "Game$#{game_name}"
3232
)
33+
when "TimerReset"
34+
event_store.publish(
35+
Game::TimerReset.new(data: { slot: value.to_i, game_id: game_name }),
36+
stream_name: "Game$#{game_name}"
37+
)
3338
end
3439
end
3540
end

app/models/read_model/game_read_model.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ def build_slack_new_turn_message(event_data)
2020
steam://run/8930/q/%2Bconnect%20#{ip_address}"
2121
end
2222

23+
def build_slack_timer_reset_message(event_data)
24+
"The turn timer for game #{name} has been reset"
25+
end
26+
2327
def turn
2428
current_turn[:number]
2529
end

config/initializers/rails_event_store.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
.new(logger: Rails.logger, event_store: Rails.configuration.event_store)
88
.call(event)
99
end,
10-
to: [Game::NewTurnStarted, Game::PlayerDisconnected]
10+
to: [Game::NewTurnStarted, Game::PlayerDisconnected, Game::TimerReset]
1111
)
1212
client.subscribe(
1313
-> (event) do

game/lib/game.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module Game
1010
PlayerRegistered = Class.new(DomainEvent)
1111
PlayerUnregistered = Class.new(DomainEvent)
1212
PlayerSlotfhulnessIncreased = Class.new(DomainEvent)
13+
TimerReset = Class.new(DomainEvent)
1314

1415
HostGame = Struct.new(:game_id, :turn_timer)
1516
RegisterPlayer = Struct.new(:game_id, :player_id, :slot_id)

game/lib/game/current_turn.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ def call(stream_name)
2020
.when(PlayerEndedTurn, method(:handle_player_ended_turn))
2121
.when(PlayerEndTurnCancelled, method(:handle_player_end_turn_cancelled))
2222
.when(PlayerConnected, method(:handle_player_end_turn_cancelled))
23+
.when(TimerReset, method(:handle_timer_reset))
2324
.run(@event_store, count: 10_000)
2425
Result.new(state[:turn], state[:unfinished_player_ids], state[:ends_at])
2526
end
@@ -67,5 +68,11 @@ def handle_game_hosted(state, event)
6768
state[:turn_timer] = event.data.fetch(:turn_timer)
6869
state
6970
end
71+
72+
def handle_timer_reset(state, event)
73+
reset_at = event.metadata.fetch(:timestamp)
74+
state[:ends_at] = reset_at + state[:turn_timer]
75+
state
76+
end
7077
end
7178
end

game/lib/game/game.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,8 @@ def apply_player_connected(_event)
4545

4646
def apply_player_disconnected(_event)
4747
end
48+
49+
def apply_reset_timer(_event)
50+
end
4851
end
4952
end

game/spec/game/current_turn_spec.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,23 @@ def player_3
158158
NewTurnStarted.new(data: {turn: 1}),
159159
PlayerEndedTurn.new(data: {slot: 2}),
160160
PlayerEndedTurn.new(data: {slot: 2}),
161-
PlayerUnregistered.new(data: {slot_id: 3, player_id: player_3})
161+
PlayerUnregistered.new(data: {slot: 3, player_id: player_3})
162162
)
163163
current_turn = CurrentTurn.new(event_store).call(game_id)
164164

165165
expect(current_turn.turn).to eq(1)
166166
expect(current_turn.unfinished_player_ids).to eq([player_1])
167167
end
168+
169+
specify("timer reset") do
170+
given(
171+
GameHosted.new(data: {turn_timer: 24.hours.to_i}),
172+
NewTurnStarted.new(data: {turn: 1}, metadata: {timestamp: Time.at(0).utc}),
173+
TimerReset.new(data: {slot: 1}, metadata: {timestamp: Time.at(24.hours).utc})
174+
)
175+
current_turn = CurrentTurn.new(event_store).call(game_id)
176+
177+
expect(current_turn.ends_at).to eq(Time.at(48.hours).utc)
178+
end
168179
end
169180
end

logs_parser/lib/logs_parser.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ def call(line)
2929
elsif player_disconnected?(line)
3030
player_number = line.scan(/\d/)[-1]
3131
return Result.new(game_name, "PlayerDisconnected", player_number, timestamp)
32+
elsif timer_reset?(line)
33+
player_number = line.scan(/\d/)[-3]
34+
return Result.new(game_name, "TimerReset", player_number, timestamp)
3235
end
3336
end
3437
end
@@ -39,7 +42,7 @@ def call(line)
3942

4043
def contains_relevant_data?(line)
4144
line.match(/DBG: Game Turn/) || line.match(/:NetTurnComplete/) || line.match(/NetTurnUnready/) ||
42-
line.match(/NetPlayerReady/) || line.match(/ConnectionClosed Player\(\d\)/)
45+
line.match(/NetPlayerReady/) || line.match(/ConnectionClosed Player\(\d\)/) || line.match(/:NetGiftUnit.+UnitID=-1/)
4346
end
4447

4548
def split_log_line(line)
@@ -67,6 +70,10 @@ def player_connected?(line)
6770
def player_disconnected?(line)
6871
line.match(/ConnectionClosed/)
6972
end
73+
74+
def timer_reset?(line)
75+
line.match(/:NetGiftUnit.+UnitID=-1/)
76+
end
7077
end
7178

7279
class HttpAdapter

logs_parser/spec/service_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,12 @@
7979
expect(result).to be_nil
8080
end
8181

82+
specify "player player connected happy path" do
83+
parser = LogsParser::Service.new("arkency_test", 6)
84+
result = parser.call("[3540015.559] Net RECV (1) :NetGiftUnit(Player=1, Minor=-1, UnitID=-1)\n")
85+
expect_result(result, game_name: "arkency_test", entry_type: "TimerReset", data: "1", timestamp: "3540015.559")
86+
end
87+
8288
private
8389

8490
def expect_result(result, game_name:, entry_type:, data:, timestamp:)

spec/domain_events_from_entries_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,10 @@ def event_store
4646

4747
expect(event_store).not_to(have_published(an_event(Game::PlayerDisconnected)))
4848
end
49+
50+
specify("TimerReset") do
51+
PitbossEntry.create(timestamp: 0, value: 5, entry_type: "TimerReset", game_name: "dummy")
52+
53+
expect(event_store).to(have_published(an_event(Game::TimerReset).with_data(slot: 5, game_id: "dummy")))
54+
end
4955
end

0 commit comments

Comments
 (0)