# frozen_string_literal: true module Slack module SocketMode class Handler InvalidPayloadTypeError = Class.new(StandardError) VALID_PAYLOAD_TYPES = %i[disconnect events_api interactive].freeze class << self def process(parsed_payload) payload_type = parsed_payload[:type]&.to_sym if VALID_PAYLOAD_TYPES.include?(payload_type) send(payload_type, parsed_payload) else # Log this, but don't raise an error that breaks the connection logger.warn("Unrecognized payload", payload: parsed_payload) end end private def disconnect(parsed_payload) logger.info("Disconnect message", payload: parsed_payload) # Handle any disconnect steps you wish to take here. # See https://api.slack.com/apis/socket-mode#disconnect end def events_api(parsed_payload) logger.debug("Events API parsed_payload", payload: parsed_payload) # Handle any registered event API events here. # See https://api.slack.com/apis/events-api rescue => error # Log this, but don't raise an error that breaks the connection logger.warn("events_api message handling error", { payload: parsed_payload }, error) end def interactive(parsed_payload) logger.debug("Interactive message", payload: parsed_payload) # Handle any registered interactive events here. # See https://api.slack.com/reference/interaction-payloads rescue => error # Log this, but don't raise an error that breaks the connection logger.warn("interactive message handling error", { payload: parsed_payload }, error) end end end end end