Packages

Implementation of the ATProtocol client spec in Elixir.

Current section

4 Versions

Jump to

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…