class TelegramWorkflow::Workflow

Attributes

client[R]
params[R]

Public Class Methods

new(raw_params) click to toggle source
# File lib/telegram_workflow/workflow.rb, line 4
def initialize(raw_params)
  @params  = TelegramWorkflow::Params.new(raw_params)
  @session = TelegramWorkflow::Session.new(@params)
  @logger = TelegramWorkflow.config.logger

  if @params.start?
    set_current_action(TelegramWorkflow.config.start_action)
  end

  chat_id = @session.read(:chat_id) || @session.write(:chat_id, @params.chat_id)
  @client = TelegramWorkflow.config.client.new(chat_id)
end

Public Instance Methods

process() click to toggle source
# File lib/telegram_workflow/workflow.rb, line 17
def process
  # run the shared step
  shared_step_result = current_action.shared

  if shared_step_result == :__continue
    log_request
    current_action.public_send(current_step) # setup callbacks
    current_action.__run_on_message # run a callback
  else
    @logger.info "[TelegramWorkflow] Processing by shared handler"
  end

  while @redirect_to
    do_redirect
  end

  @session.dump

  @client.inline_request
end
redirect_to(action_or_step, session_params = nil) click to toggle source
# File lib/telegram_workflow/workflow.rb, line 38
def redirect_to(action_or_step, session_params = nil)
  raise TelegramWorkflow::Errors::DoubleRedirect if @redirect_to
  raise TelegramWorkflow::Errors::SharedRedirect if action_or_step == :shared
  raise TelegramWorkflow::Errors::StartRedirect  if action_or_step == TelegramWorkflow.config.start_action

  @redirect_to = action_or_step
  @session_params = session_params
end

Private Instance Methods

current_action() click to toggle source
# File lib/telegram_workflow/workflow.rb, line 57
def current_action
  @current_action ||= begin
    action_class = if action = @session.read(:current_action)
      Object.const_get(action)
    else
      TelegramWorkflow.config.start_action
    end

    action_class.new(self, @session.user_session, @session.flash)
  end
end
current_step() click to toggle source
# File lib/telegram_workflow/workflow.rb, line 77
def current_step
  @session.read(:current_step) || :initial
end
do_redirect() click to toggle source
# File lib/telegram_workflow/workflow.rb, line 85
def do_redirect
  action_or_step = @redirect_to
  session_params = @session_params
  @redirect_to = @session_params = nil

  # reset on_message and on_redirect callbacks
  current_action.__reset_callbacks

  if action_or_step.is_a?(Class)
    set_current_action(action_or_step)
  else
    set_current_step(action_or_step)
  end

  if session_params
    @session.flash.merge!(session_params)
  end

  current_action.public_send(current_step) # setup callbacks
  current_action.__run_on_redirect # run a callback
end
log_request() click to toggle source
# File lib/telegram_workflow/workflow.rb, line 49
def log_request
  @logger.info "[TelegramWorkflow] Processing by #{current_action.class.name}##{current_step}"

  if TelegramWorkflow.config.webhook_url.nil?
    @logger.info "[TelegramWorkflow] Parameters: #{@params.to_h}"
  end
end
set_current_action(action_class) click to toggle source
# File lib/telegram_workflow/workflow.rb, line 69
def set_current_action(action_class)
  @session.write(:current_action, action_class.to_s)
  set_current_step(nil)
  @session.reset_flash

  @current_action = action_class.new(self, @session.user_session, @session.flash)
end
set_current_step(step) click to toggle source
# File lib/telegram_workflow/workflow.rb, line 81
def set_current_step(step)
  @session.write(:current_step, step)
end