Packages
extwitter
0.6.2
0.14.0
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.0
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.1
0.2.0
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Twitter client library for Elixir.
Current section
Files
Jump to
Current section
Files
lib/extwitter/api/base.ex
defmodule ExTwitter.API.Base do
@moduledoc """
Provides basic and common functionalities for Twitter API.
"""
# https://dev.twitter.com/overview/api/response-codes
@error_code_rate_limit_exceeded 88
@doc """
Send request to the api.twitter.com server.
"""
def request(method, path, params \\ []) do
do_request(method, request_url(path), params)
end
@doc """
Send request to the upload.twitter.com server.
"""
def upload_request(method, path, params \\ []) do
do_request(method, upload_url(path), params)
end
defp do_request(method, url, params) do
oauth = ExTwitter.Config.get_tuples |> verify_params
consumer = {oauth[:consumer_key], oauth[:consumer_secret], :hmac_sha1}
ExTwitter.OAuth.request(method, url, params, consumer, oauth[:access_token], oauth[:access_token_secret])
|> parse_result
end
def verify_params([]) do
raise %ExTwitter.Error{
message: "OAuth parameters are not set. Use ExTwitter.configure function to set parameters in advance." }
end
def verify_params(params), do: params
def get_id_option(id) do
cond do
is_number(id) ->
[user_id: id]
true ->
[screen_name: id]
end
end
def request_url(path) do
"https://api.twitter.com/#{path}" |> to_char_list
end
defp upload_url(path) do
"https://upload.twitter.com/#{path}" |> to_char_list
end
def parse_result(result) do
{:ok, {_response, header, body}} = result
verify_response(ExTwitter.JSON.decode!(body), header)
end
defp verify_response(body, header) do
if is_list(body) do
body
else
case Map.get(body, :errors, nil) || Map.get(body, :error, nil) do
nil ->
body
errors when is_list(errors) ->
parse_error(List.first(errors), header)
error ->
raise(ExTwitter.Error, message: inspect error)
end
end
end
defp parse_error(error, header) do
%{:code => code, :message => message} = error
case code do
@error_code_rate_limit_exceeded ->
reset_at = fetch_rate_limit_reset(header)
reset_in = Enum.max([reset_at - Timex.Date.now(:secs), 0])
raise ExTwitter.RateLimitExceededError,
code: code, message: message, reset_at: reset_at, reset_in: reset_in
_ ->
raise ExTwitter.Error, code: code, message: message
end
end
defp fetch_rate_limit_reset(header) do
{_, reset_at_in_string} = List.keyfind(header, 'x-rate-limit-reset', 0)
{reset_at, _} = Integer.parse(to_string(reset_at_in_string))
reset_at
end
end