Current section
Files
Jump to
Current section
Files
lib/hunter/application.ex
defmodule Hunter.Application do
@moduledoc """
Application entity
This module defines a `Hunter.Application` struct and the main functions
for working with Applications.
## Fields
* `id` - identifier
* `client_id` - client id
* `client_secret` - client secret
"""
@hunter_api Hunter.Config.hunter_api
@type t :: %__MODULE__{
id: non_neg_integer,
client_id: String.t,
client_secret: String.t
}
@derive [Poison.Encoder]
defstruct [:id, :client_id, :client_secret]
@doc """
Register a new OAuth client app on the target instance
## Parameters
* `name` - name of your application
* `redirect_uri` - where the user should be redirected after authorization,
default: `urn:ietf:wg:oauth:2.0:oob` (no redirect)
* `scopes` - scope list, see the scope section for more details,
default: `read`
* `website` - URL to the homepage of your app, default: `nil`
* `options` - option list
## Scopes
* `read` - read data
* `write` - post statuses and upload media for statuses
* `follow` - follow, unfollow, block, unblock
Multiple scopes can be requested during the authorization phase with the
`scope` query param
## Options
* `save?` - persists your application information to a file, so, you can use
them later. default: `false`
* `api_base_url` - specifies if you want to register an application on a
different instance. default: `https://mastodon.social`
"""
@spec create_app(String.t, URI.t, [String.t], String.t, Keyword.t) :: Hunter.Application.t
def create_app(name, redirect_uri \\ "urn:ietf:wg:oauth:2.0:oob", scopes \\ ["read"], website \\ nil, options \\ []) do
save? = Keyword.get(options, :save?, false)
base_url = Keyword.get(options, :api_base_url, "https://mastodon.social")
app = @hunter_api.create_app(name, redirect_uri, scopes, website, base_url)
if save?, do: save_credentials(name, app)
app
end
@doc """
Load persisted application's credentials
## Parameters
* `name` - application name
"""
@spec load_credentials(String.t) :: Hunter.Application.t
def load_credentials(name) do
"~/.hunter/apps/#{name}.json"
|> Path.expand()
|> File.read!()
|> Poison.decode!(as: %Hunter.Application{})
end
defp save_credentials(name, app) do
home = Path.expand("~/.hunter/apps")
unless File.exists?(home), do: File.mkdir_p!(home)
File.write!("#{home}/#{name}.json", Poison.encode!(app))
end
end