relay: add relay follow/unfollow tasks
authorWilliam Pitcock <nenolod@dereferenced.org>
Mon, 6 Aug 2018 07:14:16 +0000 (07:14 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Mon, 6 Aug 2018 08:22:12 +0000 (08:22 +0000)
lib/mix/tasks/relay_follow.ex [new file with mode: 0644]
lib/mix/tasks/relay_unfollow.ex [new file with mode: 0644]
lib/pleroma/web/activity_pub/relay.ex

diff --git a/lib/mix/tasks/relay_follow.ex b/lib/mix/tasks/relay_follow.ex
new file mode 100644 (file)
index 0000000..a8152d9
--- /dev/null
@@ -0,0 +1,12 @@
+defmodule Mix.Tasks.RelayFollow do
+  use Mix.Task
+  require Logger
+  alias Pleroma.Web.ActivityPub.Relay
+
+  @shortdoc "Follows a remote relay"
+  def run([target]) do
+    Mix.Task.run("app.start")
+
+    :ok = Relay.follow(target)
+  end
+end
diff --git a/lib/mix/tasks/relay_unfollow.ex b/lib/mix/tasks/relay_unfollow.ex
new file mode 100644 (file)
index 0000000..81b7197
--- /dev/null
@@ -0,0 +1,12 @@
+defmodule Mix.Tasks.RelayUnfollow do
+  use Mix.Task
+  require Logger
+  alias Pleroma.Web.ActivityPub.Relay
+
+  @shortdoc "Follows a remote relay"
+  def run([target]) do
+    Mix.Task.run("app.start")
+
+    :ok = Relay.unfollow(target)
+  end
+end
index 736d0e406b8cb3f7a8c29ba5b1b9e28d03ccb07c..8b49188fbee76b29f744b3b92d2aa2beb1cb2ec1 100644 (file)
@@ -1,7 +1,35 @@
 defmodule Pleroma.Web.ActivityPub.Relay do
   alias Pleroma.User
+  alias Pleroma.Web.ActivityPub.ActivityPub
+  require Logger
 
   def get_actor do
     User.get_or_create_instance_user()
   end
+
+  def follow(target_instance) do
+    with %User{} = local_user <- get_actor(),
+         %User{} = target_user <- User.get_or_fetch_by_ap_id(target_instance),
+         {:ok, activity} <- ActivityPub.follow(local_user, target_user) do
+      ActivityPub.publish(local_user, activity)
+      Logger.info("relay: followed instance: #{target_instance}; id=#{activity.data["id"]}")
+    else
+      e -> Logger.error("error: #{inspect(e)}")
+    end
+
+    :ok
+  end
+
+  def unfollow(target_instance) do
+    with %User{} = local_user <- get_actor(),
+         %User{} = target_user <- User.get_or_fetch_by_ap_id(target_instance),
+         {:ok, activity} <- ActivityPub.unfollow(local_user, target_user) do
+      ActivityPub.publish(local_user, activity)
+      Logger.info("relay: unfollowed instance: #{target_instance}: id=#{activity.data["id"]}")
+    else
+      e -> Logger.error("error: #{inspect(e)}")
+    end
+
+    :ok
+  end
 end