module Socrates::Core::State
Attributes
adapter[R]
data[R]
session[R]
user[R]
Public Class Methods
new(adapter:, session:, data: StateData.new)
click to toggle source
# File lib/socrates/core/state.rb, line 14 def initialize(adapter:, session:, data: StateData.new) @data = data @adapter = adapter @session = session @user = session.user @next_state_id = nil @next_state_action = nil @logger = Socrates.config.logger || Socrates::Logger.default end
Public Instance Methods
ask()
click to toggle source
# File lib/socrates/core/state.rb, line 90 def ask # stub implementation, to be overwritten. end
end_conversation()
click to toggle source
# File lib/socrates/core/state.rb, line 84 def end_conversation @data.clear transition_to StateData::END_OF_CONVERSATION, action: StateData::END_OF_CONVERSATION end
listen(_message)
click to toggle source
# File lib/socrates/core/state.rb, line 94 def listen(_message) # stub implementation, to be overwritten. end
next_state_action()
click to toggle source
# File lib/socrates/core/state.rb, line 32 def next_state_action if @next_state_action.nil? next_action(@data.state_action) else @next_state_action end end
next_state_id()
click to toggle source
# File lib/socrates/core/state.rb, line 24 def next_state_id if @next_state_id.nil? state_id_from_classname else @next_state_id end end
repeat_action()
click to toggle source
# File lib/socrates/core/state.rb, line 79 def repeat_action @next_state_id = @data.state_id @next_state_action = @data.state_action end
respond(message: nil, template: nil, send_now: false)
click to toggle source
# File lib/socrates/core/state.rb, line 40 def respond(message: nil, template: nil, send_now: false) if template # TODO: Partials? filename = File.join(Socrates.config.view_path, template) source = File.read(filename) message = ERB.new(source, 0, "<>").result(binding) end return if message.empty? @logger.info %Q(#{@session.channel} send: "#{format_for_logging(message)}") @adapter.queue_message(@session, message, send_now: send_now) end
send_message(to:, message:)
click to toggle source
# File lib/socrates/core/state.rb, line 54 def send_message(to:, message:) displayable_to = to.respond_to?(:id) ? to.id : to @logger.info %Q(#{@session.channel} send direct to #{displayable_to}: "#{format_for_logging(message)}") @adapter.queue_direct_message(@session, message, to) end
transition_to(state_id, action: nil, data: {})
click to toggle source
# File lib/socrates/core/state.rb, line 61 def transition_to(state_id, action: nil, data: {}) if action.nil? action = if state_id.nil? nil elsif state_id == state_id_from_classname next_action(@data.state_action) else :ask end end @next_state_id = state_id @next_state_action = action @data.merge(data) end
Private Instance Methods
format_for_logging(message)
click to toggle source
# File lib/socrates/core/state.rb, line 104 def format_for_logging(message) message.gsub("\n", "\\n") end
next_action(current_action)
click to toggle source
# File lib/socrates/core/state.rb, line 100 def next_action(current_action) (%i[ask listen] - [current_action]).first end
state_id_from_classname()
click to toggle source
# File lib/socrates/core/state.rb, line 108 def state_id_from_classname StringHelpers.classname_to_underscore(self.class.to_s.split("::").last).to_sym end