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