Current section
4 Versions
Jump to
Current section
4 Versions
Compare versions
8
files changed
+202
additions
-10
deletions
| @@ -11,10 +11,14 @@ | |
| 11 11 | <<"lib/atproto/bsky/schemas">>,<<"lib/atproto/bsky/schemas/post_view.ex">>, |
| 12 12 | <<"lib/atproto/bsky/schemas/profile_viewer_state.ex">>, |
| 13 13 | <<"lib/atproto/bsky/schemas/profile_view_detailed.ex">>, |
| 14 | + <<"lib/atproto/bsky/schemas/follows.ex">>, |
| 14 15 | <<"lib/atproto/bsky/schemas/feed.ex">>, |
| 15 16 | <<"lib/atproto/bsky/schemas/profile_view_basic.ex">>, |
| 16 17 | <<"lib/atproto/bsky/schemas/feed_view_post.ex">>, |
| 18 | + <<"lib/atproto/bsky/schemas/followers.ex">>, |
| 17 19 | <<"lib/atproto/bsky/schemas/reply.ex">>, |
| 20 | + <<"lib/atproto/bsky/schemas/profile_view.ex">>, |
| 21 | + <<"lib/atproto/bsky/schemas/mutes.ex">>, |
| 18 22 | <<"lib/atproto/bsky/schemas/feed_viewer_state.ex">>, |
| 19 23 | <<"lib/atproto/bsky/rich_text.ex">>,<<"lib/atproto.ex">>,<<"mix.exs">>, |
| 20 24 | <<"README.md">>,<<"LICENSE">>]}. |
| @@ -32,4 +36,4 @@ | |
| 32 36 | {<<"optional">>,false}, |
| 33 37 | {<<"repository">>,<<"hexpm">>}, |
| 34 38 | {<<"requirement">>,<<"~> 0.1.0">>}]]}. |
| 35 | - {<<"version">>,<<"0.1.1">>}. |
| 39 | + {<<"version">>,<<"0.1.2">>}. |
| @@ -5,15 +5,27 @@ defmodule ATProto.BSky do | |
| 5 5 | |
| 6 6 | # app.bsky.feed (https://atproto.com/lexicons/app-bsky-feed) |
| 7 7 | |
| 8 | - def get_timeline(client) do |
| 9 | - XRPC.query(client, "app.bsky.feed.getTimeline") |
| 8 | + @doc """ |
| 9 | + A view of the user's home timeline. |
| 10 | + """ |
| 11 | + def get_timeline(client, params \\ []) do |
| 12 | + case XRPC.query(client, "app.bsky.feed.getTimeline", params: params) do |
| 13 | + {:ok, body} -> ATProto.BSky.Feed.new(body) |
| 14 | + result -> result |
| 15 | + end |
| 10 16 | end |
| 11 17 | |
| 18 | + @doc """ |
| 19 | + Wrapper around `ATProto.create_record` to create a BSky post |
| 20 | + """ |
| 12 21 | def create_post(client, repo, record) do |
| 13 22 | record = Keyword.put_new(record, :"$type", "app.bsky.feed.post") |
| 14 23 | ATProto.create_record(client, repo, "app.bsky.feed.post", record) |
| 15 24 | end |
| 16 25 | |
| 26 | + @doc """ |
| 27 | + A view of an actor's feed. |
| 28 | + """ |
| 17 29 | def get_author_feed(client, actor, params \\ []) do |
| 18 30 | params = [actor: actor] |> Keyword.merge(params) |
| 19 31 | |
| @@ -23,6 +35,15 @@ defmodule ATProto.BSky do | |
| 23 35 | end |
| 24 36 | end |
| 25 37 | |
| 38 | + @doc """ |
| 39 | + A view of an actor's feed. |
| 40 | + """ |
| 41 | + def get_posts(client, uris) do |
| 42 | + params = [uris: uris] |
| 43 | + |
| 44 | + XRPC.query(client, "app.bsky.feed.getPosts", params: params) |
| 45 | + end |
| 46 | + |
| 26 47 | # app.bsky.actor (https://atproto.com/lexicons/app-bsky-actor) |
| 27 48 | |
| 28 49 | def get_profile(client, actor) do |
| @@ -36,9 +57,55 @@ defmodule ATProto.BSky do | |
| 36 57 | |
| 37 58 | # app.bsky.graph (https://atproto.com/lexicons/app-bsky-graph) |
| 38 59 | |
| 39 | - def get_followers(client, actor) do |
| 40 | - params = [actor: actor] |
| 41 | - XRPC.query(client, "app.bsky.graph.getFollowers", params: params) |
| 60 | + @doc """ |
| 61 | + Who is following an actor? |
| 62 | + """ |
| 63 | + |
| 64 | + def get_followers(client, actor, params \\ []) do |
| 65 | + params = [actor: actor] |> Keyword.merge(params) |
| 66 | + |
| 67 | + case XRPC.query(client, "app.bsky.graph.getFollowers", params: params) do |
| 68 | + {:ok, body} -> ATProto.BSky.Followers.new(body) |
| 69 | + result -> result |
| 70 | + end |
| 71 | + end |
| 72 | + |
| 73 | + @doc """ |
| 74 | + Who is an actor following? |
| 75 | + """ |
| 76 | + def get_follows(client, actor, params \\ []) do |
| 77 | + params = [actor: actor] |> Keyword.merge(params) |
| 78 | + |
| 79 | + case XRPC.query(client, "app.bsky.graph.getFollows", params: params) do |
| 80 | + {:ok, body} -> ATProto.BSky.Follows.new(body) |
| 81 | + result -> result |
| 82 | + end |
| 83 | + end |
| 84 | + |
| 85 | + @doc """ |
| 86 | + Who does the viewer mute? |
| 87 | + """ |
| 88 | + def get_mutes(client, params \\ []) do |
| 89 | + case XRPC.query(client, "app.bsky.graph.getMutes", params: params) do |
| 90 | + {:ok, body} -> ATProto.BSky.Mutes.new(body) |
| 91 | + result -> result |
| 92 | + end |
| 93 | + end |
| 94 | + |
| 95 | + @doc """ |
| 96 | + Mute an actor by did or handle. |
| 97 | + """ |
| 98 | + def mute_actor(client, actor) do |
| 99 | + body = %{actor: actor} |> Jason.encode!() |
| 100 | + XRPC.procedure(client, "app.bsky.graph.muteActor", body: body) |
| 101 | + end |
| 102 | + |
| 103 | + @doc """ |
| 104 | + Unmute an actor by did or handle. |
| 105 | + """ |
| 106 | + def unmute_actor(client, actor) do |
| 107 | + body = %{actor: actor} |> Jason.encode!() |
| 108 | + XRPC.procedure(client, "app.bsky.graph.unmuteActor", body: body) |
| 42 109 | end |
| 43 110 | |
| 44 111 | # app.bsky.unspecced |
| @@ -47,6 +114,9 @@ defmodule ATProto.BSky do | |
| 47 114 | An unspecced view of globally popular items. |
| 48 115 | """ |
| 49 116 | def get_popular(client, params \\ []) do |
| 50 | - XRPC.query(client, "app.bsky.unspecced.getPopular", params: params) |
| 117 | + case XRPC.query(client, "app.bsky.unspecced.getPopular", params: params) do |
| 118 | + {:ok, body} -> ATProto.BSky.Feed.new(body) |
| 119 | + result -> result |
| 120 | + end |
| 51 121 | end |
| 52 122 | end |
| @@ -17,8 +17,6 @@ defmodule ATProto.BSky.Feed do | |
| 17 17 | end |
| 18 18 | |
| 19 19 | def new(params) do |
| 20 | - IO.inspect(params) |
| 21 | - |
| 22 20 | case changeset(params) do |
| 23 21 | %Ecto.Changeset{valid?: false} = changeset -> |
| 24 22 | {:error, changeset} |
| @@ -0,0 +1,30 @@ | |
| 1 | + defmodule ATProto.BSky.Followers do |
| 2 | + use Ecto.Schema |
| 3 | + import Ecto.Changeset |
| 4 | + |
| 5 | + @primary_key false |
| 6 | + embedded_schema do |
| 7 | + field :cursor, :string |
| 8 | + embeds_one :subject, ATProto.BSky.ProfileView |
| 9 | + embeds_many :followers, ATProto.BSky.ProfileView |
| 10 | + end |
| 11 | + |
| 12 | + def changeset(attrs), do: changeset(%__MODULE__{}, attrs) |
| 13 | + |
| 14 | + def changeset(schema, attrs) do |
| 15 | + schema |
| 16 | + |> cast(attrs, [:cursor]) |
| 17 | + |> cast_embed(:subject, required: true) |
| 18 | + |> cast_embed(:followers, required: true) |
| 19 | + end |
| 20 | + |
| 21 | + def new(params) do |
| 22 | + case changeset(params) do |
| 23 | + %Ecto.Changeset{valid?: false} = changeset -> |
| 24 | + {:error, changeset} |
| 25 | + |
| 26 | + %Ecto.Changeset{valid?: true} = changeset -> |
| 27 | + {:ok, apply_changes(changeset)} |
| 28 | + end |
| 29 | + end |
| 30 | + end |
| @@ -0,0 +1,30 @@ | |
| 1 | + defmodule ATProto.BSky.Follows do |
| 2 | + use Ecto.Schema |
| 3 | + import Ecto.Changeset |
| 4 | + |
| 5 | + @primary_key false |
| 6 | + embedded_schema do |
| 7 | + field :cursor, :string |
| 8 | + embeds_one :subject, ATProto.BSky.ProfileView |
| 9 | + embeds_many :follows, ATProto.BSky.ProfileView |
| 10 | + end |
| 11 | + |
| 12 | + def changeset(attrs), do: changeset(%__MODULE__{}, attrs) |
| 13 | + |
| 14 | + def changeset(schema, attrs) do |
| 15 | + schema |
| 16 | + |> cast(attrs, [:cursor]) |
| 17 | + |> cast_embed(:subject, required: true) |
| 18 | + |> cast_embed(:follows, required: true) |
| 19 | + end |
| 20 | + |
| 21 | + def new(params) do |
| 22 | + case changeset(params) do |
| 23 | + %Ecto.Changeset{valid?: false} = changeset -> |
| 24 | + {:error, changeset} |
| 25 | + |
| 26 | + %Ecto.Changeset{valid?: true} = changeset -> |
| 27 | + {:ok, apply_changes(changeset)} |
| 28 | + end |
| 29 | + end |
| 30 | + end |
Loading more files…