sloanelybutsurely.com/lib/core/syndication/bluesky_client.ex

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