diff options
Diffstat (limited to 'lib/pleroma/web/streamer.ex')
-rw-r--r-- | lib/pleroma/web/streamer.ex | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/lib/pleroma/web/streamer.ex b/lib/pleroma/web/streamer.ex index 3b2938676..9f1080015 100644 --- a/lib/pleroma/web/streamer.ex +++ b/lib/pleroma/web/streamer.ex @@ -2,6 +2,7 @@ defmodule Pleroma.Web.Streamer do use GenServer require Logger import Plug.Conn + alias Pleroma.{User, Notification} def start_link do spawn(fn -> @@ -37,9 +38,7 @@ defmodule Pleroma.Web.Streamer do {:noreply, topics} end - def handle_cast(%{action: :stream, topic: topic, item: item}, topics) do - Logger.debug("Trying to push to #{topic}") - Logger.debug("Pushing item to #{topic}") + def push_to_socket(topics, topic, item) do Enum.each(topics[topic] || [], fn (socket) -> json = %{ event: "update", @@ -48,10 +47,46 @@ defmodule Pleroma.Web.Streamer do send socket.transport_pid, {:text, json} end) + end + + def handle_cast(%{action: :stream, topic: "user", item: %Notification{} = item}, topics) do + topic = "user:#{item.user_id}" + Enum.each(topics[topic] || [], fn (socket) -> + json = %{ + event: "notification", + payload: Pleroma.Web.MastodonAPI.MastodonAPIController.render_notification(socket.assigns["user"], item) |> Poison.encode! + } |> Poison.encode! + + send socket.transport_pid, {:text, json} + end) + {:noreply, topics} + end + + def handle_cast(%{action: :stream, topic: "user", item: item}, topics) do + Logger.debug("Trying to push to users") + recipient_topics = User.get_recipients_from_activity(item) + |> Enum.map(fn (%{id: id}) -> "user:#{id}" end) + + Enum.each(recipient_topics, fn (topic) -> + push_to_socket(topics, topic, item) + end) + {:noreply, topics} + end + + def handle_cast(%{action: :stream, topic: topic, item: item}, topics) do + Logger.debug("Trying to push to #{topic}") + Logger.debug("Pushing item to #{topic}") + push_to_socket(topics, topic, item) {:noreply, topics} end + defp internal_topic("user", socket) do + "user:#{socket.assigns[:user].id}" + end + defp internal_topic(topic, socket), do: topic + def handle_cast(%{action: :add, topic: topic, socket: socket}, sockets) do + topic = internal_topic(topic, socket) sockets_for_topic = sockets[topic] || [] sockets_for_topic = Enum.uniq([socket | sockets_for_topic]) sockets = Map.put(sockets, topic, sockets_for_topic) @@ -61,6 +96,7 @@ defmodule Pleroma.Web.Streamer do end def handle_cast(%{action: :remove, topic: topic, socket: socket}, sockets) do + topic = internal_topic(topic, socket) sockets_for_topic = sockets[topic] || [] sockets_for_topic = List.delete(sockets_for_topic, socket) sockets = Map.put(sockets, topic, sockets_for_topic) |