class Zulip::Client

Constants

DEFAULT_OPEN_TIMEOUT
DEFAULT_TIMEOUT
VERSION

Attributes

debug[RW]

Public Class Methods

new(site:, username:, api_key:, **options) { |faraday| ... } click to toggle source
# File lib/zulip/client.rb, line 18
def initialize(site:, username:, api_key:, **options)
  @site = URI.parse(site)
  @connection = Faraday.new(@site.to_s, options) do |faraday|
    faraday.adapter Faraday.default_adapter
    faraday.options[:open_timeout] ||= DEFAULT_OPEN_TIMEOUT
    faraday.options[:timeout] ||= DEFAULT_TIMEOUT
    yield faraday if block_given?
  end
  @connection.basic_auth(username, api_key)
  @running = false
  @debug = false
end

Public Instance Methods

close_stream() click to toggle source
# File lib/zulip/client.rb, line 128
def close_stream
  @running = false
end
register(event_types: [], narrow: []) click to toggle source
# File lib/zulip/client.rb, line 55
def register(event_types: [], narrow: [])
  response = @connection.post do |request|
    request.url("/api/v1/register")
    params = {}
    params["event_types"] = JSON.generate(event_types) unless event_types.empty?
    params["narrow"] = JSON.generate(narrow) unless narrow.empty?
    request.body = params
  end
  if response.success?
    res = JSON.parse(response.body, symbolize_names: true)
    [res[:queue_id], res[:last_event_id]]
  else
    raise Zulip::ResponseError, reqponse.reason_phrase
  end
end
send_message(type: :stream, to: "general", subject: "", content: "") click to toggle source
# File lib/zulip/client.rb, line 31
def send_message(type: :stream, to: "general", subject: "", content: "")
  @connection.post do |request|
    request.url("/api/v1/messages")
    params = { "type" => type.to_s }
    case type
    when :private
      params["to"] = JSON.generate(Array(to))
    when :stream
      params["to"] = to
      params["subject"] = subject
    end
    params["content"] = content
    request.body = params
  end
end
send_private_message(to:, content:) click to toggle source
# File lib/zulip/client.rb, line 51
def send_private_message(to:, content:)
  send_message(type: :private, to: to, content: content)
end
send_public_message(to:, subject:, content:) click to toggle source
# File lib/zulip/client.rb, line 47
def send_public_message(to:, subject:, content:)
  send_message(type: :stream, to: to, subject: subject, content: content)
end
stream_event(event_types: [], narrow: []) { |event| ... } click to toggle source
# File lib/zulip/client.rb, line 87
def stream_event(event_types: [], narrow: [])
  @running = true
  queue_id, last_event_id = register(event_types: event_types, narrow: narrow)
  loop do
    break unless @running

    response = @connection.get do |request|
      request.url("/api/v1/events")
      request.params["queue_id"] = queue_id
      request.params["last_event_id"] = last_event_id
    end

    if response.success?
      res = JSON.parse(response.body, symbolize_names: true)
      raise Zulip::ResponseError, res[:msg] unless res[:result] == "success"
      res[:events].each do |event|
        last_event_id = event[:id]
        if event_types.empty? || event_types.include?(event[:type])
          yield event
        end
      end
    else
      case response.status
      when 400..499
        raise Zulip::ResponseError, response.reason_phrase
      when 500..599
        puts "Retrying..."
        sleep 1
      end
    end
  end
ensure
  unregister(queue_id)
end
stream_message(narrow: []) { |event| ... } click to toggle source
# File lib/zulip/client.rb, line 122
def stream_message(narrow: [])
  stream_event(event_types: ["message"], narrow: narrow) do |event|
    yield event[:message]
  end
end
unregister(queue_id) click to toggle source
# File lib/zulip/client.rb, line 71
def unregister(queue_id)
  response = @connection.delete do |request|
    request.url("/api/v1/events")
    request.body = { "queue_id" => queue_id }
  end
  case
  when response.success?
    JSON.parse(response.body, symbolize_names: true)[:result] == "success"
  when (400..499).include?(response.status)
    res = JSON.parse(response.body, symbolize_names: true)
    raise Zulip::ResponseError, res[:msg]
  else
    raise Zulip::ResponseError, response.reason_phrase
  end
end