class EurekaBot::Tg::Client

Attributes

token[R]
url[R]

Public Class Methods

new(token:, url: 'https://api.telegram.org') click to toggle source
# File lib/eureka_bot/tg/client.rb, line 8
def initialize(token:, url: 'https://api.telegram.org')
  @url   = url
  @token = token
end

Public Instance Methods

extract_result(response) click to toggle source
# File lib/eureka_bot/tg/client.rb, line 22
def extract_result(response)
  if response['ok']
    response['result']
  else
    raise EurekaBot::Tg::Client::Error.new(error_code: response['error_code'], description: response['description'])
  end
end
get_file_url(file_id) click to toggle source
# File lib/eureka_bot/tg/client.rb, line 13
def get_file_url(file_id)
  file_path = make_request('getFile', payload: {file_id: file_id}.to_json)['file_path']
  [url, '/file', '/bot', token, '/', file_path].join
end
make_request(route, method: :get, **rest) click to toggle source
# File lib/eureka_bot/tg/client.rb, line 30
def make_request(route, method: :get, **rest)
  full_route = Array.wrap(route).join('/')
  instrument 'eureka-bot.tg.request', route: full_route, method: method, rest: JSON.generate(rest) do
    res = resource[full_route]

    options = rest.clone
    payload = options.delete(:payload)
    headers = (res.options[:headers] || {}).merge(options)

    request = options.merge(
        method:  method,
        url:     res.url,
        headers: headers
    )

    request[:payload] = payload if payload

    if request[:payload].is_a?(Hash)
      request[:headers].delete('Content-Type')
      request[:multipart] = true
    end

    response = nil

    begin
      response = parse_response(
          RestClient::Request.execute(request).body
      )
    rescue RestClient::Exception => e
      EurekaBot.exception_handler(e, e.class, custom_params: {error: e, http_code: e.http_code, http_body: e.http_body}.to_json)
      response = parse_response(e.http_body)
    end

    if response
      instrument 'eureka-bot.tg.response', response: response
      extract_result(response)
    end
  end
end
parse_response(response) click to toggle source
# File lib/eureka_bot/tg/client.rb, line 18
def parse_response(response)
  ActiveSupport::JSON.decode(response) if response.present?
end
resource() click to toggle source
# File lib/eureka_bot/tg/client.rb, line 70
def resource
  @resource ||= RestClient::Resource.new(
      [
          url,
          ['bot', token].join
      ].to_param,
      headers: {
          'Content-Type' => 'application/JSON'
      },
      logger:  EurekaBot.logger,
      timeout: 30
  )
end