50 lines
1.2 KiB
Elixir
50 lines
1.2 KiB
Elixir
defmodule Core.Syndication.BlueskyClient do
|
|
@middleware [
|
|
Tesla.Middleware.Logger,
|
|
{Tesla.Middleware.BaseUrl, "https://bsky.social/xrpc"},
|
|
Tesla.Middleware.JSON
|
|
]
|
|
|
|
def new(opts \\ []) do
|
|
middleware = @middleware
|
|
|
|
middleware =
|
|
case Keyword.fetch(opts, :token) do
|
|
{:ok, token} ->
|
|
middleware ++ [{Tesla.Middleware.BearerAuth, token: token}]
|
|
|
|
:error ->
|
|
middleware
|
|
end
|
|
|
|
Tesla.client(middleware)
|
|
end
|
|
|
|
def create_session(identifier, password) do
|
|
client = new()
|
|
|
|
Tesla.post(client, "/com.atproto.server.createSession", %{
|
|
identifier: identifier,
|
|
password: password
|
|
})
|
|
end
|
|
|
|
def refresh_session(%Schema.BlueskyAccount{refresh_jwt: token}) do
|
|
client = new(token: token)
|
|
|
|
Tesla.post(client, "/com.atproto.server.refreshSession", nil)
|
|
end
|
|
|
|
def post_status(%Schema.BlueskyAccount{} = bluesky_account, text) do
|
|
client = new(token: bluesky_account.access_jwt)
|
|
|
|
Tesla.post(client, "/com.atproto.repo.createRecord", %{
|
|
repo: bluesky_account.did,
|
|
collection: "app.bsky.feed.post",
|
|
record: %{
|
|
text: text,
|
|
createdAt: DateTime.utc_now() |> DateTime.to_iso8601()
|
|
}
|
|
})
|
|
end
|
|
end
|