diff options
| author | lambda <pleromagit@rogerbraun.net> | 2017-12-05 11:27:11 +0000 | 
|---|---|---|
| committer | lambda <pleromagit@rogerbraun.net> | 2017-12-05 11:27:11 +0000 | 
| commit | 08e7e249b1e656bce79fec7df4ce8bf9b158855f (patch) | |
| tree | 6ffaad6b46925bd1bf5f5aff53437df7ed0528b1 /lib | |
| parent | 7f336cb8b102c4dd5045aceebedafa1ca363bd91 (diff) | |
| parent | e7c2472abd470b3b0ba8e9321a378e5a77412e26 (diff) | |
| download | pleroma-08e7e249b1e656bce79fec7df4ce8bf9b158855f.tar.gz pleroma-08e7e249b1e656bce79fec7df4ce8bf9b158855f.zip | |
Merge branch 'feature/chat' into 'develop'
Feature/chat
See merge request pleroma/pleroma!36
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{ | 
