Class: TDL::ChallengeSession

Inherits:
Object
  • Object
show all
Defined in:
lib/tdl/runner/challenge_session.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(runner) ⇒ ChallengeSession

Returns a new instance of ChallengeSession.



14
15
16
# File 'lib/tdl/runner/challenge_session.rb', line 14

def initialize(runner)
  @runner = runner
end

Class Method Details

.for_runner(runner) ⇒ Object



10
11
12
# File 'lib/tdl/runner/challenge_session.rb', line 10

def self.for_runner(runner)
  ChallengeSession.new(runner)
end

Instance Method Details

#check_status_of_challengeObject



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/tdl/runner/challenge_session.rb', line 65

def check_status_of_challenge
  @audit_stream = @config.get_audit_stream

  journey_progress = @challenge_server_client.get_journey_progress
  @audit_stream.write_line(journey_progress)

  available_actions = @challenge_server_client.get_available_actions
  @audit_stream.write_line(available_actions)

  not(available_actions.include?('No actions available.'))
end

#execute_action(user_input) ⇒ Object



87
88
89
90
91
92
93
94
95
96
# File 'lib/tdl/runner/challenge_session.rb', line 87

def execute_action(user_input)
  action_feedback = @challenge_server_client.send_action user_input
  if action_feedback.include?('Round time for')
    last_fetched_round = RoundManagement.get_last_fetched_round(@config.get_working_directory)
    @recording_system.notify_event(last_fetched_round, RecordingEvent::ROUND_COMPLETED)
  end

  @audit_stream.write_line action_feedback
  @challenge_server_client.get_round_description
end

#execute_user_action(user_input) ⇒ Object



77
78
79
80
81
82
83
84
85
# File 'lib/tdl/runner/challenge_session.rb', line 77

def execute_user_action(user_input)
  if user_input == 'deploy'
      @runner.run
      last_fetched_round = RoundManagement.get_last_fetched_round(@config.get_working_directory)
      @recording_system.notify_event(last_fetched_round, RecordingEvent::ROUND_SOLUTION_DEPLOY)
  end

  execute_action user_input
end

#run_appObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/tdl/runner/challenge_session.rb', line 41

def run_app
  @challenge_server_client = ChallengeServerClient.new(
    @config.get_hostname,
    @config.get_port,
    @config.get_journey_id,
    @config.get_use_colours)
  
  begin
    should_continue = check_status_of_challenge
    if should_continue
      user_input = @user_input_callback.call
      @audit_stream.write_line "Selected action is: #{user_input}"
      round_description = execute_user_action(user_input)
      RoundManagement.save_description(@recording_system, round_description, @audit_stream, @config.get_working_directory)
    end
  rescue ChallengeServerClient::ClientErrorException => e
    @audit_stream.write_line e.message
  rescue ChallengeServerClient::ServerErrorException => e
    @audit_stream.write_line 'Server experienced an error. Try again in a few minutes.'
  rescue ChallengeServerClient::OtherCommunicationException => e
    @audit_stream.write_line 'Client threw an unexpected error. Try again.'
  end
end

#startObject



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/tdl/runner/challenge_session.rb', line 29

def start
  @recording_system = RecordingSystem.new(@config.get_recording_system_should_be_on)
  
  unless @recording_system.is_recording_system_ok
    @audit_stream.write_line 'Please run `record_screen_and_upload` before continuing.'
    return
  end

  @audit_stream.write_line "Connecting to #{@config.get_hostname}"
  run_app
end

#with_action_provider(callback) ⇒ Object



24
25
26
27
# File 'lib/tdl/runner/challenge_session.rb', line 24

def with_action_provider(callback)
  @user_input_callback = callback
  self
end

#with_config(config) ⇒ Object



18
19
20
21
22
# File 'lib/tdl/runner/challenge_session.rb', line 18

def with_config(config)
  @config = config
  @audit_stream = config.get_audit_stream
  self
end