logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma

scheduled_activity_worker.ex (1524B)


      1 # Pleroma: A lightweight social networking server
      2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
      3 # SPDX-License-Identifier: AGPL-3.0-only
      4 
      5 defmodule Pleroma.ScheduledActivityWorker do
      6   @moduledoc """
      7   Sends scheduled activities to the job queue.
      8   """
      9 
     10   alias Pleroma.Config
     11   alias Pleroma.ScheduledActivity
     12   alias Pleroma.User
     13   alias Pleroma.Web.CommonAPI
     14   use GenServer
     15   require Logger
     16 
     17   @schedule_interval :timer.minutes(1)
     18 
     19   def start_link(_) do
     20     GenServer.start_link(__MODULE__, nil)
     21   end
     22 
     23   def init(_) do
     24     if Config.get([ScheduledActivity, :enabled]) do
     25       schedule_next()
     26       {:ok, nil}
     27     else
     28       :ignore
     29     end
     30   end
     31 
     32   def perform(:execute, scheduled_activity_id) do
     33     try do
     34       {:ok, scheduled_activity} = ScheduledActivity.delete(scheduled_activity_id)
     35       %User{} = user = User.get_cached_by_id(scheduled_activity.user_id)
     36       {:ok, _result} = CommonAPI.post(user, scheduled_activity.params)
     37     rescue
     38       error ->
     39         Logger.error(
     40           "#{__MODULE__} Couldn't create a status from the scheduled activity: #{inspect(error)}"
     41         )
     42     end
     43   end
     44 
     45   def handle_info(:perform, state) do
     46     ScheduledActivity.due_activities(@schedule_interval)
     47     |> Enum.each(fn scheduled_activity ->
     48       PleromaJobQueue.enqueue(:scheduled_activities, __MODULE__, [:execute, scheduled_activity.id])
     49     end)
     50 
     51     schedule_next()
     52     {:noreply, state}
     53   end
     54 
     55   defp schedule_next do
     56     Process.send_after(self(), :perform, @schedule_interval)
     57   end
     58 end