diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/application.ex | 1 | ||||
-rw-r--r-- | lib/pleroma/web/channels/user_socket.ex | 12 | ||||
-rw-r--r-- | lib/pleroma/web/chat_channel.ex | 46 | ||||
-rw-r--r-- | lib/pleroma/web/twitter_api/twitter_api_controller.ex | 3 | ||||
-rw-r--r-- | lib/pleroma/web/twitter_api/views/user_view.ex | 8 |
5 files changed, 66 insertions, 4 deletions
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index bfe16e13a..2969ca3c4 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -20,6 +20,7 @@ defmodule Pleroma.Application do limit: 2500 ]]), worker(Pleroma.Web.Federator, []), + worker(Pleroma.Web.ChatChannel.ChatChannelState, []), ] ++ if Mix.env == :test, do: [], else: [worker(Pleroma.Web.Streamer, [])] diff --git a/lib/pleroma/web/channels/user_socket.ex b/lib/pleroma/web/channels/user_socket.ex index 7aa8e556e..4a9bb8e22 100644 --- a/lib/pleroma/web/channels/user_socket.ex +++ b/lib/pleroma/web/channels/user_socket.ex @@ -1,8 +1,11 @@ defmodule Pleroma.Web.UserSocket do use Phoenix.Socket + alias Pleroma.User + alias Comeonin.Pbkdf2 ## Channels # channel "room:*", Pleroma.Web.RoomChannel + channel "chat:*", Pleroma.Web.ChatChannel ## Transports transport :websocket, Phoenix.Transports.WebSocket @@ -19,8 +22,13 @@ defmodule Pleroma.Web.UserSocket do # # See `Phoenix.Token` documentation for examples in # performing token verification on connect. - def connect(_params, socket) do - {:ok, socket} + def connect(%{"token" => token}, socket) do + with {:ok, user_id} <- Phoenix.Token.verify(socket, "user socket", token, max_age: 84600), + %User{} = user <- Pleroma.Repo.get(User, user_id) do + {:ok, assign(socket, :user_name, user.nickname)} + else + _e -> :error + end end # Socket id's are topics that allow you to identify all sockets for a given user: diff --git a/lib/pleroma/web/chat_channel.ex b/lib/pleroma/web/chat_channel.ex new file mode 100644 index 000000000..268bef17d --- /dev/null +++ b/lib/pleroma/web/chat_channel.ex @@ -0,0 +1,46 @@ +defmodule Pleroma.Web.ChatChannel do + use Phoenix.Channel + alias Pleroma.Web.ChatChannel.ChatChannelState + alias Pleroma.User + + def join("chat:public", _message, socket) do + send(self(), :after_join) + {:ok, socket} + end + + def handle_info(:after_join, socket) do + push socket, "messages", %{messages: ChatChannelState.messages()} + {:noreply, socket} + end + + def handle_in("new_msg", %{"text" => text}, %{assigns: %{user_name: user_name}} = socket) do + author = User.get_cached_by_nickname(user_name) + author = Pleroma.Web.MastodonAPI.AccountView.render("account.json", user: author) + message = ChatChannelState.add_message(%{text: text, author: author}) + + broadcast! socket, "new_msg", message + {:noreply, socket} + end +end + +defmodule Pleroma.Web.ChatChannel.ChatChannelState do + use Agent + @max_messages 20 + + def start_link do + Agent.start_link(fn -> %{max_id: 1, messages: []} end, name: __MODULE__) + end + + def add_message(message) do + Agent.get_and_update(__MODULE__, fn state -> + id = state[:max_id] + 1 + message = Map.put(message, "id", id) + messages = [message | state[:messages]] |> Enum.take(@max_messages) + {message, %{max_id: id, messages: messages}} + end) + end + + def messages() do + Agent.get(__MODULE__, fn state -> state[:messages] |> Enum.reverse end) + end +end diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index 1a706029a..73d96c73d 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -10,7 +10,8 @@ defmodule Pleroma.Web.TwitterAPI.Controller do require Logger def verify_credentials(%{assigns: %{user: user}} = conn, _params) do - render(conn, UserView, "show.json", %{user: user}) + token = Phoenix.Token.sign(conn, "user socket", user.id) + render(conn, UserView, "show.json", %{user: user, token: token}) end def status_update(%{assigns: %{user: user}} = conn, %{"status" => _} = status_data) do diff --git a/lib/pleroma/web/twitter_api/views/user_view.ex b/lib/pleroma/web/twitter_api/views/user_view.ex index 3dc18eff8..d1c7e6fbd 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -25,7 +25,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do user_info = User.get_cached_user_info(user) - %{ + data = %{ "created_at" => user.inserted_at |> Utils.format_naive_asctime, "description" => HtmlSanitizeEx.strip_tags(user.bio), "favourites_count" => 0, @@ -47,6 +47,12 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "cover_photo" => image_url(user.info["banner"]), "background_image" => image_url(user.info["background"]) } + + if assigns[:token] do + Map.put(data, "token", assigns[:token]) + else + data + end end def render("short.json", %{user: %User{ |